Xillinux 章节八 GPIO的输入输出实验

本文将在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的文件属性来修改设备的属性值,进而改变设备的工作状态

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注