RTEMS 7.0-rc1
Loading...
Searching...
No Matches
gpio.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0+-with-RTEMS-exception */
2
11/*
12 * Copyright (c) 2014-2015 Andre Marques <andre.lousa.marques at gmail.com>
13 *
14 * The license and distribution terms for this file may be
15 * found in the file LICENSE in this distribution or at
16 * http://www.rtems.org/license/LICENSE.
17 */
18
19#ifndef LIBBSP_SHARED_GPIO_H
20#define LIBBSP_SHARED_GPIO_H
21
22#include <bsp.h>
23#include <rtems.h>
24
25#ifdef __cplusplus
26extern "C" {
27#endif /* __cplusplus */
28
29#if !defined(BSP_GPIO_PIN_COUNT) || !defined(BSP_GPIO_PINS_PER_BANK)
30 #error "BSP_GPIO_PIN_COUNT or BSP_GPIO_PINS_PER_BANK is not defined."
31#endif
32
33#if BSP_GPIO_PIN_COUNT <= 0 || BSP_GPIO_PINS_PER_BANK <= 0
34 #error "Invalid BSP_GPIO_PIN_COUNT or BSP_GPIO_PINS_PER_BANK."
35#endif
36
37#if BSP_GPIO_PINS_PER_BANK > 32
38 #error "Invalid BSP_GPIO_PINS_PER_BANK. Must be in the range of 1 to 32."
39#endif
40
41#define GPIO_LAST_BANK_PINS BSP_GPIO_PIN_COUNT % BSP_GPIO_PINS_PER_BANK
42
43#if GPIO_LAST_BANK_PINS > 0
44 #define GPIO_BANK_COUNT (BSP_GPIO_PIN_COUNT / BSP_GPIO_PINS_PER_BANK) + 1
45#else
46 #define GPIO_BANK_COUNT BSP_GPIO_PIN_COUNT / BSP_GPIO_PINS_PER_BANK
47 #undef GPIO_LAST_BANK_PINS
48 #define GPIO_LAST_BANK_PINS BSP_GPIO_PINS_PER_BANK
49#endif
50
51#if defined(BSP_GPIO_PINS_PER_SELECT_BANK) && BSP_GPIO_PINS_PER_SELECT_BANK > 32
52 #error "Invalid BSP_GPIO_PINS_PER_SELECT_BANK. Must under and including 32."
53#elif defined(BSP_GPIO_PINS_PER_SELECT_BANK) <= 32
54 #define GPIO_SELECT_BANK_COUNT \
55 BSP_GPIO_PINS_PER_BANK / BSP_GPIO_PINS_PER_SELECT_BANK
56#endif
57
58#define INTERRUPT_SERVER_PRIORITY 1
59#define INTERRUPT_SERVER_STACK_SIZE 2 * RTEMS_MINIMUM_STACK_SIZE
60#define INTERRUPT_SERVER_MODES RTEMS_TIMESLICE | RTEMS_PREEMPT
61#define INTERRUPT_SERVER_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
62
63#define GPIO_INPUT_ERROR ~0
64
77typedef enum
78{
79 PULL_UP = 1,
80 PULL_DOWN,
81 NO_PULL_RESISTOR
83
89typedef enum
90{
91 DIGITAL_INPUT = 0,
93 BSP_SPECIFIC,
94 NOT_USED
96
102typedef enum
103{
104 FALLING_EDGE = 0,
105 RISING_EDGE,
106 LOW_LEVEL,
107 HIGH_LEVEL,
108 BOTH_EDGES,
109 BOTH_LEVELS,
110 NONE
112
119typedef enum
120{
121 IRQ_HANDLED,
122 IRQ_NONE
124
131typedef enum
132{
133 SHARED_HANDLER,
134 UNIQUE_HANDLER
136
143typedef struct
144{
145 /* The BSP defined function code. */
146 uint32_t io_function;
147
148 void *pin_data;
150
155typedef struct
156{
157 rtems_gpio_interrupt active_interrupt;
158
159 rtems_gpio_handler_flag handler_flag;
160
161 bool threaded_interrupts;
162
163 /* Interrupt handler function. */
164 rtems_gpio_irq_state (*handler) (void *arg);
165
166 /* Interrupt handler function arguments. */
167 void *arg;
168
169 /* Software switch debounce settings. It should contain the amount of clock
170 * ticks that must pass between interrupts to ensure that the interrupt
171 * was not caused by a switch bounce.
172 * If set to 0 this feature is disabled . */
173 uint32_t debounce_clock_tick_interval;
175
180typedef struct
181{
182 /* Processor pin number. */
183 uint32_t pin_number;
184 rtems_gpio_function function;
185
186 /* Pull resistor setting. */
187 rtems_gpio_pull_mode pull_mode;
188
189 /* If digital out pin, set to TRUE to set the pin to logical high,
190 * or FALSE for logical low. If not a digital out then this
191 * is ignored. */
192 bool output_enabled;
193
194 /* If true inverts digital in/out applicational logic. */
195 bool logic_invert;
196
197 /* Pin interrupt configuration. Should be NULL if not used. */
199
200 /* Structure with BSP specific data, to use during the pin request.
201 * If function == BSP_SPECIFIC this should have a pointer to
202 * a rtems_gpio_specific_data structure.
203 *
204 * If not this field may be NULL. This is passed to the BSP function
205 * so any BSP specific data can be passed to it through this pointer. */
206 void *bsp_specific;
208
214typedef struct
215{
216 /* Global GPIO pin number. */
217 uint32_t pin_number;
218
219 /* RTEMS GPIO pin function code. */
220 rtems_gpio_function function;
221
222 /* BSP specific function code. Only used if function == BSP_SPECIFIC */
223 uint32_t io_function;
224
225 /* BSP specific data. */
226 void *bsp_specific;
228
233typedef struct
234{
235 const rtems_gpio_pin_conf *digital_inputs;
236 uint32_t input_count;
237
238 const rtems_gpio_pin_conf *digital_outputs;
239 uint32_t output_count;
240
241 const rtems_gpio_pin_conf *bsp_specifics;
242 uint32_t bsp_specific_pin_count;
244
249
265
273
289extern rtems_status_code rtems_gpio_define_pin_group(
290 const rtems_gpio_group_definition *group_definition,
291 rtems_gpio_group *group
292);
293
306 uint32_t data,
307 rtems_gpio_group *group
308);
309
320extern uint32_t rtems_gpio_read_group(rtems_gpio_group *group);
321
336 rtems_gpio_group *group,
337 void *arg
338);
339
350 const rtems_gpio_pin_conf *conf
351);
352
365 const rtems_gpio_pin_conf *conf
366);
367
381 uint32_t *pin_numbers,
382 uint32_t pin_count
383);
384
398 uint32_t *pin_numbers,
399 uint32_t pin_count
400);
401
412extern uint32_t rtems_gpio_multi_read(
413 uint32_t *pin_numbers,
414 uint32_t pin_count
415);
416
428extern rtems_status_code rtems_gpio_set(uint32_t pin_number);
429
441extern rtems_status_code rtems_gpio_clear(uint32_t pin_number);
442
452extern int rtems_gpio_get_value(uint32_t pin_number);
453
472extern rtems_status_code rtems_gpio_multi_select(
473 const rtems_gpio_pin_conf *pins,
474 uint8_t pin_count
475);
476
496extern rtems_status_code rtems_gpio_request_pin(
497 uint32_t pin_number,
498 rtems_gpio_function function,
499 bool output_enable,
500 bool logic_invert,
501 void *bsp_specific
502);
503
515 uint32_t pin_number,
517);
518
529extern rtems_status_code rtems_gpio_release_pin(uint32_t pin_number);
530
541 const rtems_gpio_pin_conf *conf
542);
543
554extern rtems_status_code rtems_gpio_release_multiple_pins(
555 const rtems_gpio_pin_conf *pins,
556 uint32_t pin_count
557);
558
570 rtems_gpio_group *group
571);
572
592 uint32_t pin_number,
593 int ticks
594);
595
616 uint32_t pin_number,
617 rtems_gpio_irq_state (*handler) (void *arg),
618 void *arg
619);
620
648extern rtems_status_code rtems_gpio_enable_interrupt(
649 uint32_t pin_number,
650 rtems_gpio_interrupt interrupt,
652 bool threaded_handling,
653 rtems_gpio_irq_state (*handler) (void *arg),
654 void *arg
655);
656
672 uint32_t pin_number,
673 rtems_gpio_irq_state (*handler) (void *arg),
674 void *arg
675);
676
691extern rtems_status_code rtems_gpio_disable_interrupt(uint32_t pin_number);
692
704 uint32_t bank,
705 uint32_t bitmask
706);
707
719 uint32_t bank,
720 uint32_t bitmask
721);
722
734extern uint32_t rtems_gpio_bsp_multi_read(uint32_t bank, uint32_t bitmask);
735
753extern rtems_status_code rtems_gpio_bsp_specific_group_operation(
754 uint32_t bank,
755 uint32_t *pins,
756 uint32_t pin_count,
757 void *arg
758);
759
777extern rtems_status_code rtems_gpio_bsp_multi_select(
779 uint32_t pin_count,
780 uint32_t select_bank
781);
782
793extern rtems_status_code rtems_gpio_bsp_set(uint32_t bank, uint32_t pin);
794
805extern rtems_status_code rtems_gpio_bsp_clear(uint32_t bank, uint32_t pin);
806
818extern uint32_t rtems_gpio_bsp_get_value(uint32_t bank, uint32_t pin);
819
833 uint32_t bank,
834 uint32_t pin,
835 void *bsp_specific
836);
837
851 uint32_t bank,
852 uint32_t pin,
853 void *bsp_specific
854);
855
870 uint32_t bank,
871 uint32_t pin,
872 uint32_t function,
873 void *pin_data
874);
875
888 uint32_t bank,
889 uint32_t pin,
891);
892
906
916
929 uint32_t bank,
930 uint32_t pin,
931 rtems_gpio_interrupt interrupt
932);
933
946 uint32_t bank,
947 uint32_t pin,
948 rtems_gpio_interrupt interrupt
949);
950
953#ifdef __cplusplus
954}
955#endif /* __cplusplus */
956
957#endif /* LIBBSP_SHARED_GPIO_H */
rtems_status_code rtems_gpio_resistor_mode(uint32_t pin_number, rtems_gpio_pull_mode mode)
Configures a single GPIO pin pull resistor.
Definition: gpio-support.c:1384
rtems_gpio_function
The set of possible functions a pin can have.
Definition: gpio.h:90
@ DIGITAL_OUTPUT
Assigns a certain function to a GPIO pin.
Definition: gpio.h:92
rtems_status_code rtems_gpio_group_bsp_specific_operation(rtems_gpio_group *group, void *arg)
Performs a BSP specific operation on a group of pins. The pins order is as defined in the group defin...
Definition: gpio-support.c:942
rtems_status_code rtems_gpio_bsp_select_specific_io(uint32_t bank, uint32_t pin, uint32_t function, void *pin_data)
Assigns a BSP specific function to the given pin. This must be implemented by each BSP.
Definition: rpi-gpio.c:148
rtems_gpio_irq_state
The set of possible handled states an user-defined interrupt handler can return.
Definition: gpio.h:120
rtems_status_code rtems_gpio_bsp_select_input(uint32_t bank, uint32_t pin, void *bsp_specific)
Assigns the digital input function to the given pin. This must be implemented by each BSP.
Definition: rpi-gpio.c:128
uint32_t rtems_gpio_read_group(rtems_gpio_group *group)
Reads the value/level of the group's digital inputs. The pins order is as defined in the group defini...
Definition: gpio-support.c:906
rtems_status_code rtems_gpio_release_pin(uint32_t pin_number)
Releases a GPIO pin, making it available to be used again.
Definition: gpio-support.c:1429
rtems_status_code rtems_gpio_disable_interrupt(uint32_t pin_number)
Stops interrupts from being generated on a given GPIO pin and removes the corresponding handler.
Definition: gpio-support.c:1889
rtems_status_code rtems_gpio_multi_set(uint32_t *pin_numbers, uint32_t pin_count)
Sets multiple output GPIO pins with the logical high.
Definition: gpio-support.c:1104
rtems_status_code rtems_gpio_bsp_enable_interrupt(uint32_t bank, uint32_t pin, rtems_gpio_interrupt interrupt)
Enables interrupts to be generated on a given GPIO pin. This must be implemented by each BSP.
Definition: rpi-gpio.c:220
rtems_status_code rtems_gpio_initialize(void)
Initializes the GPIO API.
Definition: gpio-support.c:641
rtems_status_code rtems_gpio_bsp_clear(uint32_t bank, uint32_t pin)
Sets an output GPIO pin with the logical low. This must be implemented by each BSP.
Definition: rpi-gpio.c:112
rtems_gpio_handler_flag
The set of flags to specify an user-defined interrupt handler uniqueness on a GPIO pin.
Definition: gpio.h:132
rtems_status_code rtems_gpio_interrupt_handler_remove(uint32_t pin_number, rtems_gpio_irq_state(*handler)(void *arg), void *arg)
Disconnects an user-defined interrupt handler from the given pin. If in the end there are no more use...
Definition: gpio-support.c:1827
int rtems_gpio_get_value(uint32_t pin_number)
Returns the value (level) of a GPIO input pin.
Definition: gpio-support.c:1254
uint32_t rtems_gpio_bsp_get_value(uint32_t bank, uint32_t pin)
Returns the value (level) of a GPIO input pin. This must be implemented by each BSP.
Definition: rpi-gpio.c:121
rtems_status_code rtems_gpio_bsp_multi_set(uint32_t bank, uint32_t bitmask)
Sets multiple output GPIO pins with the logical high. This must be implemented by each BSP.
Definition: rpi-gpio.c:78
rtems_status_code rtems_gpio_update_configuration(const rtems_gpio_pin_conf *conf)
Updates the current configuration of a GPIO pin .
Definition: gpio-support.c:1009
rtems_status_code rtems_gpio_bsp_set_resistor_mode(uint32_t bank, uint32_t pin, rtems_gpio_pull_mode mode)
Configures a single GPIO pin pull resistor. This must be implemented by each BSP.
Definition: rpi-gpio.c:159
rtems_gpio_group * rtems_gpio_create_pin_group(void)
Instantiates a GPIO pin group. To define the group.
Definition: gpio-support.c:681
rtems_status_code rtems_gpio_bsp_disable_interrupt(uint32_t bank, uint32_t pin, rtems_gpio_interrupt interrupt)
Stops interrupts from being generated on a given GPIO pin. This must be implemented by each BSP.
Definition: rpi-gpio.c:266
rtems_gpio_interrupt
The set of possible interrupts a GPIO pin can generate.
Definition: gpio.h:103
rtems_status_code rtems_gpio_bsp_select_output(uint32_t bank, uint32_t pin, void *bsp_specific)
Assigns the digital output function to the given pin. This must be implemented by each BSP.
Definition: rpi-gpio.c:138
uint32_t rtems_gpio_bsp_multi_read(uint32_t bank, uint32_t bitmask)
Returns the value (level) of multiple GPIO input pins. This must be implemented by each BSP.
Definition: rpi-gpio.c:96
rtems_status_code rtems_gpio_write_group(uint32_t data, rtems_gpio_group *group)
Writes a value to the group's digital outputs. The pins order is as defined in the group definition.
Definition: gpio-support.c:841
uint32_t rtems_gpio_bsp_interrupt_line(rtems_vector_number vector)
Reads and returns a vector/bank interrupt event line. The bitmask should indicate with a 1 if the cor...
Definition: rpi-gpio.c:205
rtems_status_code rtems_gpio_debounce_switch(uint32_t pin_number, int ticks)
Attaches a debouncing function to a given pin/switch. Debouncing is done by requiring a certain numbe...
Definition: gpio-support.c:1568
rtems_status_code rtems_gpio_release_pin_group(rtems_gpio_group *group)
Releases a GPIO pin group, making the pins used available to be repurposed.
Definition: gpio-support.c:1499
rtems_status_code rtems_gpio_request_configuration(const rtems_gpio_pin_conf *conf)
Requests a GPIO pin configuration.
Definition: gpio-support.c:981
uint32_t rtems_gpio_multi_read(uint32_t *pin_numbers, uint32_t pin_count)
Returns the value (level) of multiple GPIO input pins.
Definition: gpio-support.c:1150
rtems_status_code rtems_gpio_clear(uint32_t pin_number)
Sets an output GPIO pin with the logical low.
Definition: gpio-support.c:1214
rtems_status_code rtems_gpio_interrupt_handler_install(uint32_t pin_number, rtems_gpio_irq_state(*handler)(void *arg), void *arg)
Connects a new user-defined interrupt handler to a given pin.
Definition: gpio-support.c:1603
rtems_status_code rtems_gpio_bsp_set(uint32_t bank, uint32_t pin)
Sets an output GPIO pin with the logical high. This must be implemented by each BSP.
Definition: rpi-gpio.c:103
rtems_gpio_pull_mode
The set of possible configurations for a GPIO pull-up resistor.
Definition: gpio.h:78
rtems_status_code rtems_gpio_release_configuration(const rtems_gpio_pin_conf *conf)
Releases a GPIO pin, making it available to be used again.
Definition: gpio-support.c:1467
rtems_status_code rtems_gpio_bsp_multi_clear(uint32_t bank, uint32_t bitmask)
Sets multiple output GPIO pins with the logical low. This must be implemented by each BSP.
Definition: rpi-gpio.c:87
rtems_status_code rtems_gpio_set(uint32_t pin_number)
Sets an output GPIO pin with the logical high.
Definition: gpio-support.c:1174
rtems_vector_number rtems_gpio_bsp_get_vector(uint32_t bank)
Calculates a vector number for a given GPIO bank. This must be implemented by each BSP.
Definition: rpi-gpio.c:198
rtems_status_code rtems_gpio_multi_clear(uint32_t *pin_numbers, uint32_t pin_count)
Sets multiple output GPIO pins with the logical low.
Definition: gpio-support.c:1127
ISR_Vector_number rtems_vector_number
This integer type represents interrupt vector numbers.
Definition: intr.h:102
rtems_status_code
This enumeration provides status codes for directives of the Classic API.
Definition: status.h:85
This header file defines the RTEMS Classic API.
Object containing configuration information to request a GPIO pin group.
Definition: gpio.h:234
Object containing relevant information about a GPIO group.
Definition: gpio-support.c:58
Object containing configuration information regarding interrupts.
Definition: gpio.h:156
Object containing configuration information to assign GPIO functions to multiple pins at the same tim...
Definition: gpio.h:215
Object containing configuration information to request/update a GPIO pin.
Definition: gpio.h:181
Object containing relevant information for assigning a BSP specific function to a pin.
Definition: gpio.h:144