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
-
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
-
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
-
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.
- Return
int 0: no error; -1 otherwise.
- Parameters
pin
: Pin number to set as inputpull
: pull type
-
int
hal_gpio_init_out
(int pin, int val)¶ Initialize the specified pin as an output, setting the pin to the specified value.
- Return
int 0: no error; -1 otherwise.
- Parameters
pin
: Pin number to set as outputval
: Value to set pin
-
int
hal_gpio_deinit
(int pin)¶ Deinitialize the specified pin to revert the previous initialization.
- Return
int 0: no error; -1 otherwise.
- Parameters
pin
: Pin number to unset
-
void
hal_gpio_write
(int pin, int val)¶ Write a value (either high or low) to the specified pin.
- Parameters
pin
: Pin to setval
: Value to set pin (0:low 1:high)
-
int
hal_gpio_read
(int pin)¶ Reads the specified pin.
- Return
int 0: low, 1: high
- Parameters
pin
: Pin number to read
-
int
hal_gpio_toggle
(int pin)¶ Toggles the specified pin.
- Return
current gpio state int 0: low, 1: high
- Parameters
pin
: Pin number to toggle
-
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.
- Return
0 on success, non-zero error code on failure.
- Parameters
pin
: The pin to trigger GPIO interrupt onhandler
: The handler function to callarg
: The argument to provide to the IRQ handlertrig
: The trigger mode (e.g. rising, falling)pull
: The mode of the pin (e.g. pullup, pulldown)
-
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