开始对USB感兴趣了,学习一下USB驱动,趁着现在刚好在做USB设备驱动。
先了解一下USB的大概知识:
1.先看一下维基百科的介绍:http://zh.wikipedia.org/wiki/USB
USB分组格式
USB的分组格式和早期的互联网分组格式非常相似,要了解USB连接原理就一定要先了解分组格式。
2.了解一下VID和PID(摘自: http://www.cyantechnology.com/chinese/support/support_faqs.php#b02)什么是 USB 厂商 ID号码和产品ID 号码?
所有的USB 期间有三个号码来识别,这立按重要性排序解释。
- 厂商 ID (VID)
这是一个分配给USB器件厂商的16-位编码.这一号码的分配由USB官方论坛控制,该论坛位于 www.usb.org。分配给赛恩的VID 是 0x1B45。 - 产品 ID (PID)
一旦厂商获得了一个16-位 VID,就可以为自己的应用产品任意分配一个16-位的 PID。通常会为每一个具体的应用产品分配一个独立的 PID 编号。 - 序列编号
每一个独立的设备可由一个唯一的序列号设别。序列号为可选用,但是推荐使用。它可以被主机用来在拥有相同VID和PID的设备之间具体识别各个设备。
要了解更多详情, 请访问USB官方网站 www.usb.org/developers/vendor。
这里有usb org为厂商分配的ID:http://www.baiheee.com/Documents/090427/090427170750.htm
3.在IBM的网站上,也有对USB驱动的讲解,但是基于linux2.4核心的。
http://www.ibm.com/developerworks/cn/linux/l-usb/index1.html
http://www.ibm.com/developerworks/cn/linux/l-usb/index2.html
另有基于linux2.6核心的:http://linux.chinaitlab.com/driver/731464.html
其中有一条命令很重要:cat /proc/bus/usb/devices,得到当前系统探测到的USB总线上的设备信息。它包括Vendor、ProdID、Product等。
下面是我买的一款杂牌CF卡读卡器插入后的信息片断:
T: Bus=01 Lev=01 Prnt=01 Port=01 Cnt=02 Dev#= 5 Spd=12 MxCh= 0 |
4.USB体系工作流程
USB体系结构规定,在一个USB系统中,只有唯一的一个主机。USB和主机系统的接口称做主机控制器,主机控制器由主机控制器芯片、固件程序和软件共同实现的。USB设备包括USB集线器和功能器件。其中USB集线器的作用是扩展总线端点,向总线提供更多的连接点;功能器件是用户使用的外部设备,如键盘,鼠标等。USB设备需要支持USB总线协议,对主机的操作提供反馈并且提供设备性能的描述信息。
USB总线采用轮询方式控制,主机控制设置初始化所有的数据传输。USB总线每次执行传输动作最多可以传输3个数据包。每次开始传输时,主机控制器发送一个描述符描述传输动作的种类和方向,这个数据包称做标志数据包(Token Packet)。USB设备收到主机发送的标志数据包后,解析出数据包的数据。
USB数据传输的方向只有两种:主机到设备或者设备到主机。在一个数据传输开始时,由标志包标示数据的传输方向,然后发送端开始发送包含信息的数据。接收端发送一个握手的数据包表明数据是否传送成功。在主机和设备之间的USB数据传输可以看做一个通道。USB数据传输有流和消息两种通道。消息是有格式的数据,而流是没有数据格式的。USB有一个默认的控制消息通道,在设备启动的时候被创建,因此设备的设置查询和输入控制信息都可以使用默认消息控制通道完成。
5.linux内核USB驱动框架
http://blog.youkuaiyun.com/linuxdianc/article/details/5029416