在linux,更新了usb设备的firmware后,你需要重新插拔一下usb设备来让系统读取到新的usb设备信息。

我们可以通过软件的方式让usb设备reset,实现hot-replug目的,让系统重新读取usb设备信息。

有两种方法让内核replug USB设备:

一:使用usbfs系统reset USB设备

先看看源码:

在drivers/usb/core/devio.c里的usbdev_ioctl函数里有

 case USBDEVFS_RESET:
snoop(&dev->dev, "%s: RESET\n", __func__);
ret = proc_resetdevice(ps);
break;

proc_resetdevice调用了drivers/usb/core/hub.c的usb_reset_device重置usb设备,使内核replug该usb

只需打开usbfs里面对应的usb文件进行ioctl(fd, USBDEVFS_RESET, NULL)即可。

二:修改设备驱动,在ioctl里添加USBDEVFS_RESET选项

我在ftdi_sio驱动里,添加

static int ftdi_device_reset(struct usb_serial_port *port)
{
struct usb_device *dev = port->serial->dev;
int ret;
ret = usb_lock_device_for_reset(dev,NULL);
if (ret == 0) {
ret = usb_reset_device(dev);
usb_unlock_device(dev);
}
return ret;
}
static int ftdi_ioctl(struct tty_struct *tty, struct file *file,
unsigned int cmd, unsigned long arg)
{
struct usb_serial_port *port = tty->driver_data;
struct ftdi_private *priv = usb_get_serial_port_data(port);
dbg("%s cmd 0x%04x", __func__, cmd);
/* Based on code from acm.c and others */
switch (cmd) {
/* To support usb_control_msg to ttyUSB */
case USBDEVFS_CONTROL:
//dev_printk(KERN_DEBUG, &port->serial->dev->dev, "%s: CONTROL\n", __FUNCTION__);
return tty_usb_control(port, (void __user *)arg);
break;
/* reset after downloading new firmware */
case USBDEVFS_RESET:
return ftdi_device_reset(port);
break;

使用该内核,则可以通过设备驱动进行replug该usb设备,很方便。

使用驱动reset设备:

static int usb_device_reset(int fd)
{
int ret;
#define FTDI_USBDEV_RESET   _IO('U', 20)
ret = ioctl(fd, FTDI_USBDEV_RESET, NULL);
if (ret < 0)
printf("USB device reset: %s\n", strerror(errno));
return ret;
}

上面的#define FTDI_USBDEV_RESET  _IO('U', 20),其实就是USBDEVFS_RESET

我使用修改了的驱动实现,实际效果如下:

root@DLRC:/opt/sniffer/bin#setmoteid_4x -d /dev/ttyUSB0 -w 92
product :HKUST ATC Telos Rev B(9), len:24
old product :HKUST ATC Telos Rev B(9), len:24
new product :   HKUST ATC Telos Rev B(92)
serial save:DS000338, len:8
ftdi_sio 1-1.4.3:1.0: forced unbind
ep93xx-ohci ep93xx-ohci: shutdown urb c563dde0 ep1in-bulk
ftdi_sio 1-1.4.3:1.0: device disconnected
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
usb 1-1.4.3: reset full speed USB device using ep93xx-ohci and address 4
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
hub 1-1.4:1.0: state 7 ports 4 chg 0000 evt 0008
usb 1-1.4.3: ep0 maxpacket = 8
usbserial_generic 1-1.4.3:1.0: usb_probe_interface
usbserial_generic 1-1.4.3:1.0: usb_probe_interface - got id
ftdi_sio 1-1.4.3:1.0: usb_probe_interface
ftdi_sio 1-1.4.3:1.0: usb_probe_interface - got id
ftdi_sio 1-1.4.3:1.0: FTDI USB Serial Device converter detected
usb 1-1.4.3: Detected FT232BM
usb 1-1.4.3: FTDI USB Serial Device converter now attached to ttyUSB1
ftdi_sio ttyUSB0: FTDI USB Serial Device converter now disconnected from ttyUSB0

可以看到,reset它,内核就replug该USB。

How to programatically unplug replug an USB device in linux?相关推荐

  1. USB U盘Linux mass_storage驱动学习笔记(1)

    学习博客地址:https://blog.csdn.net/fudan_abc 学习书名:<Linux那些事之我是USB> 看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是dr ...

  2. StackOverflow How to programmatically unplug replug an arbitrary USB device? 如何以编程方式拔出并重新插入任意USB设备

    文章目录 方法1:通过devcon工具重启usb hub 像这种情况,明明插了六个摄像头,它偏偏掉一个... 刚好,我们可以测试How to programmatically unplug & ...

  3. Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接)

    Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接) VMware Workstation,提示提示Host US ...

  4. USB查看器 USB Device Tree Viewer(UsbTreeView.exe)的使用(重启Intel Realsense摄像头)

    文章目录 简介 打开后界面 测试U盘弹出后是否能找回 测试挽回掉线的摄像头 简介 USB Device Tree Viewer是一个非常实用的USB设备查看器,它可以发现所有的usb接口的使用情况,并 ...

  5. USB device如何进入suspend模式

    1. 当没有使能usb device(usb_conf DEVEN没有置1),device处于L3状态 2. 当使能了usb device,但是没有连接到host,device处于L2(suspend ...

  6. S3C2440 WINCE6将USB DEVICE改成USB HOST,实现两个USB HOST

    S3C2440一般默认的是一个USB DEVICE,一个USB HOST,即一个主口,一个从口,先来看看USB Device与USB Host相关知识. USB Host: 最底层就是USB Host ...

  7. STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)

    STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介   本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...

  8. Start booting from USB device boot failed 解决办法(老机器问题)

    Start booting from USB device boot failed 解决办法 问题: 一般情况下,我们设置电脑BIOS USB 第一启动方式最重要的两步: 1.Removable De ...

  9. U盘做为系统盘安装系统,出现start booting from usb device和boot failed解决方案

    U盘做为系统盘安装系统,出现start booting from usb device和boot failed解决方案 参考文章: (1)U盘做为系统盘安装系统,出现start booting fro ...

最新文章

  1. 围城之势已起,拼多多骑虎难下
  2. 华师大c语言作业答案,2018华东师范大学计算机系机试题目代码
  3. 必做作业2:目前比较火的直播软件调研
  4. 证明kruskal算法求解图的最小生成树具有贪心选择性质_将并查集应用在图论中的最小生成树算法——Kruskal...
  5. Linux报错:/etc/sudoers is world writable
  6. MATLAB学习笔记(八)
  7. html5页脚最低下,页面底部或内容的页脚,以较低者为准
  8. k8s核心技术-Controller(Deployment)_概述和应用场景---K8S_Google工作笔记0028
  9. condition实现通知部分线程
  10. java 线程安全 Lock
  11. Eureka Server 开启身份验证与客户端注册
  12. Matlab批量读取csv、txt、prn等文件
  13. EsgynDB 使用JDBC UDR访问远程Trafodion的几个问题小结
  14. python倒数切片_python切片
  15. jcp jsr_JCP EC 2011年特别选举结果即将公布!
  16. 十六进制与ascii码的互转(c语言),十六进制与ASCII码转换
  17. 高效团队建设与管理 学习心得
  18. 【程序】Altera FPGA NIOS实现Scatter-Gather DMA(SGDMA)收发回环测试,描述符和缓冲区全部放在同一块SDRAM里面
  19. 如何设置maya的Render.exe程序来mayabatch批量渲染
  20. SQLServer 2012 Always on配置全过程

热门文章

  1. Google 联合一些社交网站来对抗 facebook
  2. 程序计数器和指令寄存器
  3. AdaBoost学习笔记+公示推导(思维导图版)
  4. 降价狂欢购,荣耀9青春版直降200元!
  5. HSM 加密机 硬件加密机 国密标准解读 安当加密
  6. 中国象棋程序的设计与实现 三 --2012本科毕业论文等重要文档资料
  7. 如何修复Apple AirPods Max电池耗尽问题?
  8. 理想国Python入门教程
  9. 主流神经网络(3)——径向基神经网络
  10. SSH密钥删除与创建