Let's pick up usdhc1 cd pin on i.mx6ul evk for test.

The MX6UL_PAD_UART1_RTS_B is configured as GPIO1_IO19 in device tree, which is used by usdhc1 as sd1 cd.
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
imx6ul-14x14-evk.dts
314 &usdhc1 {
315 pinctrl-names = "default", "state_100mhz", "state_200mhz";
316 pinctrl-0 = <&pinctrl_usdhc1>;
317 pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
318 pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
319 cd-gpios = <&gpio1 19 0>;
320 keep-power-in-suspend;
321 enable-sdio-wakeup;
322 vmmc-supply = <®_sd1_vmmc>;
323 status = "okay";
324 };
407 &iomuxc {
408 pinctrl-names = "default";
409 pinctrl-0 = <&pinctrl_hog_1>;
410 imx6ul-evk {
411 pinctrl_hog_1: hoggrp-1 {
412 fsl,pins = <
413 MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
414 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
415 MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
416 MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */
417 >;
Debug fs give us chance to check the gpio status:
cat /sys/kernel/debug/gpio
sdcard plugout: gpio-19 (2190000.usdhc cd ) in hi
sdcard plugin : gpio-19 (2190000.usdhc cd ) in lo
sdcard plug out:
root@imx6ulevk:~# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/209c000.gpio, 209c000.gpio:
gpio-3 (tsc_X- ) in hi
gpio-9 (VSD_3V3 ) out lo
gpio-19 (2190000.usdhc cd ) in hi
GPIOs 32-63, platform/20a0000.gpio, 20a0000.gpio:
GPIOs 64-95, platform/20a4000.gpio, 20a4000.gpio:
GPIOs 96-127, platform/20a8000.gpio, 20a8000.gpio:
gpio-119 (? ) out lo
GPIOs 128-159, platform/20ac000.gpio, 20ac000.gpio:
gpio-131 (? ) out lo
gpio-132 (headset detect ) in lo
gpio-135 (spi32766.0 ) out lo
gpio-136 (? ) out lo
gpio-138 (spi4.14 ) out lo
gpio-139 (spi4.14 ) out lo
sdcard plugin:
root@imx6ulevk:~# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/209c000.gpio, 209c000.gpio:
gpio-3 (tsc_X- ) in hi
gpio-9 (VSD_3V3 ) out lo
gpio-19 (2190000.usdhc cd ) in lo
GPIOs 32-63, platform/20a0000.gpio, 20a0000.gpio:
GPIOs 64-95, platform/20a4000.gpio, 20a4000.gpio:
GPIOs 96-127, platform/20a8000.gpio, 20a8000.gpio:
gpio-119 (? ) out lo
GPIOs 128-159, platform/20ac000.gpio, 20ac000.gpio:
gpio-131 (? ) out lo
gpio-132 (headset detect ) in lo
gpio-135 (spi32766.0 ) out lo
gpio-136 (? ) out lo
gpio-138 (spi4.14 ) out lo
gpio-139 (spi4.14 ) out lo
But we could not use it as an indenpendent GPIO, because this GPIO is used by usdhc1 module.
You will get busy when you try to use it as an independent GPIO.
root@imx6ulevk:~# echo 19 > /sys/class/gpio/export
-sh: echo: write error: Device or resource busy
root@imx6ulevk:~#
Let's modify the device tree to make gpio-19 isolated from usdhc1:
314 &usdhc1 {
315 pinctrl-names = "default", "state_100mhz", "state_200mhz";
316 pinctrl-0 = <&pinctrl_usdhc1>;
317 pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
318 pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
319 // cd-gpios = <&gpio1 19 0>;
320 keep-power-in-suspend;
321 enable-sdio-wakeup;
322 vmmc-supply = <®_sd1_vmmc>;
323 status = "okay";
324 };
recompile the dts and get the new dtb file. replace the old one and reboot the i.mx6ul evk
let's check by debug fs and sys class we could not find the gpio-19.
root@imx6ulevk:~# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/209c000.gpio, 209c000.gpio:
gpio-3 (tsc_X- ) in hi
gpio-9 (VSD_3V3 ) out lo
GPIOs 32-63, platform/20a0000.gpio, 20a0000.gpio:
GPIOs 64-95, platform/20a4000.gpio, 20a4000.gpio:
GPIOs 96-127, platform/20a8000.gpio, 20a8000.gpio:
gpio-119 (? ) out lo
GPIOs 128-159, platform/20ac000.gpio, 20ac000.gpio:
gpio-131 (? ) out lo
gpio-132 (headset detect ) in lo
gpio-135 (spi32766.0 ) out lo
gpio-136 (? ) out lo
gpio-138 (spi4.14 ) out lo
gpio-139 (spi4.14 ) out lo
root@imx6ulevk:~# ls /sys/class/gpio/
export gpiochip0 gpiochip248 gpiochip64 unexport
gpio132 gpiochip128 gpiochip32 gpiochip96
Let's export gpio19
root@imx6ulevk:~# echo 19 > /sys/class/gpio/export
root@imx6ulevk:~# ls /sys/class/gpio/
export gpio19 gpiochip128 gpiochip32 gpiochip96
gpio132 gpiochip0 gpiochip248 gpiochip64 unexport
check with debug fs if we can see it.
Yes. we see it.
root@imx6ulevk:~# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/209c000.gpio, 209c000.gpio:
gpio-3 (tsc_X- ) in hi
gpio-9 (VSD_3V3 ) out lo
gpio-19 (sysfs ) in hi
GPIOs 32-63, platform/20a0000.gpio, 20a0000.gpio:
GPIOs 64-95, platform/20a4000.gpio, 20a4000.gpio:
GPIOs 96-127, platform/20a8000.gpio, 20a8000.gpio:
gpio-119 (? ) out lo
GPIOs 128-159, platform/20ac000.gpio, 20ac000.gpio:
gpio-131 (? ) out lo
gpio-132 (headset detect ) in lo
gpio-135 (spi32766.0 ) out lo
gpio-136 (? ) out lo
gpio-138 (spi4.14 ) out lo
gpio-139 (spi4.14 ) out lo
check the gpio-19 value
sdcard plugout:
root@imx6ulevk:~# cat /sys/class/gpio/gpio19/value
524288
sdcard plugin:
root@imx6ulevk:~# cat /sys/class/gpio/gpio19/value
0
why it is not 0 and 1? because it is raw data. any nonzero value is treated as high
The following is from linux document.
It may also provide a customvalue for ARCH_NR_GPIOS, so that it better reflects the number of GPIOs in
actual use on that platform, without wasting static table space. (It should count both built-in/SoC GPIOs and
also ones on GPIO expanders.
Sysfs Interface for Userspace (OPTIONAL)
"value" ... reads as either 0 (low) or 1 (high). If the GPIO
is configured as an output, this value may be written;
any nonzero value is treated as high.
let's check with debug fs.
sdcard plug out:
root@imx6ulevk:~# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/209c000.gpio, 209c000.gpio:
gpio-3 (tsc_X- ) in hi
gpio-9 (VSD_3V3 ) out lo
gpio-19 (sysfs ) in hi
GPIOs 32-63, platform/20a0000.gpio, 20a0000.gpio:
GPIOs 64-95, platform/20a4000.gpio, 20a4000.gpio:
GPIOs 96-127, platform/20a8000.gpio, 20a8000.gpio:
gpio-119 (? ) out lo
GPIOs 128-159, platform/20ac000.gpio, 20ac000.gpio:
gpio-131 (? ) out lo
gpio-132 (headset detect ) in lo
gpio-135 (spi32766.0 ) out lo
gpio-136 (? ) out lo
gpio-138 (spi4.14 ) out lo
gpio-139 (spi4.14 ) out lo
sdcard plugin:
root@imx6ulevk:~# cat /sys/kernel/debug/gpio
GPIOs 0-31, platform/209c000.gpio, 209c000.gpio:
gpio-3 (tsc_X- ) in hi
gpio-9 (VSD_3V3 ) out lo
gpio-19 (sysfs ) in lo
GPIOs 32-63, platform/20a0000.gpio, 20a0000.gpio:
GPIOs 64-95, platform/20a4000.gpio, 20a4000.gpio:
GPIOs 96-127, platform/20a8000.gpio, 20a8000.gpio:
gpio-119 (? ) out lo
GPIOs 128-159, platform/20ac000.gpio, 20ac000.gpio:
gpio-131 (? ) out lo
gpio-132 (headset detect ) in lo
gpio-135 (spi32766.0 ) out lo
gpio-136 (? ) out lo
gpio-138 (spi4.14 ) out lo
gpio-139 (spi4.14 ) out lo
Do you notice it is show hi and lo, not a value. (remember any nonzero value is treated as high. )
Verify with memtool:
root@imx6ulevk:~# /unit_tests/memtool GPIO1.DR.DR
SOC: i.MX6UL
GPIO1 Addr:0x209c000
GPIO1.DR Addr:0x0209C000 Value:0xF00C0118 - The 32-bit GPIO_DR register stores data that is ready to be driven to the output lines.
GPIO1.DR.DR(0..31) :0xf00c0118
root@imx6ulevk:~# /unit_tests/memtool GPIO1.DR.DR
SOC: i.MX6UL
GPIO1 Addr:0x209c000
GPIO1.DR Addr:0x0209C000 Value:0xF0040118 - The 32-bit GPIO_DR register stores data that is ready to be driven to the output lines.
GPIO1.DR.DR(0..31) :0xf0040118
Data bits.
0xf00c0118 -> 0xf0040118
bit 19 1 -> 0 (hi->lo)
Could we use the debug fs for accessing gpio from use space.
No. Please don't do that.
a. It is for debug purpose.
b. it could not handle output.
What we need to do for an independent?
Only one thing: Correct IOMUX pinctrl in device tree.
In this example is:
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
407 &iomuxc {
408 pinctrl-names = "default";
409 pinctrl-0 = <&pinctrl_hog_1>;
410 imx6ul-evk {
411 pinctrl_hog_1: hoggrp-1 {
412 fsl,pins = <
413 MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
414 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
415 MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
416 MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */
417 >;
Why we know echo 19 > /sys/class/gpio/export Not other number?
Please run the command
for i in /sys/class/gpio/* ; do cat $i/label; cat $i/base; echo; done
209c000.gpio
0
20ac000.gpio
128
74hc595
248
20a0000.gpio
32
20a4000.gpio
64
20a8000.gpio
96
imx6ul.dtsi
468 gpio1: gpio@0209c000 {
469 compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
470 reg = <0x0209c000 0x4000>;
471 interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
472 <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
473 gpio-controller;
474 #gpio-cells = <2>;
475 interrupt-controller;
476 #interrupt-cells = <2>;
477 };
209c000 is for gpio1 and the base is "0".
So, the bit 19 is 0 + 19.
What does this caculation refer to?
It is the linux document I mentoined before.
Let take another example for 20a8000.gpio base is 96.
501 gpio4: gpio@020a8000 {
502 compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
503 reg = <0x020a8000 0x4000>;
504 interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>,
505 <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
506 gpio-controller;
507 #gpio-cells = <2>;
508 interrupt-controller;
509 #interrupt-cells = <2>;
510 };
If we want to use gpio4-11, we should do is to echo 107 > /sys/class/gpio/export
107 = 96 + 11