RTEMS 6.3
Loading...
Searching...
No Matches
gpio.h
Go to the documentation of this file.
1
8
9/*
10 * Copyright (c) 2014-2015 Andre Marques <andre.lousa.marques at gmail.com>
11 *
12 * The license and distribution terms for this file may be
13 * found in the file LICENSE in this distribution or at
14 * http://www.rtems.org/license/LICENSE.
15 */
16
17#ifndef LIBBSP_SHARED_GPIO_H
18#define LIBBSP_SHARED_GPIO_H
19
20#include <bsp.h>
21#include <rtems.h>
22
23#ifdef __cplusplus
24extern "C" {
25#endif /* __cplusplus */
26
27#if !defined(BSP_GPIO_PIN_COUNT) || !defined(BSP_GPIO_PINS_PER_BANK)
28 #error "BSP_GPIO_PIN_COUNT or BSP_GPIO_PINS_PER_BANK is not defined."
29#endif
30
31#if BSP_GPIO_PIN_COUNT <= 0 || BSP_GPIO_PINS_PER_BANK <= 0
32 #error "Invalid BSP_GPIO_PIN_COUNT or BSP_GPIO_PINS_PER_BANK."
33#endif
34
35#if BSP_GPIO_PINS_PER_BANK > 32
36 #error "Invalid BSP_GPIO_PINS_PER_BANK. Must be in the range of 1 to 32."
37#endif
38
39#define GPIO_LAST_BANK_PINS BSP_GPIO_PIN_COUNT % BSP_GPIO_PINS_PER_BANK
40
41#if GPIO_LAST_BANK_PINS > 0
42 #define GPIO_BANK_COUNT (BSP_GPIO_PIN_COUNT / BSP_GPIO_PINS_PER_BANK) + 1
43#else
44 #define GPIO_BANK_COUNT BSP_GPIO_PIN_COUNT / BSP_GPIO_PINS_PER_BANK
45 #undef GPIO_LAST_BANK_PINS
46 #define GPIO_LAST_BANK_PINS BSP_GPIO_PINS_PER_BANK
47#endif
48
49#if defined(BSP_GPIO_PINS_PER_SELECT_BANK) && BSP_GPIO_PINS_PER_SELECT_BANK > 32
50 #error "Invalid BSP_GPIO_PINS_PER_SELECT_BANK. Must under and including 32."
51#elif defined(BSP_GPIO_PINS_PER_SELECT_BANK) <= 32
52 #define GPIO_SELECT_BANK_COUNT \
53 BSP_GPIO_PINS_PER_BANK / BSP_GPIO_PINS_PER_SELECT_BANK
54#endif
55
56#define INTERRUPT_SERVER_PRIORITY 1
57#define INTERRUPT_SERVER_STACK_SIZE 2 * RTEMS_MINIMUM_STACK_SIZE
58#define INTERRUPT_SERVER_MODES RTEMS_TIMESLICE | RTEMS_PREEMPT
59#define INTERRUPT_SERVER_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
60
61#define GPIO_INPUT_ERROR ~0
62
68
75typedef enum
76{
77 PULL_UP = 1,
78 PULL_DOWN,
79 NO_PULL_RESISTOR
81
87typedef enum
88{
89 DIGITAL_INPUT = 0,
91 BSP_SPECIFIC,
92 NOT_USED
94
100typedef enum
101{
102 FALLING_EDGE = 0,
103 RISING_EDGE,
104 LOW_LEVEL,
105 HIGH_LEVEL,
106 BOTH_EDGES,
107 BOTH_LEVELS,
108 NONE
110
117typedef enum
118{
119 IRQ_HANDLED,
120 IRQ_NONE
122
129typedef enum
130{
131 SHARED_HANDLER,
132 UNIQUE_HANDLER
134
141typedef struct
142{
143 /* The BSP defined function code. */
144 uint32_t io_function;
145
146 void *pin_data;
148
153typedef struct
154{
155 rtems_gpio_interrupt active_interrupt;
156
157 rtems_gpio_handler_flag handler_flag;
158
159 bool threaded_interrupts;
160
161 /* Interrupt handler function. */
162 rtems_gpio_irq_state (*handler) (void *arg);
163
164 /* Interrupt handler function arguments. */
165 void *arg;
166
167 /* Software switch debounce settings. It should contain the amount of clock
168 * ticks that must pass between interrupts to ensure that the interrupt
169 * was not caused by a switch bounce.
170 * If set to 0 this feature is disabled . */
171 uint32_t debounce_clock_tick_interval;
173
178typedef struct
179{
180 /* Processor pin number. */
181 uint32_t pin_number;
182 rtems_gpio_function function;
183
184 /* Pull resistor setting. */
185 rtems_gpio_pull_mode pull_mode;
186
187 /* If digital out pin, set to TRUE to set the pin to logical high,
188 * or FALSE for logical low. If not a digital out then this
189 * is ignored. */
190 bool output_enabled;
191
192 /* If true inverts digital in/out applicational logic. */
193 bool logic_invert;
194
195 /* Pin interrupt configuration. Should be NULL if not used. */
197
198 /* Structure with BSP specific data, to use during the pin request.
199 * If function == BSP_SPECIFIC this should have a pointer to
200 * a rtems_gpio_specific_data structure.
201 *
202 * If not this field may be NULL. This is passed to the BSP function
203 * so any BSP specific data can be passed to it through this pointer. */
204 void *bsp_specific;
206
212typedef struct
213{
214 /* Global GPIO pin number. */
215 uint32_t pin_number;
216
217 /* RTEMS GPIO pin function code. */
218 rtems_gpio_function function;
219
220 /* BSP specific function code. Only used if function == BSP_SPECIFIC */
221 uint32_t io_function;
222
223 /* BSP specific data. */
224 void *bsp_specific;
226
231typedef struct
232{
233 const rtems_gpio_pin_conf *digital_inputs;
234 uint32_t input_count;
235
236 const rtems_gpio_pin_conf *digital_outputs;
237 uint32_t output_count;
238
239 const rtems_gpio_pin_conf *bsp_specifics;
240 uint32_t bsp_specific_pin_count;
242
247
249
255
263
271
287extern rtems_status_code rtems_gpio_define_pin_group(
288 const rtems_gpio_group_definition *group_definition,
289 rtems_gpio_group *group
290);
291
304 uint32_t data,
305 rtems_gpio_group *group
306);
307
318extern uint32_t rtems_gpio_read_group(rtems_gpio_group *group);
319
334 rtems_gpio_group *group,
335 void *arg
336);
337
338extern rtems_status_code rtems_bsp_select_specific_io(
339 uint32_t bank,
340 uint32_t pin,
341 uint32_t function,
342 void *pin_data
343);
344
355 const rtems_gpio_pin_conf *conf
356);
357
370 const rtems_gpio_pin_conf *conf
371);
372
386 uint32_t *pin_numbers,
387 uint32_t pin_count
388);
389
403 uint32_t *pin_numbers,
404 uint32_t pin_count
405);
406
417extern uint32_t rtems_gpio_multi_read(
418 uint32_t *pin_numbers,
419 uint32_t pin_count
420);
421
433extern rtems_status_code rtems_gpio_set(uint32_t pin_number);
434
446extern rtems_status_code rtems_gpio_clear(uint32_t pin_number);
447
457extern int rtems_gpio_get_value(uint32_t pin_number);
458
477extern rtems_status_code rtems_gpio_multi_select(
478 const rtems_gpio_pin_conf *pins,
479 uint8_t pin_count
480);
481
501extern rtems_status_code rtems_gpio_request_pin(
502 uint32_t pin_number,
503 rtems_gpio_function function,
504 bool output_enable,
505 bool logic_invert,
506 void *bsp_specific
507);
508
520 uint32_t pin_number,
522);
523
534extern rtems_status_code rtems_gpio_release_pin(uint32_t pin_number);
535
546 const rtems_gpio_pin_conf *conf
547);
548
559extern rtems_status_code rtems_gpio_release_multiple_pins(
560 const rtems_gpio_pin_conf *pins,
561 uint32_t pin_count
562);
563
575 rtems_gpio_group *group
576);
577
597 uint32_t pin_number,
598 int ticks
599);
600
621 uint32_t pin_number,
622 rtems_gpio_irq_state (*handler) (void *arg),
623 void *arg
624);
625
653extern rtems_status_code rtems_gpio_enable_interrupt(
654 uint32_t pin_number,
655 rtems_gpio_interrupt interrupt,
657 bool threaded_handling,
658 rtems_gpio_irq_state (*handler) (void *arg),
659 void *arg
660);
661
677 uint32_t pin_number,
678 rtems_gpio_irq_state (*handler) (void *arg),
679 void *arg
680);
681
696extern rtems_status_code rtems_gpio_disable_interrupt(uint32_t pin_number);
697
709 uint32_t bank,
710 uint32_t bitmask
711);
712
724 uint32_t bank,
725 uint32_t bitmask
726);
727
739extern uint32_t rtems_gpio_bsp_multi_read(uint32_t bank, uint32_t bitmask);
740
758extern rtems_status_code rtems_gpio_bsp_specific_group_operation(
759 uint32_t bank,
760 uint32_t *pins,
761 uint32_t pin_count,
762 void *arg
763);
764
782extern rtems_status_code rtems_gpio_bsp_multi_select(
784 uint32_t pin_count,
785 uint32_t select_bank
786);
787
798extern rtems_status_code rtems_gpio_bsp_set(uint32_t bank, uint32_t pin);
799
810extern rtems_status_code rtems_gpio_bsp_clear(uint32_t bank, uint32_t pin);
811
823extern uint32_t rtems_gpio_bsp_get_value(uint32_t bank, uint32_t pin);
824
838 uint32_t bank,
839 uint32_t pin,
840 void *bsp_specific
841);
842
856 uint32_t bank,
857 uint32_t pin,
858 void *bsp_specific
859);
860
875 uint32_t bank,
876 uint32_t pin,
877 uint32_t function,
878 void *pin_data
879);
880
893 uint32_t bank,
894 uint32_t pin,
896);
897
911
921
934 uint32_t bank,
935 uint32_t pin,
936 rtems_gpio_interrupt interrupt
937);
938
939extern rtems_status_code rtems_bsp_enable_interrupt(
940 uint32_t bank,
941 uint32_t pin,
942 rtems_gpio_interrupt interrupt
943);
944
957 uint32_t bank,
958 uint32_t pin,
959 rtems_gpio_interrupt interrupt
960);
961
962extern rtems_status_code rtems_bsp_disable_interrupt(
963 uint32_t bank,
964 uint32_t pin,
965 rtems_gpio_interrupt interrupt
966);
967
969
970#ifdef __cplusplus
971}
972#endif /* __cplusplus */
973
974#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:1386
rtems_gpio_function
The set of possible functions a pin can have.
Definition gpio.h:88
@ DIGITAL_OUTPUT
Assigns a certain function to a GPIO pin.
Definition gpio.h:90
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:941
rtems_gpio_irq_state
The set of possible handled states an user-defined interrupt handler can return.
Definition gpio.h:118
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:905
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:1431
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:1891
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:1103
rtems_status_code rtems_gpio_initialize(void)
Initializes the GPIO API.
Definition gpio-support.c:640
rtems_gpio_handler_flag
The set of flags to specify an user-defined interrupt handler uniqueness on a GPIO pin.
Definition gpio.h:130
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:1829
int rtems_gpio_get_value(uint32_t pin_number)
Returns the value (level) of a GPIO input pin.
Definition gpio-support.c:1253
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:1008
rtems_gpio_group * rtems_gpio_create_pin_group(void)
Instantiates a GPIO pin group. To define the group.
Definition gpio-support.c:680
rtems_gpio_interrupt
The set of possible interrupts a GPIO pin can generate.
Definition gpio.h:101
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:840
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:1570
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:1501
rtems_status_code rtems_gpio_request_configuration(const rtems_gpio_pin_conf *conf)
Requests a GPIO pin configuration.
Definition gpio-support.c:980
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:1149
rtems_status_code rtems_gpio_clear(uint32_t pin_number)
Sets an output GPIO pin with the logical low.
Definition gpio-support.c:1213
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:1605
rtems_gpio_pull_mode
The set of possible configurations for a GPIO pull-up resistor.
Definition gpio.h:76
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:1469
rtems_status_code rtems_gpio_set(uint32_t pin_number)
Sets an output GPIO pin with the logical high.
Definition gpio-support.c:1173
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:1126
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
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:128
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:112
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:192
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:100
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:107
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:74
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:137
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:236
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:120
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:88
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:179
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:93
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:81
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:174
This header file defines the RTEMS Classic API.
Object containing configuration information to request a GPIO pin group.
Definition gpio.h:232
Object containing relevant information about a GPIO group.
Definition gpio-support.c:56
Object containing configuration information regarding interrupts.
Definition gpio.h:154
Object containing configuration information to assign GPIO functions to multiple pins at the same tim...
Definition gpio.h:213
Object containing configuration information to request/update a GPIO pin.
Definition gpio.h:179
Object containing relevant information for assigning a BSP specific function to a pin.
Definition gpio.h:142