CC23x0R5DriverLibrary
gpio.h
Go to the documentation of this file.
1 /******************************************************************************
2  * Filename: gpio.h
3  *
4  * Description: Defines and prototypes for the GPIO.
5  *
6  * Copyright (c) 2022 Texas Instruments Incorporated
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1) Redistributions of source code must retain the above copyright notice,
12  * this list of conditions and the following disclaimer.
13  *
14  * 2) Redistributions in binary form must reproduce the above copyright notice,
15  * this list of conditions and the following disclaimer in the documentation
16  * and/or other materials provided with the distribution.
17  *
18  * 3) Neither the name of the copyright holder nor the names of its
19  * contributors may be used to endorse or promote products derived from this
20  * software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
26  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  ******************************************************************************/
35 
36 #ifndef __GPIO_H__
37 #define __GPIO_H__
38 
39 //*****************************************************************************
40 //
45 //
46 //*****************************************************************************
47 
48 //*****************************************************************************
49 //
50 // If building with a C++ compiler, make all of the definitions in this header
51 // have a C binding.
52 //
53 //*****************************************************************************
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57 
58 #include <stdint.h>
59 #include "../inc/hw_types.h"
60 #include "../inc/hw_memmap.h"
61 #include "../inc/hw_gpio.h"
62 #include "debug.h"
63 
64 //*****************************************************************************
65 //
66 // Check for legal range of variable dioNumber
67 //
68 //*****************************************************************************
69 #ifdef DRIVERLIB_DEBUG
70  #include "chipinfo.h"
71 
72 static bool dioNumberLegal(uint32_t dioNumber)
73 {
74  // TODO: Implement properly
75  // Get number of GPIOs supported by platform. Number of DIOs is NUMDIO + 1.
76  // Actual number available may be less for some package types.
77  uint32_t numDio = 1 + ((HWREG(GPIO_BASE + GPIO_O_DESCEX) & GPIO_DESCEX_NUMDIO_M) >> GPIO_DESCEX_NUMDIO_S);
78  return (dioNumber < numDio);
79 }
80 #endif
81 
82 //*****************************************************************************
83 //
84 // The following values define the bit field for the GPIO DIOs.
85 //
86 //*****************************************************************************
87 #define GPIO_DIO_0_MASK 0x00000001 // GPIO DIO 0 mask
88 #define GPIO_DIO_1_MASK 0x00000002 // GPIO DIO 1 mask
89 #define GPIO_DIO_2_MASK 0x00000004 // GPIO DIO 2 mask
90 #define GPIO_DIO_3_MASK 0x00000008 // GPIO DIO 3 mask
91 #define GPIO_DIO_4_MASK 0x00000010 // GPIO DIO 4 mask
92 #define GPIO_DIO_5_MASK 0x00000020 // GPIO DIO 5 mask
93 #define GPIO_DIO_6_MASK 0x00000040 // GPIO DIO 6 mask
94 #define GPIO_DIO_7_MASK 0x00000080 // GPIO DIO 7 mask
95 #define GPIO_DIO_8_MASK 0x00000100 // GPIO DIO 8 mask
96 #define GPIO_DIO_9_MASK 0x00000200 // GPIO DIO 9 mask
97 #define GPIO_DIO_10_MASK 0x00000400 // GPIO DIO 10 mask
98 #define GPIO_DIO_11_MASK 0x00000800 // GPIO DIO 11 mask
99 #define GPIO_DIO_12_MASK 0x00001000 // GPIO DIO 12 mask
100 #define GPIO_DIO_13_MASK 0x00002000 // GPIO DIO 13 mask
101 #define GPIO_DIO_14_MASK 0x00004000 // GPIO DIO 14 mask
102 #define GPIO_DIO_15_MASK 0x00008000 // GPIO DIO 15 mask
103 #define GPIO_DIO_16_MASK 0x00010000 // GPIO DIO 16 mask
104 #define GPIO_DIO_17_MASK 0x00020000 // GPIO DIO 17 mask
105 #define GPIO_DIO_18_MASK 0x00040000 // GPIO DIO 18 mask
106 #define GPIO_DIO_19_MASK 0x00080000 // GPIO DIO 19 mask
107 #define GPIO_DIO_20_MASK 0x00100000 // GPIO DIO 20 mask
108 #define GPIO_DIO_21_MASK 0x00200000 // GPIO DIO 21 mask
109 #define GPIO_DIO_22_MASK 0x00400000 // GPIO DIO 22 mask
110 #define GPIO_DIO_23_MASK 0x00800000 // GPIO DIO 23 mask
111 #define GPIO_DIO_24_MASK 0x01000000 // GPIO DIO 24 mask
112 #define GPIO_DIO_25_MASK 0x02000000 // GPIO DIO 25 mask
113 #define GPIO_DIO_ALL_MASK 0xFFFFFFFF // GPIO all DIOs mask
114 
115 //*****************************************************************************
116 //
117 // Define constants that shall be passed as the outputEnableValue parameter to
118 // GPIOSetOutputEnableDio() and will be returned from the function
119 // GPIOGetOutputEnableDio().
120 //
121 //*****************************************************************************
122 #define GPIO_OUTPUT_DISABLE 0x00000000 // DIO output is disabled
123 #define GPIO_OUTPUT_ENABLE 0x00000001 // DIO output is enabled
124 
125 //*****************************************************************************
126 //
127 // API Functions and prototypes
128 //
129 //*****************************************************************************
130 
131 //*****************************************************************************
132 //
140 //
141 //*****************************************************************************
142 __STATIC_INLINE uint32_t GPIOReadDio(uint32_t dioNumber)
143 {
144  // Check the arguments.
145  ASSERT(dioNumberLegal(dioNumber));
146 
147  // Return the input value from the specified DIO.
148  return ((HWREG( GPIO_BASE + GPIO_O_DIN31_0 ) >> dioNumber) & 1);
149 }
150 
151 //*****************************************************************************
152 //
169 //
170 //*****************************************************************************
171 __STATIC_INLINE uint32_t GPIOReadMultiDio(uint32_t dioMask)
172 {
173  // Check the arguments.
174  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
175 
176  // Return the input value from the specified DIOs.
177  return (HWREG( GPIO_BASE + GPIO_O_DIN31_0 ) & dioMask);
178 }
179 
180 //*****************************************************************************
181 //
192 //
193 //*****************************************************************************
194 __STATIC_INLINE void GPIOWriteDio(uint32_t dioNumber, uint32_t value)
195 {
196  // Check the arguments.
197  ASSERT(dioNumberLegal(dioNumber));
198  ASSERT((value == 0) || (value == 1));
199 
200  // Write 0 or 1 to the byte indexed DOUT map
201  HWREGB( GPIO_BASE + GPIO_O_DOUT3_0 + dioNumber ) = value;
202 }
203 
204 //*****************************************************************************
205 //
223 //
224 //*****************************************************************************
225 __STATIC_INLINE void GPIOWriteMultiDio(uint32_t dioMask, uint32_t bitVectoredValue)
226 {
227  // Check the arguments.
228  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
229 
230  HWREG( GPIO_BASE + GPIO_O_DOUT31_0 ) = (HWREG( GPIO_BASE + GPIO_O_DOUT31_0 ) & ~dioMask) |
231  (bitVectoredValue & dioMask);
232 }
233 
234 //*****************************************************************************
235 //
243 //
244 //*****************************************************************************
245 __STATIC_INLINE void GPIOSetDio(uint32_t dioNumber)
246 {
247  // Check the arguments.
248  ASSERT(dioNumberLegal(dioNumber));
249 
250  // Set the specified DIO.
251  HWREG( GPIO_BASE + GPIO_O_DOUTSET31_0 ) = (1 << dioNumber);
252 }
253 
254 //*****************************************************************************
255 //
267 //
268 //*****************************************************************************
269 __STATIC_INLINE void GPIOSetMultiDio(uint32_t dioMask)
270 {
271  // Check the arguments.
272  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
273 
274  // Set the DIOs.
275  HWREG( GPIO_BASE + GPIO_O_DOUTSET31_0 ) = dioMask;
276 }
277 
278 //*****************************************************************************
279 //
287 //
288 //*****************************************************************************
289 __STATIC_INLINE void GPIOClearDio(uint32_t dioNumber)
290 {
291  // Check the arguments.
292  ASSERT(dioNumberLegal(dioNumber));
293 
294  // Clear the specified DIO.
295  HWREG( GPIO_BASE + GPIO_O_DOUTCLR31_0 ) = (1 << dioNumber);
296 }
297 
298 //*****************************************************************************
299 //
311 //
312 //*****************************************************************************
313 __STATIC_INLINE void GPIOClearMultiDio(uint32_t dioMask)
314 {
315  // Check the arguments.
316  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
317 
318  // Clear the DIOs.
319  HWREG( GPIO_BASE + GPIO_O_DOUTCLR31_0 ) = dioMask;
320 }
321 
322 //*****************************************************************************
323 //
331 //
332 //*****************************************************************************
333 __STATIC_INLINE void GPIOToggleDio(uint32_t dioNumber)
334 {
335  // Check the arguments.
336  ASSERT(dioNumberLegal(dioNumber));
337 
338  // Toggle the specified DIO.
339  HWREG( GPIO_BASE + GPIO_O_DOUTTGL31_0 ) = (1 << dioNumber);
340 }
341 
342 //*****************************************************************************
343 //
355 //
356 //*****************************************************************************
357 __STATIC_INLINE void GPIOToggleMultiDio(uint32_t dioMask)
358 {
359  // Check the arguments.
360  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
361 
362  // Toggle the DIOs.
363  HWREG( GPIO_BASE + GPIO_O_DOUTTGL31_0 ) = dioMask;
364 }
365 
366 //*****************************************************************************
367 //
380 //
381 //*****************************************************************************
382 __STATIC_INLINE uint32_t GPIOGetOutputEnableDio(uint32_t dioNumber)
383 {
384  // Check the arguments.
385  ASSERT(dioNumberLegal(dioNumber));
386 
387  // Return the output enable status for the specified DIO.
388  return ((HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) >> dioNumber) & 1);
389 }
390 
391 //*****************************************************************************
392 //
409 //
410 //*****************************************************************************
412 {
413  // Check the arguments.
414  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
415 
416  // Return the output enable value for the specified DIOs.
417  return (HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) & dioMask);
418 }
419 
420 //*****************************************************************************
421 //
435 //
436 //*****************************************************************************
437 __STATIC_INLINE void GPIOSetOutputEnableDio(uint32_t dioNumber, uint32_t outputEnableValue)
438 {
439  // Check the arguments.
440  ASSERT(dioNumberLegal(dioNumber));
441  ASSERT((outputEnableValue == GPIO_OUTPUT_DISABLE) || (outputEnableValue == GPIO_OUTPUT_ENABLE));
442 
443  // Update the output enable bit for the specified DIO.
444  if (outputEnableValue == GPIO_OUTPUT_ENABLE)
445  {
446  HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) |= (1 << dioNumber);
447  }
448  else
449  {
450  HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) &= ~(1 << dioNumber);
451  }
452 }
453 
454 //*****************************************************************************
455 //
476 //
477 //*****************************************************************************
478 __STATIC_INLINE void GPIOSetOutputEnableMultiDio(uint32_t dioMask, uint32_t bitVectoredOutputEnable)
479 {
480  // Check the arguments.
481  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
482 
483  HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) = (HWREG( GPIO_BASE + GPIO_O_DOE31_0 ) & ~dioMask) |
484  (bitVectoredOutputEnable & dioMask);
485 }
486 
487 //*****************************************************************************
488 //
498 //
499 //*****************************************************************************
500 __STATIC_INLINE uint32_t GPIOGetEventDio(uint32_t dioNumber)
501 {
502  // Check the arguments.
503  ASSERT(dioNumberLegal(dioNumber));
504 
505  // Return the event status for the specified DIO.
506  return ((HWREG( GPIO_BASE + GPIO_O_RIS ) >> dioNumber) & 1);
507 }
508 
509 //*****************************************************************************
510 //
528 //
529 //*****************************************************************************
530 __STATIC_INLINE uint32_t GPIOGetEventMultiDio(uint32_t dioMask)
531 {
532  // Check the arguments.
533  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
534 
535  // Return the event status for the specified DIO.
536  return (HWREG( GPIO_BASE + GPIO_O_RIS ) & dioMask);
537 }
538 
539 //*****************************************************************************
540 //
548 //
549 //*****************************************************************************
550 __STATIC_INLINE void GPIOClearEventDio(uint32_t dioNumber)
551 {
552  // Check the arguments.
553  ASSERT(dioNumberLegal(dioNumber));
554 
555  // Clear the event status for the specified DIO.
556  HWREG( GPIO_BASE + GPIO_O_ICLR ) = (1 << dioNumber);
557 }
558 
559 //*****************************************************************************
560 //
573 //
574 //*****************************************************************************
576 {
577  // Check the arguments.
578  ASSERT(dioMask & GPIO_DIO_ALL_MASK);
579 
580  // Clear the event status for the specified DIOs.
581  HWREG( GPIO_BASE + GPIO_O_ICLR ) = dioMask;
582 }
583 
584 //*****************************************************************************
585 //
586 // Mark the end of the C bindings section for C++ compilers.
587 //
588 //*****************************************************************************
589 #ifdef __cplusplus
590 }
591 #endif
592 
593 //*****************************************************************************
594 //
598 //
599 //*****************************************************************************
600 
601 #endif // __GPIO_H__
__STATIC_INLINE uint32_t GPIOGetOutputEnableMultiDio(uint32_t dioMask)
Gets the output enable setting of the specified DIOs.
Definition: gpio.h:411
#define GPIO_DIO_ALL_MASK
Definition: gpio.h:113
__STATIC_INLINE void GPIOSetMultiDio(uint32_t dioMask)
Sets the specified DIOs to 1 (high).
Definition: gpio.h:269
#define GPIO_OUTPUT_ENABLE
Definition: gpio.h:123
__STATIC_INLINE void GPIOClearDio(uint32_t dioNumber)
Clears a specific DIO to 0 (low).
Definition: gpio.h:289
__STATIC_INLINE uint32_t GPIOGetEventDio(uint32_t dioNumber)
Gets the event status of a specific DIO.
Definition: gpio.h:500
__STATIC_INLINE void GPIOToggleDio(uint32_t dioNumber)
Toggles a specific DIO.
Definition: gpio.h:333
__STATIC_INLINE void GPIOWriteMultiDio(uint32_t dioMask, uint32_t bitVectoredValue)
Writes masked data to the specified DIOs.
Definition: gpio.h:225
__STATIC_INLINE void GPIOSetOutputEnableMultiDio(uint32_t dioMask, uint32_t bitVectoredOutputEnable)
Configures the output enable setting for all specified DIOs.
Definition: gpio.h:478
__STATIC_INLINE void GPIOClearEventDio(uint32_t dioNumber)
Clears the IO event status of a specific DIO.
Definition: gpio.h:550
#define ASSERT(expr)
Definition: debug.h:71
__STATIC_INLINE void GPIOSetOutputEnableDio(uint32_t dioNumber, uint32_t outputEnableValue)
Sets output enable of a specific DIO.
Definition: gpio.h:437
__STATIC_INLINE uint32_t GPIOReadDio(uint32_t dioNumber)
Reads a specific DIO.
Definition: gpio.h:142
__STATIC_INLINE void GPIOToggleMultiDio(uint32_t dioMask)
Toggles the specified DIOs.
Definition: gpio.h:357
__STATIC_INLINE uint32_t GPIOGetOutputEnableDio(uint32_t dioNumber)
Gets the output enable status of a specific DIO.
Definition: gpio.h:382
__STATIC_INLINE void GPIOSetDio(uint32_t dioNumber)
Sets a specific DIO to 1 (high).
Definition: gpio.h:245
#define GPIO_OUTPUT_DISABLE
Definition: gpio.h:122
__STATIC_INLINE void GPIOWriteDio(uint32_t dioNumber, uint32_t value)
Writes a value to a specific DIO.
Definition: gpio.h:194
#define __STATIC_INLINE
Definition: cmsis_gcc.h:47
__STATIC_INLINE void GPIOClearEventMultiDio(uint32_t dioMask)
Clears the IO event status on the specified DIOs.
Definition: gpio.h:575
__STATIC_INLINE uint32_t GPIOGetEventMultiDio(uint32_t dioMask)
Gets the event status of the specified DIOs.
Definition: gpio.h:530
__STATIC_INLINE uint32_t GPIOReadMultiDio(uint32_t dioMask)
Reads the input value for the specified DIOs.
Definition: gpio.h:171
__STATIC_INLINE void GPIOClearMultiDio(uint32_t dioMask)
Clears the specified DIOs to 0 (low).
Definition: gpio.h:313