i.MX53 SODIMM GPIO
Locating configuration file
The initial CPU configuration is part the following device tree source file:
- arch/arm/boot/dts/imx53.dtsi
Shared module configuration can be found in the following file:
- arch/arm/boot/dts/imx53-vmx53.dtsi
The specific module configuration customised for i.MX53 SODIMM PC Module is part of these device tree source files:
- i.MX53 SODIMM PC Module Max: arch/arm/boot/dts/imx53-vmx53-557.dts
- i.MX53 SODIMM PC Module Pro: arch/arm/boot/dts/imx53-vmx53-668.dts
- i.MX53 SODIMM PC Module Basic: arch/arm/boot/dts/imx53-vmx53-779.dts
Note: In most cases just a single file edit is needed to apply modifications.
Definition of configuration macros
PAD_CTL_HVE (1 << 13) PAD_CTL_HYS (1 << 8) PAD_CTL_PKE (1 << 7) PAD_CTL_PUE (1 << 6) PAD_CTL_PUS_100K_DOWN (0 << 4) PAD_CTL_PUS_47K_UP (1 << 4) PAD_CTL_PUS_100K_UP (2 << 4) PAD_CTL_PUS_22K_UP (3 << 4) PAD_CTL_ODE (1 << 3) PAD_CTL_DSE_LOW (0 << 1) PAD_CTL_DSE_MED (1 << 1) PAD_CTL_DSE_HIGH (2 << 1) PAD_CTL_DSE_MAX (3 << 1) PAD_CTL_SRE_FAST (1 << 0) PAD_CTL_SRE_SLOW (0 << 0)
Controlling GPIO signals using raw access
In this example signals CSI0_DAT12 - CSI0_DAT19 will be configured as GPIOs.
Note: Make sure signals MX53_PAD_CSI0_DAT12_* up to MX53_PAD_CSI0_DAT19_* are set only once in all related device tree source files.
Device tree modification:
&iomuxc { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_hog>; imx53-vmx53 { pinctrl_hog: hoggrp { fsl,pins = < MX53_PAD_CSI0_DAT12__GPIO5_30 0x80000000 // PAD default config MX53_PAD_CSI0_DAT13__GPIO5_31 0x000000e0 // PKE + PUE + PUS_47K_UP + DSE_LOW + SRE_SLOW MX53_PAD_CSI0_DAT14__GPIO6_0 0x00000100 // HYS + DSE_LOW + SRE_SLOW MX53_PAD_CSI0_DAT15__GPIO6_1 0x000000c0 // PKE + PUE + PUS_100K_DOWN + DSE_LOW + SRE_SLOW MX53_PAD_CSI0_DAT16__GPIO6_2 0x80000000 // PAD default config MX53_PAD_CSI0_DAT17__GPIO6_3 0x80000000 // PAD default config MX53_PAD_CSI0_DAT18__GPIO6_4 0x80000000 // PAD default config MX53_PAD_CSI0_DAT19__GPIO6_5 0x80000000 // PAD default config >; }; }
Testing the modifications
Calculating GPIO number
GPIO pin numbering follows this general equation:
GPIO_NUMBER = MX53_PAD_NAME__GPIOX_Y = X_Y = (X-1)*32+Y
GPIO accessible from CSI0_DAT13 pin is available at this number:
GPIO_NUMBER = MX53_PAD_CSI0_DAT13__GPIO5_31 = 5_31 = (5-1)*32+31 = 4*32+31 = 159
Setting GPIO as output
root@vmx53 ~$ echo 159 > /sys/class/gpio/export root@vmx53 ~$ echo out > /sys/class/gpio/gpio159/direction root@vmx53 ~$ echo 0 > /sys/class/gpio/gpio159/value #root@vmx53 ~$ echo 1 > /sys/class/gpio/gpio159/value #root@vmx53 ~$ echo 159 > /sys/class/gpio/unexport
Setting GPIO as input
root@vmx53 ~$ echo 159 > /sys/class/gpio/export root@vmx53 ~$ echo in > /sys/class/gpio/gpio159/direction root@vmx53 ~$ cat /sys/class/gpio/gpio159/value 0 #root@vmx53 ~$ echo 159 > /sys/class/gpio/unexport
Controlling GPIO signals using drivers
Signals will be set accordingly:
- pins CSI0_DAT12 - CSI0_DAT14 as input GPIOs
- pins CSI0_DAT15 - CSI0_DAT17 as output GPIOs
Note: Make sure signals MX53_PAD_CSI0_DAT12_* up to MX53_PAD_CSI0_DAT17_* are set only once in all related device tree source files.
Device tree modification:
&iomuxc { ... imx53-vmx53 { ... pinctrl_inp: inpgrp { fsl,pins = < MX53_PAD_CSI0_DAT12__GPIO5_30 0x80000000 // PAD default config MX53_PAD_CSI0_DAT13__GPIO5_31 0x80000000 // PAD default config MX53_PAD_CSI0_DAT14__GPIO6_0 0x80000000 // PAD default config >; }; pinctrl_out: outgrp { fsl,pins = < MX53_PAD_CSI0_DAT15__GPIO6_1 0x80000000 // PAD default config MX53_PAD_CSI0_DAT16__GPIO6_2 0x80000000 // PAD default config MX53_PAD_CSI0_DAT17__GPIO6_3 0x80000000 // PAD default config >; }; ... }; ... }
Input signals
Adding GPIO kernel module
Device Drivers ---> Input device support ---> [*] Keyboards ---> <*> GPIO Buttons
Altering input sources in the device tree
/ { ... inputs { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; autorepeat; input@0 { label = "input-0"; gpios = <&gpio5 30 GPIO_ACTIVE_HIGH>; linux,code = <0x100>; // BTN_0 }; input@1 { label = "input-1"; gpios = <&gpio5 31 GPIO_ACTIVE_HIGH>; linux,code = <0x101>; // BTN_1 }; input@2 { label = "input-2"; gpios = <&gpio6 0 GPIO_ACTIVE_HIGH>; linux,code = <0x102>; // BTN_2 }; }; ... };
Testing the modifications
root@vmx53 ~$ evtest /dev/input/event4 Input driver version is 1.0.1 Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100 Input device name: "inputs.12" Supported events: Event type 0 (EV_SYN) Event type 1 (EV_KEY) Event code 256 (BTN_0) Event code 257 (BTN_1) Event code 258 (BTN_2) Properties: Property type 20 (EV_REP) Property code 0 (REP_DELAY) Value 250 Property code 1 (REP_PERIOD) Value 33 Testing ... (interrupt to exit) Event: time 946946772.718139, type 1 (EV_KEY), code 256 (BTN_0), value 1 Event: time 946946772.718139, -------------- SYN_REPORT ------------ Event: time 946946772.968114, type 1 (EV_KEY), code 256 (BTN_0), value 2 Event: time 946946772.968114, -------------- SYN_REPORT ------------ Event: time 946946773.008115, type 1 (EV_KEY), code 256 (BTN_0), value 2 Event: time 946946773.008115, -------------- SYN_REPORT ------------ Event: time 946946773.018134, type 1 (EV_KEY), code 256 (BTN_0), value 0 Event: time 946946773.018134, -------------- SYN_REPORT ------------ Event: time 946946786.688130, type 1 (EV_KEY), code 256 (BTN_0), value 1 Event: time 946946786.688130, -------------- SYN_REPORT ------------ Event: time 946946786.908131, type 1 (EV_KEY), code 256 (BTN_0), value 0
Output signals
Adding GPIO kernel module
Device Drivers ---> [*] LED Support ---> <*> LED Class Support <*> LED Support for GPIO connected LEDs [*] LED Trigger support --->
Altering output sources in the device tree
/ { ... outputs { compatible = "gpio-leds"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_out>; output@0 { label = "output-0"; gpios = <&gpio6 1 GPIO_ACTIVE_HIGH>; default-state = "keep"; }; output@1 { label = "output-1"; gpios = <&gpio6 2 GPIO_ACTIVE_HIGH>; default-state = "on"; }; output@2 { label = "output-2"; gpios = <&gpio6 3 GPIO_ACTIVE_HIGH>; default-state = "off"; }; }; ... };
Testing the modifications
root@vmx53 ~$ cat /sys/class/leds/output-0/trigger [none] nand-disk mmc0 mmc1 timer heartbeat backlight gpio default-on root@vmx53 ~$ cat /sys/class/leds/output-0/brightness 0 root@vmx53 ~$ echo 255 > /sys/class/leds/output-0/brightness # On root@vmx53 ~$ echo 0 > /sys/class/leds/output-0/brightness # Off
Printing current state (brightness) of output signals:
root@vmx53 ~$ for i in /sys/class/leds/output-*/ ; do value=$(cat ${i}/brightness); echo $(basename ${i}) :: ${value}; done output-0 :: 0 output-1 :: 255 output-2 :: 0
Debugging
root@vmx53 ~$ mount -t debugfs none /sys/kernel/debug
root@vmx53 ~$ cat /sys/kernel/debug/gpio GPIOs 0-31, platform/53f84000.gpio, 53f84000.gpio: gpio-7 (usbotg_vbus ) out lo GPIOs 32-63, platform/53f88000.gpio, 53f88000.gpio: gpio-48 (spi_imx ) out lo gpio-49 (spi_imx ) out lo gpio-52 (ads7846_pendown ) in hi gpio-62 (spi_imx ) out lo GPIOs 64-95, platform/53f8c000.gpio, 53f8c000.gpio: gpio-83 (spi_imx ) out lo gpio-88 (50004000.esdhc cd ) in hi gpio-89 (50008000.esdhc cd ) in hi gpio-93 (led-red ) out lo gpio-95 (usbh1_vbus ) out lo GPIOs 96-127, platform/53f90000.gpio, 53f90000.gpio: GPIOs 128-159, platform/53fdc000.gpio, 53fdc000.gpio: gpio-132 (LCD PEN ) out lo gpio-158 (input-0 ) in lo gpio-159 (input-1 ) in lo GPIOs 160-191, platform/53fe0000.gpio, 53fe0000.gpio: gpio-160 (input-2 ) in lo gpio-161 (output-0 ) out lo gpio-162 (output-1 ) out lo gpio-163 (output-2 ) out lo GPIOs 192-223, platform/53fe4000.gpio, 53fe4000.gpio: