====== GPIO port register map ====== === GPIO Configuration register === ^ Pin Number ^ GPIO name ^ Base Address ^ Offset ^ Name ^ Bit ^ Type ^ Description ^ Reset Value ^ |15|GPX1.2| 0x1340_0000 | 0x0C20 | GPX1CON[2] | [11:8] | RW | 0x0=input, 0x1=Output, 0x2=Reserved, 0x3=Reserved, 0x4=TraceData, 0x5 to 0xE=Reserved, 0xF=EXT_INT| 0x00 | |18|GPX1.3|:::|:::| GPX1CON[3] | [15:12] |:::|:::|:::| |13|GPX1.5|:::|:::| GPX1CON[5] | [23:20] |:::|:::|:::| |17|GPX1.6|:::|:::| GPX1CON[6] | [27:24] |:::|:::|:::| |25|GPX1.7|:::|:::| GPX1CON[7] | [31:28] |:::|:::|:::| |26|GPX2.0|:::| 0x0C40 | GPX2CON[0] | [3:0] |:::|:::|:::| |24|GPX2.1|:::|:::| GPX2CON[1] | [7:4] |:::|:::|:::| |20|GPX2.4|:::|:::| GPX2CON[4] | [19:16] |:::|:::|:::| |21|GPX2.5|:::|:::| GPX2CON[5] | [23:20] |:::|:::|:::| |19|GPX2.6|:::|:::| GPX2CON[6] | [27:24] |:::|:::|:::| |22|GPX2.7|:::|:::| GPX2CON[7] | [31:28] |:::|:::|:::| |27|GPX3.1|:::| 0x0C60 | GPX3CON[1] | [7:4] |:::|:::|:::| |10|GPA2.4| 0x1401_0000 | 0x0040 | GPA2CON[4] | [19:16] |:::|:::|:::| |11|GPA2.5|:::|:::| GPA2CON[5] | [23:20] |:::|:::|:::| |9|GPA2.6|:::|:::| GPA2CON[6] | [27:24] |:::|:::|:::| |7|GPA2.7|:::|:::| GPA2CON[7] | [31:28] |:::|:::|:::| |16|GPB3.2|:::| 0x00C0 | GPB3CON[2] | [11:8] |:::|:::|:::| |14|GPB3.3|:::|:::| GPB3CON[3] | [15:12] |:::|:::|:::| === GPIO Data register === ^ GPIO name ^ Base Address ^ Offset ^ Name ^ Bit ^ Type ^ Description ^ Reset Value ^ |GPX1[n]|0x1340_0000| 0x0C24 | GPX1DAT[7:0] | [7:0] | RWX | When you configure the port as input port, the corresponding bit is the pin state. When you configure the port as output port, the pin state is same as the corresponding bit. When you configure the port as functional pin, it reads the undefined value. | 0x00 | |GPX2[n]|:::| 0x0C44 | GPX2DAT[7:0] |:::|:::|:::|:::| |GPX3[n]|:::| 0x0C64 | GPX3DAT[7:0] |:::|:::|:::|:::| |GPA2[n]|0x1401_0000| 0x0044 | GPA2DAT[7:0] |:::|:::|:::|:::| |GPB3[n]|:::| 0x00C4 | GPB3DAT[7:0] |:::|:::|:::|:::| === GPIO Pull-up/down register === ^ GPIO name ^ Base Address ^ Offset ^ Name ^ Bit ^ Type ^ Description ^ Reset Value ^ |GPX1[n]|0x1340_0000| 0x0C28 | GPX1PUD[n] | [2n+1:2n] n = 0 to 7 | RW | 0x0=Disables pull-up/down, 0x1=Enables pull-down, 0x2=Reserved, 0x3=Enables pull-up | 0x5555 | |GPX2[n]|:::| 0x0C48 | GPX2PUD[n] |:::|:::|:::|:::| |GPX3[n]|:::| 0x0C68 | GPX3PUD[n] |:::|:::|:::|:::| |GPA2[n]|0X1401_0000| 0x0048 | GPA2PUD[n] |:::|:::|:::|:::| |GPB3[n]|:::| 0x00C8 | GPB3PUD[n] |:::|:::|:::|:::| === Memory mapped GPIO example === root@odroid:# gcc -o mmap_gpio mmap_gpio.c root@odroid:# ./mmap_gpio GPX1CON register : 0x100000f0 GPX1CON register : 0x100001f0 GPX1DAT register : 0x00000086 GPX1DAT register : 0x00000082 #include #include #include #include static volatile uint32_t *gpio; int main(int argc, char **argv) { int fd ; if ((fd = open ("/dev/mem", O_RDWR | O_SYNC) ) < 0) { printf("Unable to open /dev/mem\n"); return -1; } gpio = mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x13400000); if (gpio < 0){ printf("Mmap failed.\n"); return -1; } // Print GPX1 configuration register. printf("GPX1CON register : 0x%08x\n", *(unsigned int *)(gpio + (0x0c20 >> 2))); // Set direction of GPX1.2 configuration register as out. *(gpio + (0x0c20 >> 2)) |= (0x1 << 8); printf("GPX1CON register : 0x%08x\n", *(unsigned int *)(gpio + (0x0c20 >> 2))); // GPX1.2 High *(gpio + (0x0c24 >> 2)) |= (1 << 2); printf("GPX1DAT register : 0x%08x\n", *(unsigned int *)(gpio + (0x0c24 >> 2))); // GPX1.2 Low *(gpio + (0x0c24 >> 2)) &= ~(1 << 2); printf("GPX1DAT register : 0x%08x\n", *(unsigned int *)(gpio + (0x0c24 >> 2))); return 0; }