問題是這樣的,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 計算中間位...