]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A2F200_SoftConsole/MicroSemi_Code/drivers/mss_gpio/mss_gpio.c
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / CORTEX_A2F200_SoftConsole / MicroSemi_Code / drivers / mss_gpio / mss_gpio.c
1 /*******************************************************************************\r
2  * (c) Copyright 2008 Actel Corporation.  All rights reserved.\r
3  * \r
4  * SmartFusion microcontroller subsystem GPIO bare metal driver implementation.\r
5  *\r
6  * SVN $Revision: 1753 $\r
7  * SVN $Date: 2009-12-11 15:12:18 +0000 (Fri, 11 Dec 2009) $\r
8  */\r
9 #include "mss_gpio.h"\r
10 #include "../../CMSIS/mss_assert.h"\r
11 \r
12 #ifdef __cplusplus\r
13 extern "C" {\r
14 #endif \r
15 \r
16 /*-------------------------------------------------------------------------*//**\r
17 *\r
18 */\r
19 #define GPIO_INT_ENABLE_MASK        (uint32_t)0x00000008UL\r
20 #define OUTPUT_BUFFER_ENABLE_MASK   0x00000004UL\r
21 \r
22 #define NB_OF_GPIO  (uint32_t)32\r
23 \r
24 /*-------------------------------------------------------------------------*//**\r
25  * Lookup table of GPIO configuration registers address indexed on GPIO ID.\r
26  */\r
27 static uint32_t volatile * const g_config_reg_lut[NB_OF_GPIO] =\r
28 {\r
29     &(GPIO->GPIO_0_CFG),\r
30     &(GPIO->GPIO_1_CFG),\r
31     &(GPIO->GPIO_2_CFG),\r
32     &(GPIO->GPIO_3_CFG),\r
33     &(GPIO->GPIO_4_CFG),\r
34     &(GPIO->GPIO_5_CFG),\r
35     &(GPIO->GPIO_6_CFG),\r
36     &(GPIO->GPIO_7_CFG),\r
37     &(GPIO->GPIO_8_CFG),\r
38     &(GPIO->GPIO_9_CFG),\r
39     &(GPIO->GPIO_10_CFG),\r
40     &(GPIO->GPIO_11_CFG),\r
41     &(GPIO->GPIO_12_CFG),\r
42     &(GPIO->GPIO_13_CFG),\r
43     &(GPIO->GPIO_14_CFG),\r
44     &(GPIO->GPIO_15_CFG),\r
45     &(GPIO->GPIO_16_CFG),\r
46     &(GPIO->GPIO_17_CFG),\r
47     &(GPIO->GPIO_18_CFG),\r
48     &(GPIO->GPIO_19_CFG),\r
49     &(GPIO->GPIO_20_CFG),\r
50     &(GPIO->GPIO_21_CFG),\r
51     &(GPIO->GPIO_22_CFG),\r
52     &(GPIO->GPIO_23_CFG),\r
53     &(GPIO->GPIO_24_CFG),\r
54     &(GPIO->GPIO_25_CFG),\r
55     &(GPIO->GPIO_26_CFG),\r
56     &(GPIO->GPIO_27_CFG),\r
57     &(GPIO->GPIO_28_CFG),\r
58     &(GPIO->GPIO_29_CFG),\r
59     &(GPIO->GPIO_30_CFG),\r
60     &(GPIO->GPIO_31_CFG)\r
61 };\r
62 \r
63 /*-------------------------------------------------------------------------*//**\r
64  * Lookup table of Cortex-M3 GPIO interrupt number indexed on GPIO ID.\r
65  */\r
66 static const IRQn_Type g_gpio_irqn_lut[NB_OF_GPIO] =\r
67 {\r
68     GPIO0_IRQn,\r
69     GPIO1_IRQn,\r
70     GPIO2_IRQn,\r
71     GPIO3_IRQn,\r
72     GPIO4_IRQn,\r
73     GPIO5_IRQn,\r
74     GPIO6_IRQn,\r
75     GPIO7_IRQn,\r
76     GPIO8_IRQn,\r
77     GPIO9_IRQn,\r
78     GPIO10_IRQn,\r
79     GPIO11_IRQn,\r
80     GPIO12_IRQn,\r
81     GPIO13_IRQn,\r
82     GPIO14_IRQn,\r
83     GPIO15_IRQn,\r
84     GPIO16_IRQn,\r
85     GPIO17_IRQn,\r
86     GPIO18_IRQn,\r
87     GPIO19_IRQn,\r
88     GPIO20_IRQn,\r
89     GPIO21_IRQn,\r
90     GPIO22_IRQn,\r
91     GPIO23_IRQn,\r
92     GPIO24_IRQn,\r
93     GPIO25_IRQn,\r
94     GPIO26_IRQn,\r
95     GPIO27_IRQn,\r
96     GPIO28_IRQn,\r
97     GPIO29_IRQn,\r
98     GPIO30_IRQn,\r
99     GPIO31_IRQn\r
100 };\r
101 \r
102 /*-------------------------------------------------------------------------*//**\r
103  * MSS_GPIO_init\r
104  * See "mss_gpio.h" for details of how to use this function.\r
105  */\r
106 void MSS_GPIO_init( void )\r
107 {\r
108     uint32_t i;\r
109     \r
110     /* reset MSS GPIO hardware */\r
111     SYSREG->SOFT_RST_CR |= SYSREG_GPIO_SOFTRESET_MASK;\r
112     /* Clear any previously pended MSS GPIO interrupt */\r
113     for ( i = 0U; i < NB_OF_GPIO; ++i )\r
114     {\r
115         NVIC_ClearPendingIRQ( g_gpio_irqn_lut[i] );\r
116     }\r
117     /* Take MSS GPIO hardware out of reset. */\r
118     SYSREG->SOFT_RST_CR &= ~SYSREG_GPIO_SOFTRESET_MASK;\r
119 }\r
120 \r
121 /*-------------------------------------------------------------------------*//**\r
122  * MSS_GPIO_config\r
123  * See "mss_gpio.h" for details of how to use this function.\r
124  */\r
125 void MSS_GPIO_config\r
126 (\r
127     mss_gpio_id_t port_id,\r
128     uint32_t config\r
129 )\r
130 {\r
131     uint32_t gpio_idx = (uint32_t)port_id;\r
132     \r
133     ASSERT( gpio_idx < NB_OF_GPIO );\r
134 \r
135     if ( gpio_idx < NB_OF_GPIO )\r
136     {\r
137         *(g_config_reg_lut[gpio_idx]) = config;\r
138     }\r
139 }\r
140 \r
141 /*-------------------------------------------------------------------------*//**\r
142  * MSS_GPIO_set_output\r
143  * See "mss_gpio.h" for details of how to use this function.\r
144  */\r
145 void MSS_GPIO_set_output\r
146 (\r
147     mss_gpio_id_t       port_id,\r
148     uint8_t             value\r
149 )\r
150 {\r
151     uint32_t gpio_idx = (uint32_t)port_id;\r
152     \r
153     ASSERT( gpio_idx < NB_OF_GPIO );\r
154     \r
155     if ( gpio_idx < NB_OF_GPIO )\r
156     {\r
157         GPIO_BITBAND->GPIO_OUT[gpio_idx] = (uint32_t)value;\r
158     }\r
159 }\r
160 \r
161 /*-------------------------------------------------------------------------*//**\r
162  * MSS_GPIO_drive_inout\r
163  * See "mss_gpio.h" for details of how to use this function.\r
164  */\r
165 void MSS_GPIO_drive_inout\r
166 (\r
167     mss_gpio_id_t port_id,\r
168     mss_gpio_inout_state_t inout_state\r
169 )\r
170 {\r
171     uint32_t outputs_state;\r
172     uint32_t config;\r
173     uint32_t gpio_idx = (uint32_t)port_id;\r
174     \r
175     ASSERT( gpio_idx < NB_OF_GPIO );\r
176     \r
177     if ( gpio_idx < NB_OF_GPIO )\r
178     {\r
179         switch( inout_state )\r
180         {\r
181         case MSS_GPIO_DRIVE_HIGH:\r
182             /* Set output high */\r
183             outputs_state = GPIO->GPIO_OUT;\r
184             outputs_state |= (uint32_t)1 << gpio_idx;\r
185             GPIO->GPIO_OUT = outputs_state;\r
186             /* Enable output buffer */\r
187             config = *(g_config_reg_lut[gpio_idx]);\r
188             config |= OUTPUT_BUFFER_ENABLE_MASK;\r
189             *(g_config_reg_lut[gpio_idx]) = config;\r
190             break;\r
191             \r
192         case MSS_GPIO_DRIVE_LOW:\r
193             /* Set output low */\r
194             outputs_state = GPIO->GPIO_OUT;\r
195             outputs_state &= ~((uint32_t)((uint32_t)1 << gpio_idx));\r
196             GPIO->GPIO_OUT = outputs_state;\r
197             /* Enable output buffer */\r
198             config = *(g_config_reg_lut[gpio_idx]);\r
199             config |= OUTPUT_BUFFER_ENABLE_MASK;\r
200             *(g_config_reg_lut[gpio_idx]) = config;\r
201             break;\r
202             \r
203         case MSS_GPIO_HIGH_Z:\r
204             /* Disable output buffer */\r
205             config = *(g_config_reg_lut[gpio_idx]);\r
206             config &= ~OUTPUT_BUFFER_ENABLE_MASK;\r
207             *(g_config_reg_lut[gpio_idx]) = config;\r
208             break;\r
209             \r
210         default:\r
211             ASSERT(0);\r
212             break;\r
213         }\r
214     }\r
215 }\r
216 \r
217 /*-------------------------------------------------------------------------*//**\r
218  * MSS_GPIO_enable_irq\r
219  * See "mss_gpio.h" for details of how to use this function.\r
220  */\r
221 void MSS_GPIO_enable_irq\r
222 (\r
223     mss_gpio_id_t port_id\r
224 )\r
225 {\r
226     uint32_t cfg_value;\r
227     uint32_t gpio_idx = (uint32_t)port_id;\r
228     \r
229     ASSERT( gpio_idx < NB_OF_GPIO );\r
230     \r
231     if ( gpio_idx < NB_OF_GPIO )\r
232     {\r
233         cfg_value = *(g_config_reg_lut[gpio_idx]);\r
234         *(g_config_reg_lut[gpio_idx]) = (cfg_value | GPIO_INT_ENABLE_MASK);\r
235         NVIC_EnableIRQ( g_gpio_irqn_lut[gpio_idx] );\r
236     }\r
237 }\r
238 \r
239 /*-------------------------------------------------------------------------*//**\r
240  * MSS_GPIO_disable_irq\r
241  * See "mss_gpio.h" for details of how to use this function.\r
242  */\r
243 void MSS_GPIO_disable_irq\r
244 (\r
245     mss_gpio_id_t port_id\r
246 )\r
247 {\r
248     uint32_t cfg_value;\r
249     uint32_t gpio_idx = (uint32_t)port_id;\r
250     \r
251     ASSERT( gpio_idx < NB_OF_GPIO );\r
252 \r
253     if ( gpio_idx < NB_OF_GPIO )\r
254     {\r
255         cfg_value = *(g_config_reg_lut[gpio_idx]);\r
256         *(g_config_reg_lut[gpio_idx]) = (cfg_value & ~GPIO_INT_ENABLE_MASK);\r
257     }\r
258 }\r
259 \r
260 /*-------------------------------------------------------------------------*//**\r
261  * MSS_GPIO_clear_irq\r
262  * See "mss_gpio.h" for details of how to use this function.\r
263  */\r
264 void MSS_GPIO_clear_irq\r
265 (\r
266     mss_gpio_id_t port_id\r
267 )\r
268 {\r
269     uint32_t gpio_idx = (uint32_t)port_id;\r
270     \r
271     ASSERT( gpio_idx < NB_OF_GPIO );\r
272     \r
273     if ( gpio_idx < NB_OF_GPIO )\r
274     {\r
275         GPIO->GPIO_IRQ = ((uint32_t)1) << gpio_idx;\r
276         NVIC_ClearPendingIRQ( g_gpio_irqn_lut[gpio_idx] );\r
277     }\r
278 }\r
279 \r
280 #ifdef __cplusplus\r
281 }\r
282 #endif\r
283 \r