How to programatically unplug replug an USB device in linux?
在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?相关推荐
- USB U盘Linux mass_storage驱动学习笔记(1)
学习博客地址:https://blog.csdn.net/fudan_abc 学习书名:<Linux那些事之我是USB> 看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是dr ...
- StackOverflow How to programmatically unplug replug an arbitrary USB device? 如何以编程方式拔出并重新插入任意USB设备
文章目录 方法1:通过devcon工具重启usb hub 像这种情况,明明插了六个摄像头,它偏偏掉一个... 刚好,我们可以测试How to programmatically unplug & ...
- Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接)
Vmware提示:host usb device connections disabled-(vmware 主机已禁用 usb 设备连接) VMware Workstation,提示提示Host US ...
- USB查看器 USB Device Tree Viewer(UsbTreeView.exe)的使用(重启Intel Realsense摄像头)
文章目录 简介 打开后界面 测试U盘弹出后是否能找回 测试挽回掉线的摄像头 简介 USB Device Tree Viewer是一个非常实用的USB设备查看器,它可以发现所有的usb接口的使用情况,并 ...
- USB device如何进入suspend模式
1. 当没有使能usb device(usb_conf DEVEN没有置1),device处于L3状态 2. 当使能了usb device,但是没有连接到host,device处于L2(suspend ...
- S3C2440 WINCE6将USB DEVICE改成USB HOST,实现两个USB HOST
S3C2440一般默认的是一个USB DEVICE,一个USB HOST,即一个主口,一个从口,先来看看USB Device与USB Host相关知识. USB Host: 最底层就是USB Host ...
- STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)
STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介 本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...
- Start booting from USB device boot failed 解决办法(老机器问题)
Start booting from USB device boot failed 解决办法 问题: 一般情况下,我们设置电脑BIOS USB 第一启动方式最重要的两步: 1.Removable De ...
- U盘做为系统盘安装系统,出现start booting from usb device和boot failed解决方案
U盘做为系统盘安装系统,出现start booting from usb device和boot failed解决方案 参考文章: (1)U盘做为系统盘安装系统,出现start booting fro ...
最新文章
- 围城之势已起,拼多多骑虎难下
- 华师大c语言作业答案,2018华东师范大学计算机系机试题目代码
- 必做作业2:目前比较火的直播软件调研
- 证明kruskal算法求解图的最小生成树具有贪心选择性质_将并查集应用在图论中的最小生成树算法——Kruskal...
- Linux报错:/etc/sudoers is world writable
- MATLAB学习笔记(八)
- html5页脚最低下,页面底部或内容的页脚,以较低者为准
- k8s核心技术-Controller(Deployment)_概述和应用场景---K8S_Google工作笔记0028
- condition实现通知部分线程
- java 线程安全 Lock
- Eureka Server 开启身份验证与客户端注册
- Matlab批量读取csv、txt、prn等文件
- EsgynDB 使用JDBC UDR访问远程Trafodion的几个问题小结
- python倒数切片_python切片
- jcp jsr_JCP EC 2011年特别选举结果即将公布!
- 十六进制与ascii码的互转(c语言),十六进制与ASCII码转换
- 高效团队建设与管理 学习心得
- 【程序】Altera FPGA NIOS实现Scatter-Gather DMA(SGDMA)收发回环测试,描述符和缓冲区全部放在同一块SDRAM里面
- 如何设置maya的Render.exe程序来mayabatch批量渲染
- SQLServer 2012 Always on配置全过程