USB学习笔记-总结
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学习笔记-总结的更多相关文章
- USB学习笔记连载(十五):USB固件更新以及安装驱动
前几篇博客已经把如何更改固件程序和更改USB驱动名称,那么接下来就要把之前生成的 .iic 文件烧录到EEPROM里面去,实现USB的C2启动(笔者使用的是此类型,C2启动). 打开Cypress U ...
- USB学习笔记连载(十二):USB描述符
USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.H ...
- USB学习笔记连载(十一):CY7C68013A的启动方式-EEPROM
上述的应用笔记中有介绍FX2LP的启动选项,主要包括I2C启动和USB启动. 说白了I2C启动需要使用外部的EEPROM,USB启动,只是使用上位机控制软件将配置程序FX2LP中,不用EEPRO ...
- USB学习笔记-协议
一.USB设备枚举过程 1.复位从设备使其设备地址为02.先从设备发送读取设备描述符的命令(只读取一次,即使端点0的最大包长小于18字节)3.设备返回设备描述符4.主机返回0长度确认数据包给到设备5. ...
- USB学习笔记连载(二十一):CY7C68013A进行数据传输(一)
官方手册中给出了bulkloop参考例程,此例程是PC从端口2发送出数据,然后从端口6接收到数据,那么根据这个思想,可以进行修改,使得PC机接收到的数据不是从EP2发送过来的,而是从外部逻辑,比如FP ...
- USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)
CYPRESS的USB外设控制器CY7C68013A是一款广泛应用于USB打印机,手机,存储设备,USB测试等多个领域的经典产品.该产品符合USB2.0协议规范,支持full speed和high s ...
- USB学习笔记连载(十三):keil的配置环境
在对USB设备的驱动名字进行更改时,需要利用keil软件对固件进行修改,并生成 .iic 文件烧录到CY7C68013A所带的外部EEPROM中,keil生成的 .hex文件只能烧录到 Cypress ...
- USB学习笔记连载(八):FX2替换到FX2LP需要注意事项
对于使用FX2的用户,可以升级到FX2LP,上述的应用笔记<AN4078-C>中就讲解了在升级中的注意事项. 必要的修改: 1.晶振的匹配电容需要更改,FX2LP是12pF,不过笔 ...
- USB学习笔记连载(七):CY7C68013A 无法识别的可能原因
最近一直在调试视频 采集卡,和PC端连接的是USB接口,使用的是cypress的CY7C68013A-56PVXC. //======================================= ...
随机推荐
- VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)
上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是 ...
- Flask添加翻页功能(非sqlalchemy)
最近做flask的项目,需要增加翻页的功能,网上找的教程都是结合sqlalchemy的,可是我用的不是sqlalchemy,肿木办呢? 以下是我的做法 一.前端 1.传递页码 前端我使用ajax提交表 ...
- kafka环境安装
源码包下载: http://archive.apache.org/dist/kafka/1.0.0/ 集群环境: master 192.168.1.99 slave1 192.168.1.100 sl ...
- java第四天
p32~p36: 学习javadoc 1.第一步,打开一个一定规模的java项目 2.第二步,搭建测试环境 IntelliJ IDEA ——> Tools ——> Generate Jav ...
- awk处理excel表格数据
拿到一个ip的excel表格,要对单元格中的ip进行扫描,一看有点乱,有空格分割的,有"/"分割的,有带括号(分割的,有好几百个: 要把左边的变为右边的格式,用excel自带的功能 ...
- 20145326蔡馨熠 实验三 "敏捷开发与XP实践"
20145326蔡馨熠 实验三 "敏捷开发与XP实践" 程序设计过程 一.实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 1.git上传代码 首先我通 ...
- 在pom.xml中使用distributionManagement将项目打包上传到nexus私服
本文介绍 如何在pom.xml中使用distributionManagement将项目打包上传到nexus私服 1.pom.xml文件添加distributionManagement节点 <!- ...
- elasticsearch的服务器响应异常及解决策略(转)
详述: 1 _riverStatus Import_fail 问题描述: 发现有个索引的数据同步不完整,在 http://192.168.1.17:9200/_plugin/head/ 在browse ...
- Java编程学习之JDBC连接MySQL
JDBC连接MySQL 一.对JDBC连接数据库的步骤1.加载数据库驱动//加载驱动Class.forName(driverClass)-------------------------------- ...
- POJ 2253 Frogger(dijkstra变形)
http://poj.org/problem?id=2253 题意: 有两只青蛙A和B,现在青蛙A要跳到青蛙B的石头上,中间有许多石头可以让青蛙A弹跳.给出所有石头的坐标点,求出在所有通路中青蛙需要跳 ...