瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。
【公众号】迅为电子
【粉丝群】824412014(加群获取驱动文档+例程)
【视频观看】嵌入式学习之Linux驱动(第十期_热插拔_全新升级)_基于RK3568
【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板
在前面章节中所讲解的都是关于热插拔的理论和较为简单的实验,而为了加深大家对热插拔的理解以及在可以在实际工作中进行应用,所以在本章节将进行实践,使用udev挂载U盘和T卡。
上一章中我们编写了一个名为mdev的应用程序,用来处理uevent事件,而实际上udev和mdev的可执行程序都是很复杂的,也并不需要我们自己来写,只需要在构建buildroot文件系统时勾选对应的选项即可。首先来到buildroot的源码目录下,如下图(图 118-1)然后使用以下命令加载rk3568的默认配置文件)所示:
图 118-1
然后使用以下命令加载rk3568的默认配置文件并进入到图形化配置界面,如下图(图 118-2)所示:
make rockchip_rk3568_defconfig
make menuconfig
图 118-2
由于本章节使用的是udev所以需要在在System configuration菜单中,选择/dev management (Dynamic using devtmpfs + eudev),如下图(图 118-3)所示:
图 118-3
默认情况下选中的就是udev,相应的镜像已经放在了“iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动程序\82_udev_u盘_TF卡”目录下如下图所示:
烧写该镜像之后,可以在串口终端输入以下命令来查看udev是否已经启用了,如下图(图 118-4)所示:
ps -aux | grep -nR udev
图 118-4
检查到/sbin/udevd进程就表示当前系统使用的是udev,至此配置buildroot文件系统支持udev就完成了。
本小节编写完成的文件对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程04_Linux驱动程序\82_udev_u盘_TF卡\U盘。
在上一小节中配置buildroot使能了udev,而要想使用udev来实现U盘的自动挂载,还需在开发板的/etc/udev/rules.d目录下创建相应的规则文件(/etc/udev/rules.d目录不存在可以手动创建,一般都已经存在了),这里我们创建一个名为001.rules的文件,如下图(图 118-5)所示:
图 118-5
然后向该文件中添加以下内容:
KERNEL=="sd[a-z][0-9]", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/usb/usb-add.sh %k"
SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/usb/usb-remove.sh"
(1)KERNEL=="sd[a-z][0-9]"
KERNEL:表示匹配设备的内核名。
"sd[a-z][0-9]":是一个正则表达式模式,sd:表示设备名以 "sd" 开头,[a-z]:表示设备名的第三个字符是小写字母,[0-9]:表示设备名的第四个字符是数字。
这个模式用于匹配 USB 存储设备的块设备节点,如 /dev/sda1、/dev/sdb2 等。
(2)SUBSYSTEM=="block"
SUBSYSTEM:表示匹配设备的子系统名称。
"block":表示设备的子系统是块设备子系统,即与磁盘、分区等相关的设备。
这部分规则是为了确保只匹配块设备子系统下的设备。
(3)ACTION=="add"和 ACTION=="remove"
ACTION:表示匹配设备的动作。
"add":表示设备被添加。
"remove":表示设备被yichu。
这部分规则是为了处理设备被添加和被删除的事件。
(5)RUN+="/etc/udev/rules.d/usb/usb-add.sh %k"
RUN+="...":表示在匹配的设备上执行指定的命令。
"/etc/udev/rules.d/usb/usb-add.sh":是要执行的命令的路径,即在设备添加时执行 /etc/udev/rules.d/usb/usb-add.sh 脚本文件。
%k:是 Udev 提供的一个变量,表示匹配的设备的内核名。
可以注意到当块设备被添加的时候会执行/etc/udev/rules.d/usb/usb-add.sh脚本,块设备被删除的时候会执行/etc/udev/rules.d/usb/usb-remove.sh脚本,所以接下来我们要完善这两个脚本内容,首先在/etc/udev/rules.d/目录下创建名为usb的文件夹,并在这个创建usb-add.sh和usb-remove.sh脚本,如下图(图 118-6) 所示:
图 118-6
然后在 /etc/udev/rules.d/usb/usb-add.sh 文件中写入以下内容:
#!/bin/sh
/bin/mount -t vfat /dev/$1 /mnt
在 /etc/udev/rules.d/usb/usb-remove.sh 文件中写入以下内容:
#!/bin/sh
sync
/bin/umount -l /mnt
添加完成如下图(图 118-7)所示:
图 118-7
添加完成之后还需要使用chmod命令赋予两个脚本的可执行权限,如下图(图 118-8)所示:
图 118-8
至此关于udev自动挂载U盘的相关配置文件完成了,首先输入以下df命令查看当前的挂载情况,如下图(图 118-9)所示:
图 118-9
可以看到当前并没有关于U盘相关的挂载信息,然后插入U盘,相关打印如下(图 118-10)所示:
图 118-10
然后重新使用df命令查看当前的挂载情况,如下图(图 118-11)所示:
图 118-11
可以看到U盘sda1就成功挂载到了/mnt目录,然后拔掉U盘,重新使用df命令查看当前挂载情况,可以发现/dev/sda1设备已经消失了,如下图所示:
图 118-12
至此,使用udev自动挂载U盘实验就完成了。
本小节编写完成的文件对应的网盘路径为:iTOP-RK3568开发板【底板V1.7版本】\03_【iTOP-RK3568开发板】指南教程\02_Linux驱动配套资料\04_Linux驱动例程04_Linux驱动程序\82_udev_u盘_TF卡\TF卡。
在上一个小节中我们实现了U盘的自动挂载,而为了帮助同学们举一反三,本小节要使用udev实现TF卡的自动挂载,将TF卡挂载到/mnt目录下,在不做任何修改的情况下,直接插入TF卡,会发现TF卡直接挂载到了/mnt/sdcard目录,如下图所示:
图 118-13
这是因为在/lib/udev/rules.d目录下已经帮我们添加了很多的udev规则,如下图所示:
图 118-14
这里的规则文件跟我们上一小节自己创建的规则文件所实现的作用是相同的,只是 /etc/udev/rules.d/目录的规则文件比/lib/udev/rules.d目录的规则文件优先级高。
所以要实现TF卡自动挂载到/mnt命令让就需要进入到 /etc/udev/rules.d/目录下,这次我们创建一个名为002.rules的文件,如下图所示:
图 118-15
然后向该文件中添加以下内容:
KERNEL=="mmcblk[0-9]p[0-9]", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/tf/tf-add.sh %k"
SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/tf/tf-remove.sh"
(1)KERNEL=="mmcblk[0-9]p[0-9]"
KERNEL:表示匹配设备的内核名。
"mmcblk[a-z][0-9]":是一个正则表达式模式,mmcblk:表示设备名以 "mmcblk" 开头,[0-9]:表示设备名的第7个字符和第9个字符是数字。
这个模式用于匹配TF卡存储设备的块设备节点,如 /dev/mmcblk1p1 等。
(2)SUBSYSTEM=="block"
SUBSYSTEM:表示匹配设备的子系统名称。
"block":表示设备的子系统是块设备子系统,即与磁盘、分区等相关的设备。
这部分规则是为了确保只匹配块设备子系统下的设备。
(3)ACTION=="add"和 ACTION=="remove"
ACTION:表示匹配设备的动作。
"add":表示设备被添加。
"remove":表示设备被yichu。
这部分规则是为了处理设备被添加和被删除的事件。
(5)RUN+="/etc/udev/rules.d/tf/tf-add.sh %k"
RUN+="...":表示在匹配的设备上执行指定的命令。
"/etc/udev/rules.d/tf/tf-add.sh":是要执行的命令的路径,即在设备添加时执行 /etc/udev/rules.d/tf/tf-add.sh 脚本文件。
%k:是 Udev 提供的一个变量,表示匹配的设备的内核名。
当TF卡块设备被添加的时候会执行/etc/udev/rules.d/usb/tf-add.sh脚本,TF卡块设备被删除的时候会执行/etc/udev/rules.d/tf/tf-remove.sh脚本,所以接下来我们要完善这两个脚本内容,首先在/etc/udev/rules.d/目录下创建名为tf的文件夹,并在这个创建tf-add.sh和tf-remove.sh脚本,如下图 所示:
图 118-16
然后在 /etc/udev/rules.d/usb/tf-add.sh 文件中写入以下内容:
#!/bin/sh
/bin/mount -t vfat /dev/$1 /mnt
在 /etc/udev/rules.d/usb/tf-remove.sh 文件中写入以下内容:
#!/bin/sh
sync
/bin/umount -l /mnt
添加完成如下图所示:
图 118-17
添加完成之后还需要使用chmod命令赋予两个脚本的可执行权限,如下图所示
图 118-18
至此关于udev自动挂载TF卡的相关配置文件完成了,首先输入以下df命令查看当前的挂载情况,如下图所示:
图 118-19
可以看到当前并没有关于TF卡相关的挂载信息,然后插入U盘,相关打印如下所示:
图 118-20
然后重新使用df命令查看当前的挂载情况,如下图所示:
图 118-21
可以看到TF卡mmcblk1p1就成功挂载到了/mnt目录,然后拔掉U盘,重新使用df命令查看当前挂载情况,可以发现/dev/mmcblk1p1设备已经消失了,如下图所示:
至此,使用udev自动挂载TF卡的实验就完成了。