Helios64 provides 16 GPIOs via a 20-Pin header (P5). Those GPIOs are provided via an 16-bit IO Expander [PCA9655E](http://www.onsemi.com/PowerSolutions/product.do?id=PCA9655E) connected to I2C bus 2. ![P5 Location](/helios64/img/gpio/gpio.jpg) ## Pinout ![P5 Pinout](/helios64/img/gpio/gpio_pinout.jpg) | PIN | Port | Remarks | |-----|------|-------------| | 1 | - | 3.3V Supply | | 2 | - | 5V Supply | | 3 | - | GND | | 4 | EXP_P0_0 | | | 5 | EXP_P0_1 | | | 6 | EXP_P0_2 | | | 7 | EXP_P0_3 | | | 8 | EXP_P0_4 | | | 9 | EXP_P0_5 | | | 10 | EXP_P0_6 | | | 11 | EXP_P0_7 | | | 12 | EXP_P1_0 | | | 13 | EXP_P1_1 | | | 14 | EXP_P1_2 | | | 15 | EXP_P1_3 | | | 16 | EXP_P1_4 | | | 17 | EXP_P1_5 | | | 18 | EXP_P1_6 | | | 19 | EXP_P1_7 | | | 20 | - | GND | ## Accessing GPIOs under Linux If the kernel supports debugfs (*CONFIG_DEBUG_FS=y*), list of GPIOs can be retrieved with the following command ```bash sudo cat /sys/kernel/debug/gpio ``` Look for the **gpiochip5: GPIOs XXX-YYY** section, whereas **XXX** is first GPIO number and **YYY** is last GPIO number of IO expander. ``` gpiochip5: GPIOs 496-511, parent: i2c/2-0020, 2-0020, can sleep: ``` Another way to get first GPIO number of the IO expander ``` cat /sys/bus/i2c/devices/2-0020/gpio/gpiochip*/base ``` Therefore the mapping between header P5 Pins and Sysfs GPIO numbers will be as described in the following table ### GPIO Table | PIN | Sysfs GPIO number | Remarks | |-----|------|-------------| | 1 | - | 3.3V Supply | | 2 | - | 5V Supply | | 3 | - | GND | | 4 | 496 | | | 5 | 497 | | | 6 | 498 | | | 7 | 499 | | | 8 | 500 | | | 9 | 501 | | | 10 | 502 | | | 11 | 503 | | | 12 | 504 | | | 13 | 505 | | | 14 | 506 | | | 15 | 507 | | | 16 | 508 | | | 17 | 509 | | | 18 | 510 | | | 19 | 511 | | | 20 | - | GND | ### GPIO Control **1.** Export the GPIO number you want to use ``` echo N | sudo tee -a /sys/class/gpio/export ``` ( *N* is the GPIO number you want to export ) **2.** Set the direction, "out" for Output or "in" for Input ``` echo DIRECTION | sudo tee -a /sys/class/gpio/gpioN/direction ``` (*DIRECTION* value is "out" or "in") **3.** Now you can read or change the GPIO value To read GPIO value ``` cat /sys/class/gpio/gpioN/value ``` To change GPIO value (only if GPIO set as Output) ``` echo VALUE | sudo tee -a /sys/class/gpio/gpioN/value ``` !!! notes Pay attention to the path, /sys/class/gpio/gpio**N**/ where **N** is the GPIO number.