使用PetaLinux,访问GPIO控制器非常简单,但是您需要了解一些技巧。
定位GPIO控制器
在我使用的示例FPGA中,可编程逻辑中有两个GPIO控制器。它们位于地址0x4120_0000和0x4121_0000。如果您在pl.dtsiPetaLinux项目的目录中查找文件subsystems/linux/configs/device-tree,您将看到GPIO设备的条目。无需修改整个设备树。
如果您构建并启动了PetaLinux构建,则可以在/sys/class/gpio目录中查找。
root@pz-7015-2016-2:~# ls /sys/class/gpio/
export gpiochip901 gpiochip902 gpiochip906 unexport
您会看到gpiochip每个GPIO控制器都有一个目录。在gpiochip901与gpiochip902目录对应PL控制器,我在我的设计中加入的。该gpiochip906目录用于PS中的GPIO控制器。
但是,您怎么知道哪一个呢?每个目录都包含一个标签文件,该文件告诉您控制器的设备树标签。您可以继续看一下内容:
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip901/label
/amba_pl/gpio@41210000
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip902/label
/amba_pl/gpio@41200000
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip906/label
zynq_gpio
查看它,您会看到gpiochip901对应于我的控制器,位于0x4120_0000,而gpiochip902对应于我的控制器,位于0x4121_0000。Gpiochip906是不同的,并且对应于ZYNQ上的内置控制器。为什么是这些数字?在我的FPGA中,第一个GPIO控制器仅控制一个GPIO位,而第二个GPIO控制器控制四个位。我们可以通过在ngpio控制器文件中查找来确定每个控制器控制多少位。
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip901/ngpio
1
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip902/ngpio
4
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpiochip906/ngpio
118
在我看来,编号从901开始。由于该控制器只有一个GPIO位,所以下一个控制器是902。该控制器具有4位,因此ZYNQ PS控制器从906开始,具有118位。
启用GPIO位
要访问GPIO位,您需要启用正确的GPIO引脚。您可以通过写入目录中的export文件来执行此操作/sys/class/gpio。这是启用我的第二个控制器的LSB的示例:
root@pz-7015-2016-2:~# echo -n 902 > /sys/class/gpio/export
现在,如果您在/sys/class/gpio目录中查找,将看到一个新目录创建,该目录使您可以控制单个GPIO引脚。
root@pz-7015-2016-2:~# ls /sys/class/gpio
export gpio902 gpiochip901 gpiochip902 gpiochip906 unexport
`
如果您查看该目录,则会看到许多可设置项:
root@pz-7015-2016-2:~# ls /sys/class/gpio/gpio902
active_low direction power subsystem uevent value
访问GPIO位
您可以通过查看direction文件来确定GPIO方向。由于我的GPIO引脚是输出,所以它显示值为out。
root@pz-7015-2016-2:~# cat /sys/class/gpio/gpio902/direction
out
您可以通过写value文件将值更改为1。
root@pz-7015-2016-2:~# echo 1 > /sys/class/gpio/gpio902/value
结论
现在你有了在PetaLinux上访问GPIO的“标准”方式。
没有回复内容