1. # ls /sys/bus/usb/devices/解析:
1-0:1.0 1-1 1-1:1.0 2-0:1.0 2-1 2-1:1.0 2-2 2-2.1 2-2:1.0 2-2.1:1.0 2-2.1:1.1 usb1 usb2

1) usb1 usb2 usb3 usb4表示主机连接了4条USB总线,即4条USB主机控制器

2)
  4-0:1.0 表示4号总线或者说是4号root hub,0就是root hub的0号端口,1表示配置为1号,0表示接口为0号。也就是说4号总线的0号端口上的设备使用的是1号配置
       的0号接口. 4-0, 0表示是roothub,其下行端口从1开始,
  4-0.1:1.0 多出一个.1表示root hub的0号端口下又接了一个hub,这个hub的1号端口上接了这个设备
  4-0.2:1.0 例如4号总线的roothub的0号端口下面又接了一个hub,这个hub的2号端口下面接了这个设备,这个设备使用的是1号配置的0号接口

[ 9.034896] hub 1-:1.0: USB hub found 
[ 9.050502] hub 2-:1.0: USB hub found
[ 9.332156] hub 3-:1.0: USB hub found
[ 9.468292] hub 4-:1.0: USB hub found

/sys/devices/platform/soc/ee0a0100.usb/usb4
/sys/devices/platform/soc/ee0a0100.usb/usb4/4-0:1.0      roothub
/sys/devices/platform/soc/ee0a0100.usb/usb4/4-1         
/sys/devices/platform/soc/ee0a0100.usb/usb4/4-1/4-1:1.0    roothub的下行端口1(hub的端口从1开始编号),下面挂一个设备4-1:1.0
/sys/devices/platform/soc/ee0a0100.usb/usb4/4-1/4-1:1.0/host0

2.获取USB设备描述符的两种策略:实现在hub.c中的hub_port_connect()中

(1)旧策略:就是Linux本身自带的策略,就是先读取8字节设备描述符操作.

(2)新策略:模仿Windows的 首次交互,在不知道bMaxPacketSize0的值的情况下,先直接发送64个字节的获取设备描述符的请求过去, 要求设备返回64个字节过来, 如果设备端点0的max packet size是32或者64,那么只要把18个 字节的设备描述传递过来就可以了,但是如果你设备端点0的max packet size就是8或者16, 而设备描述符是18个字节, 一次肯定传递不完, 那么你必然是传递了一次以后还等待着继续传递,但是从驱动 角度来说,只要获得了8个字节就够了,而对于设备,不是等着继续传吗,我直接对你做一次reset,让设备复位,这样就清掉了设备剩下的想传的数据了,然后我主机得了前8个字节我就可以知道你真正的 max packet size,然后主机就按这个真正的最大值来进行下面的传输,首先就是获得你那个18个字节的真正的完整的设备描述符,这就是Windows下面的处理方法。

花絮: 很多厂商都是按着Windows的这种策略来测试自己的设备的,他们压根儿就没有测试过请求8个字节的设备描述符,于是,也就没人能保证当你发送请求要它返回8个字节的设备描述符的时候它能够正确的响应. 所以,Linux开发者们委曲求全,把这种Windows下的策略给加了进来。 其实,Linux的那种策略才是usb spec提供的策略,而现实是,Windows没有遵守这种策略,然而厂商们出厂的时候就只是测试了能在Windows下工作,他们认为遵守Windows就是遵守了usb spec.而事实呢,却并非如 此.严格意义来说,这是Windows这边的bug,不过这种做法却引导了潮流.

如今的Linux hub.c代码里实现了这两种策略,每种试两次,原来的Linux中的那种策略叫做old scheme,沿袭Windows的策略叫做新策略。现在的做法是,具体使用哪种策略和先使用哪种策略,你作为用户你可 以在加载模块的时候可以通过下面参数自己设置,模块参数是usbcore.ko中的old_scheme_first(默认是false,即先尝试新策略)但是如果你不设置,那么默认的方法就是先使用新的这种机制试两次,然后如果不行,就使用旧机制再试两次。 usbcore.ko:old_scheme_first 先尝试使用旧策略(默认是false) usbcore.ko:use_both_schemes 如果一种策略失败,就尝试使用另一种策略(默认是true) 若use_both_schemes为false,就只试一种策略,试哪种策略由old_scheme_first决定。

# modinfo usbcore | grep scheme
parm: old_scheme_first:start with the old device initialization scheme (bool)
parm: use_both_schemes:try the other device initialization scheme if the first one fails (bool)
# cat /etc/modprobe.d/usb.conf
options usbcore old_scheme_first=

3.设备描述符有18字节,第8字节是bMaxPacketSize0

4.drivers/usb/core/generic.c中的int usb_choose_configuration(struct usb_device *udev)给设备选择一个默认的配置 generic_probe  usb_choose_configuration  usb_set_configuration  usb_notify_add_device

5.usb设备枚举位置 hub_port_connect()  hub_port_init //中只是使用新策略或旧策略只获取了设备描述符!

6.choose_devnum(): 设备号在usbfs中用作文件名。 在USB-1.1和USB-2.0总线上,它们也用作设备地址,但是在USB-3.0总线上,地址由控制器硬件分配,并且通常与设备编号不同。 地址0由USB保留为默认地址,Linux的USB堆栈始终使用1作为控制器的root hub的地址。 因此,USB栈的端口#1,即wusb虚拟端口#0的地址为#2。

7.hub_is_superspeed():hub是否为super speed hub需要在其设备描述符中指定bDeviceProtocol = USB_HUB_PR_SS

8.并没有一个专门的端点描述符来描述0号端点,因为不需要,原因是endpoint zero基本上所有的特性都是在spec规定好了的, 大家都一样,所以不需要每个设备另外准备一个描述符来描述它. 其 bMaxPacketSize0在设备描述符的第8字节处。

USB学习笔记-总结的更多相关文章

  1. USB学习笔记连载(十五):USB固件更新以及安装驱动

    前几篇博客已经把如何更改固件程序和更改USB驱动名称,那么接下来就要把之前生成的 .iic 文件烧录到EEPROM里面去,实现USB的C2启动(笔者使用的是此类型,C2启动). 打开Cypress U ...

  2. USB学习笔记连载(十二):USB描述符

    USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...

  3. USB学习笔记连载(十一):CY7C68013A的启动方式-EEPROM

       上述的应用笔记中有介绍FX2LP的启动选项,主要包括I2C启动和USB启动. 说白了I2C启动需要使用外部的EEPROM,USB启动,只是使用上位机控制软件将配置程序FX2LP中,不用EEPRO ...

  4. USB学习笔记-协议

    一.USB设备枚举过程 1.复位从设备使其设备地址为02.先从设备发送读取设备描述符的命令(只读取一次,即使端点0的最大包长小于18字节)3.设备返回设备描述符4.主机返回0长度确认数据包给到设备5. ...

  5. USB学习笔记连载(二十一):CY7C68013A进行数据传输(一)

    官方手册中给出了bulkloop参考例程,此例程是PC从端口2发送出数据,然后从端口6接收到数据,那么根据这个思想,可以进行修改,使得PC机接收到的数据不是从EP2发送过来的,而是从外部逻辑,比如FP ...

  6. USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)

    CYPRESS的USB外设控制器CY7C68013A是一款广泛应用于USB打印机,手机,存储设备,USB测试等多个领域的经典产品.该产品符合USB2.0协议规范,支持full speed和high s ...

  7. USB学习笔记连载(十三):keil的配置环境

    在对USB设备的驱动名字进行更改时,需要利用keil软件对固件进行修改,并生成 .iic 文件烧录到CY7C68013A所带的外部EEPROM中,keil生成的 .hex文件只能烧录到 Cypress ...

  8. USB学习笔记连载(八):FX2替换到FX2LP需要注意事项

    对于使用FX2的用户,可以升级到FX2LP,上述的应用笔记<AN4078-C>中就讲解了在升级中的注意事项.   必要的修改:   1.晶振的匹配电容需要更改,FX2LP是12pF,不过笔 ...

  9. USB学习笔记连载(七):CY7C68013A 无法识别的可能原因

    最近一直在调试视频 采集卡,和PC端连接的是USB接口,使用的是cypress的CY7C68013A-56PVXC. //======================================= ...

随机推荐

  1. Ubuntu vim java 自动补全javacomeplete2

    一 安装vundle $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 默认安装在/.v ...

  2. MySql数据库的安装和卸载

  3. Vue学习笔记之表单绑定输入

    vue的核心:声明式的指令和数据的双向绑定. 那么声明式的指令,已经给大家介绍完了.接下来我们来研究一下什么是数据的双向绑定? 另外,大家一定要知道vue的设计模式:MVVM M是Model的简写,V ...

  4. 20145307陈俊达《网络对抗》逆向及Bof基础

    20145307陈俊达<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任 ...

  5. 小奇的糖果(candy)

    [题目背景]小奇不小心让糖果散落到了地上,它对着满地的彩色糖果胡思乱想.[问题描述]有 N 个彩色糖果在平面上. 小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能够拾起多少糖果 ...

  6. 从0开始学习 GITHUB 系列之「GIT 进阶」【转】

    本文转载自:http://stormzhang.com/github/2016/06/16/learn-github-from-zero5/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  7. 【图片服务器】搭建Nginx图片服务器

    一.安装Nginx 二.安装vsftpd 三.开始搭建Nginx图片服务器 1.效果 例如:图片通过ftp服务上传到/home/ftpuser/www/images目录下,我想通过访问Nginx服务器 ...

  8. BZOJ 3529 【SDOI2014】 数表

    题目链接:数表 我们一起来膜PoPoQQQ大爷的题解吧Orz 首先我们来考虑没有\(a\)的限制该怎么做.显然交换\(n\),\(m\)答案不变,所以后面默认\(n \le m\). 我们定义两个函数 ...

  9. python 获取进程执行的结果

    import subprocessp = subprocess.Popen([r'ls'],stdout=subprocess.PIPE) result = p.stdout.read()print( ...

  10. adb: failed to install xxx.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.xxx.deliveryrobot signatures do not match the previously installed version; ignoring!]

    解决方法:我是在安装软件时出现的这个错误,先卸载再安装即可 卸载: adb uninstall "com.yourapp.yourapp" 安装: adb install your ...