zynq7000 linux axi-gpio驱动:重置axi-gpio驱动方法
linux gpio 从内核空间导出到用户空间
petalinux 在制作Linux 系统时,会自动的将gpio 从内核空间导出到用户空间,在用户空间下可以通过sysfs 方式控制gpio;用户空间位置在 /sys/class/gpio,在该文件夹下能看到gpiochipX,X 代表gpio的base从那里开始。比如vivado 设计用的axi-gpio 地址时412000,经过空间导出到用户空间之后,gpiochipX 的属性就表示了axi-gpio属性,其中label 为物理地址,base 为基地址,且X=BASE,比如BASE = 1000, 则生成gpiochip1000,还有一个参数ngpio 表示生成了几个gpio口。
即在vidado 做工程时体现的是物理地址,经过petalinux 制作linux 系统后,自动的将内核空间的gpio导出到用户空间/sys/class/gpio下,然后在xsdk 下写linux 的gpio 驱动时,用的是base,gpio数目不同,base是不同的,在sdk中写程序时注意先看一下gpiochip 从几开始,但是gpiochip 的label 对应的是内核空间的物理地址。由于gpio 最大1024,从0到1023,因此比如axi-gpio 有30个io口,则生成gpiochip994,从994到1023共30个io;如果axi-gpio为24个,则生成gpiochip1000,从1000到1023共24个gpio口;这一过程为petalinux 自动生成的过程,且在设备树文档里面也有体现。
AXI-GPIO 重新配置方法
Step1:vivado里重新配置完axi-gpio后,再导出hdf,然后拷贝到petalinux工程里。
Step2:执行petalinux-config --get-hw-description -p .
Step3:执行petalinux-build
step4:检查 components/plnx_workspace/device-tree/device-tree/pl.dtsi的axi-gpio节点是否更新,主要是gpio数量跟实际配置是否对应。
在petalinux-build 之后生成新的设备树,查看gpio-width,已经自动改为<0x1e>,即30个gpio;然后经过生成新的boot.bin和 image.ub,复制到sd卡运行,用putty 查看linux 系统信息,运行以下命令:
cd /
cd sys/class/gpio
打印出来信息为 gpiochip0 gpiochip 994, 994 + 30 =1024,从994 到 1023 共30个gpio。其中gpiochip0 为mio 和 emio的信息,可以通过cat查看其值。
Step5:将重新编译后的boot.bin和image.ub更新到板卡
Step6:启动系统后会看到gpio的base改变
将应用程序中用的offset 改为994,即base 改为994即可。
sysfs方式控制GPIO
其实linux下面有一个通用的GPIO操作接口,就是 “/sys/class/gpio” 方式。首先gpio 的驱动有没有被导出来,位置在 /sys/class/gpio
确认第一个GPIO控制器索引 (每个PIN脚一个控制器)
[email protected]:/sys/class/gpio# ls
export gpiochip906 unexport