Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
en:c1_gpio_default [2015/12/30 09:29] charles.park |
en:c1_gpio_default [2016/05/28 11:26] (current) odroid [Expansion Connectors (J2)] |
||
---|---|---|---|
Line 1: | Line 1: | ||
+ | |||
====== Expansion Connectors (J2) ====== | ====== Expansion Connectors (J2) ====== | ||
- | ^ GPIO ^ Name ^ Mode ^ V ^ PU/PD ^ PIN ^ PIN ^ PU/PD ^ V ^ Mode ^ Name ^ GPIO ^ | + | ** Default gpio status ** |
- | | - | 3.3V |---- | - | ---- | 1 | 2 | ---- | - | ---- | 5.0V | - | | + | |
+ | ^ GPIO ^ Name ^ Mode ^ V ^ PU/PD ^ PIN ^ PIN ^ PU/PD ^ V ^ Mode ^ Name ^ GPIO ^ | ||
+ | | - | 3.3V | - | - | - | 1 | 2 | - | - | - | 5.0V | - | | ||
+ | | 74 | I2CA_SDA | IN | 1 | - | 3 | 4 | - | - | - | 5.0V | - | | ||
+ | | 75 | I2CA_SCL | IN | 1 | - | 5 | 6 | - | - | - | GND | - | | ||
+ | | 83 | GPIOY.3 | IN | 0 | P/U | 7 | 8 | P/U | 1 | ALT1 | GPIOX.16 | 113 | | ||
+ | | - | GND | - | - | - | 9 | 10 | P/U | 1 | ALT1 | GPIOX.17 | 114 | | ||
+ | | 88 | GPIOY.8 | IN | 1 | P/U | 11 | 12 | P/U | 0 | IN | GPIOY.7 | 87 | | ||
+ | | 116 | GPIOX.19 | IN | 1 | P/U | 13 | 14 | - | - | - | GND | - | | ||
+ | | 115 | GPIOX.18 | IN | 0 | P/D | 15 | 16 | P/U | 1 | IN | GPIOX.7 | 104 | | ||
+ | | - | 3.3V | - | - | - | 17 | 18 | P/U | 1 | IN | GPIOX.5 | 102 | | ||
+ | | 107 | GPIOX.10 | IN | 1 | P/U | 19 | 20 | - | - | - | GND | - | | ||
+ | | 106 | GPIOX.9 | IN | 1 | P/U | 21 | 22 | P/U | 1 | IN | GPIOX.6 | 103 | | ||
+ | | 105 | GPIOX.8 | IN | 1 | P/U | 23 | 24 | P/D | 0 | IN | GPIOX.20 | 117 | | ||
+ | | - | GND | - | - | - | 25 | 26 | P/U | 1 | IN | GPIOX.21 | 118 | | ||
+ | | 76 | I2CB_SDA | IN | 1 | - | 27 | 28 | - | 1 | IN | I2CB_SCL | 77 | | ||
+ | | 101 | GPIOX.4 | IN | 1 | P/U | 29 | 30 | - | - | - | GND | - | | ||
+ | | 100 | GPIOX.3 | IN | 1 | P/U | 31 | 32 | P/U | 1 | IN | GPIOX.2 | 99 | | ||
+ | | 108 | GPIOX.11 | IN | 0 | P/D | 33 | 34 | - | - | - | GND | - | | ||
+ | | 97 | GPIOX.0 | IN | 1 | P/U | 35 | 36 | P/U | 1 | IN | GPIOX.1 | 98 | | ||
+ | | - | ADC.AIN0 | - | - | - | 37 | 38 | - | - | - | 1.8V REF | - | | ||
+ | | - | GND | - | - | - | 39 | 40 | - | - | - | ADC.AIN1 | - | | ||
+ | |||
+ | ** modprobe aml_i2c and spicc ** | ||
+ | ^ GPIO ^ Name ^ Mode ^ V ^ PU/PD ^ PIN ^ PIN ^ PU/PD ^ V ^ Mode ^ Name ^ GPIO ^ | ||
+ | | - | 3.3V | - | - | - | 1 | 2 | - | - | - | 5.0V | - | | ||
+ | | 74 | I2CA_SDA | ALT5 | 1 | - | 3 | 4 | - | - | - | 5.0V | - | | ||
+ | | 75 | I2CA_SCL | ALT5 | 1 | - | 5 | 6 | - | - | - | GND | - | | ||
+ | | 83 | GPIOY.3 | IN | 0 | P/D | 7 | 8 | P/U | 1 | ALT1 | GPIOX.16 | 113 | | ||
+ | | - | GND | - | - | - | 9 | 10 | P/U | 1 | ALT1 | GPIOX.17 | 114 | | ||
+ | | 88 | GPIOY.8 | IN | 1 | P/U | 11 | 12 | P/D | 0 | IN | GPIOY.7 | 87 | | ||
+ | | 116 | GPIOX.19 | IN | 1 | P/U | 13 | 14 | - | - | - | GND | - | | ||
+ | | 115 | GPIOX.18 | IN | 0 | P/D | 15 | 16 | P/U | 1 | IN | GPIOX.7 | 104 | | ||
+ | | - | 3.3V | - | - | - | 17 | 18 | P/U | 1 | IN | GPIOX.5 | 102 | | ||
+ | | 107 | GPIOX.10 | ALT4 | 1 | P/U | 19 | 20 | - | - | - | GND | - | | ||
+ | | 106 | GPIOX.9 | ALT4 | 1 | P/U | 21 | 22 | P/U | 1 | IN | GPIOX.6 | 103 | | ||
+ | | 105 | GPIOX.8 | ALT4 | 1 | P/U | 23 | 24 | P/D | 1 | OUT | GPIOX.20 | 117 | | ||
+ | | - | GND | - | - | - | 25 | 26 | P/U | 1 | OUT | GPIOX.21 | 118 | | ||
+ | | 76 | I2CB_SDA | ALT5 | 1 | - | 27 | 28 | - | - | ALT5 | I2CB_SCL | 77 | | ||
+ | | 101 | GPIOX.4 | IN | 1 | P/U | 29 | 30 | - | - | - | GND | - | | ||
+ | | 100 | GPIOX.3 | IN | 1 | P/U | 31 | 32 | P/U | 1 | IN | GPIOX.2 | 99 | | ||
+ | | 108 | GPIOX.11 | IN | 0 | P/D | 33 | 34 | - | - | - | GND | - | | ||
+ | | 97 | GPIOX.0 | IN | 1 | P/U | 35 | 36 | P/U | 1 | IN | GPIOX.1 | 98 | | ||
+ | | - | ADC.AIN0 | - | - | - | 37 | 38 | - | - | - | 1.8V REF | - | | ||
+ | | - | GND | - | - | - | 39 | 40 | - | - | - | ADC.AIN1 | - | | ||
+ | |||
+ | |||
+ | ====== Expansion Connectors (J7) ====== | ||
+ | ^ GPIO ^ Name ^ Mode ^ V ^ PU/PD ^ PIN ^ | ||
+ | | - | GND | - | - | - | 1 | | ||
+ | | 6 | GPIOAO.6 | IN | 0 | - | 2 | | ||
+ | | - | 5.0V | - | - | - | 3 | | ||
+ | | 8 | GPIOAO.8 | ALT2 | 0 | P/U | 4 | | ||
+ | | 10 | GPIOAO.10 | ALT2 | 0 | P/U | 5 | | ||
+ | | 9 | GPIOAO.9 | ALT2 | 0 | P/U | 6 | | ||
+ | | 11 | GPIOAO.11 | ALT2 | 0 | P/U | 7 | | ||
+ | |||
+ | ====== GPIO Status Check Program ====== | ||
+ | <file c gpio_status.c> | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // ODROID-C1 GPIO Status Check Application. | ||
+ | // | ||
+ | // Compile : gcc -o <create excute file name> <source file name> | ||
+ | // Run : sudo ./<created excute file name> | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | #include <stdio.h> | ||
+ | #include <stdarg.h> | ||
+ | #include <stdint.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <ctype.h> | ||
+ | #include <poll.h> | ||
+ | #include <unistd.h> | ||
+ | #include <errno.h> | ||
+ | #include <string.h> | ||
+ | #include <time.h> | ||
+ | #include <fcntl.h> | ||
+ | #include <pthread.h> | ||
+ | #include <sys/time.h> | ||
+ | #include <sys/mman.h> | ||
+ | #include <sys/stat.h> | ||
+ | #include <sys/wait.h> | ||
+ | #include <sys/ioctl.h> | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Global handle Define | ||
+ | // | ||
+ | //------------------------------------------------------------------------------ | ||
+ | |||
+ | // MMAP Address for GPIO | ||
+ | #define GPIO_REG_MAP 0xC1108000 | ||
+ | #define GPIO_AO_REG_MAP 0xC8100000 | ||
+ | |||
+ | #define BLOCK_SIZE (4*1024) | ||
+ | |||
+ | static volatile unsigned int *gpio; | ||
+ | static volatile unsigned int *gpio_ao; | ||
+ | |||
+ | static volatile unsigned int *ao_in; | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | // refer kernel/arch/arm/mach-meson8b/include/mach/gpio.h | ||
+ | #define GPIOAO_PIN_START 0 | ||
+ | #define GPIOAO_PIN_END 13 | ||
+ | |||
+ | #define GPIOAO_FSEL_REG_OFFSET 0x09 | ||
+ | #define GPIOAO_OUTP_REG_OFFSET 0x09 | ||
+ | #define GPIOAO_INP_REG_OFFSET 0x0A | ||
+ | #define GPIOAO_PUPD_REG_OFFSET 0x0B | ||
+ | #define GPIOAO_PUEN_REG_OFFSET 0x0B | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | #define GPIODV_PIN_START 50 | ||
+ | #define GPIODV_PIN_END 79 | ||
+ | |||
+ | #define GPIODV_FSEL_REG_OFFSET 0x12 | ||
+ | #define GPIODV_OUTP_REG_OFFSET 0x13 | ||
+ | #define GPIODV_INP_REG_OFFSET 0x14 | ||
+ | #define GPIODV_PUPD_REG_OFFSET 0x3A | ||
+ | #define GPIODV_PUEN_REG_OFFSET 0x48 | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | #define GPIOY_PIN_START 80 | ||
+ | #define GPIOY_PIN_END 96 | ||
+ | |||
+ | #define GPIOY_FSEL_REG_OFFSET 0x0F | ||
+ | #define GPIOY_OUTP_REG_OFFSET 0x10 | ||
+ | #define GPIOY_INP_REG_OFFSET 0x11 | ||
+ | #define GPIOY_PUPD_REG_OFFSET 0x3D | ||
+ | #define GPIOY_PUEN_REG_OFFSET 0x4B | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | #define GPIOX_PIN_START 97 | ||
+ | #define GPIOX_PIN_END 118 | ||
+ | |||
+ | #define GPIOX_FSEL_REG_OFFSET 0x0C | ||
+ | #define GPIOX_OUTP_REG_OFFSET 0x0D | ||
+ | #define GPIOX_INP_REG_OFFSET 0x0E | ||
+ | #define GPIOX_PUPD_REG_OFFSET 0x3E | ||
+ | #define GPIOX_PUEN_REG_OFFSET 0x4C | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | #define MUX_REG0 0x5 // MUX_AO Block | ||
+ | #define MUX_REG1 0x2D | ||
+ | #define MUX_REG2 0x2E | ||
+ | #define MUX_REG3 0x2F | ||
+ | #define MUX_REG4 0x30 | ||
+ | #define MUX_REG5 0x31 | ||
+ | #define MUX_REG6 0x32 | ||
+ | #define MUX_REG7 0x33 | ||
+ | #define MUX_REG8 0x34 | ||
+ | #define MUX_REG9 0x35 | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | #define BIT(x) (1 << x) | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | const char MODE_STR[8][5] = { | ||
+ | " - ", | ||
+ | "ALT1", | ||
+ | "ALT2", | ||
+ | "ALT3", | ||
+ | "ALT4", | ||
+ | "ALT5", | ||
+ | "IN", | ||
+ | "OUT", | ||
+ | }; | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | const char PUPD_STR[3][5] = { | ||
+ | " - ", | ||
+ | "P/U", | ||
+ | "P/D", | ||
+ | }; | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | struct header_info { | ||
+ | int gpio; | ||
+ | char name[10]; | ||
+ | }; | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | const struct header_info header_J2[40] = { | ||
+ | { -1, "3.3V" }, { -1, "5.0V" }, | ||
+ | { 74, "I2CA_SDA" }, { -1, "5.0V" }, | ||
+ | { 75, "I2CA_SCL" }, { -1, "GND" }, | ||
+ | { 83, "GPIOY.3" }, { 113, "GPIOX.16" }, | ||
+ | { -1, "GND" }, { 114, "GPIOX.17" }, | ||
+ | { 88, "GPIOY.8" }, { 87, "GPIOY.7" }, | ||
+ | { 116, "GPIOX.19" }, { -1, "GND" }, | ||
+ | { 115, "GPIOX.18" }, { 104, "GPIOX.7" }, | ||
+ | { -1, "3.3V" }, { 102, "GPIOX.5" }, | ||
+ | { 107, "GPIOX.10" }, { -1, "GND" }, | ||
+ | { 106, "GPIOX.9" }, { 103, "GPIOX.6" }, | ||
+ | { 105, "GPIOX.8" }, { 117, "GPIOX.20" }, | ||
+ | { -1, "GND" }, { 118, "GPIOX.21" }, | ||
+ | { 76, "I2CB_SDA" }, { 77, "I2CB_SCL" }, | ||
+ | { 101, "GPIOX.4" }, { -1, "GND" }, | ||
+ | { 100, "GPIOX.3" }, { 99, "GPIOX.2" }, | ||
+ | { 108, "GPIOX.11" }, { -1, "GND" }, | ||
+ | { 97, "GPIOX.0" }, { 98, "GPIOX.1" }, | ||
+ | { -1, "ADC.AIN0" }, { -1, "1.8V REF" }, | ||
+ | { -1, "GND" }, { -1, "ADC.AIN1" }, | ||
+ | }; | ||
+ | |||
+ | //------------------------------------------------------------------------------ | ||
+ | const struct header_info header_J7[7] = { | ||
+ | { -1, "GND" }, | ||
+ | { 6, "GPIOAO.6" }, | ||
+ | { -1, "5.0V" }, | ||
+ | { 8, "GPIOAO.8" }, | ||
+ | { 10, "GPIOAO.10" }, | ||
+ | { 9, "GPIOAO.9" }, | ||
+ | { 11, "GPIOAO.11" }, | ||
+ | }; | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_mode_gpiox (int pin) | ||
+ | { | ||
+ | switch(pin) { | ||
+ | case 0: | ||
+ | if (*(gpio + MUX_REG8) & BIT(5)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(14)) return 2; | ||
+ | break; | ||
+ | case 1: | ||
+ | if (*(gpio + MUX_REG8) & BIT(4)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(13)) return 2; | ||
+ | break; | ||
+ | case 2: | ||
+ | if (*(gpio + MUX_REG8) & BIT(3)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(13)) return 2; | ||
+ | break; | ||
+ | case 3: | ||
+ | if (*(gpio + MUX_REG8) & BIT(2)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(13)) return 2; | ||
+ | break; | ||
+ | case 4: | ||
+ | if ((*(gpio + MUX_REG5) & BIT(29)) && (*(gpio + MUX_REG5) & BIT(12))) | ||
+ | return 1; | ||
+ | if (*(gpio + MUX_REG3) & BIT(30)) return 2; | ||
+ | if (*(gpio + MUX_REG4) & BIT(17)) return 3; | ||
+ | break; | ||
+ | case 5: | ||
+ | if ((*(gpio + MUX_REG5) & BIT(28)) && (*(gpio + MUX_REG5) & BIT(12))) | ||
+ | return 1; | ||
+ | if (*(gpio + MUX_REG3) & BIT(29)) return 2; | ||
+ | if (*(gpio + MUX_REG4) & BIT(16)) return 3; | ||
+ | break; | ||
+ | case 6: | ||
+ | if ((*(gpio + MUX_REG5) & BIT(28)) && (*(gpio + MUX_REG5) & BIT(12))) | ||
+ | return 1; | ||
+ | if (*(gpio + MUX_REG3) & BIT(27)) return 2; | ||
+ | if (*(gpio + MUX_REG4) & BIT(15)) return 3; | ||
+ | if (*(gpio + MUX_REG5) & BIT(9)) return 4; | ||
+ | break; | ||
+ | case 7: | ||
+ | if ((*(gpio + MUX_REG5) & BIT(28)) && (*(gpio + MUX_REG5) & BIT(12))) | ||
+ | return 1; | ||
+ | if (*(gpio + MUX_REG3) & BIT(27)) return 2; | ||
+ | if (*(gpio + MUX_REG4) & BIT(14)) return 3; | ||
+ | if (*(gpio + MUX_REG5) & BIT(8)) return 4; | ||
+ | break; | ||
+ | case 8: | ||
+ | if (*(gpio + MUX_REG8) & BIT(1)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(11)) return 2; | ||
+ | if (*(gpio + MUX_REG6) & BIT(19)) return 3; | ||
+ | if (*(gpio + MUX_REG4) & BIT(22)) return 4; | ||
+ | if (*(gpio + MUX_REG3) & BIT(6)) return 5; | ||
+ | break; | ||
+ | case 9: | ||
+ | if (*(gpio + MUX_REG8) & BIT(0)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(10)) return 2; | ||
+ | if (*(gpio + MUX_REG6) & BIT(18)) return 3; | ||
+ | if (*(gpio + MUX_REG4) & BIT(24)) return 4; | ||
+ | if (*(gpio + MUX_REG3) & BIT(6)) return 5; | ||
+ | break; | ||
+ | case 10: | ||
+ | if (*(gpio + MUX_REG3) & BIT(22)) return 1; | ||
+ | if ((*(gpio + MUX_REG7) & BIT(31)) && (*(gpio + MUX_REG9) & BIT(19))) | ||
+ | return 2; | ||
+ | if (*(gpio + MUX_REG6) & BIT(17)) return 3; | ||
+ | if (*(gpio + MUX_REG4) & BIT(23)) return 4; | ||
+ | if (*(gpio + MUX_REG3) & BIT(8)) return 5; | ||
+ | break; | ||
+ | case 11: | ||
+ | if (*(gpio + MUX_REG3) & BIT(20)) return 1; | ||
+ | if (*(gpio + MUX_REG7) & BIT(30)) return 2; | ||
+ | if (*(gpio + MUX_REG2) & BIT(3)) return 5; | ||
+ | break; | ||
+ | case 16: | ||
+ | if (*(gpio + MUX_REG4) & BIT(9)) return 1; | ||
+ | if (*(gpio + MUX_REG4) & BIT(21)) return 4; | ||
+ | if (*(gpio + MUX_REG4) & BIT(5)) return 5; | ||
+ | break; | ||
+ | case 17: | ||
+ | if (*(gpio + MUX_REG4) & BIT(8)) return 1; | ||
+ | if (*(gpio + MUX_REG4) & BIT(20)) return 4; | ||
+ | if (*(gpio + MUX_REG4) & BIT(4)) return 5; | ||
+ | break; | ||
+ | case 18: | ||
+ | if (*(gpio + MUX_REG4) & BIT(7)) return 1; | ||
+ | if (*(gpio + MUX_REG4) & BIT(19)) return 4; | ||
+ | break; | ||
+ | case 19: | ||
+ | if (*(gpio + MUX_REG4) & BIT(6)) return 1; | ||
+ | if (*(gpio + MUX_REG4) & BIT(18)) return 4; | ||
+ | break; | ||
+ | case 20: | ||
+ | if (*(gpio + MUX_REG6) & BIT(16)) return 3; | ||
+ | if (*(gpio + MUX_REG4) & BIT(25)) return 4; | ||
+ | if (*(gpio + MUX_REG3) & BIT(9)) return 5; | ||
+ | break; | ||
+ | case 21: | ||
+ | break; | ||
+ | default : | ||
+ | return 0; | ||
+ | } | ||
+ | return *(gpio + GPIOX_FSEL_REG_OFFSET) & BIT(pin) ? 6 : 7; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_mode_gpioy (int pin) | ||
+ | { | ||
+ | switch(pin) { | ||
+ | case 0: | ||
+ | if (*(gpio + MUX_REG3) & BIT(2)) return 1; | ||
+ | break; | ||
+ | case 1: | ||
+ | if (*(gpio + MUX_REG3) & BIT(1)) return 1; | ||
+ | break; | ||
+ | case 3: | ||
+ | if (*(gpio + MUX_REG1) & BIT(7)) return 2; | ||
+ | if (*(gpio + MUX_REG3) & BIT(18)) return 3; | ||
+ | break; | ||
+ | case 6: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | break; | ||
+ | case 7: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | break; | ||
+ | case 8: | ||
+ | if (*(gpio + MUX_REG3) & BIT(0)) return 1; | ||
+ | break; | ||
+ | case 9: | ||
+ | if (*(gpio + MUX_REG3) & BIT(4)) return 1; | ||
+ | break; | ||
+ | case 10: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | break; | ||
+ | case 11: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | break; | ||
+ | case 12: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | break; | ||
+ | case 13: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(7)) return 3; | ||
+ | break; | ||
+ | case 14: | ||
+ | if (*(gpio + MUX_REG3) & BIT(5)) return 1; | ||
+ | if (*(gpio + MUX_REG5) & BIT(6)) return 3; | ||
+ | break; | ||
+ | default : | ||
+ | return 0; | ||
+ | } | ||
+ | return *(gpio + GPIOY_FSEL_REG_OFFSET) & BIT(pin) ? 6 : 7; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_mode_gpiodv (int pin) | ||
+ | { | ||
+ | switch(pin) { | ||
+ | case 24: | ||
+ | if (*(gpio + MUX_REG6) & BIT(23)) return 4; | ||
+ | if (*(gpio + MUX_REG9) & BIT(31)) return 5; | ||
+ | break; | ||
+ | case 25: | ||
+ | if (*(gpio + MUX_REG6) & BIT(22)) return 4; | ||
+ | if (*(gpio + MUX_REG9) & BIT(30)) return 5; | ||
+ | break; | ||
+ | case 26: | ||
+ | if (*(gpio + MUX_REG6) & BIT(21)) return 4; | ||
+ | if (*(gpio + MUX_REG9) & BIT(29)) return 5; | ||
+ | break; | ||
+ | case 27: | ||
+ | if (*(gpio + MUX_REG6) & BIT(20)) return 4; | ||
+ | if (*(gpio + MUX_REG9) & BIT(28)) return 5; | ||
+ | break; | ||
+ | default : | ||
+ | return 0; | ||
+ | } | ||
+ | return *(gpio + GPIODV_FSEL_REG_OFFSET) & BIT(pin) ? 6 : 7; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_mode_gpioao (int pin) | ||
+ | { | ||
+ | switch(pin) { | ||
+ | case 0: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(12)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(26)) return 3; | ||
+ | break; | ||
+ | case 1: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(11)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(25)) return 3; | ||
+ | break; | ||
+ | case 2: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(10)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(8)) return 3; | ||
+ | break; | ||
+ | case 3: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(9)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(22)) return 2; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(7)) return 3; | ||
+ | break; | ||
+ | case 4: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(6)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(2)) return 2; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(24)) return 3; | ||
+ | break; | ||
+ | case 5: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(5)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(1)) return 2; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(23)) return 3; | ||
+ | break; | ||
+ | case 6: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(18)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(16)) return 4; | ||
+ | if (*(gpio + MUX_REG1) & BIT(13)) return 5; | ||
+ | break; | ||
+ | case 7: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(0)) return 1; | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(21)) return 2; | ||
+ | break; | ||
+ | case 8: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(30)) return 2; | ||
+ | return 1; | ||
+ | case 9: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(29)) return 2; | ||
+ | if (*(gpio + MUX_REG1) & BIT(15)) return 5; | ||
+ | return 1; | ||
+ | case 10: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(28)) return 2; | ||
+ | if (*(gpio + MUX_REG1) & BIT(14)) return 5; | ||
+ | return 1; | ||
+ | case 11: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(27)) return 2; | ||
+ | return 1; | ||
+ | case 12: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(17)) return 1; | ||
+ | break; | ||
+ | case 13: | ||
+ | if (*(gpio_ao + MUX_REG0) & BIT(31)) return 1; | ||
+ | break; | ||
+ | default : | ||
+ | return 0; | ||
+ | } | ||
+ | return *(gpio_ao + GPIOAO_FSEL_REG_OFFSET) & BIT(pin) ? 6 : 7; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_mode (int pin) | ||
+ | { | ||
+ | switch (pin) { | ||
+ | case GPIOX_PIN_START...GPIOX_PIN_END: | ||
+ | return get_mode_gpiox(pin - GPIOX_PIN_START); | ||
+ | case GPIOY_PIN_START...GPIOY_PIN_END: | ||
+ | return get_mode_gpioy(pin - GPIOY_PIN_START); | ||
+ | case GPIODV_PIN_START...GPIODV_PIN_END: | ||
+ | return get_mode_gpiodv(pin - GPIODV_PIN_START); | ||
+ | case GPIOAO_PIN_START...GPIOAO_PIN_END: | ||
+ | return get_mode_gpioao(pin - GPIOAO_PIN_START); | ||
+ | default : | ||
+ | break; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_pupd (int pin) | ||
+ | { | ||
+ | switch (pin) { | ||
+ | case GPIOX_PIN_START...GPIOX_PIN_END: | ||
+ | if (*(gpio + GPIOX_PUEN_REG_OFFSET) & BIT(pin - GPIOX_PIN_START)) { | ||
+ | return *(gpio + GPIOX_PUPD_REG_OFFSET) & BIT(pin - GPIOX_PIN_START) ? | ||
+ | 1 : 2; | ||
+ | } | ||
+ | break; | ||
+ | case GPIOY_PIN_START...GPIOY_PIN_END: | ||
+ | if (*(gpio + GPIOY_PUEN_REG_OFFSET) & BIT(pin - GPIOY_PIN_START)) { | ||
+ | return *(gpio + GPIOY_PUPD_REG_OFFSET) & BIT(pin - GPIOY_PIN_START) ? | ||
+ | 1 : 2; | ||
+ | } | ||
+ | break; | ||
+ | case GPIODV_PIN_START...GPIODV_PIN_END: | ||
+ | if (*(gpio + GPIODV_PUEN_REG_OFFSET) & BIT(pin - GPIODV_PIN_START)) { | ||
+ | return *(gpio + GPIODV_PUPD_REG_OFFSET) & BIT(pin - GPIODV_PIN_START) ? | ||
+ | 1 : 2; | ||
+ | } | ||
+ | break; | ||
+ | case GPIOAO_PIN_START...GPIOAO_PIN_END: | ||
+ | if (*(gpio_ao + GPIOAO_PUEN_REG_OFFSET) & BIT(pin - GPIOAO_PIN_START)) { | ||
+ | return *(gpio_ao + GPIOAO_PUPD_REG_OFFSET) & BIT(pin - GPIOAO_PIN_START + 16) ? | ||
+ | 1 : 2; | ||
+ | } | ||
+ | break; | ||
+ | default : | ||
+ | break; | ||
+ | } | ||
+ | return 0; // PU/PD disable | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int get_status (int pin) | ||
+ | { | ||
+ | switch (pin) { | ||
+ | case GPIOX_PIN_START...GPIOX_PIN_END: | ||
+ | return *(gpio + GPIOX_INP_REG_OFFSET) & BIT(pin - GPIOX_PIN_START) ? | ||
+ | 1 : 0; | ||
+ | case GPIOY_PIN_START...GPIOY_PIN_END: | ||
+ | return *(gpio + GPIOY_INP_REG_OFFSET) & BIT(pin - GPIOY_PIN_START) ? | ||
+ | 1 : 0; | ||
+ | case GPIODV_PIN_START...GPIODV_PIN_END: | ||
+ | return *(gpio + GPIODV_INP_REG_OFFSET) & BIT(pin - GPIODV_PIN_START) ? | ||
+ | 1 : 0; | ||
+ | case GPIOAO_PIN_START...GPIOAO_PIN_END: | ||
+ | return *(gpio_ao + GPIOAO_INP_REG_OFFSET) & BIT(pin - GPIOAO_PIN_START) ? | ||
+ | 1 : 0; | ||
+ | default : | ||
+ | break; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // system init | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int system_init(void) | ||
+ | { | ||
+ | int fd; | ||
+ | |||
+ | if ((fd = open ("/dev/mem", O_RDWR | O_SYNC | O_CLOEXEC) ) < 0) { | ||
+ | fprintf(stderr, "/dev/mem open error!\n"); fflush(stdout); | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | gpio = (unsigned int *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_REG_MAP); | ||
+ | gpio_ao = (unsigned int *)mmap(0, BLOCK_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, GPIO_AO_REG_MAP); | ||
+ | |||
+ | if((unsigned int)gpio == -1 || (unsigned int)gpio_ao == -1) { | ||
+ | fprintf(stderr, "mmap error!\n"); fflush(stdout); | ||
+ | return -1; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | // | ||
+ | // Start Program | ||
+ | // | ||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | int main (int argc, char *argv[]) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | if (system_init() < 0) | ||
+ | { | ||
+ | fprintf (stderr, "%s: System Init failed\n", __func__); fflush(stdout); | ||
+ | return -1; | ||
+ | } | ||
+ | |||
+ | printf("+------+----------+------+---+-------+--- J2 ---+-------+---+------+----------+------+\n"); | ||
+ | printf("| GPIO | Name | Mode | V | PU/PD | Physical | PU/PD | V | Mode | Name | GPIO |\n"); | ||
+ | printf("+------+----------+------+---+-------+----++----+-------+---+------+----------+------+\n"); | ||
+ | for (i = 0; i < 40; i += 2) { | ||
+ | if (header_J2[i].gpio != -1) { | ||
+ | printf("| %3d | %8s | %4s | %d | %4s | %2d |", | ||
+ | header_J2[i].gpio, | ||
+ | header_J2[i].name, | ||
+ | MODE_STR[get_mode(header_J2[i].gpio)], | ||
+ | get_status(header_J2[i].gpio), | ||
+ | PUPD_STR[get_pupd(header_J2[i].gpio)], | ||
+ | i + 1); | ||
+ | } | ||
+ | else { | ||
+ | printf("| - | %8s | - | - | - | %2d |", | ||
+ | header_J2[i].name, | ||
+ | i + 1); | ||
+ | } | ||
+ | |||
+ | if (header_J2[i+1].gpio != -1) { | ||
+ | printf("| %2d | %4s | %d | %4s | %8s | %3d |\n", | ||
+ | i + 2, | ||
+ | PUPD_STR[get_pupd(header_J2[i+1].gpio)], | ||
+ | get_status(header_J2[i+1].gpio), | ||
+ | MODE_STR[get_mode(header_J2[i+1].gpio)], | ||
+ | header_J2[i+1].name, | ||
+ | header_J2[i+1].gpio); | ||
+ | } | ||
+ | else { | ||
+ | printf("| %2d | - | - | - | %8s | - |\n", | ||
+ | i + 2, | ||
+ | header_J2[i+1].name); | ||
+ | } | ||
+ | } | ||
+ | printf("+------+----------+------+---+-------+----++----+-------+---+------+----------+------+\n"); | ||
+ | |||
+ | printf("+------+-----------+------+---+-------+--- J7 ---+\n"); | ||
+ | printf("| GPIO | Name | Mode | V | PU/PD | Physical |\n"); | ||
+ | printf("+------+-----------+------+---+-------+----------+\n"); | ||
+ | |||
+ | for(i = 0; i < 7; i ++) { | ||
+ | if (header_J7[i].gpio != -1) { | ||
+ | printf("| %3d | %9s | %4s | %d | %4s | %2d |\n", | ||
+ | header_J7[i].gpio, | ||
+ | header_J7[i].name, | ||
+ | MODE_STR[get_mode(header_J7[i].gpio)], | ||
+ | get_status(header_J7[i].gpio), | ||
+ | PUPD_STR[get_pupd(header_J7[i].gpio)], | ||
+ | i + 1); | ||
+ | } | ||
+ | else { | ||
+ | printf("| - | %9s | - | - | - | %2d |\n", | ||
+ | header_J7[i].name, | ||
+ | i + 1); | ||
+ | } | ||
+ | } | ||
+ | printf("+------+-----------+------+---+-------+----------+\n"); | ||
+ | fflush(stdout); | ||
+ | |||
+ | return 0 ; | ||
+ | } | ||
+ | |||
+ | //------------------------------------------------------------------------------------------------------------ | ||
+ | |||
+ | </file> | ||