usb 设备 复位

 

USB devices are anywhere nowadays, even many embedded devices replace the traditional serial devices with usb devices. However, I experienced that USB devices hang from time to time. In most cases, a manual unplug and replug will solve the issue. Actually, usb reset can simulate the unplug and replug operation.

First, get the device path for your usb device. Enter the command lsusb will give you something similar as below,

Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 002: ID 04b3:310c IBM Corp. Wheel Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 0a5c:2145 Broadcom Corp.
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Use the IBM Wheel Mouse as an example, the device node for it is /dev/bus/usb/006/002, where 006 is the bus number, and 002 is the device number.

Second, apply ioctl operation to reset the device. This is done in C code,

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
void main(int argc, char **argv)
{
    const char *filename;
    int fd;
    filename = argv[1];
    fd = open(filename, O_WRONLY);
    ioctl(fd, USBDEVFS_RESET, 0);
    close(fd);
    return;
}

Save the code above as reset.c, then compile the code using

gcc -o reset reset.c
32位arm:arm-linux-gnueabihf-gcc

This will produce the a binary named reset. Again, using the wheel mouse as an example, execute the following commands,

sudo ./reset /dev/bus/usb/006/002
 

You can take a look at the message by,

tail -f /var/log/messages
 

On my Ubuntu desktop, the last line reads,

May 4 16:09:17 roman10 kernel: [ 1663.013118] usb 6-2:
reset low speed USB device using uhci_hcd and address 2
 

This reset operation is effectively the same as you unplug and replug a usb device.

For another method of reset usb using libusb, please refer here

转载于:https://www.cnblogs.com/Ph-one/p/11531847.html

<think>好的,用户想了解USB3复位过程的相关信息或者解决USB3复位的问题。首先,我需要回忆一下USB3.0的基本架构和复位机制。USB3.0引入了SuperSpeed模式,与USB2.0兼容,所以复位过程可能涉及两种模式的切换。 接下来,根据系统级指令的要求,我需要确保所有数学公式和独立公式使用正确的LaTeX格式,不过这个问题可能不涉及太多数学内容,可能更多的是协议和信号处理。但如果有涉及时序或电气参数,可能需要用公式表示。 用户的问题是关于USB3复位过程的详解,所以需要分步骤解释复位过程,包括不同类型的复位,比如端口复位、功能复位等。可能需要参考类似DDR3初始化和NVMe控制器复位的过程,比如引用[1]和[2]提到的动态ODT和工作队列的处理。不过要注意,这些引用是关于内存和NVMe的,可能与USB3的复位机制不同,但初始化流程可能有相似之处,比如控制器的状态机转换。 需要检查USB3规范中的复位流程,确保信息准确。可能涉及链路训练、电气空闲、LFPS(低频周期信号)等。USB3的复位可能分为热复位、温复位、冷复位,或者功能复位和端口复位。例如,当主机检测到设备连接时,会发起端口复位设备需要响应并进入默认状态。 另外,解决复位问题可能需要检查硬件连接、信号完整性、电源管理,或者固件/驱动的问题。比如引用[1]提到的动态ODT用于改善信号完整性,可能在USB3中也有类似的终端电阻配置影响复位过程。引用[2]中的NVMe复位流程涉及工作队列和控制器状态重置,USB3的控制器复位可能也有类似的步骤,比如寄存器配置和状态机重置。 还需要考虑USB3协议中的具体章节,比如第9章关于设备状态和总线事件,第7章关于链路层和物理层的过程。例如,设备复位后需要进入U0状态,完成链路训练,协商速度和电压参数。 可能用户遇到的问题是无法正确复位导致设备无法识别或传输不稳定,需要分析可能的原因,如信号干扰、固件bug、驱动不兼容等。解决方案可能包括更新驱动、检查硬件设计、使用协议分析仪抓包等。 最后,生成相关问题时要围绕USB3复位的机制、故障排除、协议细节等方面提问,帮助用户深入理解。</think>### USB3复位过程详解 USB3复位过程涉及物理层、链路层和协议层的协同操作,主要分为**功能复位**和**端口复位**两种类型[^1]。以下是具体步骤及关键机制: --- #### **1. 物理层复位** 当检测到连接事件时,物理层通过**低频周期信号(LFPS)**启动复位流程: - **电气空闲(Electrical Idle)**:发送端进入低功耗状态,持续发送LFPS脉冲[^1]。 - **协商阶段**:设备与主机通过LFPS协商速率和电压参数,例如$V_{cm}$(共模电压)需满足$0.8V < V_{cm} < 1.2V$[^1]。 - **链路训练**:双方同步时钟并建立稳定通信链路。 --- #### **2. 链路层复位** 链路层通过**链路命令(Link Command)**触发复位: - **发送复位请求**:主机发送`LBPM(Link Bilateral PM Request)`报文。 - **状态机重置**:链路层状态机从`U0`(活跃状态)切换到`Recovery`状态,重新协商链路参数[^2]。 - **超时检测**:若复位未在$t_{Recovery} \leq 10ms$内完成,触发二次复位[^3]。 --- #### **3. 协议层复位** 协议层通过控制传输(Control Transfer)完成设备初始化: - **端点上下文重置**:主机发送`SET_FEATURE`命令,清除端点缓冲区。 - **设备状态迁移**:设备从`Default`状态进入`Addressed`状态,分配唯一地址。 - **配置描述符加载**:主机读取设备描述符并加载驱动。 --- #### **常见复位问题与解决** 1. **信号完整性差** - 现象:频繁复位或连接不稳定。 - 排查:检查PCB走线阻抗匹配(需满足$90\Omega \pm 10\%$差分阻抗),优化终端电阻(Rtt)配置[^1]。 2. **固件/驱动异常** - 现象:复位设备无响应。 - 解决:更新设备固件或主机控制器驱动,确保符合xHCI 1.1规范。 3. **电源噪声干扰** - 现象:复位过程中断。 - 解决:增加电源滤波电容,例如并联$10\mu F$和$0.1\mu F$电容。 --- #### **示例:USB3控制器复位代码片段(Linux内核)** ```c // 重置USB3控制器 void usb3_reset_controller(struct usb_hcd *hcd) { writel(USB_CMD_RESET, &hcd->regs->usb_cmd); // 发送复位命令 while (readl(&hcd->regs->usb_cmd) & USB_CMD_RESET) udelay(1); // 等待复位完成 reconfigure_endpoints(hcd); // 重新配置端点 } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值