/*FUNCTION********************************************************************** * * Function Name : gpio_clear_pin_interrupt_flag * Description : Clear individual GPIO pin interrupt status flag. * *END**************************************************************************/ void gpio_clear_pin_interrupt_flag(uint32_t pinName) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); port_hal_clear_pin_interrupt_flag(gpioInstance, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_WritePinOutput * Description : Set output level of individual GPIO pin to logic 1 or 0. * *END**************************************************************************/ void GPIO_DRV_WritePinOutput(uint32_t pinName, uint32_t output) { uint32_t gpioBaseAddr = g_gpioBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); GPIO_HAL_WritePinOutput(gpioBaseAddr, pin, output); }
/*FUNCTION********************************************************************** * * Function Name : gpio_write_pin_output * Description : Set output level of individual GPIO pin to logic 1 or 0. * *END**************************************************************************/ void gpio_write_pin_output(uint32_t pinName, uint32_t output) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); gpio_hal_write_pin_output(gpioInstance, pin, output); }
/*FUNCTION********************************************************************** * * Function Name : gpio_read_pin_input * Description : Read current input value of individual GPIO pin. * *END**************************************************************************/ uint32_t gpio_read_pin_input(uint32_t pinName) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); return gpio_hal_read_pin_input(gpioInstance, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_InputPinInit * Description : Initialize one GPIO input pin used by board. * *END**************************************************************************/ void GPIO_DRV_InputPinInit(const gpio_input_pin_user_config_t *inputPin) { /* Get actual port and pin number.*/ uint32_t port = GPIO_EXTRACT_PORT(inputPin->pinName); uint32_t pin = GPIO_EXTRACT_PIN(inputPin->pinName); uint32_t gpioBaseAddr = g_gpioBaseAddr[port]; uint32_t portBaseAddr = g_portBaseAddr[port]; /* Un-gate port clock*/ CLOCK_SYS_EnablePortClock(port); /* Set current pin as digital input.*/ GPIO_HAL_SetPinDir(gpioBaseAddr, pin, kGpioDigitalInput); /* Configure GPIO input features. */ PORT_HAL_SetPullCmd(portBaseAddr, pin, inputPin->config.isPullEnable); PORT_HAL_SetPullMode(portBaseAddr, pin, inputPin->config.pullSelect); PORT_HAL_SetPassiveFilterCmd(portBaseAddr, pin, inputPin->config.isPassiveFilterEnabled); #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER PORT_HAL_SetDigitalFilterCmd(portBaseAddr, pin, inputPin->config.isDigitalFilterEnabled); #endif PORT_HAL_SetPinIntMode(portBaseAddr, pin, inputPin->config.interrupt); /* Configure NVIC */ if ((inputPin->config.interrupt) && (g_portIrqId[port])) { /* Enable GPIO interrupt.*/ INT_SYS_EnableIRQ(g_portIrqId[port]); } }
/*FUNCTION********************************************************************** * * Function Name : gpio_get_pin_direction * Description : Get current direction of individual GPIO pin. * *END**************************************************************************/ uint32_t gpio_get_pin_direction(uint32_t pinName) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); return gpio_hal_get_pin_direction(gpioInstance, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_IsPinIntPending * Description : Read the individual pin-interrupt status flag. * *END**************************************************************************/ bool GPIO_DRV_IsPinIntPending(uint32_t pinName) { PORT_Type * portBase = g_portBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); return PORT_HAL_IsPinIntPending(portBase, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_SetDigitalFilterCmd * Description : Enable or disable digital filter in one single port. * *END**************************************************************************/ void GPIO_DRV_SetDigitalFilterCmd(uint32_t pinName, bool isDigitalFilterEnabled) { uint32_t portBaseAddr = g_portBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); PORT_HAL_SetDigitalFilterCmd(portBaseAddr, pin, isDigitalFilterEnabled); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_TogglePinOutput * Description : Reverse current output logic of individual GPIO pin. * *END**************************************************************************/ void GPIO_DRV_TogglePinOutput(uint32_t pinName) { GPIO_Type * gpioBase = g_gpioBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); GPIO_HAL_TogglePinOutput(gpioBase, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_ReadPinInput * Description : Read current input value of individual GPIO pin. * *END**************************************************************************/ uint32_t GPIO_DRV_ReadPinInput(uint32_t pinName) { GPIO_Type * gpioBase = g_gpioBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); return GPIO_HAL_ReadPinInput(gpioBase, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_WritePinOutput * Description : Set output level of individual GPIO pin to logic 1 or 0. * *END**************************************************************************/ void GPIO_DRV_WritePinOutput(uint32_t pinName, uint32_t output) { GPIO_Type * gpioBase = g_gpioBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); GPIO_HAL_WritePinOutput(gpioBase, pin, output); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_SetPinDir * Description : Set current direction of individual GPIO pin. * *END**************************************************************************/ void GPIO_DRV_SetPinDir(uint32_t pinName, gpio_pin_direction_t direction) { GPIO_Type * gpioBase = g_gpioBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); GPIO_HAL_SetPinDir(gpioBase, pin, direction); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_GetPinDir * Description : Get current direction of individual GPIO pin. * *END**************************************************************************/ gpio_pin_direction_t GPIO_DRV_GetPinDir(uint32_t pinName) { GPIO_Type * gpioBase = g_gpioBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); return GPIO_HAL_GetPinDir(gpioBase, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_OutputPinInit * Description : Initialize one GPIO output pin used by board. * *END**************************************************************************/ void GPIO_DRV_OutputPinInit(const gpio_output_pin_user_config_t *outputPin) { /* Get actual port and pin number.*/ uint32_t port = GPIO_EXTRACT_PORT(outputPin->pinName); uint32_t pin = GPIO_EXTRACT_PIN(outputPin->pinName); GPIO_Type * gpioBase = g_gpioBase[port]; PORT_Type * portBase = g_portBase[port]; /* Un-gate port clock*/ CLOCK_SYS_EnablePortClock(port); /* Set current pin as gpio.*/ PORT_HAL_SetMuxMode(portBase, pin, kPortMuxAsGpio); /* Set current pin as digital output.*/ GPIO_HAL_SetPinDir(gpioBase, pin, kGpioDigitalOutput); /* Configure GPIO output features. */ GPIO_HAL_WritePinOutput(gpioBase, pin, outputPin->config.outputLogic); #if FSL_FEATURE_PORT_HAS_SLEW_RATE PORT_HAL_SetSlewRateMode(portBase, pin, outputPin->config.slewRate); #endif #if FSL_FEATURE_PORT_HAS_DRIVE_STRENGTH PORT_HAL_SetDriveStrengthMode(portBase, pin, outputPin->config.driveStrength); #endif #if FSL_FEATURE_PORT_HAS_OPEN_DRAIN PORT_HAL_SetOpenDrainCmd(portBase, pin, outputPin->config.isOpenDrainEnabled); #endif }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_ClearPinIntFlag * Description : Clear individual GPIO pin interrupt status flag. * *END**************************************************************************/ void GPIO_DRV_ClearPinIntFlag(uint32_t pinName) { PORT_Type * portBase = g_portBase[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); PORT_HAL_ClearPinIntFlag(portBase, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_ReadPinInput * Description : Read current input value of individual GPIO pin. * *END**************************************************************************/ uint32_t GPIO_DRV_ReadPinInput(uint32_t pinName) { uint32_t gpioBaseAddr = g_gpioBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); return GPIO_HAL_ReadPinInput(gpioBaseAddr, pin); }
/*FUNCTION********************************************************************** * * Function Name : gpio_input_pin_init * Description : Initialize one GPIO input pin used by board. * *END**************************************************************************/ void gpio_input_pin_init(const gpio_input_pin_user_config_t *inputPin) { /* Get actual port and pin number.*/ uint32_t gpioInstance = GPIO_EXTRACT_PORT(inputPin->pinName); uint32_t pin = GPIO_EXTRACT_PIN(inputPin->pinName); /* Un-gate port clock*/ clock_manager_set_gate(kClockModulePORT, gpioInstance, true); /* Set current pin as digital input.*/ gpio_hal_set_pin_direction(gpioInstance, pin, kGpioDigitalInput); /* Configure GPIO input features. */ port_hal_configure_pull(gpioInstance, pin, inputPin->config.isPullEnable); port_hal_pull_select(gpioInstance, pin, inputPin->config.pullSelect); port_hal_configure_passive_filter(gpioInstance, pin, inputPin->config.isPassiveFilterEnabled); #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER port_hal_configure_digital_filter(gpioInstance, pin, inputPin->config.isDigitalFilterEnabled); #endif port_hal_configure_pin_interrupt(gpioInstance, pin, inputPin->config.interrupt); /* Configure NVIC */ if ((inputPin->config.interrupt) && (gpio_irq_ids[gpioInstance])) { /* Enable GPIO interrupt.*/ interrupt_enable(gpio_irq_ids[gpioInstance]); } }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_ClearPinIntFlag * Description : Clear individual GPIO pin interrupt status flag. * *END**************************************************************************/ void GPIO_DRV_ClearPinIntFlag(uint32_t pinName) { uint32_t portBaseAddr = g_portBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); PORT_HAL_ClearPinIntFlag(portBaseAddr, pin); }
void hardware_init(void) { uint8_t i; /* enable clock for PORTs */ for (i = 0; i < PORT_INSTANCE_COUNT; i++) { CLOCK_SYS_EnablePortClock(i); } #if (SD_CARD_APP) #if ((defined TWR_K64F120M) || (defined FRDM_K64F) || (defined TWR_K60D100M) || (defined TWR_K21F120M) || (defined TWR_K65F180M)) /* configure detect pin as gpio (alt1) */ uint32_t port = GPIO_EXTRACT_PORT(sdhcCdPin[0].pinName); uint32_t pin = GPIO_EXTRACT_PIN(sdhcCdPin[0].pinName); PORT_Type * portBase = g_portBase[port]; PORT_HAL_SetMuxMode(portBase, pin, kPortMuxAsGpio); configure_sdhc_pins(BOARD_SDHC_INSTANCE); #endif #endif /* Init board clock */ BOARD_ClockInit(); dbg_uart_init(); }
GpioPin::GpioPin(uint32_t combinedPin, pin_direction_t dir) : m_bank(GPIO_EXTRACT_BANK(combinedPin)), m_pin(GPIO_EXTRACT_PIN(combinedPin)) { gpio_set_gpio(m_bank, m_pin); setDirection(dir); }
// handler associated to SW1 (labeled SW2 on board) void SW1_Intr_Handler(void) { static uint32_t c_ifsr; // port c interrupt flag status register uint32_t c_portBaseAddr = g_portBaseAddr[GPIO_EXTRACT_PORT(kGpioSW1)]; uint32_t portPinMask = (1 << GPIO_EXTRACT_PIN(kGpioSW1)); CPU_CRITICAL_ENTER(); // enter critical section (disable interrupts) OSIntEnter(); // notify to scheduler the beginning of an ISR ("This allows ?C/OS-III to keep track of interrupt nesting") c_ifsr = PORT_HAL_GetPortIntFlag(c_portBaseAddr); // get intr flag reg related to port C if( (c_ifsr & portPinMask) ) // check if kGpioSW1 generated the interrupt [pin 6 -> 7th flag (flags start with index 0)] { //sem_sw1_post OSSemPost(&MySem1, OS_OPT_POST_1 + OS_OPT_POST_NO_SCHED, &os_err); } GPIO_DRV_ClearPinIntFlag( kGpioSW1 ); CPU_CRITICAL_EXIT(); // renable interrupts OSIntExit(); /* notify to scheduler the end of an ISR ("determines if a higher priority task is ready-to-run. If so, the interrupt returns to the higher priority task instead of the interrupted task.") */ }
/*FUNCTION********************************************************************** * * Function Name : gpio_set_pin_direction * Description : Set current direction of individual GPIO pin. * *END**************************************************************************/ void gpio_set_pin_direction(uint32_t pinName, gpio_pin_direction_t direction) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); gpio_hal_set_pin_direction(gpioInstance, pin, direction); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_GetPinDir * Description : Get current direction of individual GPIO pin. * *END**************************************************************************/ gpio_pin_direction_t GPIO_DRV_GetPinDir(uint32_t pinName) { uint32_t gpioBaseAddr = g_gpioBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); return GPIO_HAL_GetPinDir(gpioBaseAddr, pin); }
/*FUNCTION********************************************************************** * * Function Name : gpio_toggle_pin_output * Description : Reverse current output logic of individual GPIO pin. * *END**************************************************************************/ void gpio_toggle_pin_output(uint32_t pinName) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); gpio_hal_toggle_pin_output(gpioInstance, pin); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_SetPinDir * Description : Set current direction of individual GPIO pin. * *END**************************************************************************/ void GPIO_DRV_SetPinDir(uint32_t pinName, gpio_pin_direction_t direction) { uint32_t gpioBaseAddr = g_gpioBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); GPIO_HAL_SetPinDir(gpioBaseAddr, pin, direction); }
/*FUNCTION********************************************************************** * * Function Name : gpio_configure_digital_filter * Description : Enable or disable digital filter in one single port. * *END**************************************************************************/ void gpio_configure_digital_filter(uint32_t pinName, bool isDigitalFilterEnabled) { uint32_t gpioInstance = GPIO_EXTRACT_PORT(pinName); uint32_t pin = GPIO_EXTRACT_PIN(pinName); port_hal_configure_digital_filter(gpioInstance, pin, isDigitalFilterEnabled); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_TogglePinOutput * Description : Reverse current output logic of individual GPIO pin. * *END**************************************************************************/ void GPIO_DRV_TogglePinOutput(uint32_t pinName) { uint32_t gpioBaseAddr = g_gpioBaseAddr[GPIO_EXTRACT_PORT(pinName)]; uint32_t pin = GPIO_EXTRACT_PIN(pinName); GPIO_HAL_TogglePinOutput(gpioBaseAddr, pin); }
/*! * @brief gpio IRQ handler with the same name in startup code */ void BOARD_SDHC_CD_GPIO_IRQ_HANDLER(void) { PORT_Type * gpioBase = g_portBase[GPIO_EXTRACT_PORT(kGpioSdhc0Cd)]; uint32_t pin = GPIO_EXTRACT_PIN(kGpioSdhc0Cd); if(PORT_HAL_GetPortIntFlag(gpioBase) == (1 << pin)) { sdhc_card_detection(); } /* Clear interrupt flag.*/ PORT_HAL_ClearPortIntFlag(gpioBase); }
/*! * @brief gpio IRQ handler with the same name in startup code */ void SDCARD_CD_GPIO_IRQ_HANDLER(void) { PORT_Type * gpioBase = g_portBase[GPIO_EXTRACT_PORT(kGpioSdcardCardDetection)]; uint32_t pin = GPIO_EXTRACT_PIN(kGpioSdcardCardDetection); if(PORT_HAL_GetPortIntFlag(gpioBase) == (1 << pin)) { spiSDcard_card_detection(); } /* Clear interrupt flag.*/ PORT_HAL_ClearPortIntFlag(gpioBase); }
/*FUNCTION********************************************************************** * * Function Name : GPIO_DRV_InputPinInit * Description : Initialize one GPIO input pin used by board. * *END**************************************************************************/ void GPIO_DRV_InputPinInit(const gpio_input_pin_user_config_t *inputPin) { /* Get actual port and pin number.*/ uint32_t port = GPIO_EXTRACT_PORT(inputPin->pinName); uint32_t pin = GPIO_EXTRACT_PIN(inputPin->pinName); GPIO_Type * gpioBase = g_gpioBase[port]; PORT_Type * portBase = g_portBase[port]; /* Un-gate port clock*/ CLOCK_SYS_EnablePortClock(port); /* Set current pin as gpio.*/ PORT_HAL_SetMuxMode(portBase, pin, kPortMuxAsGpio); /* Set current pin as digital input.*/ GPIO_HAL_SetPinDir(gpioBase, pin, kGpioDigitalInput); /* Configure GPIO input features. */ #if FSL_FEATURE_PORT_HAS_PULL_ENABLE PORT_HAL_SetPullCmd(portBase, pin, inputPin->config.isPullEnable); #endif #if FSL_FEATURE_PORT_HAS_PULL_SELECTION PORT_HAL_SetPullMode(portBase, pin, inputPin->config.pullSelect); #endif #if FSL_FEATURE_PORT_HAS_PASSIVE_FILTER PORT_HAL_SetPassiveFilterCmd(portBase, pin, inputPin->config.isPassiveFilterEnabled); #endif #if FSL_FEATURE_PORT_HAS_DIGITAL_FILTER PORT_HAL_SetDigitalFilterCmd(portBase, pin, inputPin->config.isDigitalFilterEnabled); #endif #if FSL_FEATURE_GPIO_HAS_INTERRUPT_VECTOR PORT_HAL_SetPinIntMode(portBase, pin, inputPin->config.interrupt); /* Configure NVIC */ if ((inputPin->config.interrupt) && (g_portIrqId[port])) { /* Enable GPIO interrupt.*/ INT_SYS_EnableIRQ(g_portIrqId[port]); } #endif }