攻城獅分享丨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 ,就不會發生問題了。
相關產品 >
-
FET335xD核心板
飛凌AM335系列核心板基于TI RM Cortex-A8 架構 AM335x 微處理器設計,AM335x核心板整板尺寸47*71mm;AM335X核心板芯片全部采用工業級用料;AM335x核心板引腳豐富,引出200pinCPU引腳,原生支持6路UART;AM335x核心板支持市面上主流的操作系統,Linux-RT、Linux3.2。更多AM335x系列概述,AM335處理器特點請聯系在線客服
了解詳情 -
FET62xx-C核心板
FET6254-C核心板基于TI Sitara? AM62x系列工業級處理器設計。采用Arm Cortex A53架構,并集成了廣泛的接口,如2路支持TSN的千兆以太網、USB 2.0CAN-FD,AM6254核心板兼容AM62x全系列處理器,提供單核、雙核、四核可選,功能引腳完全兼容,飛凌嵌入式已經適配AM6254 AM6231 AM6232三款芯片為您帶來靈活的成本組合方案,AM62x可應用于廣泛的工業環境,如人機界面(HMI)、工業計算機、邊緣計算、零售自動化、充電樁控制單元(TCU)、醫療設備等。
了解詳情