i.MX6UL添加GPIO的方法基于飞凌嵌入式OKMX6UL开发板

注: i.MX6UL添加GPIO方法,使用平台为飞凌嵌入式OKMX6UL-C开发板,其它平台可参考使用

  i.MX6UL开发板详情 1.jpg

方法一:采用 iomux的方法

在设备树中 iomux中添加复用gpio引脚如下,具体设置的上下拉电阻,驱动能力,查找 i.MX6UL CPU 手册,对应修改。

 

比如 MX6UL_PAD_CSI_DATA00__GPIO4_IO21    0x3008

MX6UL_PAD_CSI_DATA01__GPIO4_IO22    0x 1f0b1

MX6UL_PAD_CSI_DATA02__GPIO4_IO23    0x 1f0b1

MX6UL_PAD_CSI_DATA03__GPIO4_IO24    0x 1f0b1

 

MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09      0x 1f0b1

MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08     0x 1f0b1

MX6UL_PAD_JTAG_TDO__GPIO1_IO12          0x 1f0b1

  

同时修改设备树文件中(其他地方复用引脚)

 

 

 

 

 

 

编译设备树。替换 飞凌 iMX6UL 开发板中所用设备树。

 

此时可以使用 echo命令进行控制:

命令为:

echo $i > /sys/class/gpio/export

 

echo "out" > /sys/class/gpio/gpio$i/direction

echo " in " > /sys/class/gpio/gpio$i/direction

 

echo "1" > /sys/class/gpio/gpio$i/value

echo " 0 " > /sys/class/gpio/gpio$i/value

 

echo $i > /sys/class/gpio/unexport

 

以控制 GPIO4_IO22 为例:

1.  计算对应 sys/class/gpio的值 GPIOn_IOx = (n-1)*32 + x

GPIO4_IO22 =(4-1)*32+22=118

2.  GPIO4_IO22 设置为输出。

echo  118  > /sys/class/gpio/export 用于通知系统需要导出控制的 GPIO 引脚编号

echo "out" > /sys/class/gpio/gpio 118 /direction   控制为输出

echo "1" > /sys/class/gpio/gpio 118 /value   输出为高电平

或者 echo "0" > /sys/class/gpio/gpio 118 /value 输出为低电平

echo  118   > /sys/class/gpio/unexport   通知系统取消导出

3.  GPIO4_IO22 设置为输入。

echo  118  > /sys/class/gpio/export 用于通知系统需要导出控制的 GPIO 引脚编号

echo " in " > /sys/class/gpio/gpio 118 /direction   控制为输入

这时给该引脚接高电平,输入即为高电平,反之为低电平

echo  118   > /sys/class/gpio/unexport   通知系统取消导出

4.  另外客户可以自己通过 shell文件来控制gpio做为输入或者输出。

4.1 GPIO输出测试

编写测试脚本   vi gpiotest_o.sh

#!/bin/bash

# gpio list gpio (bank-1)*32 + nr  

for test in  118 119 120 137 136 12

do

echo Exporting pin $test.

echo $test> /sys/class/gpio/export

echo Setting pin $1.

echo  out > /sys/class/gpio/gpio$test/direction

echo  $1 > /sys/class/gpio/gpio$test/value

echo $test> /sys/class/gpio/unexport

done

echo complete

 

修改脚本执行权限: chmod u+x gpiotest_o.sh

测试 gpio输出为低。进入到脚本所在路径: ./gpiotest_o.sh    0

所有 GPIO输出低电平 0V。

测试 gpio输出为高电平。进入到脚本所在路径: ./gpiotest_o.sh     1

所有 GPIO输出高电平。输出的高电平,根据引脚所在的电源域不同,可能会有区别。

 

另外有些客户发现

echo  118  > /sys/class/gpio/export 用于通知系统需要导出控制的 GPIO 引脚编号

echo "out" > /sys/class/gpio/gpio 118 /direction   控制为输出

echo "1" > /sys/class/gpio/gpio 118 /value   输出为高电平

cat /sys/class/gpio/gpio118/value 仍旧为0

原因如下图所示,客户可以从 CPU手册中查找到相关内容:

 

输入模式读取的是psr的值。

 

读取 output的value值是从PSR中读取的。而写入output值是写入到DR中的。可以通过设置SION位回环。

 

4.2 GPIO输入测试

编写测试脚本   vi gpiotest_i.sh

#!/bin/bash

# gpio list gpio (bank-1)*32 + nr  

for test in  118 119 120 137 136 12

do

echo Exporting pin $test.

echo $test> /sys/class/gpio/export

echo  in > /sys/class/gpio/gpio$test/direction

gpioval=`cat  /sys/class/gpio/gpio$test/value`

echo GPIO $test = $gpioval

echo

echo $test> /sys/class/gpio/unexport

done

echo complete

 

修改脚本执行权限: chmod u+x gpiotest_ i .sh

测试 gpio输入为低。进入到脚本所在路径: ./gpiotest_ i .sh  

所有 GPIO输入为 0。

 

测试 gpio输入为高电平,比如5v。进入到脚本所在路径: ./gpiotest_ i .sh

所有 GPIO输入为1。(如果为非零值,是因为读取对应的位为1,可以修改内核源码中 drivers/gpio/gpio-generic.c 文件,将其中中 bgpio_get 函数中

return bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio) ;修改为

return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio));

修改之后, value值为1)

 

\iomuxc\shell\di\in-test.sh,复制到forlinx(比如)目录下./in-test.sh 118

\iomuxc\shell\do\close.sh,复制到forlinx(比如)目录下./close.sh 118

\iomuxc\shell\do\open.sh,复制到forlinx(比如)目录下./open.sh 118

或者采用 \iomuxc\write-117-out-high\test,复制到forlinx(比如)目录下./test 将gpio 117输出为高。



方法二:创建 dev/gpio节点。

1、在设备树文件中添加设备节点定义以及其引脚定义:

 

 

并将其他复用引脚对应的功能 disabed,保证这些引脚没被重复定义使用。引脚的pinmux可以查看imx6ul-pinfunc.h文件。

 

2、在driver/misc/gpio目录下添加gpio驱动gpio-user.c,名字需要与节点定义里的驱动名字保持相同,客户也可以自己写驱动。同时添加Kconfig和Makefile文件。

修改 driver/misc下Kconfig和Makefile文件:

driver/misc/Makefile 中添加:

obj-y            += gpio/

编辑 driver/misc/Kconfig, 添加一行:

source "drivers/misc/gpio/Kconfig" ,如图:

 

在根目录下修改 linux_imx6ul_config文件,添加:

CONFIG_GPIO_USER_INTF=y

3、编译。

make zImage

make ARCH=arm CROSS_COMPILE=arm-fsl-linux-gnueabi- dtbs

 

4、拷贝前面生成的zImage, imx6ul-14x14-evk.dtb 到 SD卡system目录中,SD卡方式烧录。

dev下有gpio节点。

 

采用 gpio-test.c为用户测试程序。编译为gpio-test。

使用 gpio-test in 2测试DI。

使用 gpio-test out 0 1 测试DO1 输出为高电平。

使用 gpio-test out 0 0 测试DO1 输出为低电平。