mdev详解和利用mdev让USB串口按USB通道自动映射

【linux kernel】mdev详解_iriczhao的博客-CSDN博客文章浏览阅读2k次,点赞6次,收藏10次。文章目录一、mdev概述二、用法三、linux内核源码分析四、busybox源码分析一、mdev概述mdev是busybox提供的一个工具,在嵌入式系统中,相当于简化版的udev,作用是:在系统启动、热插拔和动态加载驱动程序时,自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的。在加载驱动过程中,根据驱动程序,在/dev下自动创建设备节点。以下内容摘自busybox-1.23.1的mdev.txt文件,该文件中描述了mdev工具的功能和用法:Mdev has two prim_mdevhttps://blog.csdn.net/iriczhao/article/details/123762356

问题是这样的,LINUX平台的USB串口在开发或者使用时,会因为USB串口插入的时间不同,发生 USB端口号变化的情况。有些情况,这种问题不好规避。
目前一个有效的解决方法是利用udev的规则来USB串口按硬件信息自动映射,但是嵌入式linux只有busybox提供的mdev,这里说下如何利用mdev来USB串口按通道不同来自动映射。

mdev的基本原理是监测linux文件系统的sys目录下属性文件的变化,自动地创建和删除设备文件。创建/删除的触发,需要满足以下3点:
1、属性文件变化发生在/sys/class 或者sys/block目录。
2、变化内容是创建/删除了一个以设备名device_name作为名称的目录。
3、device_name至少包含一个名为 dev属性文件,dev的内容是"major:minor"

直接说USB串口的情况,在插入USB串口时,会再/sys/class/tty/ttyUSB0生成以下文件。

-r--r--r--    1 root     root          4096 Jul 28  1974 dev
lrwxrwxrwx    1 root     root             0 Dec 31 16:03 device -> ../../../devices/platform/EHCI-NationalChip.0/usb1
lrwxrwxrwx    1 root     root             0 Dec 31 16:03 subsystem -> ../../usb_device
-rw-r--r--    1 root     root          4096 Dec 31 16:03 uevent

重点是uevet,查看它的内容,可以看到PHYSDEVPATH属性项中描述了US的物理通道"1-1/1-1:1.0",利用这一属性,串口属于哪个端口就确定了。

[root@gx3201 ttyUSB0]# cat dev
188:0
[root@gx3201 ttyUSB0]# cat uevent 
MAJOR=188
MINOR=0
PHYSDEVPATH=/devices/platform/EHCI-NationalChip.0/usb1/1-1/1-1:1.0/ttyUSB0
PHYSDEVBUS=usb-serial
PHYSDEVDRIVER=option1
[root@gx3201 ttyUSB0]# 

我的实现方法是这样的,在mdev的规则文件mdev.conf中添加新的正则表达式规则

ttyUSB[0-9]   0:5 666   * /etc/hotplug/usb/myusb.sh $MDEV $ACTION

这样当系统有添加ttyUSB*设备时,就会执行/etc/hotplug/usb/myusb.sh脚本。
myusb.sh脚本 的内容

#!/bin/sh
module4g_96c_0='1-1/1-1:1.0'
module4g_96c_1='1-1/1-1:1.1'
module4g_96c_2='1-1/1-1:1.2'
module4g_96c_3='1-1/1-1:1.3'
ucom_96c_0='1-2/1-2.1/1-2.1:1.0'
ucom_96c_1='1-2/1-2.2/1-2.2:1.0'
ucom_96c_2='1-2/1-2.3/1-2.3:1.0'
ucom_96c_3='1-2/1-2.4/1-2.4:1.0'
if [ $2 = "add" ]; then
#获取tty所用hub通道
	utty=`cat /sys/class/tty/$1/uevent | busybox grep  ttyUSB| sed 's/^.*EHCI-NationalChip.0\/usb1\///g' | sed 's/\/ttyUSB.*$//g'`
else
#	echo "not add uevent" > /dev/ttyS0
	exit 0
fi

if [ $utty  = $module4g_96c_0 ]; then
	ln -sf /dev/$1 /dev/4g96c_0 
elif [ $utty  = $module4g_96c_1 ]; then
	ln -sf /dev/$1 /dev/4g96c_1 
elif [ $utty  = $module4g_96c_2 ]; then
	ln -sf /dev/$1 /dev/4g96c_2 
elif [ $utty  = $module4g_96c_3 ]; then
	ln -sf /dev/$1 /dev/4g96c_3 	
elif [ $utty  = $ucom_96c_0 ]; then
	ln -sf /dev/$1 /dev/tty96C_0 
elif [ $utty  = $ucom_96c_1 ]; then
	ln -sf /dev/$1 /dev/tty96C_1
elif [ $utty  = $ucom_96c_2 ]; then
	ln -sf /dev/$1 /dev/tty96C_2
elif [ $utty  = $ucom_96c_3 ]; then
	ln -sf /dev/$1 /dev/tty96C_3
	
fi

利用mdev让USB串口按USB通道自动映射 - 代码先锋网

# mount usb devices
sd[a-z]  0:0  660 * if [ $ACTION = "add" ]; then /etc/hotplug/udisk_insert; elif [ $ACTION = 'remove' ]; then /etc/hotplug/udisk_remove; fi
sd[a-z][1-9]  0:0  660 * if [ $ACTION = "add" ]; then /etc/hotplug/udisk_insert_s; elif [ $ACTION = 'remove' ]; then /etc/hotplug/udisk_remove; fi


 

你可能感兴趣的:(Linux,linux,mdev)