Linux下USB設備自動復位的軟件實現

背景

        在做SDR項目的時候由於固件版本原因,每次使用完之後都需要重新插拔一下usb接口才能恢復正常。實際生成環境中肯定不能容忍這種情況發生,所以需要實現一種檢測到usb設備異常後能夠自動復位的功能

 

思路

        先找資料,去網上搬磚

        再拿來直接用,在使用過程中找出不足之處

        對缺點進行改進,形成通用庫並進行發佈

 

解決過程

        Google了一些資料,發現網上有許多現成的代碼,而且也是可以用的。不過有很大的問題在於需要手動去查找usb設備的各種參數。

        問題的關鍵就在於:如何獲取usb的參數

        dmesg可以查看usb設備的詳細情況

        lsusb可以查看當前系統已經連接的usb設備情況

        通過上述兩個命令是可以得到usb bus number 和 device number這兩個關鍵參數的

        最終的解決方案就是,通過腳本得到相關cmd命令的輸出,然後進行文本分析和正則表達式匹配,得到關鍵參數後提供給已有usb復位代碼,實現usb設備的復位。

 

舉例說明:

1. cmd line下輸入:dmesg 
看看log,找出所屬的usb相關bus number和device number號
先lsusb查看當前的usb設備名

[19716.055236] usb 1-2: USB disconnect, device number 18
[19716.317559] usb 2-2: new SuperSpeed USB device number 13 using xhci_hcd
[19716.338361] usb 2-2: LPM exit latency is zeroed, disabling LPM.
[19716.339434] usb 2-2: New USB device found, idVendor=2500, idProduct=0020
[19716.339441] usb 2-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[19716.339445] usb 2-2: Product: USRP B200
[19716.339449] usb 2-2: Manufacturer: Ettus Research LLC
[19716.339452] usb 2-2: SerialNumber: 3107336

可知USRP B200的bus number = 2, device number = 13

2. cmd line輸入:lsusb

Bus 002 Device 013: ID 2500:0020  
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 0cf3:e007 Atheros Communications, Inc. 
Bus 001 Device 004: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 003: ID 0bda:5689 Realtek Semiconductor Corp. 
Bus 001 Device 002: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

可進一步確認002/013兩個參數

貢獻和不足之處

        修改了網上已有usb復位代碼,使得可以通過模糊字段來自動獲取復位所需的usb參數,從而達到全自動的功能。便於工程應用。

        缺點在於復位邏輯是有缺陷的,實際上該代碼只能復位最新的記錄。在很複雜的情況下很有可能會失敗。

 

源碼地址

稍等。。。

 

參考鏈接

https://askubuntu.com/questions/645/how-do-you-reset-a-usb-device-from-the-command-line
 

 

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