利用mdev讓USB串列埠按USB通道自動對映

2021-09-29 09:25:02 字數 3186 閱讀 6984

問題是這樣的,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 3116:

03 device ->..

/../

../devices/platform/ehci-nationalchip.

0/usb1

lrwxrwxrwx 1 root root 0 dec 3116:

03 subsystem ->..

/../usb_device

-rw-r--r--

1 root root 4096 dec 3116:

03 uevent

重點是uevet,檢視它的內容,可以看到physdevpath屬性項中描述了us的物理通道"1-1/1-1:1.0",利用這一屬性,串列埠屬於哪個埠就確定了。

[root@gx3201 ttyusb0]# cat dev

188:

0[root@gx3201 ttyusb0]# cat uevent

major=

188minor=

0physdevpath=

/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:

5666

*/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

fiif

[ $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

這裡我對指令碼語言不是很熟悉,寫的可能比較笨拙,思想是利用從uevent的資料獲取發生變化的usb通道,在和實際硬體的usb通道匹配,找出這個usb是屬於哪個通道,然後對映好我們自己規定的名字。

mdev自動加 解除安裝usb儲存裝置

1 編輯mdev配置檔案 etc mdev.conf,新增如下語句 sd a z 0 9 0 0 0660 mount t vfat o iocharset cp936 dev mdev mnt udisk sd a z 0 9 0 0 0660 umount mnt udisk 2 核心配置,核心...

USB轉串總結

一 usb 轉串模組原理 原理 常用晶元區別 max232 外圍電路簡單,但是占用pcb面積大,不美觀 pl2303 水貨多不穩定,外圍電路複雜,成本低 ch340 穩定,外圍電路簡單,成本相對高 計算機和mcu通訊的方法 1.只有串列埠介面的台式電腦 很老 交叉串列埠線 max232晶元 mcu ...

利用jquery讓元素居中

利用jquery 讓元素居中 一 html頁面 前提需要頁面中引入了jquery.js 物件 計算left 當前視窗寬度 var ndivleft window width 整體寬度減去當前元素的寬度 ndivleft ndivleft parseint ediv.offsetwidth 計算中間位...