去年,老师让我分析基于HD3系统芯片的WindowsCE USB驱动的可行性。USB驱动非常庞大,多个软件层次相互交错,以及各种协议,USB系统对于一般人很难理解,我对其也只是理解一个大概,下面,我对USB驱动架构的认识做一个总结。

USB系统可以分为两个系统:(1)主机系统HOST;(2)设备系统(Device)。

USB主机系统Host
USB主机系统中,USB主机控制器是一块核心的处理芯片,主机控制器通过根集线器(Root Hub)与外部USB从机设备相连。USB主机控制器包含硬件、软件、固件等部分。

USB设备系统Device
USB设备按功能可分为两部分:集线器Hub、功能部件。如下图所示,主机通过根集线器连接到各种外围设备(集线器、功能部件)。

USB驱动架构
下图所示是典型的USB驱动架构。

USB core
USB Core包含Host Core Driver、Hub Driver,简称USBD module,独立于硬件的协议栈,支持USB Host协议、USB Hub功能。

HCD(Host Controller Driver)
硬件之上运行的是HCD,USB HCD包含三种USB接口规范:

(1)UHCI:通用主机控制接口,USB1.0/1.1;

(2)OHCI:开放主机控制接口,USB1.0/1.1;

(3)EHCI:增强主机控制接口,USB2.0;

HCD的内部结构如下图所示:

其中,HCD包含了Platform Device Driver、Host Controller Driver、Root Hub Driver。

USB Core和HCD构成了USB驱动的核心部分,在上层就是用各种USB设备的厂商提供相应的驱动程序。

以如下一个带OTG技术的WindowsCE USB驱动架构为例,可以将USB驱动从上到下分为3层:

(1)应用层:Client(USB Device Driver);

(2)总线层:USBD;

(3)硬件层:USB HCD;

USB Host的应用协议支持4种应用:RNDIS、Print、Mass Storage、HID;其中HID(Human Interface Device)是一种通信协议。

USB OTG控制器的上层是USB OTG控制器的驱动,USB OTG Core Driver是协议层(总线层),如果做Host,它会使用USB Host协议栈;如果做Device,它会使用USB Device协议栈。

USB设备工作流程
当设备功能驱动希望向某个管道发出读写请求时,首先构造请求(USB Request Block,URB)发给USB总线驱动(USBD中的Hub Driver),USB总线驱动解释该请求,并转换请求发往USB主机控制器端口驱动(usbport.sys,应该属于HCD),进而通过小端口驱动(usbohci.sys等,应该属于USB HCD)与设备进行通信。具体如下图所示:

参考文献
http://blog.csdn.net/arnoldlu/article/details/25386603

http://blog.csdn.net/myarrow/article/details/8500155

http://blog.csdn.net/nanjianhui/article/details/4438599

http://jazka.blog.51cto.com/809003/737486

http://blog.csdn.net/henry000/article/details/7183423

http://bbs.csdn.net/topics/310195515

http://blog.csdn.net/LoongEmbedded/article/details/7519808
---------------------
作者:BaoChuquan
来源:CSDN
原文:https://blog.csdn.net/u014276460/article/details/47292427
版权声明:本文为博主原创文章,转载请附上博文链接!

最新文章

  1. 【流量劫持】SSLStrip 的未来 —— HTTPS 前端劫持
  2. jQuery offset,position,offsetParent,scrollLeft,scrollTop html控件定位 css position
  3. 测试框架Mockito使用笔记
  4. ML2 – Address Population
  5. SQL Server 事务处理 回滚事务
  6. Missing access checks in put_user/get_user kernel API (CVE-2013-6282)
  7. Unable to open c
  8. 【HDOJ】1197 Specialized Four-Digit Numbers
  9. BufferedInputStream,FileInputStream,FileChannel实现文件拷贝
  10. python中的model模板中的数据类型
  11. 区间DP(初步了解)
  12. 【SVN】is out of date
  13. MySQL - 主从复制及读写分离原理
  14. 有关nginx的配置文件 之server
  15. Spring入门看这一篇就够了
  16. Search in rotated array two
  17. .net DataTable序列化成Json
  18. SQLSetStmtAttr
  19. C# 相对路径指定详解
  20. [转]TimeQuest之delay_fall clock_fall傻傻分不清楚

热门文章

  1. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习3
  2. HTML5_图片合成_刮刮卡
  3. 2018-2019-1 20189210 《Linux内核原理与分析》第三周作业
  4. git开发过程中的使用流程
  5. 小甲鱼零基础python课后题 P22 021函数:lambda表达式
  6. vue中router.go、router.push和router.replace的区别
  7. Python中的引用传参
  8. Python---函数的相关知识点总结一:
  9. 使用openSSL开源工具进行SSL/TLS 安全测试
  10. 解决loadrunner录制时 Request Connection: Remote Server @ 0.0.0.0:80 (Service=?) NOT PROXIED! (REASON: Unable to connect to remote server: rc = -1 , le = 0)问题