采用iomux的方法
在设备树中iomux中添加复用gpio引脚如下,具体设置的上下拉电阻,驱动能力,查找i.MX6UL CPU手册,对应修改。
比如MX6UL_PAD_CSI_DATA00__GPIO4_IO21 0x3008
MX6UL_PAD_CSI_DATA01__GPIO4_IO22 0x1f0b1
MX6UL_PAD_CSI_DATA02__GPIO4_IO23 0x1f0b1
MX6UL_PAD_CSI_DATA03__GPIO4_IO24 0x1f0b1
MX6UL_PAD_SNVS_TAMPER9__GPIO5_IO09 0x1f0b1
MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x1f0b1
MX6UL_PAD_JTAG_TDO__GPIO1_IO12 0x1f0b1
同时修改设备树文件中(其他地方复用引脚)
编译设备树。替换飞凌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/gpio118/direction 控制为输出
echo “1” 》 /sys/class/gpio/gpio118/value 输出为高电平
或者echo “0” 》 /sys/class/gpio/gpio118/value输出为低电平
echo 118 》 /sys/class/gpio/unexport 通知系统取消导出
3. 将GPIO4_IO22设置为输入。
echo 118 》 /sys/class/gpio/export用于通知系统需要导出控制的GPIO引脚编号
echo “in” 》 /sys/class/gpio/gpio118/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/gpio118/direction 控制为输出
echo “1” 》 /sys/class/gpio/gpio118/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)
iomuxcshelldiin-test.sh,复制到forlinx(比如)目录下。/in-test.sh 118
iomuxcshelldoclose.sh,复制到forlinx(比如)目录下。/close.sh 118
iomuxcshelldoopen.sh,复制到forlinx(比如)目录下。/open.sh 118
或者采用iomuxcwrite-117-out-hightest,复制到forlinx(比如)目录下。/test 将gpio 117输出为高。