没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux内核USB驱动架构:USB设备驱动架构.pdf
资源详情
资源评论
资源推荐
1
USB 设备驱动架构
LK 版本:2.6.35.3
2013 年 1 月 14 日
任务目标:
分析整理插入一个 USB 设备的处理过程。
USB 设备、配置、接口、设置以及端点的五者关系图:
一个 USB 设备对应有一个或多个配置;
一个配置对应一个或多个的 USB 接口;
一个 USB接口又具有一个或多个的设置;
一个设置又会拥有一个或多个的 USB 端点。
2
五者关系图如下:
usb_device{}
设备
.descriptor
*config
......
usb_host_config{}[]
......
usb_host_config{}
.desc
......
*interface[]
usb_interface{}[]
......
usb_interface{}
*altsetting
*cur_altsetting
.num_altsetting
......
usb_host_interface{}[]
......
usb_host_interface{}
*endpoint
.desc
......
usb_host_endpoint{}[]
......
usb_host_endpoint{}
.desc
......
一个配置
一个接口
一个设置
一个端点
.urb_list
usb_device_descriptor{}
配置描述符
usb_config_descriptor{}
usb_interface_descriptor{}
接口描述符
usb_endpoint_descriptor{}
端点描述符
1.定义这个端点的数据输入/输出方向
由.bEndpointAddress 的 bit7 决定,0
为输出,1 为输入。
2.至于如何判断是中断、等时、控制或
批量传输的类型:可根据.bmAttributes
的 bit1 和 bit0 决定,00 表示控制传输,
01 表示等时传输,10 表示批量传输,
11 表示中断传输
*ep_in[]
*ep_out[]
.bNumConfigurations
设备描述符
USB_MAXINTERFACES
.bNumEndpoints
.bEndpointAddress
.bmAttributes
1.每个端点拥有一个 urb_list
2.urb 的数据从端点进行收发
3.HCD 每收到一个 urb,就
会将它添加到这个 urb 指定
的 urb 队列中,例:
list_add_tail(&urb->urb_list,
&urb->ep->urb_list)
usb_host_endpoint{}*[]
......
usb_host_endpoint*{}[]
......
多个配置
多个接口
多个设置
多个端点
指向
3
#define USB_DIR_OUT 0
#define USB_ENDPOINT_DIR_MASK 0x80
static inline int usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd)
{
return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
}
void usb_enable_endpoint(struct usb_device *dev, struct usb_host_endpoint *ep,...)
{
int is_out = usb_endpoint_dir_out(&ep->desc);
......
if (is_out || is_control)
dev->ep_out[epnum] = ep;
if (!is_out || is_control)
dev->ep_in[epnum] = ep;
}
ep_in、ep_out 的来源:
4
成员变量及意义解说:
struct usb_device_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 bcdUSB;
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;
__u8 bMaxPacketSize0;
__le16 idVendor;
__le16 idProduct;
__u8 bNumConfigurations;
......
}
usb_device_descriptor{}
.bLength
.bDescriptorType
.bDeviceClass
.bDeviceSubClass
.bDeviceProtocol
.bMaxPacketSize0
.idVendor
.idProduct
......
设备描述符
usb_config_descriptor{}
配置描述符
.bLength
.bDescriptorType
.bNumInterfaces
.bConfigurationValue
.iConfiguration
.bmAttributes
.bMaxPower
接口描述符
usb_interface_descriptor{}
.bLength
.bDescriptorType
.bInterfaceNumber
.bAlternateSetting
.bNumEndpoints
.bInterfaceClass
.bInterfaceSubClass
.bInterfaceProtocol
.iInterface
端点描述符
usb_endpoint_descriptor{}
.bLength
.bDescriptorType
.bEndpointAddress
.bmAttributes
.wMaxPacketSize
.bInterval
.bRefresh
.bSynchAddress
字符串描述符
usb_string_descriptor{}
.bLength
.bDescriptorType
.wData[1]
5
集线器类例子:
bLength:描述符的长度 #define USB_DT_DEVICE_SIZE 18;
bDescriptorType:值为 USB_DT_DEVICE:0x01
bcdUSB:USB spec 的版本号,如果是 2.0 版本,值为 0x0200,如是 1.1 版本,则值
为 0x0110。
bDeviceClass
bDeviceSubClass
bDeviceProtocol
idVendor
idProduct
bMaxPacketSize0:端点 0 一次可以处理的最大字节数。
Q:为什么要放在设备描述符里呢?
A:由于它自己没有一个描述符,而每个设备又都有这么一个端点
所以这个信息被保存在了设备描述符里,其中,这个值只能是
8,16,32 或 64 这四者之一,高速模式值只能为 64, 低速模式
只能为 8,对于中速,可以为 8,16,32,64,单位字节。
bNumConfigurations:设备当前速度模式下支持的配置数量
分别指每个设备属于一个 Class,然后 Class 下面又分了
SubClass,SubClass 下面又按各种设备遵循的不同的通
信协议继续细分
设备的厂商和 ID 号,在 USB 设备与驱动匹配时会用
到此成员参数
包括两份:一份来自 USB 接口驱动中的 module.usbmap 文件中,另
一份在 USB 外设中由枚举时获取。
设备类代码及例子请见下表
剩余38页未读,继续阅读
Alex.Ke
- 粉丝: 2920
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1