zynq7000 linux axi-gpio驱动:重置axi-gpio驱动方法

linux gpio 从内核空间导出到用户空间

        petalinux 在制作Linux 系统时,会自动的将gpio 从内核空间导出到用户空间,在用户空间下可以通过sysfs 方式控制gpio;用户空间位置在 /sys/class/gpio,在该文件夹下能看到gpiochipXX 代表gpiobase从那里开始。比如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 自动生成的过程,且在设备树文档里面也有体现。

 

注意事项:

调用gpio驱动相关函数偶尔失败的原因:
init这个函数在程序开始时执行一次即可,导出的gpio会存在与整个系统周期不要来回调用这个函数,每个pin只要初始化了,不管你的sdk程序执行到什么程度,抑或是sdk程序退出了,导出的那个pin依然存在,除非执行unexport或者重启linux
 

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>,30gpio;然后经过生成新的boot.bin image.ub,复制到sd卡运行,用putty 查看linux 系统信息,运行以下命令:

cd /

cd sys/class/gpio

打印出来信息为 gpiochip0 gpiochip 994 994 + 30 =1024,从994 1023 30gpio。其中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脚一个控制器)
root@zc706-zynq7:/sys/class/gpio# ls
export gpiochip906 unexport

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值