GPIO¶
This is the hardware independent GPIO (General Purpose Input Output) Interface for Mynewt.
Description¶
Contains the basic operations to set and read General Purpose Digital I/O Pins within a Mynewt system.
Individual GPIOs are referenced in the APIs as pins
. However, in
this interface the pins
are virtual GPIO pins. The MCU header file
maps these virtual pins
to the physical GPIO ports and pins.
Typically, the BSP code may define named I/O pins in terms of these
virtual pins
to describe the devices attached to the physical pins.
Here’s a brief example so you can get the gist of the translation.
Suppose my product uses the stm32F4xx processor. There already exists support for this processor within Mynewt. The processor has N ports (A,B,C..) of 16 GPIO pins per port. The MCU hal_gpio driver maps these to a set of virtual pins 0-N where port A maps to 0-15, Port B maps to 16-31, Port C maps to 32-47 and so on. The exact number of physical port (and virtual port pins) depends on the specific variant of the stm32F4xx.
So if I want to turn on port B pin 3, that would be virtual pin 1*16 + 3 = 19. This translation is defined in the MCU implementation of hal_gpio.c for the stm32. Each MCU will typically have a different translation method depending on its GPIO architecture.
Now, when writing a BSP, it’s common to give names to the relevant port
pins that you are using. Thus, the BSP may define a mapping between a
function and a virtual port pin in the bsp.h
header file for the
BSP. For example,
#define SYSTEM_LED (37)
#define FLASH_SPI_CHIP_SELECT (3)
would map the system indicator LED to virtual pin 37 which on the stm32F4xx would be Port C pin 5 and the chip select line for the external SPI flash to virtual pin 3 which on the stm32F4xxis port A pin 3.
Said another way, in this specific system we get
SYSTEM_LED --> hal_gpio virtual pin 37 --> port C pin 5 on the stm34F4xx
API¶
-
enum hal_gpio_mode_e¶
The “mode” of the gpio.
The gpio is either an input, output, or it is “not connected” (the pin specified is not functioning as a gpio)
Values:
-
enumerator HAL_GPIO_MODE_NC¶
Not connected.
-
enumerator HAL_GPIO_MODE_IN¶
Input.
-
enumerator HAL_GPIO_MODE_OUT¶
Output.
-
enumerator HAL_GPIO_MODE_NC¶
-
enum hal_gpio_pull¶
Values:
-
enumerator HAL_GPIO_PULL_NONE¶
Pull-up/down not enabled.
-
enumerator HAL_GPIO_PULL_UP¶
Pull-up enabled.
-
enumerator HAL_GPIO_PULL_DOWN¶
Pull-down enabled.
-
enumerator HAL_GPIO_PULL_NONE¶
-
enum hal_gpio_irq_trigger¶
Values:
-
enumerator HAL_GPIO_TRIG_NONE¶
-
enumerator HAL_GPIO_TRIG_RISING¶
IRQ occurs on rising edge.
-
enumerator HAL_GPIO_TRIG_FALLING¶
IRQ occurs on falling edge.
-
enumerator HAL_GPIO_TRIG_BOTH¶
IRQ occurs on either edge.
-
enumerator HAL_GPIO_TRIG_LOW¶
IRQ occurs when line is low.
-
enumerator HAL_GPIO_TRIG_HIGH¶
IRQ occurs when line is high.
-
enumerator HAL_GPIO_TRIG_NONE¶
-
typedef enum hal_gpio_mode_e hal_gpio_mode_t¶
-
typedef enum hal_gpio_pull hal_gpio_pull_t¶
-
typedef enum hal_gpio_irq_trigger hal_gpio_irq_trig_t¶
-
typedef void (*hal_gpio_irq_handler_t)(void *arg)¶
-
int hal_gpio_init_in(int pin, hal_gpio_pull_t pull)¶
Initializes the specified pin as an input.
- Parameters:
pin – Pin number to set as input
pull – pull type
- Returns:
int 0: no error; -1 otherwise.
-
int hal_gpio_init_out(int pin, int val)¶
Initialize the specified pin as an output, setting the pin to the specified value.
- Parameters:
pin – Pin number to set as output
val – Value to set pin
- Returns:
int 0: no error; -1 otherwise.
-
int hal_gpio_deinit(int pin)¶
Deinitialize the specified pin to revert the previous initialization.
- Parameters:
pin – Pin number to unset
- Returns:
int 0: no error; -1 otherwise.
-
void hal_gpio_write(int pin, int val)¶
Write a value (either high or low) to the specified pin.
- Parameters:
pin – Pin to set
val – Value to set pin (0:low 1:high)
-
int hal_gpio_read(int pin)¶
Reads the specified pin.
- Parameters:
pin – Pin number to read
- Returns:
int 0: low, 1: high
-
int hal_gpio_toggle(int pin)¶
Toggles the specified pin.
- Parameters:
pin – Pin number to toggle
- Returns:
current gpio state int 0: low, 1: high
-
int hal_gpio_irq_init(int pin, hal_gpio_irq_handler_t handler, void *arg, hal_gpio_irq_trig_t trig, hal_gpio_pull_t pull)¶
Initialize a given pin to trigger a GPIO IRQ callback.
- Parameters:
pin – The pin to trigger GPIO interrupt on
handler – The handler function to call
arg – The argument to provide to the IRQ handler
trig – The trigger mode (e.g. rising, falling)
pull – The mode of the pin (e.g. pullup, pulldown)
- Returns:
0 on success, non-zero error code on failure.
-
void hal_gpio_irq_release(int pin)¶
Release a pin from being configured to trigger IRQ on state change.
- Parameters:
pin – The pin to release
-
void hal_gpio_irq_enable(int pin)¶
Enable IRQs on the passed pin.
- Parameters:
pin – The pin to enable IRQs on
-
void hal_gpio_irq_disable(int pin)¶
Disable IRQs on the passed pin.
- Parameters:
pin – The pin to disable IRQs on