正点原子 发表于 2021-12-31 18:12:21

《领航者ZYNQ之嵌入式Linux开发指南_V2.0》第八章 Linux外设的使用

1)实验平台:正点原子领航者V2 ZYNQ开发板
2)章节摘自【正点原子】《领航者ZYNQ之嵌入式Linux开发指南_V2.0》
3)购买链接:https://detail.tmall.com/item.htm?id=609032204975
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-329957-1-1.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子FPGA技术交流QQ群:90562473








第八章 Linux基础外设的使用
       通过对Petalinux和XSDK的学习我们了解了如何使用Petalinux定制Linux和如何使用XSDK开发Linux应用。本章我们学习如何通过Linux系统控制领航者开发板上的基础外设,如LED、EEPROM等。这些外设都可以在终端通过Shell来控制,非常方便。

       1.1GPIO之LED的使用
       GPIO驱动程序通过sysfs文件系统提供了用户空间对GPIO的访问,因而通过终端控制LED极其方便。我们启动领航者开发板,进入第六章定制的Linux系统后在串口终端中输入如下命令进入到sysfs文件系统的leds接口处:
cd /sys/class/leds
ls         通过ls命令可以看到我们在设备树中配置的led设备,如下图所示:

图 8.1.1 查看led设备
       这6个LED对应领航者开发板上的6个LED灯,名字的命名跟板子上对应LED丝印上的名字是一样的。我们先来看下led下的内容,以ps_led0为例,输入“ls ps_led0”,执行结果如下图所示:

图 8.1.2 led下的内容
       可以看到有有brightness和trigger。brightness可以控制led灯的亮灭,trigger可以选择触发方式。我们向ps_led0的brightness写入0,即输入“echo 0 > ps_led0/brightness”命令控制led灭,如下图所示:

图 8.1.3 控制PS_LED0灭
       可以看到领航者底板上的PS_LED0被熄灭,现在输入“echo 1 > ps_led0/brightness”命令,如下图所示:

图 8.1.4 控制PSLED0亮
       可以看到领航者底板上的PS_LED0灯亮,这就是通过brightness属性文件来控制led灯的亮灭,其他led灯也可以以此种方式控制。
       现在我们来看下如何通过trigger来控制led的触发方式。首先输入“cat ps_led0/trigger”命令看下有多少种触发方式,如下图所示:
图 8.1.5 查看触发方式
       可以看到触发方式非常多,当前触发方式为none,也就是表示无任何触发反应。
       现在试一下timer触发,输入命令“echo timer > ps_led0/trigger”,如下图所示:

图 8.1.6 timer触发
       可以看到底板上的PS_LED0以定时器的方式每秒闪烁一次,这就是timer触发方式的效果。现在来看下heartbeat触发方式的效果,输入命令“echo heartbeat > ps_led0/trigger”,如下图所示:

图 8.1.7 heartbeat触发方式
       此时可以看到开发板上的PS_LED0像心跳一样的闪烁,这就是heartbeat触发方式的效果。其它触发方式,这里就不给大家一一列举了,有兴趣的读者可以自行实验,需要提醒的是并不是所有的触发方式都能有反应,必须满足触发条件才行。
       1.2IIC之EEPROM与RTC的使用
       在6.2.7小节配置设备树的时候,我们在设备树文件中配置了两个I2C外设,一个是EEPROM,另一个是RTC。首先我们来看下如何读写EEPROM。
       在/sys/class/i2c-adapter目录下有两个I2C总线控制器,如下图所示:

图 8.2.1 I2C总线控制器
i2c-1和i2c-2分别对应ZYNQ PS端的两个I2C总线控制器,开发板上的EEPROM和RTC都挂载在i2c-1总线下。我们进入到/sys/class/i2c-adapter/i2c-1/目录下,查看该目录下的内容,如下图所示:

图 8.2.2 i2c-1总线下挂载的器件
       可以看到有50和51两个不同的器件地址对应的文件夹,分别对应eeprom和RTC。
       进入到1-0050/目录下,可以看到该目录有一个eeprom属性文件,如下图所示:

图 8.2.3 eeprom属性文件
       可以通过eeprom属性文件对eeprom设备进行读写操作,譬如向eeprom设备中写入“hello world”,然后读取出来,输入命令如下:
echo "hello world" > eeprom
head -1 eeprom      执行结果如下图所示:

图 8.2.4 读写eeprom
       至此我们eeprom设备的读写就完成了。下面我们来看另一个I2C设备--RTC。
       我们进入到1-0051/目录下,看下其目录内容,输入命令如下:
cd ../1-0051/
ls -l      执行结果如下图所示:

图 8.2.5 RTC
       可以看到有一个rtc文件夹,那么操作rtc是不是像eeprom那样呢?
       当然不是,对于rtc,linux有一个专用的命令:hwclock。
       在Linux中有硬件时钟与系统时钟两种时钟。硬件时钟是指电路板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。
       使用date和hwclock命令可分别查看和设定系统时钟和硬件时钟。
       在串口终端中输入下面的指令查看系统时间:
date       串口终端如下图所示:

图 8.2.6 查看系统时钟
       上图显示的就是当前的系统时间。
       在串口终端中输入下面的指令查看硬件(RTC)时钟:
hwclock       串口终端如下图所示:

图 8.2.7 查看RTC时钟
       上图中显示的便是当前RTC时钟芯片中的时间。
       在串口终端中输入下面的指令将系统时间设置为当前日期和时间(2019/11/11,15:15:00),然后使用date指令查看所设置的系统时间:
date -s "2019-11-11 15:15:00"
date       执行结果如下图所示:

图 8.2.8 设置系统时间
       在串口终端中输入下面的命令将系统时间写入RTC时钟芯片中,然后使用hwclock命令查看硬件时钟。
hwclock -w // 将系统时钟同步至硬件时钟
hwclock    // 查看硬件时钟       执行结果如下图所示:

图 8.2.9 写入RTC时钟

页: [1]
查看完整版本: 《领航者ZYNQ之嵌入式Linux开发指南_V2.0》第八章 Linux外设的使用