UoS³ Flight Computer Firmware
 All Data Structures Files Functions Groups Pages
gpio.c
Go to the documentation of this file.
1 
11 #include "board.h"
12 #include "../gpio.h"
13 
14 #include "inc/hw_memmap.h"
15 
16 #include "driverlib/gpio.h"
17 #include "driverlib/sysctl.h"
18 
19 /* LED description struct */
20 typedef struct GPIO {
21  uint32_t peripheral; // TI Driver Peripheral Reference
22  uint32_t port; // TI Driver Port Reference
23  uint8_t pin; // TI Driver Pin Reference
24  bool initialised;
25  GPIO_mode mode;
26 } GPIO;
27 
28 static GPIO GPIO_gpios[48] =
29  { { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_0, false, GPIO_MODE_INPUT }
30  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_1, false, GPIO_MODE_INPUT }
31  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_2, false, GPIO_MODE_INPUT }
32  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_3, false, GPIO_MODE_INPUT }
33  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_4, false, GPIO_MODE_INPUT }
34  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_5, false, GPIO_MODE_INPUT }
35  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_6, false, GPIO_MODE_INPUT }
36  , { SYSCTL_PERIPH_GPIOA, GPIO_PORTA_BASE, GPIO_PIN_7, false, GPIO_MODE_INPUT }
37  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_0, false, GPIO_MODE_INPUT }
38  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_1, false, GPIO_MODE_INPUT }
39  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_2, false, GPIO_MODE_INPUT }
40  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_3, false, GPIO_MODE_INPUT }
41  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_4, false, GPIO_MODE_INPUT }
42  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_5, false, GPIO_MODE_INPUT }
43  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_6, false, GPIO_MODE_INPUT }
44  , { SYSCTL_PERIPH_GPIOB, GPIO_PORTB_BASE, GPIO_PIN_7, false, GPIO_MODE_INPUT }
45  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_0, false, GPIO_MODE_INPUT }
46  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_1, false, GPIO_MODE_INPUT }
47  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_2, false, GPIO_MODE_INPUT }
48  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_3, false, GPIO_MODE_INPUT }
49  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_4, false, GPIO_MODE_INPUT }
50  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_5, false, GPIO_MODE_INPUT }
51  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_6, false, GPIO_MODE_INPUT }
52  , { SYSCTL_PERIPH_GPIOC, GPIO_PORTC_BASE, GPIO_PIN_7, false, GPIO_MODE_INPUT }
53  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_0, false, GPIO_MODE_INPUT }
54  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_1, false, GPIO_MODE_INPUT }
55  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_2, false, GPIO_MODE_INPUT }
56  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_3, false, GPIO_MODE_INPUT }
57  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_4, false, GPIO_MODE_INPUT }
58  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_5, false, GPIO_MODE_INPUT }
59  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_6, false, GPIO_MODE_INPUT }
60  , { SYSCTL_PERIPH_GPIOD, GPIO_PORTD_BASE, GPIO_PIN_7, false, GPIO_MODE_INPUT }
61  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_0, false, GPIO_MODE_INPUT }
62  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_1, false, GPIO_MODE_INPUT }
63  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_2, false, GPIO_MODE_INPUT }
64  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_3, false, GPIO_MODE_INPUT }
65  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_4, false, GPIO_MODE_INPUT }
66  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_5, false, GPIO_MODE_INPUT }
67  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_6, false, GPIO_MODE_INPUT }
68  , { SYSCTL_PERIPH_GPIOE, GPIO_PORTE_BASE, GPIO_PIN_7, false, GPIO_MODE_INPUT }
69  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_0, false, GPIO_MODE_INPUT }
70  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_1, false, GPIO_MODE_INPUT }
71  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_2, false, GPIO_MODE_INPUT }
72  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_3, false, GPIO_MODE_INPUT }
73  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_4, false, GPIO_MODE_INPUT }
74  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_5, false, GPIO_MODE_INPUT }
75  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_6, false, GPIO_MODE_INPUT }
76  , { SYSCTL_PERIPH_GPIOF, GPIO_PORTF_BASE, GPIO_PIN_7, false, GPIO_MODE_INPUT }
77  };
78 #define NUMBER_OF_GPIOS ( sizeof(GPIO_gpios) / sizeof(GPIO) )
79 
80 static void GPIO_mode_init(GPIO *gpio, GPIO_mode mode)
81 {
82  switch(mode)
83  {
84  case GPIO_MODE_INPUT:
85  GPIOPinTypeGPIOInput(gpio->port, gpio->pin);
86  break;
87 
88  case GPIO_MODE_OUTPUT:
89  GPIOPinTypeGPIOOutput(gpio->port, gpio->pin);
90  break;
91 
92  default:
93  break;
94  }
95 
96  gpio->mode = mode;
97 }
98 
99 static void GPIO_init(GPIO *gpio, GPIO_mode mode)
100 {
101  if(!gpio->initialised)
102  {
103  /* Initialise Peripheral if not already initialised */
104  if(!SysCtlPeripheralReady(gpio->peripheral))
105  {
106  SysCtlPeripheralEnable(gpio->peripheral);
107  while(!SysCtlPeripheralReady(gpio->peripheral)) { };
108  }
109 
110  GPIO_mode_init(gpio, mode);
111 
112  gpio->initialised = true;
113  }
114  else if(mode != gpio->mode)
115  {
116  GPIO_mode_init(gpio, mode);
117  }
118 }
119 
120 void GPIO_set(uint8_t gpio_num)
121 {
122  GPIO_write(gpio_num, true);
123 }
124 
125 void GPIO_reset(uint8_t gpio_num)
126 {
127  GPIO_write(gpio_num, false);
128 }
129 
130 /* Third argument is a bit mask of bits to be set */
131 #define GPIO_Pin_Write(gpio, value) GPIOPinWrite(gpio->port, gpio->pin, value ? gpio->pin : 0x00)
132 
133 void GPIO_write(uint8_t gpio_num, bool state)
134 {
135  if(gpio_num >= NUMBER_OF_GPIOS)
136  return;
137  GPIO *gpio = &GPIO_gpios[gpio_num];
138 
139  GPIO_init(gpio, GPIO_MODE_OUTPUT);
140 
141  GPIO_Pin_Write(gpio, state);
142 }
143 
144 /* Bit mask the returned 32 bits for the required pin and convert to boolean */
145 #define GPIO_Pin_Read(gpio) !!(GPIOPinRead(gpio->port, gpio->pin) & gpio->pin)
146 
147 bool GPIO_read(uint8_t gpio_num)
148 {
149  if(gpio_num >= NUMBER_OF_GPIOS)
150  return false;
151  GPIO *gpio = &GPIO_gpios[gpio_num];
152 
153  GPIO_init(gpio, GPIO_MODE_INPUT);
154 
155  return GPIO_Pin_Read(gpio);
156 }
157 
bool GPIO_read(uint8_t gpio_num)
Definition: gpio.c:29
void GPIO_set(uint8_t gpio_num)
Definition: gpio.c:13
Definition: gpio.c:20
void GPIO_write(uint8_t gpio_num, bool state)
Definition: gpio.c:23
void GPIO_reset(uint8_t gpio_num)
Definition: gpio.c:18