嵌入式学习小组
直播中

王淑华

8年用户 246经验值
私信 关注

i.MX6UL添加GPIO的方法你晓得吗?

采用iomux的方法
创建dev/gpio节点

回帖(2)

何玉华

2021-2-22 11:55:52
  采用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输出为高。
举报

h1654156194.5000

2021-2-22 11:56:04
  创建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 输出为低电平。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分