i.MX53 SODIMM GPIO

From Voipac Wiki
Jump to navigation Jump to search

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 the 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: