Jetgpio 2.1
C library to manage the GPIO header of the Nvidia JETSON boards
jetgpio.h
Go to the documentation of this file.
1/*MIT License
2 *
3 *Copyright (c) 2025 Rubberazer
4 *
5 *Permission is hereby granted, free of charge, to any person obtaining a copy
6 *of this software and associated documentation files (the "Software"), to deal
7 *in the Software without restriction, including without limitation the rights
8 *to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 *copies of the Software, and to permit persons to whom the Software is
10 *furnished to do so, subject to the following conditions:
11 *
12 *The above copyright notice and this permission notice shall be included in all
13 *copies or substantial portions of the Software.
14 *
15 *THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 *IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 *FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 *AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 *LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 *OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 *SOFTWARE.
22 */
23
24/* jetgpio version 2.1 */
27#ifndef jetgpio_h__
28#define jetgpio_h__
29
30#include <stddef.h>
31#include <stdint.h>
32
33/* Definitions */
34
35/* Chip id for Nano Classic & Orin */
36
37#define APB_MISC_BASE 0x70000000 //Base Nano already defined as baseCFG
38#define MISC 0x00100000 //Base Orin & Xavier
39#define APB_MISC_GP_HIDREV_0 0x804 //Offset Nano
40#define MISCREG_HIDREV_0 0x4 //Offset Orin & Xavier
41
42/* GPIO base address Nano Classic */
43
44#define base_CNF 0x6000d000
45#define base_PINMUX 0x70003000
46#define base_CFG 0x70000000
47
48/* PWM Control Nano Classic */
49
50#define base_PWM 0x7000a000 // PWM Controller base address
51#define PM3_PWM0 0x00 // PWM0 pin 32 LCD_BL_PWM
52#define PM3_PWM2 0x20 // PWM2 pin 33 GPIO_PE6
53
54/* Clock and Reset Controller Nano Classic */
55
56#define CAR 0x60006000 // Clock and Reset Controller (CAR) base address
57#define CLK_RST_CONTROLLER_CLK_OUT_ENB_L_0 0x10 // CLK_RST_CONTROLLER_CLK_OUT_ENB_L_0 offset
58#define CLK_RST_CONTROLLER_CLK_OUT_ENB_H_0 0x14 // CLK_RST_CONTROLLER_CLK_OUT_ENB offset
59#define CLK_RST_CONTROLLER_RST_DEVICES_H_0 0x8 // Reset the spi controllers
60#define CLK_RST_CONTROLLER_CLK_SOURCE_SPI2_0 0x118 // CLK_RST_CONTROLLER_CLK_SOURCE_SPI2_0 source clock and divider spi2
61#define CLK_RST_CONTROLLER_CLK_SOURCE_SPI1_0 0x134 // CLK_RST_CONTROLLER_CLK_SOURCE_SPI1_0 source clokc and divider spi1
62#define CLK_RST_CONTROLLER_CLK_ENB_L_SET_0 0x320 // CLK_RST_CONTROLLER_CLK_ENB_L_SET_0 offset
63
64/* Power Management Controller Nano Classic */
65
66#define base_PMC 0x7000e000 // Power Management Controller (PMC) base address
67#define APBDEV_PMC_PWR_DET_VAL_0 0xe4 // APBDEV_PMC_PWR_DET_VAL_0
68#define APBDEV_PMC_PWR_DET_0 0x48 // APBDEV_PMC_PWR_DET_0
69#define APBDEV_PMC_PWR_DET_LATCH_0 0x4c // APBDEV_PMC_PWR_DET_LATCH_0
70
71/* GPIO CNF registers Nano Classic */
72
73#define CNF_3 0x204 // Pin 3 GEN2_I2C_SDA 0x6000d204
74#define CNF_5 0x204 // Pin 5 GEN2_I2C_SCL
75#define CNF_7 0x60C // Pin 7 AUD_MCLK
76#define CNF_8 0x108 // Pin 8 UART2_TX
77#define CNF_10 0x108 // Pin 10 UART2_RX
78#define CNF_11 0x108 // Pin 11 UART2_RTS
79#define CNF_12 0x204 // Pin 12 DAP4_SCLK
80#define CNF_13 0x004 // Pin 13 SPI2_SCK
81#define CNF_15 0x600 // Pin 15 LCD_TE
82#define CNF_16 0x704 // Pin 16 SPI2_CS1
83#define CNF_18 0x004 // Pin 18 SPI2_CS0
84#define CNF_19 0x008 // Pin 19 SPI1_MOSI
85#define CNF_21 0x008 // Pin 21 SPI1_MISO
86#define CNF_22 0x004 // Pin 22 SPI2_MISO
87#define CNF_23 0x008 // Pin 23 SPI1_SCK
88#define CNF_24 0x008 // Pin 24 SPI1_CS0
89#define CNF_26 0x008 // Pin 26 SPI1_CS1
90#define CNF_27 0x204 // Pin 27 GEN1_I2C_SDA
91#define CNF_28 0x204 // Pin 28 GEN1_I2C_SCL
92#define CNF_29 0x408 // Pin 29 CAM_AF_EN
93#define CNF_31 0x604 // Pin 31 GPIO_PZ0
94#define CNF_32 0x504 // Pin 32 LCD_BL_PWM
95#define CNF_33 0x100 // Pin 33 GPIO_PE6
96#define CNF_35 0x204 // Pin 35 DAP4_FS
97#define CNF_36 0x108 // Pin 36 UART2_CTS
98#define CNF_37 0x004 // Pin 37 SPI2_MOSI
99#define CNF_38 0x204 // Pin 38 DAP4_DIN
100#define CNF_40 0x204 // Pin 40 DAP4_DOUT
101
102/* GPIO Pinmux registers Nano Classic */
103
104#define PINMUX_3 0x0c8 // Pinmux 3 PINMUX_AUX_GEN2_I2C_SDA_0 0x700030c8
105#define PINMUX_5 0x0c4 // Pinmux 5 PINMUX_AUX_GEN2_I2C_SCL_0
106#define PINMUX_7 0x180 // Pinmux 7 PINMUX_AUX_AUD_MCLK_0
107#define PINMUX_8 0x0f4 // Pinmux 8 PINMUX_AUX_UART2_TX_0
108#define PINMUX_10 0x0f8 // Pinmux 10 PINMUX_AUX_UART2_RX_0
109#define PINMUX_11 0x0fc // Pinmux 11 PINMUX_AUX_UART2_RTS_0
110#define PINMUX_12 0x150 // Pinmux 12 PINMUX_AUX_DAP4_SCLK_0
111#define PINMUX_13 0x06c // Pinmux 13 PINMUX_AUX_SPI2_SCK_0
112#define PINMUX_15 0x1f8 // Pinmux 15 PINMUX_AUX_LCD_TE_0
113#define PINMUX_16 0x074 // Pinmux 16 PINMUX_AUX_SPI2_CS1_0
114#define PINMUX_18 0x070 // Pinmux 18 PINMUX_AUX_SPI2_CS0_0
115#define PINMUX_19 0x050 // Pinmux 19 PINMUX_AUX_SPI1_MOSI_0
116#define PINMUX_21 0x054 // Pinmux 21 PINMUX_AUX_SPI1_MISO_0
117#define PINMUX_22 0x068 // Pinmux 22 PINMUX_AUX_SPI2_MISO_0
118#define PINMUX_23 0x058 // Pinmux 23 PINMUX_AUX_SPI1_SCK_0
119#define PINMUX_24 0x05c // Pinmux 24 PINMUX_AUX_SPI1_CS0_0
120#define PINMUX_26 0x060 // Pinmux 26 PINMUX_AUX_SPI1_CS1_0
121#define PINMUX_27 0x0c0 // Pinmux 27 PINMUX_AUX_GEN1_I2C_SDA_0
122#define PINMUX_28 0x0bc // Pinmux 28 PINMUX_AUX_GEN1_I2C_SCL_0
123#define PINMUX_29 0x1e4 // Pinmux 29 PINMUX_AUX_CAM_AF_EN_0
124#define PINMUX_31 0x27c // Pinmux 31 PINMUX_AUX_GPIO_PZ0_0
125#define PINMUX_32 0x1fc // Pinmux 32 PINMUX_AUX_LCD_BL_PWM_0
126#define PINMUX_33 0x248 // Pinmux 33 PINMUX_AUX_GPIO_PE6_0
127#define PINMUX_35 0x144 // Pinmux 35 PINMUX_AUX_DAP4_FS_0
128#define PINMUX_36 0x100 // Pinmux 36 PINMUX_AUX_UART2_CTS_0
129#define PINMUX_37 0x064 // Pinmux 37 PINMUX_AUX_SPI2_MOSI_0
130#define PINMUX_38 0x148 // Pinmux 38 PINMUX_AUX_DAP4_DIN_0
131#define PINMUX_40 0x14c // Pinmux 40 PINMUX_AUX_DAP4_DOUT_0
132
133/* GPIO Cfg registers Nano Classic */
134
135#define CFG_3 0x9b4 // Config 3 GEN2_I2C_SDA_CFG 0x700009b4
136#define CFG_5 0x9b0 // Config 5 GEN2_I2C_SCL_CFG
137#define CFG_7 0x8f4 // Config 7 AUD_MCLK_CFG
138#define CFG_8 0xb38 // Config 8 UART2_TX_CFG
139#define CFG_10 0xb34 // Config 10 UART2_RX_CFG
140#define CFG_11 0xb30 // Config 11 UART2_RTS_CFG
141#define CFG_12 0x980 // Config 12 DAP4_SCLK_CFG
142#define CFG_13 0xaf8 // Config 13 SPI2_SCK_CFG
143#define CFG_15 0xa44 // Config 15 LCD_TE_CFG
144#define CFG_16 0xaec // Config 16 SPI2_CS1_CFG
145#define CFG_18 0xae8 // Config 18 SPI2_CS0_CFG
146#define CFG_19 0xae0 // Config 19 SPI1_MOSI_CFG
147#define CFG_21 0xadc // Config 21 SPI1_MISO_CFG
148#define CFG_22 0xaf0 // Config 22 SPI2_MISO_CFG
149#define CFG_23 0xae4 // Config 23 SPI1_SCK_CFG
150#define CFG_24 0xad4 // Config 24 SPI1_CS0_CFG
151#define CFG_26 0xad8 // Config 26 SPI1_CS1_CFG
152#define CFG_27 0x9ac // Config 27 GEN1_I2C_SDA_CFG
153#define CFG_28 0x9a8 // Config 28 GEN1_I2C_SCL_CFG
154#define CFG_29 0x92c // Config 29 CAM_AF_EN_CFG
155#define CFG_31 0x9fc // Config 31 GPIO_PZ0_CFG
156#define CFG_32 0xa34 // Config 32 LCD_BL_PWM_CFG
157#define CFG_33 0x9c8 // Config 33 GPIO_PE6_CFG
158#define CFG_35 0x97c // Config 35 DAP4_FS_CFG
159#define CFG_36 0xb2c // Config 36 UART2_CTS_CFG
160#define CFG_37 0xaf4 // Config 37 SPI2_MOSI_CFG
161#define CFG_38 0x974 // Config 38 DAP4_DIN_CFG
162#define CFG_40 0x978 // Config 40 DAP4_DOUT_CFG
163
164/* Typical values Pinmux & Cfg registers Nano Classic */
165
166#define PINMUX_IN 0x00000040 // Typical for pinmux register as input
167#define PINMUX_OUT 0x00000440 // Typical for pinmux register as output
168#define PINMUX_OUT1 0x0000e240 // Typical for pinmux spi pins register as output
169#define CFG_IN 0x00000000 // Typical for config register as input
170#define CFG_OUT 0x01F1F000 // Typical for config register as output
171#define CFG_OUT1 0xF0000000 // Typical for config spi pins register as output
172
173/* GPIO base address Orin */
174
175#define base_CNF_AON 0x0c2f1000 // Base address Nano AON: 3,5,27,28 AGX: 3,5,16,27,28,29,31,32,33,37
176#define base_CNF_NAON 0x02210000 // Base address Nano Non AON: 7,8,10,11,29,31,36,15,12,32,33,35,38,40,13,16,18,19,21,22,23,24,26,37 AGX: 7,8,10,11,36,15,12,35,38,40,13,18,19,21,22,23,24,26
177#define Pinmux_AON 0x0c302000 // Pinmux + config GPIO PADCTL_A14 pad Nano & AGX: 3,5,27,28
178#define Pinmux_AONHV 0x0c303000 // Pinmux + config GPIO PADCTL_A15 pad AGX: 29,31,33,37
179#define Pinmux_G7 0x02448000 // Pinmux + config GPIO PADCTL_A24 pad Nano: 7
180#define Pinmux_G3 0x02430000 // Pinmux + config GPIO PADCTL_A0 pad Nano: 8,10,11,29,31,36 AGX: 8,10,11,13,22,26
181#define Pinmux_EDP 0x02440000 // Pinmux + config GPIO PADCTL_A16 pad Nano & AGX: 15
182#define Pinmux_G4 0x02434000 // Pinmux + config GPIO PADCTL_A4 pad Nano: 12,32,33,35,38,40 AGX: 18
183#define Pinmux_G2 0x0243d000 // Pinmux + config GPIO PADCTL_A13 pad Nano: 13,16,18,19,21,22,23,24,26,37 AGX: 19,21,23,24,26
184
185/* PWM Control Orin */
186
187#define base_PWM1 0x03280000 // PWM1 Controller base address Nano & AGX: pin 15
188#define base_PWM5 0x032c0000 // PWM5 Controller base address Nano: pin 33, AGX: pin 18
189#define base_PWM7 0x032e0000 // PWM7 Controller base address Nano: pin 32
190#define base_PWM8 0x032f0000 // PWM8 Controller base address AGX: pin 13
191
192/* GPIO CNF registers Orin */
193
194#define CNFO_3 0x0640 // Pin 3 AO_GEN8_I2C_SDA_0
195#define CNFO_5 0x0620 // Pin 5 AO_GEN8_I2C_SCL_0
196#define CNFO_7 0x002c0 // Pin 7 G7_SOC_GPIO59_0
197#define CNFO_8 0x02840 // Pin 8 G3_UART1_TX_0
198#define CNFO_10 0x02860 // Pin 10 G3_UART1_RX_0
199#define CNFO_11 0x02880 // Pin 11 G3_UART1_RTS_0
200#define CNFO_12 0x042e0 // Pin 12 G4_SOC_GPIO41_0
201#define CNFO_13 0x01200 // Pin 13 G2_SPI3_SCK_0
202#define CNFO_15 0x02220 // Pin 15 EDP_SOC_GPIO39_0
203#define CNFO_16 0x01280 // Pin 16 G2_SPI3_CS1_0
204#define CNFO_18 0x01260 // Pin 18 G2_SPI3_CS0_0
205#define CNFO_19 0x014a0 // Pin 19 G2_SPI1_MOSI_0
206#define CNFO_21 0x01480 // Pin 21 G2_SPI1_MISO_0
207#define CNFO_22 0x01220 // Pin 22 G2_SPI3_MISO_0
208#define CNFO_23 0x01460 // Pin 23 G2_SPI1_SCK_0
209#define CNFO_24 0x014c0 // Pin 24 G2_SPI1_CS0_0
210#define CNFO_26 0x014e0 // Pin 26 G2_SPI1_CS1_0
211#define CNFO_27 0x0600 // Pin 27 AO_GEN2_I2C_SDA_0
212#define CNFO_28 0x04e0 // Pin 28 AO_GEN2_I2C_SCL_0
213#define CNFO_29 0x026a0 // Pin 29 G3_SOC_GPIO32_0
214#define CNFO_31 0x026c0 // Pin 31 G3_SOC_GPIO33_0
215#define CNFO_32 0x040c0 // Pin 32 G4_SOC_GPIO19_0
216#define CNFO_33 0x04200 // Pin 33 G4_SOC_GPIO21_0
217#define CNFO_35 0x04440 // Pin 35 G4_SOC_GPIO44_0
218#define CNFO_36 0x028a0 // Pin 36 G3_UART1_CTS_0
219#define CNFO_37 0x01240 // Pin 37 G2_SPI3_MOSI_0
220#define CNFO_38 0x04420 // Pin 38 G4_SOC_GPIO43_0
221#define CNFO_40 0x04400 // Pin 40 G4_SOC_GPIO42_0
222
223/* GPIO Pinmux registers Orin */
224
225#define PINMUXO_3 0x18 // Pinmux 3 AO_GEN8_I2C_SDA_0
226#define PINMUXO_5 0x20 // Pinmux 5 AO_GEN8_I2C_SCL_0
227#define PINMUXO_7 0x30 // Pinmux 7 G7_SOC_GPIO59_0
228#define PINMUXO_8 0xa8 // Pinmux 8 G3_UART1_TX_0
229#define PINMUXO_10 0xa0 // Pinmux 10 G3_UART1_RX_0
230#define PINMUXO_11 0x98 // Pinmux 11 G3_UART1_RTS_0
231#define PINMUXO_12 0x88 // Pinmux 12 G4_SOC_GPIO41_0
232#define PINMUXO_13 0x30 // Pinmux 13 G2_SPI3_SCK_0
233#define PINMUXO_15 0x20 // Pinmux 15 EDP_SOC_GPIO39_0
234#define PINMUXO_16 0x20 // Pinmux 16 G2_SPI3_CS1_0
235#define PINMUXO_18 0x10 // Pinmux 18 G2_SPI3_CS0_0
236#define PINMUXO_19 0x40 // Pinmux 19 G2_SPI1_MOSI_0
237#define PINMUXO_21 0x18 // Pinmux 21 G2_SPI1_MISO_0
238#define PINMUXO_22 0x0 // Pinmux 22 G2_SPI3_MISO_0
239#define PINMUXO_23 0x28 // Pinmux 23 G2_SPI1_SCK_0
240#define PINMUXO_24 0x8 // Pinmux 24 G2_SPI1_CS0_0
241#define PINMUXO_26 0x38 // Pinmux 26 G2_SPI1_CS1_0
242#define PINMUXO_27 0x40 // Pinmux 27 AO_GEN2_I2C_SDA_0
243#define PINMUXO_28 0x30 // Pinmux 28 AO_GEN2_I2C_SCL_0
244#define PINMUXO_29 0x68 // Pinmux 29 G3_SOC_GPIO32_0
245#define PINMUXO_31 0x70 // Pinmux 31 G3_SOC_GPIO33_0
246#define PINMUXO_32 0x80 // Pinmux 32 G4_SOC_GPIO19_0
247#define PINMUXO_33 0X40 // Pinmux 33 G4_SOC_GPIO21_0
248#define PINMUXO_35 0xa0 // Pinmux 35 G4_SOC_GPIO44_0
249#define PINMUXO_36 0x90 // Pinmux 36 G3_UART1_CTS_0
250#define PINMUXO_37 0x48 // Pinmux 37 G2_SPI3_MOSI_0
251#define PINMUXO_38 0x98 // Pinmux 38 G4_SOC_GPIO43_0
252#define PINMUXO_40 0x90 // Pinmux 40 G4_SOC_GPIO42_0
253
254/* GPIO Cfg registers Orin */
255
256#define CFGO_3 0x1c // Config 3 AO_CFG2TMC_GEN8_I2C_SDA_0
257#define CFGO_5 0X24 // Config 5 AO_CFG2TMC_GEN8_I2C_SCL_0
258#define CFGO_7 0x34 // Config 7 G7_CFG2TMC_SOC_GPIO59_0
259#define CFGO_8 0xac // Config 8 G3_CFG2TMC_UART1_TX_0
260#define CFGO_10 0xa4 // Config 10 G3_CFG2TMC_UART1_RX_0
261#define CFGO_11 0x9c // Config 11 G3_CFG2TMC_UART1_RTS_0
262#define CFGO_12 0x8c // Config 12 G4_CFG2TMC_SOC_GPIO41_0
263#define CFGO_13 0x34 // Config 13 G2_CFG2TMC_SPI3_SCK_0
264#define CFGO_15 0x24 // Config 15 EDP_CFG2TMC_SOC_GPIO39_0
265#define CFGO_16 0x24 // Config 16 G2_CFG2TMC_SPI3_CS1_0
266#define CFGO_18 0x14 // Config 18 G2_CFG2TMC_SPI3_CS0_0
267#define CFGO_19 0x44 // Config 19 G2_CFG2TMC_SPI1_MOSI_0
268#define CFGO_21 0x1c // Config 21 G2_CFG2TMC_SPI1_MISO_0
269#define CFGO_22 0x4 // Config 22 G2_CFG2TMC_SPI3_MISO_0
270#define CFGO_23 0x2c // Config 23 G2_CFG2TMC_SPI1_SCK_0
271#define CFGO_24 0xc // Config 24 G2_CFG2TMC_SPI1_CS0_0
272#define CFGO_26 0x3c // Config 26 G2_CFG2TMC_SPI1_CS1_0
273#define CFGO_27 0x44 // Config 27 AO_CFG2TMC_GEN2_I2C_SDA_0
274#define CFGO_28 0x34 // Config 28 AO_CFG2TMC_GEN2_I2C_SCL_0
275#define CFGO_29 0x6c // Config 29 G3_CFG2TMC_SOC_GPIO32_0
276#define CFGO_31 0x74 // Config 31 G3_CFG2TMC_SOC_GPIO33_0
277#define CFGO_32 0x84 // Config 32 G4_CFG2TMC_SOC_GPIO19_0
278#define CFGO_33 0x44 // Config 33 G4_CFG2TMC_SOC_GPIO21_0
279#define CFGO_35 0xa4 // Config 35 G4_CFG2TMC_SOC_GPIO44_0
280#define CFGO_36 0x94 // Config 36 G3_CFG2TMC_UART1_CTS_0
281#define CFGO_37 0x4c // Config 37 G2_CFG2TMC_SPI3_MOSI_0
282#define CFGO_38 0x9c // Config 38 G4_CFG2TMC_SOC_GPIO43_0
283#define CFGO_40 0x94 // Config 40 G4_CFG2TMC_SOC_GPIO42_0
284
285/* GPIO CNF registers Orin AGX */
286
287#define CNFOX_7 0x026c0 // Pin 7 G3_SOC_GPIO33_0
288#define CNFOX_13 0x02800 // Pin 13 G3_SOC_GPIO37_0
289#define CNFOX_16 0x0a20 // Pin 16 AO_HV_CAN1_EN_0
290#define CNFOX_18 0x04200 // Pin 18 G4_SOC_GPIO21_0
291#define CNFOX_22 0x02480 // Pin 22 G3_SOC_GPIO23_0
292#define CNFOX_29 0x0820 // Pin 29 AO_HV_CAN0_DIN_0
293#define CNFOX_31 0x0800 // Pin 31 AO_HV_CAN0_DOUT_0
294#define CNFOX_32 0x0a00 // Pin 32 AO_HV_CAN1_STB_0
295#define CNFOX_33 0x0840 // Pin 33 AO_HV_CAN1_DOUT_0
296#define CNFOX_37 0x0860 // Pin 37 AO_HV_CAN1_DIN_0
297
298/* GPIO Pinmux registers Orin AGX */
299
300#define PINMUXOX_7 0x70 // Pinmux 7 G3_SOC_GPIO33_0
301#define PINMUXOX_13 0x80 // Pinmux 13 G3_SOC_GPIO37_0
302#define PINMUXOX_16 0x48 // Pinmux 16 AO_HV_CAN1_EN_0
303#define PINMUXOX_18 0x40 // Pinmux 18 G4_SOC_GPIO21_0
304#define PINMUXOX_22 0x20 // Pinmux 22 G3_SOC_GPIO23_0
305#define PINMUXOX_29 0x18 // Pinmux 29 AO_HV_CAN0_DIN_0
306#define PINMUXOX_31 0x10 // Pinmux 31 AO_HV_CAN0_DOUT_0
307#define PINMUXOX_32 0x40 // Pinmux 32 AO_HV_CAN1_STB_0
308#define PINMUXOX_33 0X0 // Pinmux 33 AO_HV_CAN1_DOUT_0
309#define PINMUXOX_37 0x8 // Pinmux 37 AO_HV_CAN1_DIN_0
310
311/* GPIO Cfg registers Orin AGX */
312
313#define CFGOX_7 0x74 // Config 7 G3_CFG2TMC_SOC_GPIO33_0
314#define CFGOX_13 0x84 // Config 13 G3_CFG2TMC_SOC_GPIO37_0
315#define CFGOX_16 0x4c // Config 16 AO_HV_CFG2TMC_CAN1_EN_0
316#define CFGOX_18 0x44 // Config 18 G4_CFG2TMC_SOC_GPIO21_0
317#define CFGOX_22 0x24 // Config 22 G3_CFG2TMC_SOC_GPIO23_0
318#define CFGOX_29 0x1c // Config 29 AO_HV_CFG2TMC_CAN0_DIN_0
319#define CFGOX_31 0x14 // Config 31 AO_HV_CFG2TMC_CAN0_DOUT_0
320#define CFGOX_32 0x44 // Config 32 AO_HV_CFG2TMC_CAN1_STB_0
321#define CFGOX_33 0x4 // Config 33 AO_HV_CFG2TMC_CAN1_DOUT_0
322#define CFGOX_37 0xc // Config 37 AO_HV_CFG2TMC_CAN1_DIN_0
323
324/* Typical values Pinmux & Cfg registers Orin */
325
326#define CNFO_IN 0x00000001 // Typical for CNF register as input
327#define CNFO_OUT 0x00000003 // Typical for CNF register as output
328#define PINMUXO_IN 0x00000040 // Typical for pinmux register as input
329#define PINMUXO_IN1 0x00000041
330#define PINMUXO_OUT 0x00000040 // Typical for pinmux register as output
331#define PINMUXO_OUT1 0x00000060 // Pinmux register as output for I2C pins
332#define CFGO_IN 0x00000000 // Typical for config register as input
333#define CFGO_OUT 0x01f1f000 // Typical for config register as output
334
335/* GPIO base address Xavier */
336
337#define base_CNF_xavier_AON 0x0c2f1000 // Base address Xavier AON: 15,27,28
338#define base_CNF_xavier_NAON 0x02210000 // Base address Xavier Non AON: 7,8,10,11,12,13,16,18,19,21,22,23,24,26,29,31,32,33,35,36,37,38,40
339#define Pinmux_xavier_AON 0x0c302000 // Pinmux + config GPIO PADCTL_A14 pad Xavier: 3,5,15,27,28
340#define Pinmux_xavier_Audio 0x02431000 // Pinmux + config GPIO PADCTL_A1 pad Xavier: 7,12,35,38,40
341#define Pinmux_xavier_CAM 0x02430000 // Pinmux + config GPIO PADCTL_A0 pad Xavier: 8,10,11,29,31,32,36
342#define Pinmux_xavier_UART 0x0243d000 // Pinmux + config GPIO PADCTL_A13 pad Xavier: 13,16,18,19,21,22,23,24,26,37,
343#define Pinmux_xavier_EDP 0x02440000 // Pinmux + config GPIO PADCTL_A16 pad Xavier: 33,
344
345/* PWM Control Xavier */
346
347#define base_xavier_PWM1 0x03280000 // PWM1 Controller base address Xavier: pin 33
348#define base_xavier_PWM8 0x032f0000 // PWM8 Controller base address Xavier: pin 32
349
350/* GPIO CNF registers Xavier */
351
352#define CNFX_7 0x03680 // Pin 7 AUD_MCLK
353#define CNFX_8 0x02e40 // Pin 8 UART1_TX
354#define CNFX_10 0x02e60 // Pin 10 UART1_RX
355#define CNFX_11 0x02e80 // Pin 11 UART1_RTS
356#define CNFX_12 0x038a0 // Pin 12 DAP5_SCLK
357#define CNFX_13 0x02200 // Pin 13 SPI3_SCK
358#define CNFX_15 0x00280 // Pin 15 TOUCH_CLK
359#define CNFX_16 0x02280 // Pin 16 SPI3_CS1
360#define CNFX_18 0x02260 // Pin 18 SPI3_CS0
361#define CNFX_19 0x024a0 // Pin 19 SPI1_MOSI
362#define CNFX_21 0x02480 // Pin 21 SPI1_MISO
363#define CNFX_22 0x02220 // Pin 22 SPI3_MISO
364#define CNFX_23 0x02460 // Pin 23 SPI1_SCK
365#define CNFX_24 0x024c0 // Pin 24 SPI1_CS0
366#define CNFX_26 0x024e0 // Pin 26 SPI1_CS1
367#define CNFX_27 0x00400 // Pin 27 GEN2_I2C_SDA
368#define CNFX_28 0x002e0 // Pin 28 GEN2_I2C_SCL
369#define CNFX_29 0x02ca0 // Pin 29 SOC_GPIO41
370#define CNFX_31 0x02cc0 // Pin 31 SOC_GPIO42
371#define CNFX_32 0x02e00 // Pin 32 SOC_GPIO44
372#define CNFX_33 0x02820 // Pin 33 SOC_GPIO54
373#define CNFX_35 0x03a00 // Pin 35 DAP5_FS
374#define CNFX_36 0x02ea0 // Pin 36 UART1_CTS
375#define CNFX_37 0x02240 // Pin 37 SPI3_MOSI
376#define CNFX_38 0x038e0 // Pin 38 DAP5_DIN
377#define CNFX_40 0x038c0 // Pin 40 DAP5_DOUT
378
379/* GPIO Pinmux registers Xavier */
380
381#define PINMUXX_3 0x18 // Pinmux 3 PADCTL_AO_GEN8_I2C_SDA_0
382#define PINMUXX_5 0x20 // Pinmux 5 PADCTL_AO_GEN8_I2C_SCL_0
383#define PINMUXX_7 0x20 // Pinmux 7 PADCTL_AUDIO_AUD_MCLK_0
384#define PINMUXX_8 0xa8 // Pinmux 8 PADCTL_CAM_UART1_TX_0
385#define PINMUXX_10 0xa0 // Pinmux 10 PADCTL_CAM_UART1_RX_0
386#define PINMUXX_11 0x98 // Pinmux 11 PADCTL_CAM_UART1_RTS_0
387#define PINMUXX_12 0x80 // Pinmux 12 PADCTL_AUDIO_DAP5_SCLK_0
388#define PINMUXX_13 0x48 // Pinmux 13 PADCTL_UART_SPI3_SCK_0
389#define PINMUXX_15 0x00 // Pinmux 15 PADCTL_AO_TOUCH_CLK_0
390#define PINMUXX_16 0x28 // Pinmux 16 PADCTL_UART_SPI3_CS1_0
391#define PINMUXX_18 0x18 // Pinmux 18 PADCTL_UART_SPI3_CS0_0
392#define PINMUXX_19 0x58 // Pinmux 19 PADCTL_UART_SPI1_MOSI_0
393#define PINMUXX_21 0x20 // Pinmux 21 PADCTL_UART_SPI1_MISO_0
394#define PINMUXX_22 0x08 // Pinmux 22 PADCTL_UART_SPI3_MISO_0
395#define PINMUXX_23 0x40 // Pinmux 23 PADCTL_UART_SPI1_SCK_0
396#define PINMUXX_24 0x10 // Pinmux 24 PADCTL_UART_SPI1_CS0_0
397#define PINMUXX_26 0x50 // Pinmux 26 PADCTL_UART_SPI1_CS1_0
398#define PINMUXX_27 0x40 // Pinmux 27 PADCTL_AO_GEN2_I2C_SDA_0
399#define PINMUXX_28 0x30 // Pinmux 28 PADCTL_AO_GEN2_I2C_SCL_0
400#define PINMUXX_29 0x28 // Pinmux 29 PADCTL_CAM_SOC_GPIO41_0
401#define PINMUXX_31 0x30 // Pinmux 31 PADCTL_CAM_SOC_GPIO42_0
402#define PINMUXX_32 0x40 // Pinmux 32 PADCTL_CAM_SOC_GPIO44_0
403#define PINMUXX_33 0X20 // Pinmux 33 PADCTL_EDP_SOC_GPIO54_0
404#define PINMUXX_35 0x68 // Pinmux 35 PADCTL_AUDIO_DAP5_FS_0
405#define PINMUXX_36 0x90 // Pinmux 36 PADCTL_CAM_UART1_CTS_0
406#define PINMUXX_37 0x60 // Pinmux 37 PADCTL_UART_SPI3_MOSI_0
407#define PINMUXX_38 0x70 // Pinmux 38 PADCTL_AUDIO_DAP5_DIN_0
408#define PINMUXX_40 0x78 // Pinmux 40 PADCTL_AUDIO_DAP5_DOUT_0
409
410/* GPIO Cfg registers Xavier */
411
412#define CFGX_3 0x1c // Config 3 PADCTL_AO_CFG2TMC_GEN8_I2C_SDA_0
413#define CFGX_5 0X24 // Config 5 PADCTL_AO_CFG2TMC_GEN8_I2C_SCL_0
414#define CFGX_7 0x24 // Config 7 PADCTL_AUDIO_CFG2TMC_AUD_MCLK_0
415#define CFGX_8 0xac // Config 8 PADCTL_CAM_CFG2TMC_UART1_TX_0
416#define CFGX_10 0xa4 // Config 10 PADCTL_CAM_CFG2TMC_UART1_RX_0
417#define CFGX_11 0x9c // Config 11 PADCTL_CAM_CFG2TMC_UART1_RTS_0
418#define CFGX_12 0x84 // Config 12 PADCTL_AUDIO_CFG2TMC_DAP5_SCLK_0
419#define CFGX_13 0x4c // Config 13 PADCTL_UART_CFG2TMC_SPI3_SCK_0
420#define CFGX_15 0x04 // Config 15 PADCTL_AO_CFG2TMC_TOUCH_CLK_0
421#define CFGX_16 0x2c // Config 16 PADCTL_UART_CFG2TMC_SPI3_CS1_0
422#define CFGX_18 0x1c // Config 18 PADCTL_UART_CFG2TMC_SPI3_CS0_0
423#define CFGX_19 0x5c // Config 19 PADCTL_UART_CFG2TMC_SPI1_MOSI_0
424#define CFGX_21 0x24 // Config 21 PADCTL_UART_CFG2TMC_SPI1_MISO_0
425#define CFGX_22 0x0c // Config 22 PADCTL_UART_CFG2TMC_SPI3_MISO_0
426#define CFGX_23 0x44 // Config 23 PADCTL_UART_CFG2TMC_SPI1_SCK_0
427#define CFGX_24 0x14 // Config 24 PADCTL_UART_CFG2TMC_SPI1_CS0_0
428#define CFGX_26 0x54 // Config 26 PADCTL_UART_CFG2TMC_SPI1_CS1_0
429#define CFGX_27 0x44 // Config 27 PADCTL_AO_CFG2TMC_GEN2_I2C_SDA_0
430#define CFGX_28 0x34 // Config 28 PADCTL_AO_CFG2TMC_GEN2_I2C_SCL_0
431#define CFGX_29 0x2c // Config 29 PADCTL_CAM_CFG2TMC_SOC_GPIO41_0
432#define CFGX_31 0x34 // Config 31 PADCTL_CAM_CFG2TMC_SOC_GPIO42_0
433#define CFGX_32 0x44 // Config 32 PADCTL_CAM_CFG2TMC_SOC_GPIO44_0
434#define CFGX_33 0x24 // Config 33 PADCTL_EDP_CFG2TMC_SOC_GPIO54_0
435#define CFGX_35 0x6c // Config 35 PADCTL_AUDIO_CFG2TMC_DAP5_FS_0
436#define CFGX_36 0x94 // Config 36 PADCTL_CAM_CFG2TMC_UART1_CTS_0
437#define CFGX_37 0x64 // Config 37 PADCTL_UART_CFG2TMC_SPI3_MOSI_0
438#define CFGX_38 0x74 // Config 38 PADCTL_AUDIO_CFG2TMC_DAP5_DIN_0
439#define CFGX_40 0x7c // Config 40 PADCTL_AUDIO_CFG2TMC_DAP5_DOUT_0
440
441/* Define outputs get_chip_id */
442
443#define NANO 210
444#define ORIN 234
445#define ORINAGX 235
446#define XAVIER 194
447
448/* Define typical input/output */
449
450#define JET_INPUT 0
451#define JET_OUTPUT 1
452
453/* Define the typical interruption trigger */
454
455#define RISING_EDGE 1
456#define FALLING_EDGE 2
457#define EITHER_EDGE 3
458
459/* i2c definitions */
460
461#define I2C_CLOSED 0
462#define I2C_RESERVED 1
463#define I2C_OPENED 2
464
465/* SPI definitions */
466
467#define SPI_CLOSED 0
468#define SPI_RESERVED 1
469#define SPI_OPENED 2
470
471/* Externel peripheral clocks on Orin */
472
473#define EXTPERIPH3 3
474#define EXTPERIPH4 4
475
476#ifdef __cplusplus
477extern "C" {
478#endif
479
480/* Variables */
481
482typedef struct {
483 uint32_t CNF[4];
484 uint32_t OE[4];
485 uint32_t OUT[4];
486 uint32_t IN[4];
487 uint32_t INT_STA[4];
488 uint32_t INT_ENB[4];
489 uint32_t INT_LVL[4];
490 uint32_t INT_CLR[4];
491} GPIO_CNF;
492
493typedef struct {
494 uint32_t CNF[1];
495 uint32_t DEB[1];
496 uint32_t IN[1];
497 uint32_t OUT[1];
498 uint32_t OUT_VLE[1];
499 uint32_t INT_CLR[1];
500} GPIO_CNFO;
501
502
503typedef struct {
504 uint32_t pin3;
505 uint32_t pin5;
506 uint32_t pin7;
507 uint32_t pin8;
508 uint32_t pin10;
509 uint32_t pin11;
510 uint32_t pin12;
511 uint32_t pin13;
512 uint32_t pin15;
513 uint32_t pin16;
514 uint32_t pin18;
515 uint32_t pin19;
516 uint32_t pin21;
517 uint32_t pin22;
518 uint32_t pin23;
519 uint32_t pin24;
520 uint32_t pin26;
521 uint32_t pin27;
522 uint32_t pin28;
523 uint32_t pin29;
524 uint32_t pin31;
525 uint32_t pin32;
526 uint32_t pin33;
527 uint32_t pin35;
528 uint32_t pin36;
529 uint32_t pin37;
530 uint32_t pin38;
531 uint32_t pin40;
532} GPIO_CNF_Init;
533
534typedef struct {
535 uint32_t stat_reg;
536 uint32_t gpio;
537 uint32_t edge;
538 uint32_t gpio_offset;
539 uint64_t *timestamp;
540 void (*f)();
541 uint32_t debounce;
542} ISRFunc;
543
544typedef ISRFunc *PISRFunc;
545
546typedef struct {
547 uint32_t PWM_0[4];
548 uint32_t PWM_1[4];
549 uint32_t PWM_2[4];
550 uint32_t PWM_3[4];
551} GPIO_PWM;
552
553typedef struct {
554 uint32_t state;
555 int32_t fd;
556 uint32_t addr;
557 uint32_t flags;
558 uint32_t funcs;
559} i2cInfo_t;
560
561typedef struct {
562 uint32_t state;
563 int32_t fd;
564 uint32_t mode;
565 uint32_t speed;
566 uint32_t cs_delay;
567 uint32_t cs_change;
568 uint32_t bits_word;
569} SPIInfo_t;
570
571/* Functions */
572
573int gpioInitialise(void);
590void gpioTerminate(void);
600int gpioSetMode(unsigned gpio, unsigned mode);
612int gpioRead(unsigned gpio);
622int gpioWrite(unsigned gpio, unsigned level);
633int gpioSetISRFunc(unsigned gpio, unsigned edge, unsigned debounce, unsigned long *timestamp, void (*f)());
649int gpioSetPWMfrequency(unsigned gpio, unsigned frequency);
659int gpioPWM(unsigned gpio, unsigned dutycycle);
671int i2cOpen(unsigned i2cBus, unsigned i2cFlags);
686int i2cClose(unsigned handle);
695int i2cWriteByteData(unsigned handle, unsigned i2cAddr, unsigned i2cReg, unsigned bVal);
708int i2cReadByteData(unsigned handle, unsigned i2cAddr, unsigned i2cReg);
719int i2cWriteWordData(unsigned handle, unsigned i2cAddr, unsigned i2cReg, unsigned wVal);
732int i2cReadWordData(unsigned handle, unsigned i2cAddr, unsigned i2cReg);
743int spiOpen(unsigned spiChan, unsigned speed, unsigned mode, unsigned cs_delay, unsigned bits_word, unsigned lsb_first, unsigned cs_change);
775int spiClose(unsigned handle);
784int spiXfer(unsigned handle, char *txBuf, char *rxBuf, unsigned len);
796int extPeripheralRate(unsigned clk_name, unsigned rate);
806int extPeripheralEnable(unsigned clk_name);
815int extPeripheralDisable(unsigned clk_name);
824#ifdef __cplusplus
825}
826#endif
827
828#endif // jetgpio_h__
int gpioWrite(unsigned gpio, unsigned level)
Sets the GPIO level, on or off. Arduino style: digitalWrite.
Definition: nano.c:1521
int spiOpen(unsigned spiChan, unsigned speed, unsigned mode, unsigned cs_delay, unsigned bits_word, unsigned lsb_first, unsigned cs_change)
This function returns a handle for the SPI device on the channel. Data will be transferred at baud bi...
Definition: nano.c:2389
void gpioTerminate(void)
Terminates the library. This function restores the used registers to their previous state and release...
Definition: nano.c:701
int i2cReadWordData(unsigned handle, unsigned i2cAddr, unsigned i2cReg)
This reads two bytes from the specified consecutive register(s) of the device associated with handle.
Definition: nano.c:2344
int extPeripheralDisable(unsigned clk_name)
Orin family only. This functions disables one of the external peripheral clocks. There are 2 (pins 29...
Definition: orin.c:2837
int i2cWriteByteData(unsigned handle, unsigned i2cAddr, unsigned i2cReg, unsigned bVal)
This writes a single byte to the specified register of the device associated with handle.
Definition: nano.c:2199
int extPeripheralRate(unsigned clk_name, unsigned rate)
Orin family only. This functions changes the rate of one of the external peripheral clocks....
Definition: orin.c:2768
int gpioRead(unsigned gpio)
Reads the GPIO level, on or off, 0 or 1. Arduino style: digitalRead. Wheter a pin has been set as inp...
Definition: nano.c:1424
int gpioInitialise(void)
Initialises the library. gpioInitialise must be called before using the other library functions,...
Definition: nano.c:185
int gpioPWM(unsigned gpio, unsigned dutycycle)
Starts PWM on the GPIO, dutycycle between 0 (off) and range (fully on). Arduino style: analogWrite.
Definition: nano.c:2048
int spiXfer(unsigned handle, char *txBuf, char *rxBuf, unsigned len)
This function transfers len bytes of data from txBuf to the SPI device associated with the handle....
Definition: nano.c:2569
int gpioSetPWMfrequency(unsigned gpio, unsigned frequency)
Sets the frequency in hertz to be used for the GPIO.
Definition: nano.c:2022
int i2cWriteWordData(unsigned handle, unsigned i2cAddr, unsigned i2cReg, unsigned wVal)
This writes two bytes to the specified consecutive register(s) of the device associated with handle.
Definition: nano.c:2294
int spiClose(unsigned handle)
This functions closes the SPI device identified by the handle.
Definition: nano.c:2547
int i2cClose(unsigned handle)
This closes the I2C device associated with the handle.
Definition: nano.c:2172
int i2cOpen(unsigned i2cBus, unsigned i2cFlags)
This returns a handle for the device at the address on the I2C bus.
Definition: nano.c:2091
int gpioSetMode(unsigned gpio, unsigned mode)
Sets the GPIO mode, typically input or output.
Definition: nano.c:1004
int gpioSetISRFunc(unsigned gpio, unsigned edge, unsigned debounce, unsigned long *timestamp, void(*f)())
Registers a function to be called (a callback) whenever the specified.
Definition: nano.c:1778
int extPeripheralEnable(unsigned clk_name)
Orin family only. This functions enables one of the external peripheral clocks. There are 2 (pins 29 ...
Definition: orin.c:2802
int i2cReadByteData(unsigned handle, unsigned i2cAddr, unsigned i2cReg)
This reads a single byte from the specified register of the device associated with handle.
Definition: nano.c:2249