本文将在Xillinux下实现 GPIO的输入输出功能。其中输出功能将用LED灯来演示,输入功能用板子上的按键来演示
备注:因为 Xillinux 章节二 TF卡准备工作之 demo bundle 的使用说明 中的Vivado 工程默认将两个LED 都占用了(其中一个LED用于电源指示,另一个LED用于TF工作状态指示),所以如果需要在Xillinux 中控制LED灯,这里我们需要对Vivado工程进行一点点小修改。
如果是对主板排针部分的GPIO直接操作,则不需要对Vivado工程进行修改, demo bundle中的Vivado 工程已经将PS的EMIO资源映射到其中一边的排针上了。
一、Vivado 修改 LED部分(如果是控制排针的GPIO 则不需要修改)
修改的内容并不多,打开第二章节导入的vivado工程,LED 的控制是由 xillydemo.v中的这两行决定的:(Smrt Zynq SP/SP2/SL 和lemon zynq 有点区别)
//Smrt Zynq SP/SP2/SL
assign LED1 = GPIO_LED[0];
assign LED2 = gpio_tri_t[63] ? 0 : gpio_tri_o[63];
//Lemon Zynq
assign LED3 = GPIO_LED[0];
assign LED4 = gpio_tri_t[63] ? 0 : gpio_tri_o[63];
如果用户想要控制 LED2,只需增加或更改LED2的 assign 命令即可(Smart Zynq SP/SP2/SL默认是接在EMIO 63 ,对应device tree中的 TF card 状态指示; 而Lemon Zynq 下LED2默认是没有占用的,所以增加LED2的assign 命令即可)。
这里我们修改或增加下列内容,将LED2映射到emio 57脚上 (58-63脚以及0-33脚已在xillydemo 中被占用)(Smart Zynq SP/SP2/SL经过修改后TF card的状态指示仍在 gpio_tri_o[63],但该信号将被忽略。 而Lemon Zynq 默认TF卡状态是接在LED4上没有改变)
assign LED2 = gpio_tri_t[57] ? 0 : gpio_tri_o[57];
之后进行编译综合即可,然后在我们的\verilog\vivado\xillydemo.runs\impl_1\ 目录下找到刚刚生成的 xillydemo.bit文件
二、将新生成的bit 文件替换 TF 卡中的xillydemo.bit (如果是控制排针的GPIO 未对Vivado 工程进行修改则不需此操作)
1)将带xillinux 系统的TF卡 通过读卡器与电脑连接(如系统提示需要格式化磁盘,千万不要进行格式化)
2)将上文提到的 xillydemo.bit 文件复制,并替换 TF卡中原先的xillydemo.bit 文件
3) 正常退出TF卡即可
三、GPIO功能验证一 点亮LED
将TF插入主板,之后正常启动系统,并用putty调试工具查看串口命令行
这里我们用sysfs方式来驱动GPIO
a)进入 /sys/class/gpio/ 目录
cd /sys/class/gpio/
b) 用ls查看 文件夹下的内容,由下图可以知道系统已经识别出一个GPIO设备 gpiochip906了
ls
gpiochip0的起始编号是0,因为我们的板子上LED2灯被配置到emio 的57上了,而emio0 对应54和55(编号0-53属于MIO),相当于LED2 对应linux 系统的 gpio111(57+54)
c) 输入下列指令输将EMIO57(gpio 111) 节点(即LED灯)导入用户空间
echo 111 > export
d) 接下来我们尝试点亮LED灯,我们需要的操作是将输入输出改成为输出模式, 并且将LED灯对应的EMIO57 (GPIO111)设置为高电平
将GPIO111设置为输出
echo out > gpio111/direction
分别将GPIO111(EMIO 57)进行拉高 和拉低的操作来观察板子上LED灯的状态
将GPIO111设置为高电平 LED灯被点亮 echo 1 > gpio111/value 将GPIO111设置为低电平 LED灯被熄灭 echo 0 > gpio111/value
如果顺利的话,LED2灯的状态将随着我们控制GPIO111(EMIO57)的改变而变化,证明LED控制成功
四、GPIO功能验证二 按键读取
接下来我们来尝试读取按键的值
gpiochip0的起始编号是 0 ,因为我们的板子上KEY2被配置到EMIO的62上了,而emio0 对应56(编号0-53属于MIO),相当于KEY2对应linux 系统的 GPIO116(62+54)
a)进入 /sys/class/gpio/ 目录
cd /sys/class/gpio/
b) 输入下列指令输将EMIO62 (gpio 116) 节点(即KEY2)导入用户空间
echo 116 > /sys/class/gpio/export
c) 我们也可以通过下列命令查看当前的输入输出状态
cat gpio116/direction
可以看到这里 GPIO116默认就是输入状态了(这里返回的是in)
d) 如果输入输出状态是out ,那我们这里需要用下列命令将模式修改成in
echo in > gpio116/direction
e )之后我们通过下列指令来查看当前的按键值(输入指令前,我们需要提前按下或者松开按键)
cat gpio116/value
如下图所示,当KEY2 (即EMIO62 GPIO116) 按松开时,返回的value值是1, 当KEY2 按下时返回值是0
备注上文中的LED2和KEY2 在Lemon Zynq 主板下对应硬件上的LED1,和BTN1 (板子上第一个LED是LED0,第一个按键是BTN0)
以上是xillinux 的GPIO 输入输出测试的完整流程
关于 sysfs:sysfs(虚拟文件系统),sysfs的作用是将注册进系统中的设备、总线和驱动组织成一个个分级的文件,并直观地将驱动和设备的层次结构以文件的形式展示在用户空间,通过操作这些文件,系统向用户空间导出内核数据结构以及他们的属性,这样一来用户空间可以通过修改sysfs的文件属性来修改设备的属性值,进而改变设备的工作状态