您的位置:首页 > 其它

如何驱动一款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设备到此枚举就算完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: