开发板:Zynq7030数据采集板
PC平台:Ubuntu-18.04 + MobaXterm
开发环境:Xilinx Vivado + SDK -18.3
交叉编译工具:arm-linux-gnueabihf-
学习目标:通过Linux下GPIO驱动控制开发板上的LED灯
一、Zynq Linux的GPIO驱动
在前面文章:Zynq-7000系列之linux开发学习笔记:PS和PL端的GPIO使用(三)中分享了Zynq下GPIO的三种类型,由于使用的硬件关系,只分享EMIO和AXI_GPIO的具体配置流程。由于是在裸机的情况下进行的GPIO操作,需要在Vivado和SDK下对PS和PL端进行配置,还要在SDK里面编写程序,才能通过JTAG的方式下载到板子上运行。
但在Linux系统环境下,操作GPIO是非常方便的事情,一般都是通过驱动程序来进行操作。驱动程序可以通过自己编写来实现,也可以直接采用Linux下的驱动程序。
二、EMIO_GPIO
从前面几篇文章中可知:移植Linaro操作系统的流程中,生成FSBL阶段时配置了一个EMIO连接到PL端的PIN脚。
可以查看一下编译内核的时候,在 ./linux-xlnx-xilinx-v2018.3/arch/arm/configs 路径下的Xilinx Zynq官方配置文件 xilinx_zynq_defconfig ,是否使能了下面内容:
CONFIG_GPIO_SYSFS=y
CONFIG_SYSVIPC=y
CONFIG_GPIO_ZYNQ=y
查看通过SDK生成的设备树文件,包含有下面GPIO内容:
gpio@e000a000 {
compatible = "xlnx,zynq-gpio-1.0";
#gpio-cells = <0x2>;
clocks = <0x1 0x2a>;
gpio-controller;
interrupt-controller;
#interrupt-cells = <0x2>;
interrupt-parent = <0x4>;
interrupts = <0x0 0x14 0x4>;
reg = <0xe000a000 0x1000>;
emio-gpio-width = <0x1>;
gpio-mask-high = <0x0>;
gpio-mask-low = <0x5600>;
};
1、Linux下Sysfs方式直接操作GPIO
在多GPIO的系统下,需要确定要控制GPIO口的编号,一种方法就是通过查看./sys/class/gpio路径下的gpiochips编号,它反映了GPIO在系统中的地址。还有一种方法比较麻烦,就不提了0.0.0
root@linaro-ubuntu-desktop:~$ cd /sys/class/gpio/
root@linaro-ubuntu-desktop:/sys/class/gpio$ ls
export