背景
在做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