DSP

如何测试io口?

2019-07-13 19:01发布

http://xilinx.eetrend.com/blog/4908

上次我们已经把一个开源的Linux烧写到了MicroZed的QSPI Flash。这样在配置启动模式为QSPI并上电之后,我们就可以在Linux中与ZYNQ的GPIO进行交互了。在MicroZed上面,有一个LED(板子上的D3,在JTAG插座的边上)连接到PS的MIO管脚,如图1所示;LED和用户按钮在板子上的位置如图2所示。。
图1 D3的连接
图1 D3的连接
图2 LED D3和用户按钮SW1
图2 LED D3和用户按钮SW1 根据图1,只要我们控制PS的MIO47,即ZC7010芯片的B14管脚,为低电平,D3就能被点亮了。GPIO的驱动存放在/sys文件夹下(如果不知道的话可以用find / -name“”命令查找)。、连接USB-UART电缆到MicroZed,然后打开串口调试助手,再按一下MicroZed上的复位按钮,等待Linux启动完毕,就可以在串口调试助手里与Linux进行互动了。 输入ls /sys/class/gpio/命令,可以查看如何通过sysfs把GPIO的驱动导出。返回值为:export gpiochip0 unexport 为了控制MIO47,我们可以查看gpio47是不是已经被导出到sysfs文件系统。输入命令echo 47 >/sys/class/gpio/export和ls /sys/class/gpio,可以看到一个叫GPIO47的节点已经建立了,然后查看它的属性,输入ls /sys/class/gpio/gpio47,可以看到的属性有active_low, direction等。把它配置为输出管脚,输入:
echo out > /sys/class/gpio/gpio47/direction 然后更改它的属性,即给管脚状态赋值,输入: echo 1 > /sys/class/gpio/gpio47/value 回车之后,D3就被点亮了。这时你的MicroZed上面应该有3中颜 {MOD}的LED在发光了:一个是刚点亮的红 {MOD}的D3;一个是标识配置完成状态的蓝 {MOD}的D2,和表示供电正常的绿 {MOD}的D5。 试验了完了和LED的交互,我们还可以在Linux里面对用户按钮SW1进行控制。从MicroZed的原理图上得知,SW1连接到PS的MIO51,也就是ZC7010的B9管脚。采用和前面类似的命令配置gpio51节点,只不过这次要配置为输入管脚。这时可以使用cat /sys/class/gpio/gpio51/value来捕捉管脚上的电平状态;当SW1没有被按下时,管脚状态为0;SW1被按下时,管脚状态为1。 这时可以把SW1和D3关联起来,这样控制SW1就能控制D3的状态了,首先关闭D3,输入echo 0> /sys/class/gpio/gpio47/value并回车。然后把二者的状态进行关联:
cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47/value 这样只要按着SW1输入上面的代码,D3就会点亮,否则D3不亮。 最省事的办法还是用一个死循环,即创建一个任务,一直查询SW1的状态并控制D3的点亮。这样只要按下SW1,D3就点亮了;只要松开,D3就灭了。按Ctrl+C就能中断死循环的运行了。使用的所有命令和结果如图3所示。
图3 所有命令
图3 所有命令 ls /sys/class/gpio/
export gpiochip0 unexport
zynq> echo 47 > /sys/class/gpio/export
zynq>ls /sys/class/gpio/
export gpio47 gpiochip0 unexport
zynq>ls /sys/class/gpio/gpio47
active_low direction power uevent
device edge subsystem value
zynq> echo out > /sys/class/gpio/gpio47/direction
zynq> echo 1 > /sys/class/gpio/gpio47/value
zynq> echo 0 > /sys/class/gpio/gpio47/value
zynq> echo 51 > /sys/class/gpio/export
zynq> echo in > /sys/class/gpio/gpio51/direction
zynq> cat /sys/class/gpio/gpio51/value
0
zynq> cat /sys/class/gpio/gpio51/value
1
zynq> cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47/value
zynq> cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47/value
zynq> cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47/value
zynq> cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47/value
zynq> cd/
-/bin/ash: cd/: not found
zynq>zynq> cd/
-/bin/ash: can't create cd/: Is a directory
-/bin/ash: zynq: not found
zynq> -/bin/ash: cd/: not found
-/bin/ash: -/bin/ash:: not found
zynq> echo while : > pb_lights_led.sh
zynq> echo do >> pb_lights_led.sh
zynq> echo ??cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47
/value?? >> pb_lights_led.sh
-/bin/ash: can't create /sys/class/gpio/gpio47/value??: nonexistent directory
zynq> echo ??cat /sys/class/gpio/gpio51/value >
-/bin/ash: syntax error: unexpected newline
zynq> /sys/class/gpio/gpio47/value?? >> pb_lights_led.sh
-/bin/ash: /sys/class/gpio/gpio47/value??: not found
zynq> echo ??cat
zynq> pb_lights_led.sh
-/bin/ash: pb_lights_led.sh: not found
zynq> echo "cat /sys/class/gpio/gpio51/value > /sys/class/gpio/gpio47/
value">> pb_lights_led.sh
zynq> echo done >> pb_lights_led.sh
zynq>chmod 755 pb_lights_led.sh
zynq> ./pb_lights_led.sh
^C
zynq>