int spirit_gpio_set_extracycles(FAR struct spirit_library_s *spirit, enum spirit_extra_clockcycles_e xtracycles) { uint8_t regval = 0; int ret; /* Check the parameters */ DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(xtracycles)); /* Reads the MCU_CLK_CONFIG register */ ret = spirit_reg_read(spirit, MCU_CK_CONF_BASE, ®val, 1); if (ret >= 0) { /* Mask the CLOCK_TAIL field and writes the new value */ regval &= 0x9f; regval |= (uint8_t)xtracycles; /* Write to the new number of extra clock cycles in the MCU_CLOCK * register. */ ret = spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); } return ret; }
/** * @brief Initializes the SPIRIT Clock Output according to the specified * parameters in the xClockOutputInitStruct. * @param pxClockOutputInitStruct pointer to a ClockOutputInit structure that * contains the configuration information for the SPIRIT Clock Output. * @retval None. * @note The function SpiritGpioClockOutput() must be called in order to enable * or disable the MCU clock dividers. */ void SpiritGpioClockOutputInit(ClockOutputInit* pxClockOutputInitStruct) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_XO(pxClockOutputInitStruct->xClockOutputXOPrescaler)); s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_RCO(pxClockOutputInitStruct->xClockOutputRCOPrescaler)); s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(pxClockOutputInitStruct->xExtraClockCycles)); /* Calculates the register value to write according to the specified configuration */ tempRegValue = ((uint8_t)(pxClockOutputInitStruct->xClockOutputXOPrescaler) | (uint8_t)(pxClockOutputInitStruct->xClockOutputRCOPrescaler) | \ (uint8_t)(pxClockOutputInitStruct->xExtraClockCycles)); /* Writes the MCU_CLOCK register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); }
/** * @brief Sets the RCO ratio as clock output. * @param xExtraCycles the number of extra clock cycles provided before switching * to STANDBY state. This parameter can be any value of @ref ExtraClockCycles . * @retval None. */ void SpiritGpioSetExtraClockCycles(ExtraClockCycles xExtraCycles) { uint8_t tempRegValue = 0x00; /* Check the parameters */ s_assert_param(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(xExtraCycles)); /* Reads the MCU_CLK_CONFIG register */ g_xStatus = SpiritSpiReadRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); /* Mask the CLOCK_TAIL field and writes the new value */ tempRegValue &= 0x9F; tempRegValue |= ((uint8_t)xExtraCycles); /* Writes the new number of extra clock cycles in the MCU_CLOCK register */ g_xStatus = SpiritSpiWriteRegisters(MCU_CK_CONF_BASE, 1, &tempRegValue); }
int spirit_gpio_clockoutput_initialize(FAR struct spirit_library_s *spirit, FAR const struct spirit_clockoutput_init_s *clockoutput) { uint8_t regval = 0; /* Check the parameters */ DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_XO(clockoutput->xoprescaler)); DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_RCO(clockoutput->rcoprescaler)); DEBUGASSERT(IS_SPIRIT_CLOCK_OUTPUT_EXTRA_CYCLES(clockoutput->xtracycles)); /* Calculates the register value to write according to the specified * configuration */ regval = ((uint8_t)(clockoutput->xoprescaler) | (uint8_t)(clockoutput->rcoprescaler) | (uint8_t)(clockoutput->xtracycles)); /* Write to the the MCU_CLOCK register */ return spirit_reg_write(spirit, MCU_CK_CONF_BASE, ®val, 1); }