PINCC26XX.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2017, Texas Instruments Incorporated
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of Texas Instruments Incorporated nor the names of
17  * its contributors may be used to endorse or promote products derived
18  * from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /*!*****************************************************************************
34  * @file PINCC26XX.h
35  * @brief Device-specific pin & GPIO driver for CC26xx family [def]
36  *
37  * # Overview #
38  * This is the device-specific implementation of the generic PIN driver for the
39  * CC26xx family of devices.
40  *
41  * Refer to @ref PIN.h for a complete description of APIs & example of use.
42  *
43  *******************************************************************************
44  */
45 
46 #ifndef ti_drivers_PINCC26XX__include
47 #define ti_drivers_PINCC26XX__include
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51 
52 #include <stdint.h>
53 #include <stddef.h>
54 
55 #include <ti/drivers/dpl/HwiP.h>
56 
57 #include <ti/drivers/PIN.h>
58 
59 #include <ti/devices/DeviceFamily.h>
60 #include DeviceFamily_constructPath(driverlib/ioc.h)
61 #include DeviceFamily_constructPath(driverlib/gpio.h)
62 
63 //------------------------------------------------------------------------------
64 // Internal function used to find the index of the rightmost set bit in
65 // efficient way
66 #if defined(__IAR_SYSTEMS_ICC__) || defined(DOXYGEN)
67  #include <intrinsics.h>
68 #endif
69 
70 __STATIC_INLINE uint32_t PIN_ctz(uint32_t x) {
71 #if defined(codered) || defined(gcc) || defined(sourcerygxx) || defined(__GNUC__)
72  return __builtin_ctz(x);
73 #elif defined(__IAR_SYSTEMS_ICC__) || defined(DOXYGEN)
74  return __CLZ(__RBIT(x));
75 #elif defined(rvmdk) || defined(__ARMCC_VERSION)
76  return __clz(__rbit(x));
77 #elif defined(__TI_COMPILER_VERSION__)
78  return __clz(__rbit(x));
79 #else
80  #error "Unsupported compiler used"
81 #endif
82 }
83 
84 //------------------------------------------------------------------------------
85 
86 // Constant that can be used to remove run-time checks for improved efficiency
87 // Activate through preprocessor define PIN_DISABLE_RUNTIME_CHECKS
88 #ifdef PIN_DISABLE_RUNTIME_CHECKS
89  #define PIN_CHKEN 0
90 #else
91  #define PIN_CHKEN 1
92 #endif
93 
102 #define PINCC26XX_INPUT_EN (1 << 29)
103 #define PINCC26XX_HYSTERESIS (1 << 30)
104 #define PINCC26XX_NOPULL (0x3 << 13)
105 #define PINCC26XX_PULLUP (0x2 << 13)
106 #define PINCC26XX_PULLDOWN (0x1 << 13)
107 #define PINCC26XX_BM_INPUT_EN (0x01 << 29)
108 #define PINCC26XX_BM_HYSTERESIS (0x01 << 30)
109 #define PINCC26XX_BM_PULLING (0x03 << 13)
110 #define PINCC26XX_BM_INPUT_MODE (PINCC26XX_BM_INPUT_EN | PINCC26XX_BM_HYSTERESIS | \
112  PINCC26XX_BM_PULLING)
113 
114 #define PINCC26XX_GPIO_OUTPUT_EN (1 << 23)
115 #define PINCC26XX_GPIO_LOW (0 << 22)
116 #define PINCC26XX_GPIO_HIGH (1 << 22)
117 #define PINCC26XX_PUSHPULL (0x0 << 25)
118 #define PINCC26XX_OPENDRAIN (0x2 << 25)
119 #define PINCC26XX_OPENSOURCE (0x3 << 25)
120 #define PINCC26XX_SLEWCTRL (1 << 12)
121 #define PINCC26XX_DRVSTR_MIN (0x0 << 8)
122 #define PINCC26XX_DRVSTR_MED (0x4 << 8)
123 #define PINCC26XX_DRVSTR_MAX (0x8 << 8)
124 #define PINCC26XX_BM_GPIO_OUTPUT_EN (1 << 23)
125 #define PINCC26XX_BM_GPIO_OUTPUT_VAL (1 << 22)
126 #define PINCC26XX_BM_OUTPUT_BUF (3 << 25)
127 #define PINCC26XX_BM_SLEWCTRL (1 << 12)
128 #define PINCC26XX_BM_DRVSTR (0xF << 8)
129 #define PINCC26XX_BM_GPIO_OUTPUT_MODE (PINCC26XX_BM_GPIO_OUTPUT_EN | PINCC26XX_BM_GPIO_OUTPUT_VAL)
131 #define PINCC26XX_BM_OUTPUT_MODE (PINCC26XX_BM_GPIO_OUTPUT_MODE | PINCC26XX_BM_OUTPUT_BUF | \
133  PINCC26XX_BM_SLEWCTRL | PINCC26XX_BM_DRVSTR)
134 
135 #define PINCC26XX_INV_INOUT (1 << 24)
136 #define PINCC26XX_IRQ_DIS (0x0 << 16)
137 #define PINCC26XX_IRQ_NEGEDGE (0x5 << 16)
138 #define PINCC26XX_IRQ_POSEDGE (0x6 << 16)
139 #define PINCC26XX_IRQ_BOTHEDGES (0x7 << 16)
140 #define PINCC26XX_BM_INV_INOUT (1 << 24)
141 #define PINCC26XX_BM_IRQ (0x7 << 16)
142 
143 #define PINCC26XX_NO_WAKEUP (0 << 27)
144 #define PINCC26XX_WAKEUP_POSEDGE (3 << 27)
145 #define PINCC26XX_WAKEUP_NEGEDGE (2 << 27)
146 #define PINCC26XX_BM_WAKEUP (3 << 27)
147 
148 #define PINCC26XX_BM_IOCFG (PINCC26XX_BM_INPUT_MODE|PINCC26XX_BM_OUTPUT_BUF | \
150  PINCC26XX_BM_SLEWCTRL | PINCC26XX_BM_DRVSTR | \
151  PINCC26XX_BM_INV_INOUT | PINCC26XX_BM_IRQ | PINCC26XX_BM_WAKEUP)
152 #define PINCC26XX_BM_ALL (PINCC26XX_BM_IOCFG | PINCC26XX_BM_GPIO_OUTPUT_MODE)
154 
166 #define PINCC26XX_DIO0 0
167 #define PINCC26XX_DIO1 1
168 #define PINCC26XX_DIO2 2
169 #define PINCC26XX_DIO3 3
170 #define PINCC26XX_DIO4 4
171 #define PINCC26XX_DIO5 5
172 #define PINCC26XX_DIO6 6
173 #define PINCC26XX_DIO7 7
174 #define PINCC26XX_DIO8 8
175 #define PINCC26XX_DIO9 9
176 #define PINCC26XX_DIO10 10
177 #define PINCC26XX_DIO11 11
178 #define PINCC26XX_DIO12 12
179 #define PINCC26XX_DIO13 13
180 #define PINCC26XX_DIO14 14
181 #define PINCC26XX_DIO15 15
182 #define PINCC26XX_DIO16 16
183 #define PINCC26XX_DIO17 17
184 #define PINCC26XX_DIO18 18
185 #define PINCC26XX_DIO19 19
186 #define PINCC26XX_DIO20 20
187 #define PINCC26XX_DIO21 21
188 #define PINCC26XX_DIO22 22
189 #define PINCC26XX_DIO23 23
190 #define PINCC26XX_DIO24 24
191 #define PINCC26XX_DIO25 25
192 #define PINCC26XX_DIO26 26
193 #define PINCC26XX_DIO27 27
194 #define PINCC26XX_DIO28 28
195 #define PINCC26XX_DIO29 29
196 #define PINCC26XX_DIO30 30
197 #define PINCC26XX_DIO31 31
198 
202 // Array of handles, one per pin (pin id is index)
203 extern PIN_Handle PIN_HandleTable[];
204 
205 // Number of pins available on device
206 extern uint32_t PIN_NumPins;
207 
210 __STATIC_INLINE uint32_t PINCC26XX_getInputValue(PIN_Id pinId) {
211  return (HWREG(GPIO_BASE + GPIO_O_DIN31_0) >> pinId) & 1;
212 }
213 
214 
215 /* @brief Fast/efficient version of #PIN_setOutputEnable()
216  * @note Does not include any checks on handle for efficiency reasons,
217  * use #PIN_setOutputEnable() for checked version
218  */
219 __STATIC_INLINE void PINCC26XX_setOutputEnable(PIN_Id pinId, bool outputEnable) {
220  uint32_t key = HwiP_disable();
221  HWREG(GPIO_BASE + GPIO_O_DOE31_0) =
222  ((HWREG(GPIO_BASE + GPIO_O_DOE31_0) & ~(1 << pinId)) | (outputEnable << pinId));
223  HwiP_restore(key);
224 }
225 
226 
227 /* @brief Fast/efficient version of #PIN_setOutputValue()
228  * @note Does not include any checks on handle for efficiency reasons,
229  * use #PIN_setOutputValue() for checked version
230  */
231 __STATIC_INLINE void PINCC26XX_setOutputValue(PIN_Id pinId, uint32_t val) {
232  HWREGB(GPIO_BASE + GPIO_O_DOUT3_0 + pinId) = (val) ? 1 : 0;
233 }
234 
237 __STATIC_INLINE uint32_t PINCC26XX_getOutputValue(PIN_Id pinId) {
238  return (HWREG(GPIO_BASE + GPIO_O_DOUT31_0) >> pinId) & 1;
239 }
241 
242 __STATIC_INLINE void PINCC26XX_clrPendInterrupt(PIN_Id pinId) {
243  HWREG(GPIO_NONBUF_BASE + GPIO_O_EVFLAGS31_0) = (1 << pinId);
244 }
245 
248 __STATIC_INLINE uint32_t PINCC26XX_getPortInputValue(PIN_Handle handle) {
249  // Only a single port on CC26xx
250  return HWREG(GPIO_BASE + GPIO_O_DIN31_0);
251 }
252 
255 __STATIC_INLINE uint32_t PINCC26XX_getPortOutputValue(PIN_Handle handle) {
256  // Only a single port on CC26xx
257  return HWREG(GPIO_BASE + GPIO_O_DOUT31_0);
258 }
259 
260 
261 /* @brief Fast/efficient version of #PIN_setPortOutputValue()
262  * @note Does not include any checks on handle for efficiency reasons,
263  * use #PIN_setPortOutputValue() for checked version
264  */
265 __STATIC_INLINE void PINCC26XX_setPortOutputValue(PIN_Handle handle, uint32_t outputValueMask) {
266  // Only a single port on CC26xx
267  HWREG(GPIO_BASE + GPIO_O_DOUTTGL31_0) =
268  (HWREG(GPIO_BASE + GPIO_O_DOUT31_0) ^ outputValueMask) & handle->portMask;
269 }
270 
271 
272 /* @brief Fast/efficient version of #PIN_setPortOutputEnable()
273  * @note Does not include any checks on handle for efficiency reasons,
274  * use #PIN_setPortOutputEnable() for checked version
275  */
276 __STATIC_INLINE void PINCC26XX_setPortOutputEnable(PIN_Handle handle, uint32_t outputEnableMask) {
277  // Only a single port on CC26xx
278  uint32_t key = HwiP_disable();
279  HWREG(GPIO_BASE + GPIO_O_DOE31_0) =
280  (HWREG(GPIO_BASE + GPIO_O_DOE31_0) & (~handle->portMask)) | (outputEnableMask & handle->portMask);
281  HwiP_restore(key);
282 }
283 
284 
293 
294 
310 extern PIN_Status PINCC26XX_setWakeup(const PIN_Config aPinCfg[]);
311 
312 
326 extern int32_t PINCC26XX_getMux(PIN_Id pinId);
327 
333 extern uint32_t PINCC26XX_getPinCount();
334 
348 extern PIN_Status PINCC26XX_setMux(PIN_Handle handle, PIN_Id pinId, int32_t nMux);
349 
367 typedef struct PINCC26XX_HWAttrs{
381  uint8_t intPriority;
387  uint32_t swiPriority;
389 
397 #define PINCC26XX_MUX_GPIO IOC_PORT_GPIO // Default general purpose IO usage
398 #define PINCC26XX_MUX_AON_CLK32K IOC_PORT_AON_CLK32K // AON External 32kHz clock
399 #define PINCC26XX_MUX_AUX_IO IOC_PORT_AUX_IO // AUX IO Pin
400 #define PINCC26XX_MUX_MCU_SSI0_RX IOC_PORT_MCU_SSI0_RX // MCU SSI0 Receive Pin
401 #define PINCC26XX_MUX_MCU_SSI0_TX IOC_PORT_MCU_SSI0_TX // MCU SSI0 Transmit Pin
402 #define PINCC26XX_MUX_MCU_SSI0_FSS IOC_PORT_MCU_SSI0_FSS // MCU SSI0 FSS Pin
403 #define PINCC26XX_MUX_MCU_SSI0_CLK IOC_PORT_MCU_SSI0_CLK // MCU SSI0 Clock Pin
404 #define PINCC26XX_MUX_MCU_I2C_MSSDA IOC_PORT_MCU_I2C_MSSDA // MCU I2C Data Pin
405 #define PINCC26XX_MUX_MCU_I2C_MSSCL IOC_PORT_MCU_I2C_MSSCL // MCU I2C Clock Pin
406 #define PINCC26XX_MUX_MCU_UART0_RX IOC_PORT_MCU_UART0_RX // MCU UART0 Receive Pin
407 #define PINCC26XX_MUX_MCU_UART0_TX IOC_PORT_MCU_UART0_TX // MCU UART0 Transmit Pin
408 #define PINCC26XX_MUX_MCU_UART0_CTS IOC_PORT_MCU_UART0_CTS // MCU UART0 Clear To Send Pin
409 #define PINCC26XX_MUX_MCU_UART0_RTS IOC_PORT_MCU_UART0_RTS // MCU UART0 Request To Send Pin
410 #define PINCC26XX_MUX_MCU_PORT_EV_0 IOC_PORT_MCU_PORT_EVENT0 // MCU power event 0
411 #define PINCC26XX_MUX_MCU_PORT_EV_1 IOC_PORT_MCU_PORT_EVENT1 // MCU power event 1
412 #define PINCC26XX_MUX_MCU_PORT_EV_2 IOC_PORT_MCU_PORT_EVENT2 // MCU power event 2
413 #define PINCC26XX_MUX_MCU_PORT_EV_3 IOC_PORT_MCU_PORT_EVENT3 // MCU power event 3
414 #define PINCC26XX_MUX_MCU_PORT_EV_4 IOC_PORT_MCU_PORT_EVENT4 // MCU power event 4
415 #define PINCC26XX_MUX_MCU_PORT_EV_5 IOC_PORT_MCU_PORT_EVENT5 // MCU power event 5
416 #define PINCC26XX_MUX_MCU_PORT_EV_6 IOC_PORT_MCU_PORT_EVENT6 // MCU power event 6
417 #define PINCC26XX_MUX_MCU_PORT_EV_7 IOC_PORT_MCU_PORT_EVENT7 // MCU power event 7
418 #define PINCC26XX_MUX_SWV IOC_PORT_MCU_SWV // MCU serial wire viewer
419 #define PINCC26XX_MUX_MCU_SSI1_RX IOC_PORT_MCU_SSI1_RX // MCU SSI1 Receive Pin
420 #define PINCC26XX_MUX_MCU_SSI1_TX IOC_PORT_MCU_SSI1_TX // MCU SSI1 Transmit Pin
421 #define PINCC26XX_MUX_MCU_SSI1_FSS IOC_PORT_MCU_SSI1_FSS // MCU SSI1 FSS Pin
422 #define PINCC26XX_MUX_MCU_SSI1_CLK IOC_PORT_MCU_SSI1_CLK // MCU SSI1 Clock Pin
423 #define PINCC26XX_MUX_MCU_I2S_AD0 IOC_PORT_MCU_I2S_AD0 // MCU I2S Data Pin 0
424 #define PINCC26XX_MUX_MCU_I2S_AD1 IOC_PORT_MCU_I2S_AD1 // MCU I2S Data Pin 1
425 #define PINCC26XX_MUX_MCU_I2S_WCLK IOC_PORT_MCU_I2S_WCLK // MCU I2S Frame/Word Clock
426 #define PINCC26XX_MUX_MCU_I2S_BCLK IOC_PORT_MCU_I2S_BCLK // MCU I2S Bit Clock
427 #define PINCC26XX_MUX_MCU_I2S_MCLK IOC_PORT_MCU_I2S_MCLK // MCU I2S Master clock 2
428 #define PINCC26XX_MUX_RFC_TRC IOC_PORT_RFC_TRC // RF Core Tracer
429 #define PINCC26XX_MUX_RFC_GPO0 IOC_PORT_RFC_GPO0 // RC Core Data Out Pin 0
430 #define PINCC26XX_MUX_RFC_GPO1 IOC_PORT_RFC_GPO1 // RC Core Data Out Pin 1
431 #define PINCC26XX_MUX_RFC_GPO2 IOC_PORT_RFC_GPO2 // RC Core Data Out Pin 2
432 #define PINCC26XX_MUX_RFC_GPO3 IOC_PORT_RFC_GPO3 // RC Core Data Out Pin 3
433 #define PINCC26XX_MUX_RFC_GPI0 IOC_PORT_RFC_GPI0 // RC Core Data In Pin 0
434 #define PINCC26XX_MUX_RFC_GPI1 IOC_PORT_RFC_GPI1 // RC Core Data In Pin 1
435 #define PINCC26XX_MUX_RFC_SMI_DL_OUT IOC_PORT_RFC_SMI_DL_OUT // RF Core SMI Data Link Out
436 #define PINCC26XX_MUX_RFC_SMI_DL_IN IOC_PORT_RFC_SMI_DL_IN // RF Core SMI Data Link in
437 #define PINCC26XX_MUX_RFC_SMI_CL_OUT IOC_PORT_RFC_SMI_CL_OUT // RF Core SMI Command Link Out
438 #define PINCC26XX_MUX_RFC_SMI_CL_IN IOC_PORT_RFC_SMI_CL_IN // RF Core SMI Command Link In
439 
443 #ifdef __cplusplus
444 }
445 #endif
446 #endif /* ti_drivers_PINCC26XX__include */
uint8_t PIN_Id
Pin identifier data type.
Definition: PIN.h:550
__STATIC_INLINE uint32_t PINCC26XX_getOutputValue(PIN_Id pinId)
Fast/efficient version of PIN_getOutputValue()
Definition: PINCC26XX.h:235
__STATIC_INLINE uint32_t PINCC26XX_getInputValue(PIN_Id pinId)
Fast/efficient version of PIN_getInputValue()
Definition: PINCC26XX.h:208
__STATIC_INLINE void PINCC26XX_setOutputValue(PIN_Id pinId, uint32_t val)
Definition: PINCC26XX.h:229
int32_t PINCC26XX_getMux(PIN_Id pinId)
Get device-specific pin mapping to GPIO, HW peripheral or HW signal.
__STATIC_INLINE void PINCC26XX_setPortOutputValue(PIN_Handle handle, uint32_t outputValueMask)
Definition: PINCC26XX.h:263
PINCC26XX Hardware attributes.
Definition: PINCC26XX.h:365
uint8_t intPriority
SPI CC26XXDMA Peripheral&#39;s interrupt priority.
Definition: PINCC26XX.h:379
uint32_t portMask
Bitmask for pins allocated in port.
Definition: PIN.h:682
PIN_Status PINCC26XX_setMux(PIN_Handle handle, PIN_Id pinId, int32_t nMux)
Connect pin to HW peripheral, signal or to GPIO.
__STATIC_INLINE void PINCC26XX_setPortOutputEnable(PIN_Handle handle, uint32_t outputEnableMask)
Definition: PINCC26XX.h:274
uint32_t PINCC26XX_getPinCount()
Get device-specific count of how many pins are available on this device and package.
PIN_Handle PIN_HandleTable[]
__STATIC_INLINE void PINCC26XX_clrPendInterrupt(PIN_Id pinId)
Definition: PINCC26XX.h:240
PIN_Config PINCC26XX_getConfig(PIN_Id pinId)
Returns CC26xx device-specific pin configuration.
uint32_t PIN_NumPins
__STATIC_INLINE uint32_t PIN_ctz(uint32_t x)
Definition: PINCC26XX.h:70
__STATIC_INLINE void PINCC26XX_setOutputEnable(PIN_Id pinId, bool outputEnable)
Definition: PINCC26XX.h:217
underlying data structure for type PIN_State
Definition: PIN.h:680
__STATIC_INLINE uint32_t PINCC26XX_getPortOutputValue(PIN_Handle handle)
Fast/efficient version of PIN_getPortOutputValue()
Definition: PINCC26XX.h:253
uint32_t swiPriority
SPI SWI priority. The higher the number, the higher the priority. The minimum is 0 and the maximum is...
Definition: PINCC26XX.h:385
__STATIC_INLINE uint32_t PINCC26XX_getPortInputValue(PIN_Handle handle)
Fast/efficient version of PIN_getPortInputValue()
Definition: PINCC26XX.h:246
PIN_Status
Return value for many functions in the PIN driver interface.
Definition: PIN.h:688
struct PINCC26XX_HWAttrs PINCC26XX_HWAttrs
PINCC26XX Hardware attributes.
PIN_Status PINCC26XX_setWakeup(const PIN_Config aPinCfg[])
Configure wakeup (from shutdown) on pins.
uint32_t PIN_Config
Pin configuration data type with embedded pin identifier.
Definition: PIN.h:570
Generic PIN & GPIO driver.
Copyright 2017, Texas Instruments Incorporated