基于Smart Zynq与Lemon Zynq 的Petalinux开发 章节七 GPIO的输入输出实验

本文将在PETALINUX下实现 GPIO的输入输出功能。其中输出功能将用LED灯来演示,输入功能用板子上的按键来演示

  • 此章节内容适用于下列主板
    • Lemon ZYNQ (CLG400封装的7020)
    • Smart ZYNQ SP / SP2 / SL 版的板子(非标准版)(CLG484封装)
    • Smart ZYNQ 标准版(停产) (CLG400封装7010/7020 )
  • 本文在 vivado2018.3 以及 Petalinux2018.3 版本上进行演示

本文中的测试的LED和KEY 都是接在PL(FPGA)测的,所以本文中的GPIO都是使用EMIO方式进行控制。

一、VIVADO工程部分 之前章节制作的镜像已经带LED和KEY的部分,这里只做介绍)

我们之前制作的镜像中已经包含了GPIO(EMIO)部分的内容了,所以本次实验不需要重新制作VIVADO工程以及Petalinux 系统的重新编译操作

这里我们也可以简单回顾下:

1) 在ZYNQ设置页面添加GPIO端口:

  • Smart ZYNQ 是添加4个IO口,用于2个LED灯,和2个按键
  • Lemon ZYNQ 是添加8个IO口,用于4个LED灯,和4个按键

2) 将我们的EMIO GPIO 通过 External 的方式映射出来,右键 External

3) 在顶层模块中,将我们的GPIO_0 引出去

  • a.在顶层模块定义中添加 inout [3:0]GPIO_EMIO, (Smart ZYNQ 是3:0, Lemon ZYNQ是 4:0)
  • b.在顶层模块的zynq 例化部分添加 .GPIO_0_0_tri_io(GPIO_EMIO),

参考下文中标加粗的部分:(代码作省略了)

`timescale 1ns / 1ps
module TopModule(
inout [3:0]GPIO_EMIO,
// ...........
);

ZYNQ_CORE_wrapper zynq_u(
.GPIO_0_0_tri_io(GPIO_EMIO),
//................
);

endmodule

4) 在XDC约束文件中增加 GPIO部分对应的管脚约束(需要结合原理图),如下面所示(下面的参考内容是基于Smart ZYNQ SP/SP2/SL版的)

set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports GPIO_EMIO[3]]
set_property -dict {PACKAGE_PIN K21 IOSTANDARD LVCMOS33} [get_ports GPIO_EMIO[2]]
set_property -dict {PACKAGE_PIN P21 IOSTANDARD LVCMOS33} [get_ports GPIO_EMIO[1]]
set_property -dict {PACKAGE_PIN P20 IOSTANDARD LVCMOS33} [get_ports GPIO_EMIO[0]]

上面是和GPIO相关部分的添加重点, 当然要想让PETALINUX 正常跑起来,我们还是需要按工程一那样,将DDR型号,DDR位宽,UART,SD等资源添加起来的。

如果需要控制其他排针的GPIO,则按照这些内容手动修改工程即可。

二、PETALINUX的编译和烧录(之前章节制作的镜像已经带LED和KEY的部分,这里只做回顾)

如果要回顾内容可以参考下面部分:

三、启动主板并进入PETALINUX系统

将板子的启动方式调整成SD启动,如下图所示

接下来可以对主板进行上电。 上电之后板子上的POWER灯以及DONE灯将会亮起,如果我们的UART和电脑连接了,此时用putty等专业软件查看串口信息(波特率115200),可以看到系统已经启动,串口正在发送启动的日志信息。(当然这里也可以用 SSH方式通过网络进行连接)

当系统出现root@localhost:~# 就代表系统已经成功启动了,系统此时停留在等待输入账号密码的状态

此时输入用户名 root 密码 root,之后就正式登录 petalinux 了

四、GPIO功能验证一 点亮LED

这里我们用sysfs方式来驱动GPIO(在命令行终端中进行操作)

a)进入 /sys/class/gpio/ 目录

cd  /sys/class/gpio/ 

b) 用ls查看 文件夹下的内容,由下图可以知道系统已经识别出一个GPIO设备 gpiochip906了

ls

gpiochip906的起始编号是906,因为我们的板子上LED灯被配置到EMIO的0 和EMIO 1上了,而EMIO0 和EMIO1分别对应54和55(编号0-53属于MIO),相当于对应linux 系统的GPIO960(906+54)和GPIO961(906+55)

c) 输入下列指令输将EMIO0(GPIO960) 节点(即LED灯)导入用户空间

echo 960 > export

d) 接下来我们尝试点亮LED灯,我们需要的操作是将输入输出改成为输出模式, 并且将LED灯对应的EMIO57 (GPIO960)设置为高电平

将GPIO960设置为输出

echo out > gpio960/direction

分别将GPIO960(EMIO 0)进行拉高 和拉低的操作来观察板子上LED灯的状态

将GPIO960设置为高电平  LED灯被点亮 
echo 1 > gpio960/value

将GPIO960设置为低电平 LED灯被熄灭
echo 0 > gpio960/value

如果顺利的话,LED灯的状态将随着我们控制GPIO960(EMIO0)的改变而变化,证明LED控制成功

备注: 这里 Smart ZYNQ 的EMIO0 对应的是 主板上的 LED1(丝印号) ,而 Lemon ZYNQ 的EMIO0 对应的是主板上的LED0(丝印号)

五、GPIO功能验证二 按键读取

  • 这里需要注意两个地方:
    • Smart ZYNQ : 两个按键对应 EMIO3 ~ EMIO2 ,并且是按下后低电平
    • Lemon ZYNQ :四个按键对应 EMIO7 ~ EMIO4 ,并且是按下后高电平

gpiochip906的起始编号是 906 ,而EMIO0对应的是54(编号0-53属于MIO), 因为我们的按键对应Linux 系统的GPIO编号是:

  • Smart ZYNQ : KEY1:GPIO962(906+56),KEY2:GPIO963 (906+57)
  • Lemon ZYNQ :BTN0:GPIO964(906+58),BTN1:GPIO965,BTN2:GPIO966,BTN3:GPIO967
  • 本次实验仅用到一个按键,即Smart ZYNQ的 KEY1(GPIO962), 或Lemon ZYNQ的 BTN0(GPIO964),注意 两种类型的板子按键按下的电平是不同的

a)进入 /sys/class/gpio/ 目录

cd /sys/class/gpio/

b) 根据不同的主板类型 输入下列指令输将GPIO962(Smart ZYNQ)或GPIO964(Lemon ZYNQ)节点(即KEY1)导入用户空间(根据不同型号主板选择不同的命令)

// Smart ZYNQ 
echo 962 > export

//Lemon ZYNQ
echo 964 > export

c) 我们也可以通过下列命令查看当前的输入输出状态

// Smart ZYNQ 
cat gpio962/direction

//Lemon ZYNQ
cat gpio964/direction

可以看到这里 GPIO962默认就是输入状态了(这里返回的是in)

d) 如果输入输出状态是out ,那我们这里需要用下列命令将模式修改成in

// Smart ZYNQ 
echo in > gpio962/direction

//Lemon ZYNQ
echo in > gpio964/direction

e )之后我们通过下列指令来查看当前的按键值(输入指令前,我们需要提前按下或者松开按键)

// Smart ZYNQ 
cat gpio962/value

//Lemon ZYNQ
cat gpio964/value

如下图所示(此处以Smart ZYNQ为例, Lemon ZYNQ 的电平相反),当KEY1 (即EMIO56 GPIO962) 按松开时,返回的value值是1, 当KEY1 按下时返回值是0。(如果是Lemon ZYNQ,则 按键松开是0,按键按下返回0)

以上是PETALINUX的GPIO 输入输出测试过程

关于 sysfs:sysfs(虚拟文件系统),sysfs的作用是将注册进系统中的设备、总线和驱动组织成一个个分级的文件,并直观地将驱动和设备的层次结构以文件的形式展示在用户空间,通过操作这些文件,系统向用户空间导出内核数据结构以及他们的属性,这样一来用户空间可以通过修改sysfs的文件属性来修改设备的属性值,进而改变设备的工作状态

发表回复

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