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