]> begriffs open source - freertos/blob - FreeRTOS/Demo/MSP430X_MSP430FR5969_LaunchPad/driverlib/MSP430FR5xx_6xx/gpio.c
Rename /Demo/MSP430FR5969_LaunchPad to /Demo/MSP430X_MSP430FR5969_LaunchPad for consi...
[freertos] / FreeRTOS / Demo / MSP430X_MSP430FR5969_LaunchPad / driverlib / MSP430FR5xx_6xx / gpio.c
1 /* --COPYRIGHT--,BSD\r
2  * Copyright (c) 2014, Texas Instruments Incorporated\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without\r
6  * modification, are permitted provided that the following conditions\r
7  * are met:\r
8  *\r
9  * *  Redistributions of source code must retain the above copyright\r
10  *    notice, this list of conditions and the following disclaimer.\r
11  *\r
12  * *  Redistributions in binary form must reproduce the above copyright\r
13  *    notice, this list of conditions and the following disclaimer in the\r
14  *    documentation and/or other materials provided with the distribution.\r
15  *\r
16  * *  Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\r
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\r
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\r
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  * --/COPYRIGHT--*/\r
32 //*****************************************************************************\r
33 //\r
34 // gpio.c - Driver for the gpio Module.\r
35 //\r
36 //*****************************************************************************\r
37 \r
38 //*****************************************************************************\r
39 //\r
40 //! \addtogroup gpio_api gpio\r
41 //! @{\r
42 //\r
43 //*****************************************************************************\r
44 \r
45 #include "inc/hw_regaccess.h"\r
46 #include "inc/hw_memmap.h"\r
47 \r
48 #if defined(__MSP430_HAS_PORT1_R__) || defined(__MSP430_HAS_PORT2_R__) || \\r
49     defined(__MSP430_HAS_PORTA_R__)\r
50 #include "gpio.h"\r
51 \r
52 #include <assert.h>\r
53 \r
54 static const uint16_t GPIO_PORT_TO_BASE[] = {\r
55     0x00,\r
56 #if defined(__MSP430_HAS_PORT1_R__)\r
57     __MSP430_BASEADDRESS_PORT1_R__,\r
58 #elif defined(__MSP430_HAS_PORT1__)\r
59     __MSP430_BASEADDRESS_PORT1__,\r
60 #else\r
61     0xFFFF,\r
62 #endif\r
63 #if defined(__MSP430_HAS_PORT2_R__)\r
64     __MSP430_BASEADDRESS_PORT2_R__,\r
65 #elif defined(__MSP430_HAS_PORT2__)\r
66     __MSP430_BASEADDRESS_PORT2__,\r
67 #else\r
68     0xFFFF,\r
69 #endif\r
70 #if defined(__MSP430_HAS_PORT3_R__)\r
71     __MSP430_BASEADDRESS_PORT3_R__,\r
72 #elif defined(__MSP430_HAS_PORT3__)\r
73     __MSP430_BASEADDRESS_PORT3__,\r
74 #else\r
75     0xFFFF,\r
76 #endif\r
77 #if defined(__MSP430_HAS_PORT4_R__)\r
78     __MSP430_BASEADDRESS_PORT4_R__,\r
79 #elif defined(__MSP430_HAS_PORT4__)\r
80     __MSP430_BASEADDRESS_PORT4__,\r
81 #else\r
82     0xFFFF,\r
83 #endif\r
84 #if defined(__MSP430_HAS_PORT5_R__)\r
85     __MSP430_BASEADDRESS_PORT5_R__,\r
86 #elif defined(__MSP430_HAS_PORT5__)\r
87     __MSP430_BASEADDRESS_PORT5__,\r
88 #else\r
89     0xFFFF,\r
90 #endif\r
91 #if defined(__MSP430_HAS_PORT6_R__)\r
92     __MSP430_BASEADDRESS_PORT6_R__,\r
93 #elif defined(__MSP430_HAS_PORT6__)\r
94     __MSP430_BASEADDRESS_PORT6__,\r
95 #else\r
96     0xFFFF,\r
97 #endif\r
98 #if defined(__MSP430_HAS_PORT7_R__)\r
99     __MSP430_BASEADDRESS_PORT7_R__,\r
100 #elif defined(__MSP430_HAS_PORT7__)\r
101     __MSP430_BASEADDRESS_PORT7__,\r
102 #else\r
103     0xFFFF,\r
104 #endif\r
105 #if defined(__MSP430_HAS_PORT8_R__)\r
106     __MSP430_BASEADDRESS_PORT8_R__,\r
107 #elif defined(__MSP430_HAS_PORT8__)\r
108     __MSP430_BASEADDRESS_PORT8__,\r
109 #else\r
110     0xFFFF,\r
111 #endif\r
112 #if defined(__MSP430_HAS_PORT9_R__)\r
113     __MSP430_BASEADDRESS_PORT9_R__,\r
114 #elif defined(__MSP430_HAS_PORT9__)\r
115     __MSP430_BASEADDRESS_PORT9__,\r
116 #else\r
117     0xFFFF,\r
118 #endif\r
119 #if defined(__MSP430_HAS_PORT10_R__)\r
120     __MSP430_BASEADDRESS_PORT10_R__,\r
121 #elif defined(__MSP430_HAS_PORT10__)\r
122     __MSP430_BASEADDRESS_PORT10__,\r
123 #else\r
124     0xFFFF,\r
125 #endif\r
126 #if defined(__MSP430_HAS_PORT11_R__)\r
127     __MSP430_BASEADDRESS_PORT11_R__,\r
128 #elif defined(__MSP430_HAS_PORT11__)\r
129     __MSP430_BASEADDRESS_PORT11__,\r
130 #else\r
131     0xFFFF,\r
132 #endif\r
133     0xFFFF,\r
134 #if defined(__MSP430_HAS_PORTJ_R__)\r
135     __MSP430_BASEADDRESS_PORTJ_R__\r
136 #elif defined(__MSP430_HAS_PORTJ__)\r
137     __MSP430_BASEADDRESS_PORTJ__\r
138 #else\r
139     0xFFFF\r
140 #endif\r
141 };\r
142 \r
143 void GPIO_setAsOutputPin(uint8_t selectedPort,\r
144                          uint16_t selectedPins) {\r
145     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
146 \r
147     #ifndef NDEBUG\r
148     if(baseAddress == 0xFFFF)\r
149     {\r
150         return;\r
151     }\r
152     #endif\r
153 \r
154     // Shift by 8 if port is even (upper 8-bits)\r
155     if((selectedPort & 1) ^ 1)\r
156     {\r
157         selectedPins <<= 8;\r
158     }\r
159 \r
160     HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins;\r
161     HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins;\r
162     HWREG16(baseAddress + OFS_PADIR) |= selectedPins;\r
163 \r
164     return;\r
165 }\r
166 \r
167 void GPIO_setAsInputPin(uint8_t selectedPort,\r
168                         uint16_t selectedPins) {\r
169     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
170 \r
171     #ifndef NDEBUG\r
172     if(baseAddress == 0xFFFF)\r
173     {\r
174         return;\r
175     }\r
176     #endif\r
177 \r
178     // Shift by 8 if port is even (upper 8-bits)\r
179     if((selectedPort & 1) ^ 1)\r
180     {\r
181         selectedPins <<= 8;\r
182     }\r
183 \r
184     HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins;\r
185     HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins;\r
186     HWREG16(baseAddress + OFS_PADIR) &= ~selectedPins;\r
187     HWREG16(baseAddress + OFS_PAREN) &= ~selectedPins;\r
188 }\r
189 \r
190 void GPIO_setAsPeripheralModuleFunctionOutputPin(uint8_t selectedPort,\r
191                                                  uint16_t selectedPins\r
192                                                  ,\r
193                                                  uint8_t mode) {\r
194     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
195 \r
196     #ifndef NDEBUG\r
197     if(baseAddress == 0xFFFF)\r
198     {\r
199         return;\r
200     }\r
201     #endif\r
202 \r
203     // Shift by 8 if port is even (upper 8-bits)\r
204     if((selectedPort & 1) ^ 1)\r
205     {\r
206         selectedPins <<= 8;\r
207     }\r
208 \r
209     HWREG16(baseAddress + OFS_PADIR) |= selectedPins;\r
210     switch(mode)\r
211     {\r
212     case GPIO_PRIMARY_MODULE_FUNCTION:\r
213         HWREG16(baseAddress + OFS_PASEL0) |= selectedPins;\r
214         HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins;\r
215         break;\r
216     case GPIO_SECONDARY_MODULE_FUNCTION:\r
217         HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins;\r
218         HWREG16(baseAddress + OFS_PASEL1) |= selectedPins;\r
219         break;\r
220     case GPIO_TERNARY_MODULE_FUNCTION:\r
221         HWREG16(baseAddress + OFS_PASEL0) |= selectedPins;\r
222         HWREG16(baseAddress + OFS_PASEL1) |= selectedPins;\r
223         break;\r
224     }\r
225 }\r
226 \r
227 void GPIO_setAsPeripheralModuleFunctionInputPin(uint8_t selectedPort,\r
228                                                 uint16_t selectedPins\r
229                                                 ,\r
230                                                 uint8_t mode) {\r
231     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
232 \r
233     #ifndef NDEBUG\r
234     if(baseAddress == 0xFFFF)\r
235     {\r
236         return;\r
237     }\r
238     #endif\r
239 \r
240     // Shift by 8 if port is even (upper 8-bits)\r
241     if((selectedPort & 1) ^ 1)\r
242     {\r
243         selectedPins <<= 8;\r
244     }\r
245 \r
246     HWREG16(baseAddress + OFS_PADIR) &= ~selectedPins;\r
247     switch(mode)\r
248     {\r
249     case GPIO_PRIMARY_MODULE_FUNCTION:\r
250         HWREG16(baseAddress + OFS_PASEL0) |= selectedPins;\r
251         HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins;\r
252         break;\r
253     case GPIO_SECONDARY_MODULE_FUNCTION:\r
254         HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins;\r
255         HWREG16(baseAddress + OFS_PASEL1) |= selectedPins;\r
256         break;\r
257     case GPIO_TERNARY_MODULE_FUNCTION:\r
258         HWREG16(baseAddress + OFS_PASEL0) |= selectedPins;\r
259         HWREG16(baseAddress + OFS_PASEL1) |= selectedPins;\r
260         break;\r
261     }\r
262 }\r
263 \r
264 void GPIO_setOutputHighOnPin(uint8_t selectedPort,\r
265                              uint16_t selectedPins) {\r
266     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
267 \r
268     #ifndef NDEBUG\r
269     if(baseAddress == 0xFFFF)\r
270     {\r
271         return;\r
272     }\r
273     #endif\r
274 \r
275     // Shift by 8 if port is even (upper 8-bits)\r
276     if((selectedPort & 1) ^ 1)\r
277     {\r
278         selectedPins <<= 8;\r
279     }\r
280 \r
281     HWREG16(baseAddress + OFS_PAOUT) |= selectedPins;\r
282 }\r
283 \r
284 void GPIO_setOutputLowOnPin(uint8_t selectedPort,\r
285                             uint16_t selectedPins) {\r
286     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
287 \r
288     #ifndef NDEBUG\r
289     if(baseAddress == 0xFFFF)\r
290     {\r
291         return;\r
292     }\r
293     #endif\r
294 \r
295     // Shift by 8 if port is even (upper 8-bits)\r
296     if((selectedPort & 1) ^ 1)\r
297     {\r
298         selectedPins <<= 8;\r
299     }\r
300 \r
301     HWREG16(baseAddress + OFS_PAOUT) &= ~selectedPins;\r
302 }\r
303 \r
304 void GPIO_toggleOutputOnPin(uint8_t selectedPort,\r
305                             uint16_t selectedPins) {\r
306     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
307 \r
308     #ifndef NDEBUG\r
309     if(baseAddress == 0xFFFF)\r
310     {\r
311         return;\r
312     }\r
313     #endif\r
314 \r
315     // Shift by 8 if port is even (upper 8-bits)\r
316     if((selectedPort & 1) ^ 1)\r
317     {\r
318         selectedPins <<= 8;\r
319     }\r
320 \r
321     HWREG16(baseAddress + OFS_PAOUT) ^= selectedPins;\r
322 }\r
323 \r
324 void GPIO_setAsInputPinWithPullDownResistor(uint8_t selectedPort,\r
325                                             uint16_t selectedPins) {\r
326     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
327 \r
328     #ifndef NDEBUG\r
329     if(baseAddress == 0xFFFF)\r
330     {\r
331         return;\r
332     }\r
333     #endif\r
334 \r
335     // Shift by 8 if port is even (upper 8-bits)\r
336     if((selectedPort & 1) ^ 1)\r
337     {\r
338         selectedPins <<= 8;\r
339     }\r
340 \r
341     HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins;\r
342     HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins;\r
343 \r
344     HWREG16(baseAddress + OFS_PADIR) &= ~selectedPins;\r
345     HWREG16(baseAddress + OFS_PAREN) |= selectedPins;\r
346     HWREG16(baseAddress + OFS_PAOUT) &= ~selectedPins;\r
347 }\r
348 \r
349 void GPIO_setAsInputPinWithPullUpResistor(uint8_t selectedPort,\r
350                                           uint16_t selectedPins) {\r
351     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
352 \r
353     #ifndef NDEBUG\r
354     if(baseAddress == 0xFFFF)\r
355     {\r
356         return;\r
357     }\r
358     #endif\r
359 \r
360     // Shift by 8 if port is even (upper 8-bits)\r
361     if((selectedPort & 1) ^ 1)\r
362     {\r
363         selectedPins <<= 8;\r
364     }\r
365 \r
366     HWREG16(baseAddress + OFS_PASEL0) &= ~selectedPins;\r
367     HWREG16(baseAddress + OFS_PASEL1) &= ~selectedPins;\r
368     HWREG16(baseAddress + OFS_PADIR) &= ~selectedPins;\r
369     HWREG16(baseAddress + OFS_PAREN) |= selectedPins;\r
370     HWREG16(baseAddress + OFS_PAOUT) |= selectedPins;\r
371 }\r
372 \r
373 uint8_t GPIO_getInputPinValue(uint8_t selectedPort,\r
374                               uint16_t selectedPins) {\r
375     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
376 \r
377     #ifndef NDEBUG\r
378     if(baseAddress == 0xFFFF)\r
379     {\r
380         return;\r
381     }\r
382     #endif\r
383 \r
384     // Shift by 8 if port is even (upper 8-bits)\r
385     if((selectedPort & 1) ^ 1)\r
386     {\r
387         selectedPins <<= 8;\r
388     }\r
389 \r
390     uint16_t inputPinValue = HWREG16(baseAddress + OFS_PAIN) & (selectedPins);\r
391 \r
392     if(inputPinValue > 0)\r
393     {\r
394         return (GPIO_INPUT_PIN_HIGH);\r
395     }\r
396     return (GPIO_INPUT_PIN_LOW);\r
397 }\r
398 \r
399 void GPIO_enableInterrupt(uint8_t selectedPort,\r
400                           uint16_t selectedPins) {\r
401     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
402 \r
403     #ifndef NDEBUG\r
404     if(baseAddress == 0xFFFF)\r
405     {\r
406         return;\r
407     }\r
408     #endif\r
409 \r
410     // Shift by 8 if port is even (upper 8-bits)\r
411     if((selectedPort & 1) ^ 1)\r
412     {\r
413         selectedPins <<= 8;\r
414     }\r
415 \r
416     HWREG16(baseAddress + OFS_PAIE) |= selectedPins;\r
417 }\r
418 \r
419 void GPIO_disableInterrupt(uint8_t selectedPort,\r
420                            uint16_t selectedPins) {\r
421     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
422 \r
423     #ifndef NDEBUG\r
424     if(baseAddress == 0xFFFF)\r
425     {\r
426         return;\r
427     }\r
428     #endif\r
429 \r
430     // Shift by 8 if port is even (upper 8-bits)\r
431     if((selectedPort & 1) ^ 1)\r
432     {\r
433         selectedPins <<= 8;\r
434     }\r
435 \r
436     HWREG16(baseAddress + OFS_PAIE) &= ~selectedPins;\r
437 }\r
438 \r
439 uint16_t GPIO_getInterruptStatus(uint8_t selectedPort,\r
440                                  uint16_t selectedPins) {\r
441     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
442 \r
443     #ifndef NDEBUG\r
444     if(baseAddress == 0xFFFF)\r
445     {\r
446         return;\r
447     }\r
448     #endif\r
449 \r
450     // Shift by 8 if port is even (upper 8-bits)\r
451     if((selectedPort & 1) ^ 1)\r
452     {\r
453         selectedPins <<= 8;\r
454     }\r
455 \r
456     return (HWREG16(baseAddress + OFS_PAIFG) & selectedPins);\r
457 }\r
458 \r
459 void GPIO_clearInterrupt(uint8_t selectedPort,\r
460                          uint16_t selectedPins) {\r
461     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
462 \r
463     #ifndef NDEBUG\r
464     if(baseAddress == 0xFFFF)\r
465     {\r
466         return;\r
467     }\r
468     #endif\r
469 \r
470     // Shift by 8 if port is even (upper 8-bits)\r
471     if((selectedPort & 1) ^ 1)\r
472     {\r
473         selectedPins <<= 8;\r
474     }\r
475 \r
476     HWREG16(baseAddress + OFS_PAIFG) &= ~selectedPins;\r
477 }\r
478 \r
479 void GPIO_selectInterruptEdge(uint8_t selectedPort,\r
480                               uint16_t selectedPins,\r
481                               uint8_t edgeSelect) {\r
482     uint16_t baseAddress = GPIO_PORT_TO_BASE[selectedPort];\r
483 \r
484     #ifndef NDEBUG\r
485     if(baseAddress == 0xFFFF)\r
486     {\r
487         return;\r
488     }\r
489     #endif\r
490 \r
491     // Shift by 8 if port is even (upper 8-bits)\r
492     if((selectedPort & 1) ^ 1)\r
493     {\r
494         selectedPins <<= 8;\r
495     }\r
496 \r
497     if(GPIO_LOW_TO_HIGH_TRANSITION == edgeSelect)\r
498     {\r
499         HWREG16(baseAddress + OFS_PAIES) &= ~selectedPins;\r
500     }\r
501     else\r
502     {\r
503         HWREG16(baseAddress + OFS_PAIES) |= selectedPins;\r
504     }\r
505 }\r
506 \r
507 #endif\r
508 //*****************************************************************************\r
509 //\r
510 //! Close the doxygen group for gpio_api\r
511 //! @}\r
512 //\r
513 //*****************************************************************************\r