/**************************************************************************//** * @brief Configure display control * @param option Options for configuring display control. *****************************************************************************/ void DVK_displayControl(DVK_Display_TypeDef option) { uint16_t tmp; switch (option) { case DVK_Display_EBI: DVK_writeRegister(&BC_REGISTER->ARB_CTRL, BC_ARB_CTRL_EBI); break; case DVK_Display_SPI: DVK_writeRegister(&BC_REGISTER->ARB_CTRL, BC_ARB_CTRL_SPI); break; case DVK_Display_BC: DVK_writeRegister(&BC_REGISTER->ARB_CTRL, BC_ARB_CTRL_BC); break; case DVK_Display_PowerEnable: tmp = DVK_readRegister(&BC_REGISTER->DISPLAY_CTRL); tmp |= (BC_DISPLAY_CTRL_POWER_ENABLE); DVK_writeRegister(&BC_REGISTER->DISPLAY_CTRL, tmp); break; case DVK_Display_PowerDisable: tmp = DVK_readRegister(&BC_REGISTER->DISPLAY_CTRL); tmp &= ~(BC_DISPLAY_CTRL_POWER_ENABLE); DVK_writeRegister(&BC_REGISTER->DISPLAY_CTRL, tmp); break; case DVK_Display_ResetAssert: tmp = DVK_readRegister(&BC_REGISTER->DISPLAY_CTRL); tmp |= (BC_DISPLAY_CTRL_RESET); DVK_writeRegister(&BC_REGISTER->DISPLAY_CTRL, tmp); break; case DVK_Display_ResetRelease: tmp = DVK_readRegister(&BC_REGISTER->DISPLAY_CTRL); tmp &= ~(BC_DISPLAY_CTRL_RESET); DVK_writeRegister(&BC_REGISTER->DISPLAY_CTRL, tmp); break; case DVK_Display_Mode8080: tmp = DVK_readRegister(&BC_REGISTER->DISPLAY_CTRL); tmp &= ~(BC_DISPLAY_CTRL_MODE_GENERIC); DVK_writeRegister(&BC_REGISTER->DISPLAY_CTRL, tmp); break; case DVK_Display_ModeGeneric: tmp = DVK_readRegister(&BC_REGISTER->DISPLAY_CTRL); tmp |= (BC_DISPLAY_CTRL_MODE_GENERIC); DVK_writeRegister(&BC_REGISTER->DISPLAY_CTRL, tmp); break; default: /* Unknown command */ while (1) ; } }
/**************************************************************************//** * @brief Disable EFM32 access to peripheral on DVK board * @param peri Peripheral to disable *****************************************************************************/ void DVK_disablePeripheral(DVKPeripheral peri) { uint16_t bit; uint16_t tmp; /* Calculate which bit to set */ bit = (uint16_t) peri; /* Read peripheral control register */ tmp = DVK_readRegister(BC_PERCTRL); /* Disable peripheral */ tmp &= ~(bit); /* Special case for RS232, if enabled disable shutdown */ if ((peri == DVK_RS232A) || (peri == DVK_RS232B)) { /* Set shutdown bit */ tmp |= (BC_PERCTRL_RS232_SHUTDOWN); } /* Special case for IRDA */ if (peri == DVK_IRDA) { /* Set shutdown bit */ tmp |= (BC_PERCTRL_IRDA_SHUTDOWN); } DVK_writeRegister(BC_PERCTRL, tmp); }
/**************************************************************************//** * @brief Clear interrupts * @param flags Board control interrupt flags, BC_INTEN_<something> *****************************************************************************/ void DVK_clearInterruptFlags(uint16_t flags) { uint16_t tmp; tmp = DVK_readRegister(&BC_REGISTER->INTFLAG); tmp &= ~(flags); DVK_writeRegister(&BC_REGISTER->INTFLAG, tmp); }
/**************************************************************************//** * @brief Enable "Control" buttons/joystick/dip switch interrupts * @param flags Board control interrupt flags, BC_INTEN_<something> *****************************************************************************/ void DVK_enableInterrupt(uint16_t flags) { uint16_t tmp; /* Add flags to interrupt enable register */ tmp = DVK_readRegister(BC_INTEN); tmp |= flags; DVK_writeRegister(BC_INTEN, tmp); }
/**************************************************************************//** * @brief Disable "Control" buttons/joystick/dip switch interrupts * @param flags Board control interrupt flags, BC_INTEN_<something> *****************************************************************************/ void DVK_disableInterrupt(uint16_t flags) { uint16_t tmp; /* Clear flags from interrupt enable register */ tmp = DVK_readRegister(BC_INTEN); flags = ~(flags); tmp &= flags; DVK_writeRegister(BC_INTEN, tmp); }
/**************************************************************************//** * @brief Configure SPI for correct peripheral * * @param[in] device * Device to enable SPI bus for *****************************************************************************/ void DVK_spiControl(DVK_SpiControl_TypeDef device) { switch (device) { case DVK_SPI_Audio: DVK_writeRegister(&BC_REGISTER->SPI_DEMUX, BC_SPI_DEMUX_SLAVE_AUDIO); break; case DVK_SPI_Ethernet: DVK_writeRegister(&BC_REGISTER->SPI_DEMUX, BC_SPI_DEMUX_SLAVE_ETHERNET); break; case DVK_SPI_Display: DVK_writeRegister(&BC_REGISTER->SPI_DEMUX, BC_SPI_DEMUX_SLAVE_DISPLAY); break; case DVK_SPI_OFF: USART_Reset(USART1); CMU_ClockEnable(cmuClock_USART1, false); break; } }
/**************************************************************************//** * @brief Clear interrupts * @param flags Board control interrupt flags, BC_INTEN_<something> *****************************************************************************/ void DVK_clearInterruptFlags(uint16_t flags) { DVK_writeRegister(BC_INTFLAG, flags); }
/**************************************************************************//** * @brief Sets user leds * @param leds 16-bits which enables or disables the board "User leds" *****************************************************************************/ void DVK_setLEDs(uint16_t leds) { DVK_writeRegister(BC_LED, leds); }
/**************************************************************************//** * @brief Inform AEM about current energy mode * @param energyMode What energy mode we are going to use next *****************************************************************************/ void DVK_setEnergyMode(uint16_t energyMode) { DVK_writeRegister(BC_EM, energyMode); }
/**************************************************************************//** * @brief Disable BUS access *****************************************************************************/ void DVK_disableBus(void) { DVK_writeRegister(BC_BUS_CFG, 0); }
/**************************************************************************//** * @brief Enable BUS access *****************************************************************************/ void DVK_enableBus(void) { /* Enable bus access */ DVK_writeRegister(BC_BUS_CFG, 1); }
/**************************************************************************//** * @brief Inform AEM/Board Controller about what energy mode we are currently * entering. This information can be used for better visual feedback of * EFM32GG activity for the board controller and PC applications * @param energyMode What energy mode we are going to use next *****************************************************************************/ void DVK_setEnergyMode(uint16_t energyMode) { DVK_writeRegister(&BC_REGISTER->EM, energyMode); }
/**************************************************************************//** * @brief DK3750 Peripheral Access Control * Enable or disable access to on-board peripherals through switches * and SPI switch where applicable. Turn off conflicting peripherals when * enabling another. * @param[in] perf * Which peripheral to configure * @param[in] enable * If true, sets up access to peripheral, if false disables it *****************************************************************************/ void DVK_peripheralAccess(DVK_Peripheral_TypeDef perf, bool enable) { uint16_t perfControl; perfControl = DVK_readRegister(&BC_REGISTER->PERICON); /* Enable or disable the specificed peripheral by setting board control switch */ if (enable) { switch (perf) { case DVK_RS232_SHUTDOWN: perfControl |= (1 << BC_PERICON_RS232_SHUTDOWN_SHIFT); break; case DVK_RS232_UART: perfControl &= ~(1 << BC_PERICON_RS232_SHUTDOWN_SHIFT); perfControl &= ~(1 << BC_PERICON_RS232_LEUART_SHIFT); perfControl |= (1 << BC_PERICON_RS232_UART_SHIFT); break; case DVK_RS232_LEUART: perfControl &= ~(1 << BC_PERICON_RS232_SHUTDOWN_SHIFT); perfControl &= ~(1 << BC_PERICON_RS232_UART_SHIFT); perfControl |= (1 << BC_PERICON_RS232_LEUART_SHIFT); break; case DVK_I2C: perfControl |= (1 << BC_PERICON_I2C_SHIFT); break; case DVK_ETH: /* Enable SPI interface */ DVK_spiControl(DVK_SPI_Ethernet); /* Enable Ethernet analog switches */ perfControl |= (1 << BC_PERICON_I2S_ETH_SHIFT); perfControl |= (1 << BC_PERICON_I2S_ETH_SEL_SHIFT); /* Disable Analog Diff Input - pins PD0 and PD1 is shared */ perfControl &= ~(1 << BC_PERICON_ANALOG_DIFF_SHIFT); /* Disable Touch Inputs - pin PD3 is shared */ perfControl &= ~(1 << BC_PERICON_TOUCH_SHIFT); /* Disable Analog SE Input - pin PD2 is shared */ perfControl &= ~(1 << BC_PERICON_ANALOG_SE_SHIFT); break; case DVK_I2S: /* Direct SPI interface to I2S DAC */ DVK_spiControl(DVK_SPI_Audio); /* Also make surea Audio out is connected for I2S operation */ perfControl |= (1 << BC_PERICON_AUDIO_OUT_SHIFT); perfControl |= (1 << BC_PERICON_AUDIO_OUT_SEL_SHIFT); perfControl |= (1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); /* Disable Analog Diff Input - pins PD0 and PD1 is shared */ perfControl &= ~(1 << BC_PERICON_ANALOG_DIFF_SHIFT); /* Disable Touch Inputs - pin PD3 is shared */ perfControl &= ~(1 << BC_PERICON_TOUCH_SHIFT); /* Disable Analog SE Input - pin PD2 is shared */ perfControl &= ~(1 << BC_PERICON_ANALOG_SE_SHIFT); break; case DVK_TRACE: perfControl |= (1 << BC_PERICON_TRACE_SHIFT); break; case DVK_TOUCH: perfControl |= (1 << BC_PERICON_TOUCH_SHIFT); /* Disconnect SPI switch, pin PD3 is shared */ perfControl &= ~(1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); DVK_spiControl(DVK_SPI_OFF); break; case DVK_AUDIO_IN: perfControl |= (1 << BC_PERICON_AUDIO_IN_SHIFT); break; case DVK_AUDIO_OUT: perfControl &= ~(1 << BC_PERICON_AUDIO_OUT_SEL_SHIFT); perfControl |= (1 << BC_PERICON_AUDIO_OUT_SHIFT); break; case DVK_ANALOG_DIFF: perfControl |= (1 << BC_PERICON_ANALOG_DIFF_SHIFT); /* Disconnect SPI switch, pin PD0 and PD1 is shared */ perfControl &= ~(1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); DVK_spiControl(DVK_SPI_OFF); break; case DVK_ANALOG_SE: perfControl |= (1 << BC_PERICON_ANALOG_SE_SHIFT); /* Disconnect SPI switch, pin PD2 is shared */ perfControl &= ~(1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); DVK_spiControl(DVK_SPI_OFF); break; case DVK_MICROSD: perfControl |= (1 << BC_PERICON_SPI_SHIFT); break; case DVK_TFT: /* Enable SPI to SSD2119 */ DVK_spiControl(DVK_SPI_Display); /* Enable SPI analog switch */ perfControl |= (1 << BC_PERICON_I2S_ETH_SHIFT); /* Disable Analog Diff Input - pins D0 and D1 is shared */ perfControl &= ~(1 << BC_PERICON_ANALOG_DIFF_SHIFT); /* Disable Touch Inputs - pin D3 is shared */ perfControl &= ~(1 << BC_PERICON_TOUCH_SHIFT); /* Disable Analog SE Input - pin D2 is shared */ perfControl &= ~(1 << BC_PERICON_ANALOG_SE_SHIFT); break; } } else { switch (perf) { case DVK_RS232_SHUTDOWN: perfControl &= ~(1 << BC_PERICON_RS232_SHUTDOWN_SHIFT); break; case DVK_RS232_UART: perfControl |= (1 << BC_PERICON_RS232_SHUTDOWN_SHIFT); perfControl &= ~(1 << BC_PERICON_RS232_UART_SHIFT); break; case DVK_RS232_LEUART: perfControl |= (1 << BC_PERICON_RS232_SHUTDOWN_SHIFT); perfControl &= ~(1 << BC_PERICON_RS232_LEUART_SHIFT); break; case DVK_I2C: perfControl &= ~(1 << BC_PERICON_I2C_SHIFT); break; case DVK_ETH: /* Disable SPI interface */ perfControl &= ~(1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); DVK_spiControl(DVK_SPI_OFF); break; case DVK_I2S: /* Disable SPI interface and audio out */ perfControl &= ~(1 << BC_PERICON_AUDIO_OUT_SHIFT); perfControl &= ~(1 << BC_PERICON_AUDIO_OUT_SEL_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); DVK_spiControl(DVK_SPI_OFF); break; case DVK_TRACE: perfControl &= ~(1 << BC_PERICON_TRACE_SHIFT); break; case DVK_TOUCH: perfControl &= ~(1 << BC_PERICON_TOUCH_SHIFT); break; case DVK_AUDIO_IN: perfControl &= ~(1 << BC_PERICON_AUDIO_IN_SHIFT); break; case DVK_AUDIO_OUT: perfControl &= ~(1 << BC_PERICON_AUDIO_OUT_SEL_SHIFT); perfControl &= ~(1 << BC_PERICON_AUDIO_OUT_SHIFT); break; case DVK_ANALOG_DIFF: perfControl &= ~(1 << BC_PERICON_ANALOG_DIFF_SHIFT); break; case DVK_ANALOG_SE: perfControl &= ~(1 << BC_PERICON_ANALOG_SE_SHIFT); break; case DVK_MICROSD: perfControl &= ~(1 << BC_PERICON_SPI_SHIFT); break; case DVK_TFT: /* Disable SPI interface */ perfControl &= ~(1 << BC_PERICON_I2S_ETH_SHIFT); perfControl &= ~(1 << BC_PERICON_I2S_ETH_SEL_SHIFT); DVK_spiControl(DVK_SPI_OFF); break; } } /* Write back register */ DVK_writeRegister(&BC_REGISTER->PERICON, perfControl); }
/**************************************************************************//** * @brief Set board LEDs * * @param[in] leds * 16 bits enabling or disabling individual board LEDs *****************************************************************************/ void DVK_setLEDs(uint16_t leds) { DVK_writeRegister(&BC_REGISTER->UIF_LEDS, leds); }