天天看点

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

继续阅读