如何驱动一款USB设备
2013-10-03 23:55
169 查看
当我们把USB设备接入Hub接口的时候,设备地址初始化为0,那么主机控制器就要开始往地址为0的USB设备发送一个事物,实现获取设备描述符的功能(建立过程:SETUP(注)+DATA0(主)+ACK(从),数据过程:批量传输格式,状态过程:省略)。
由于我们使用现在的处理器都有USB接口芯片,所以对于这些包来说不需要我们去解析然后判断是什么包。例如6410就可以判断当前接到的包是不是SETUP包。所以我们呢很容易就可以把建立过程、数据过程的DATA数据直接读取出来,通过USB Hound可以读取出来。例子:
主机第一次获取设备描述符请求:14.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 12.1.0
对于USB请求,可以看协议手册或者文章:http://www.baiheee.com/Documents/090518/090518112619.
80(主机到设备) 06(GET_DESCRIPTOR)
00 01(设备描述符索引) 00 00 40 00 (请求长度)
USB数据都是基于小端结构!!
对于请求有很多种,都是主机发起,设备就要根据请求来操作并回应。
其中就有描述符回应:设备描述符、配置描述符、字符串描述符,我们需要根据描述符的格式来填充,具体看文章:http://blog.csdn.net/alien75/article/details/4622319
例如我们构造设备描述符:
0x12,(设备描述符固定长度18字节)
0x01,(设备描述符索引值为1)
0x10,
0x01,(USB版本设置,可以是USB1.1,也可以是USB2.0)
0x00,
0x00,
0x00, (不使用USB协议定义的设备类)
0x12,
0x13,(厂商ID,随便定义,产品化时候就不能,防止侵权)
0x01,
0x00,(产品ID)
0x00,
0x02,(USB设备的版本)
0x01,(厂商字符串索引,在字符串描述符使用)
0x02,(产品字符串索引)
0x03,(设备序列号字符串索引)
0x01(配置数)
描述符构造完毕。
发送条件:建立过程+IN包之后,就发送设备描述符,等待主机握手包,OK!
紧接着主机控制器就要设置USB设备地址(此时为默认地址0)
还是和获取设备描述一样,不过这一次没有数据过程,所以流程是:主即发送SETUP包+主机发送DATA0包(包含地址的)+从机握手包。当主机接收到握手包并且确认的时候,那么USB设备的地址就真正有效了。
主机使用新地址来发送设备描述符,配置描述符(获取配置描述符里提供的描述符信息),再次获取配置描述符、接口描述符、端口描述符、字符串描述等,操作和获取设备描述付一样。最后还有一个描述符就是设置配置描述符:
对于设置配置描述,是属于主机反馈回来的信息,是输出描述符。我们只要把该描述符的数据读出来,根据请求来设置我们的USB设备,例如使能某个端口就行了。到此,对于一般USB设备到此枚举就算完成。
由于我们使用现在的处理器都有USB接口芯片,所以对于这些包来说不需要我们去解析然后判断是什么包。例如6410就可以判断当前接到的包是不是SETUP包。所以我们呢很容易就可以把建立过程、数据过程的DATA数据直接读取出来,通过USB Hound可以读取出来。例子:
主机第一次获取设备描述符请求:14.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 12.1.0
对于USB请求,可以看协议手册或者文章:http://www.baiheee.com/Documents/090518/090518112619.
80(主机到设备) 06(GET_DESCRIPTOR)
00 01(设备描述符索引) 00 00 40 00 (请求长度)
USB数据都是基于小端结构!!
对于请求有很多种,都是主机发起,设备就要根据请求来操作并回应。
其中就有描述符回应:设备描述符、配置描述符、字符串描述符,我们需要根据描述符的格式来填充,具体看文章:http://blog.csdn.net/alien75/article/details/4622319
例如我们构造设备描述符:
0x12,(设备描述符固定长度18字节)
0x01,(设备描述符索引值为1)
0x10,
0x01,(USB版本设置,可以是USB1.1,也可以是USB2.0)
0x00,
0x00,
0x00, (不使用USB协议定义的设备类)
0x12,
0x13,(厂商ID,随便定义,产品化时候就不能,防止侵权)
0x01,
0x00,(产品ID)
0x00,
0x02,(USB设备的版本)
0x01,(厂商字符串索引,在字符串描述符使用)
0x02,(产品字符串索引)
0x03,(设备序列号字符串索引)
0x01(配置数)
描述符构造完毕。
发送条件:建立过程+IN包之后,就发送设备描述符,等待主机握手包,OK!
紧接着主机控制器就要设置USB设备地址(此时为默认地址0)
还是和获取设备描述一样,不过这一次没有数据过程,所以流程是:主即发送SETUP包+主机发送DATA0包(包含地址的)+从机握手包。当主机接收到握手包并且确认的时候,那么USB设备的地址就真正有效了。
主机使用新地址来发送设备描述符,配置描述符(获取配置描述符里提供的描述符信息),再次获取配置描述符、接口描述符、端口描述符、字符串描述等,操作和获取设备描述付一样。最后还有一个描述符就是设置配置描述符:
对于设置配置描述,是属于主机反馈回来的信息,是输出描述符。我们只要把该描述符的数据读出来,根据请求来设置我们的USB设备,例如使能某个端口就行了。到此,对于一般USB设备到此枚举就算完成。
相关文章推荐
- POJ3984 迷宫问题 BFS
- POJ3984 迷宫问题 BFS
- LINUX内核面试题摘选
- 《Zend Framework 2 程序员参考指南》 一、概述 Overview
- Android_learn
- 前端性能优化工具--DOM Monster
- 大数据分析案例:永远别忘记天气这个变量
- 最后一次飞翔
- 线程的优先级
- DDL,DML,DCL
- 一个程序员编程能力的修炼阶段
- jQuery选择器的灵活用法
- 前端性能优化工具--DOM Monster
- 线程的休眠
- pl/sql中添加 shortcuts插件
- 线程的合并
- 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。
- C++在多线程中使用UINT做循环判断变量的不确定性问题
- Single Number II
- Web服务请求异步化