PDF全文下载地址:http://download.csdn.net/source/2320280

驱网介绍:http://bbs3.driverdevelop.com/read.php?tid-120461.html

二.            USB 设备硬件结构

1.        主从结构

首先从硬件角度介绍USB,本文档的任务在于内核开发,硬件知识只能点到为止。 USB的全称是Universal Serial BUS(通用串行总线)。硬件上,他有两个显著的特点:串行数据传输、支持热拔插。从1996年1月第一个版本发布到今天,USB已经经历了四个版本:1.0、1.1、2.0和3.0。其应用遍及各个领域,方方面面。

USB的另外一个特点是他采用主从结构。两个可以互联的设备,一定有主从之分。这导致了两台主机(主设备)或者两台MP3(从设备)之间,没有办法互联。只能在设备(MP3)和主机之间建立主从互联关系。当然,后来出现了OTG,可以让设备更换角色。但并未能改变主从结构的本质。

能成为USB主机,就一定要具备两种设备:USB主控制器、USB根集线器。主控制器用来处理根集线器上的数据,交给系统处理;根集线器用来连接多个外部设备。读者请注意不能把这里的根集线器和普通USB集线器全然划等号,应当把USB集线器也理解为USB外部设备的一种,不是主机的组成部分。

图1 主机和设备

从上图我们了解到,设备->集线器->控制器->系统,就像碗中杯,杯中勺一样,层层套叠。我们在使用的电脑,每台电脑都有若干个控制器,控制器上有一个或多个根集线器,集线器上又对外暴露出一个或多个USB A型接口让外部设备连接。将设备管理器的视图模式选为“按连接排序设备”后,可看到下图所示的层次结构。

图2 控制器、集线器和设备

最上层是USB EHCI接口的控制器,中间层是控制器上唯一的根集线器,最下层是连接在根集线器上的设备。

每个USB控制器,作为一个USB族群之灵魂,其驱动程序负责为子设备分配总线地址。总线地址为7位宽,由于控制器自己占一个地址,故而最多可提供(27-1 = 127)个子设备地址,也就是说,每个控制器上最多能连接127个子设备。并且,这个数目包含了根集线器。

电器特性方面,标准USB接口有4个金属针脚,对应着USB线中,就是4根金属线:两根电源线,两根数据线。两根电源线,一个接5V电源,一个接地。两根数据线,实现了数据的差分传输,提高了稳定性,等于是一根线,也就是“串行”之由来了。

说到电源线,就说说设备供电。USB设备可以自己供电,也可以从总线获取电源。总线获取的电源,就是通过5V电源线传过来的。像U盘、鼠键这类小型设备,5V电源或者100mA电流足以满足其设备需求,故而多从总线获取电源;移动硬盘、打印机、专业USB声卡这种较大设备,往往需要外置电源,也就是自己供电。巧得很,我发现XP系统中的根集线器驱动程序,有自定义的电源属性页,反映了集线器设备的供电情况,截图如下:

图3根集线器的电源状态

由上图可以看出,此根集线器是自供电的,可用电量高达500mA/每个端口,两个端口就到达了1A电量,这是总线供电无法达到的。

2. 硬件拓扑

再说USB设备的拓扑结构。分为三层:硬件接口、统筹模块、多个功能模块。借助于这种结构,实现了多种功能集纳于同一个设备的优势。这样的话,鼠标、键盘、游戏柄三者合一,就不是什么难事。

图4  USB设备拓扑结构

有时候,这种结构令我联想到一把折扇。折起来的时候,只能看到一个骨架;打开的时候,却变成了十数背大。我是把这些骨架,当成了USb设备中的功能模块了。

如何理解上面的拓扑图呢?从硬件自身来看,设备是唯一的。故而对外的接口也是唯一的。这就对应着图中的“总线接口”模块。然则,设备存在的目的,当然是为了完成一定的工作,他能实现多少功能,即表示内部有多少独立的“功能模块”。现在好了,多个功能,同处一个设备,岂不打架了?需要有统筹单位来协调资源,这就得请出“逻辑设备”来。

很难在设备中用手指出来,那个部位对应着“逻辑设备”,因为拓扑结构中的模块都是抽象的。固件中的某几个函数,某几行代码,可能就构成了一个逻辑模块。

我们不用去考虑USB固件代码,如何运作甚至如何书写,但读者要有个认知底线:USB设备中是有程序在运行的。有人奇怪设备是怎么和主机通信、连接的,想破脑袋,却想不到设备中也有个CPU,也有运行着的代码。

CY001开发套件中包含了固件代码,C51编程。C51和C语言很类似,入手会比较顺。固件开发是一件很艰难的工作,未必比驱动开容易。但二者没有可比性,简直就是两个世界的。

<font style="line-height: 172%; font-size: 10.5pt;" face=""">3. USB中断

USB的“从主”关系还有另外一层含义:主机向设备发布命令,设备相应命令;主机如果没有命令发送,设备不能主动联系主机。“主人”不言语,“仆人”难吱声。即使是在进行输入传输的情况下——也就是说设备向主机发送数据——数据过程也是在主机的指导下完成的。

这很容易就牵扯到另一个话题:USB中断。中断从来都是主动的,现在USB设备处于“仆人”地位,哪里能够主动呢?所以众所周知,USB中断是 “伪中断”。

真正的中断,不管硬中断也好,软中断也好,一定是主动发生的。即中断源出现了,相应的中断事件即随之产生。中断是一件“意外”,并且“主动”发生。

USB的伪中断是另外一回事:USB设备总是把数据保存在设备内存中,等待主机来索取;如果主机果然来索取,就立刻把数据交给它;否则要么仍旧一直保存着,要么当新的中断数据到来时被覆盖。

从这个意义上来说,USB设备的中断端口和批量端口本质上就非常像了,将批量端口加上主机轮询,差不多也就变成一个中断端口了。后文《内核开发》部分会详细讲述批量、中断端口的读写。

《WDF USB驱动开发指南》-- USB 设备硬件结构相关推荐

  1. 《WDF USB驱动开发指南》-- WDF简介

    PDF全文下载地址:http://download.csdn.net/source/2320280 驱动网介绍:http://bbs3.driverdevelop.com/read.php?tid-1 ...

  2. 【正点原子Linux连载】第六十七章 Linux USB驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  3. usb驱动开发12——设备生命线

    函数usb_control_msg完成一些初始化后调用了usb_internal_control_msg之后就free urb.剩下的活,全部留给usb_internal_control_msg去做了 ...

  4. 【致敬未来的攻城狮计划】第2期定向赠书《RT-Thread设备驱动开发指南》+ 《GD32 MCU原理及固件库开发指南》

    开启攻城狮的成长之旅!这是我参与的由 CSDN博客专家 架构师李肯(超链接:http://yyds.recan-li.cn)和 瑞萨MCU (超链接:瑞萨电子 (Renesas Electronics ...

  5. VxWorks设备驱动开发指南--VxBus And VxBus Device Driver

    8D Spaces Reliability & Stability & Efficiency 目录视图 摘要视图 订阅 VxWorks设备驱动开发指南(二)--VxBus And Vx ...

  6. MF Porting之USB驱动开发

    花费了近三个礼拜的时间,终于完成了TI开发板的USB驱动开发,现在回头想一想,其实也没有什么,具体硬件方面的通信由DM355实现了,软件层面的数据交互由MF Porting实现了,所做的也就是熟悉了解 ...

  7. Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

    http://blog.csdn.net/zqixiao_09/article/details/51057086 设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程 ...

  8. Linux USB 驱动开发实例(七)—— 基于USB 总线的无线网卡浅析

    回顾一下USB的相关知识 USB(Universal Serial Bus)总线又叫通用串行外部总线, 它是20世纪90年代发展起来的.USB接口现在得到了广泛的应用和普及,现在的PC机中都带有大量的 ...

  9. LINUX USB驱动开发(2)-USB驱动体系分析

    一.日常USB现象: 1.将USB设备接入电脑上,右下角弹出"发现android phone" 2.跳出对话框.提示你安装驱动程序 问题1:既然没有安装驱动,为何能知道设备是&qu ...

最新文章

  1. java设计模式---备忘录模式
  2. fullcalendar 显示的时间间隔只有四十五分钟_Linux命令行监控程序,还能实时高亮显示差异,我就选它了...
  3. Mysql升级过程的问题
  4. python函数式编程、高阶函数
  5. 算法—1,简单说说最常见的冒泡排序(Bubble Sort)
  6. JSP的getRequestDispatcher()与sendRedirect()的区别
  7. CF 1642 F. Two Arrays 随机 + sosdp
  8. Spring Boot 搭建应用实现登陆实例,页面使用bootstrap
  9. SqlConnection,SqlCommand,SqldataReader的用法总结
  10. expdp导出 schema_[转载]导入导出:impdpexpdp
  11. [Perl系列—] 2. Perl 中的引用使用方法
  12. (必读)工业机器人基础教程——快速入门学习
  13. 数列和级数(基本概念)
  14. iOS系列开发-版本控制工具Git的使用
  15. 魔戒中超眩的武器装备!
  16. Django自动化测试平台项目案例
  17. CCC之I类设备、II类设备、III类设备的对比
  18. Visual Studio 默认编码为 utf-8
  19. MOOC(幕课)的到来!
  20. 中国软件:10个人 20年坎坷路

热门文章

  1. 输出倒三角—C语言实现
  2. 《数学建模竞赛入门与提高》读书笔记
  3. 解决方案和项目的区别_AI 项目落地应用指南--5.项目售前与解决方案
  4. nginx -s reload命令
  5. 在java中什么意思_在JAVA中,~是什么意思?
  6. Python:第(前)K大(小)数问题
  7. Apache虚拟主机VirtualHost的目录访问权限
  8. cmd运行war_[Java] 指定端口运行 war 包
  9. windows平台的视频播放软件-potplayer
  10. 对deap数据集进行脑电情绪识别并进行频谱分析(频域特征)