飛凌嵌入式AM335x平臺如何通過udev固定4G模塊串口號

本文以 飛凌嵌入式 AM335x平臺爲例進行講解。 在使用 4G模塊的時候, 在 4G 信號不太理想的環境下需要檢測網絡,當設備斷網後重啓 4G模塊重新撥號聯網。但系統長期運行後,重啓模塊 會導致在 /dev 目錄下的4G模塊生成的設備節點ttyusb序號改變,導致應用程序撥號時出錯。我們可以修改 udev規則文件解決這個問題。

udev 的規則文件裏定義了很多變量,如KERNELS ,SUBSYSTEMS ,DRIVERS 等等,我們可以用這些變量中的幾個來確定我們的設備,並修改我們其中的NAME 和SYMLINK 變量,這樣我們就可以改變我們的設備在/dev 目錄下的名字和鏈接了。

使用 udevadm info命令可以查詢udev數據庫中的設備信息。也可以從sysfs文件系統中查詢到設備的屬性以輔助創建udev規則。

 

udevadm  info -q path -n /dev/ttyUSB0 可以查看ttyUSB0設備的系統設備路徑

root@ok335x:~# udevadm  info -q path -n /dev/ttyUSB0
/devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1/1-1.2/1-1.2:2.2/ttyUSB0/tty/ttyUSB0

 

udevadm info -a -p $(udevadm  info -q path -n /dev/ttyUSB0) 查詢/dev/ttyUSB0設備,可以打印出設備總線的所有位置的父子關係,如下所示:

root@am335x:~# udevadm info -a -p $(udevadm  info -q path -n /dev/ttyUSB4)

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

 

  looking at device '/devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1/1-1.2/1-1.2:2.2/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="usb-serial"
    DRIVER=="option1"
    ATTR{port_number}=="0"

 

  looking at parent device '/devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1/1-1.2/1-1.2:2.2':
    KERNELS=="1-1.2:2.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="option"
    ATTRS{bInterfaceNumber}=="02"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="06"
    ATTRS{bInterfaceProtocol}=="10"
    ATTRS{modalias}=="usb:v12D1p15C1d0102dc00dsc00dpFFicFFisc06ip10"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{interface}=="Huawei Mobile Connect - Modem"

 

  looking at parent device '/devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1/1-1.2':
    KERNELS=="1-1.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 7"
    ATTRS{bConfigurationValue}=="2"
    ATTRS{bmAttributes}=="a0"
    ATTRS{bMaxPower}=="  2mA"
    ATTRS{urbnum}=="26"
    ATTRS{idVendor}=="12d1"
    ATTRS{idProduct}=="15c1"
    ATTRS{bcdDevice}=="0102"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="ff"
    ATTRS{bNumConfigurations}=="3"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="6"
    ATTRS{devpath}=="1.2"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Huawei Technologies Co., Ltd."
    ATTRS{product}=="HUAWEI Mobile V7R11"
    ATTRS{serial}=="0123456789ABCDEF"

 

  looking at parent device '/devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  2mA"
    ATTRS{urbnum}=="100"
    ATTRS{idVendor}=="0424"
    ATTRS{idProduct}=="2514"
    ATTRS{bcdDevice}=="0bb3"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="4"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"

 

  looking at parent device '/devices/platform/omap/musb-ti81xx/musb-hdrc.1/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="26"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0302"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 3.2.0-dirty musb-hcd"
    ATTRS{product}=="MUSB HDRC host driver"
    ATTRS{serial}=="musb-hdrc.1"
    ATTRS{authorized_default}=="1"

 

  looking at parent device '/devices/platform/omap/musb-ti81xx/musb-hdrc.1':
    KERNELS=="musb-hdrc.1"
    SUBSYSTEMS=="platform"
    DRIVERS=="musb-hdrc"
    ATTRS{modalias}=="platform:musb-hdrc"
    ATTRS{mode}=="a_host"
    ATTRS{vbus}=="Vbus off, timeout 1100"

 

  looking at parent device '/devices/platform/omap/musb-ti81xx':
    KERNELS=="musb-ti81xx"
    SUBSYSTEMS=="platform"
    DRIVERS=="musb-ti81xx"
    ATTRS{modalias}=="platform:musb-ti81xx"

 

  looking at parent device '/devices/platform/omap':
    KERNELS=="omap"
    SUBSYSTEMS==""
    DRIVERS==""

 

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

 

我們查看每個USB串口設備節點的信息,相應設備信息如下:

root@am335x:~# udevadm info -a -p $(udevadm  info -q path -n /dev/ttyUSB1)

root@am335x:~# udevadm info -a -p $(udevadm  info -q path -n /dev/ttyUSB2)

root@am335x:~# udevadm info -a -p $(udevadm  info -q path -n /dev/ttyUSB3)

root@am335x:~# udevadm info -a -p $(udevadm  info -q path -n /dev/ttyUSB4)

我們通過觀察各個設備節點的信息,返現ATTRS{interface}  可以區別各個設備節點
所以我們 將 SUBSYSTEMS=="usb"  ATTRS{interface}=="Huawei Mobile Connect - Modem" 作爲過濾條件。

在 /etc/udev/rules.d/local.rules 中加入以下內容。將ttyUSB0-4 做相應的軟鏈接爲ttyusb0-4
ATTRS{interface}=="Huawei Mobile Connect - Serial B",SUBSYSTEMS=="usb",SYMLINK+="ttyusb4"
ATTRS{interface}=="Huawei Mobile Connect - Ctrl",SUBSYSTEMS=="usb",SYMLINK+="ttyusb3"
ATTRS{interface}=="Huawei Mobile Connect - Pcui",SUBSYSTEMS=="usb",SYMLINK+="ttyusb2"
ATTRS{interface}=="Huawei Mobile Connect - Application",SUBSYSTEMS=="usb",SYMLINK+="ttyusb1"
ATTRS{interface}=="Huawei Mobile Connect - Modem",SUBSYSTEMS=="usb",SYMLINK+="ttyusb0"

我們重啓系統 輸入查看設備節點

通過查看 ,完成了設備節點的軟鏈接

如果我們在具體應用中 通過 /dev/ttyusb2 進行撥號上網。在實際長期運行過程中,我們的 4g 網絡守護進程檢測到 4g 離網時 ,會重啓 4g 模塊,有可能導致 ttyUSB 序號發生變化,如下

通過查看 /dev/ttyUSB10 的設備信息與前期的設備信息對比發現,多次反覆 4g 模塊重啓,屬性爲 ATTRS{interface}=="Huawei Mobile Connect - Pcui" 的接口在 /dev 目錄下的設備節點由 ttyUSB2 變爲 ttyUSB10 ,如下圖所示:

如果我們的應用還繼續使用 ttyUSB2 ,肯定會出問題的,但是我們使用 USB 串口所做的軟鏈接 ttyusb2 ,就不會發生問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章