此系列是http://blog.csdn.net/fudan_abc/博文的整理,同时加入了自己的理解。很敬佩fudan_abc的文章,仔细学习和分析受益很多。注:fundan_abc所分析linux内核代码所用的版本是2.6.22.6。

Q:学习linux下的usb通信要怎样进行?

熟悉linux驱动开发,同时需要了解usb协议规范,对照linux下的usb驱动代码慢慢分析和学习

Q:为什么要开发usb?

在usb出现以前,设备接口多样化(有串口、并口等),而usb可以实现这些接口的统一和标准化,USB是为了解决速度、扩展能力、易用性应景而生的

Q:usb规范的发展经历了哪些?

Usb的发展经历了1.0、1.1、2.0(在2009年之前)三个阶段。控制器OHCI和UHCI虽然支持的都是1.1的控制器,但是支持的硬件范围不一样。每个USB2.0 控制器带有3个芯片,根据设备的识别方式将信号发送到正确的控制芯片。我们可以将1.1设备连接到2.0的控制器上使用,不过它只能达到1.1的速度。同时也可以将2.0的设备连接到1.1的控制器上,不过不能指望它能以2.0的速度运行。ehci-hcd模块支持的是USB2.0控制器的高速模式.(参考Linux对USB1.1和2.0都是支持的,通过看drivers/usb/host目录下的Kconfig文件,我们可以知道内核里支持的控制器。)

Q:usb总线拓扑什么结构?

树形结构

Q:usb数据怎样传输?

USB大树要想茁长成长也离不开USB协议。USB总线是一个单主方式的实现,是一种轮询方式的总线。协议规定所有的数据传输都必须由主机发起,host controller初始化所有的数据传输,各种设备紧紧围绕在主机周围。

USB通信最基本的形式是通过USB设备里一个叫endpoint的端点(可以理解为硬件寄存器或者buff),而主机和endpoint之间的数据传输是通过pipe,pipe通信有两种,一种是stream,另一种是message,协议中规定:message管道要求从它那儿过的数据必须具有一定的格式,message管道必须对应两个相同号码的端点,一个用来in,一个用来out,咱们的缺省管道就是message管道,当然,与缺省管道对应的端点0就必须是两个具有同样端点号0的端点。

Q:usb数据传输有哪些类型?

USB endpoint有四种类型,分别对应了四种不同的数据传输方式。它们是控制传输(Control Transfers),中断传输(Interrupt Data Transfers),批量传输(Bulk Data Transfers),等时传输(Isochronous Data Transfers)。从usb设备端来看,也可以把端点分为四种类型为控制端点、中断端点、批量端点、等时端点。

控制传输用来控制对USB设备不同部分的访问,通常用于配置设备,获取设备信息,发送命令到设备,或者获取设备的状态报告。总之就是用来传送控制信息的,每个USB设备都会有一个endpoint 0的控制端点,内核里的USB core使用它在设备插入时进行设备的配置,它会一种等待着USB core发送控制命令。

中断传输用来以一个固定的速率传送少量的数据,USB键盘和USB鼠标使用的就是这种方式,USB的触摸屏也是,传输的数据包含了坐标信息。

批量传输用来传输大量的数据,确保没有数据丢失,并不保证在特定的时间内完成。U盘使用的就是批量传输,咱们用它备份数据时需要确保数据不能丢,而且也不能指望它能在一个固定的比较快的时间内拷贝完。

等时传输同样用来传输大量的数据,但并不保证数据是否到达,以稳定的速率发送和接收实时的信息,对传送延迟非常敏感。显然是用于音频和视频一类的设备,这类设备期望能够有个比较稳定的数据流,比如你在网上QQ视频聊天,肯定希望每分钟传输的图像/声音速率是比较稳定的,不能说这一分钟对方看到你在向她向你深情表白,可是下一分钟却看见画面停滞在那里,只能看到你那傻样一动不动,你说这不浪费感情嘛。

Q:usb系统是怎样的一个层次?


一个完整usb系统应该实现上图各个部分。图里主要显示了四个层次,USB物理设备(USB Physical Device)、客户软件(Client SW)、USB系统软件(USB System SW)以及USB Host Controller。Host Controller看似在最低层,却掌控着整个USB的通信,你的USB设备要想发挥作用,首先得获得它的批准;系统软件,只表示了系统里支持USB的部分,也就是系统相关设备无关的部分,相对于咱们的linux来说,就是usb core,并不包括所谓的各种设备驱动;客户软件则指设备相关,也就是对应于特定设备的部分,你的USB键盘驱动、触摸屏驱动什么的都在这儿(专业来看,不能将客户软件简单理解为上层应用,这里和我们平时使用的客户端应用软件不同)。

有人会问?为什么要分为这样的三层?真的有三层吗?

其实,从linux内核代码看,Host部分确实机分这三层,至于设备分这三个层次完全是为了配合host(前面说过USB总线是一个单主方式的实现,所以设备层次不得不配合host)。因此,站在不同的高度看到不同的风景,Host Controller看到的是一个个hub还有hub上的USB device,而在系统软件的眼里,看到的是逻辑设备(站在不同的高度理解),客户软件看到的是设备提供的功能。

Q:主机和设备连接是什么样子?

在USB的世界里,不仅仅有compound device,还有composite device,compound device是那些将hub和连在hub上的设备封装在一起所组成的设备,而composite device是包含彼此独立的多个接口的设备。从主机的角度看,一个compound device和单独的一个hub然后连接了多个USB设备是一样的,它里面包含的hub和各个设备都会有自己独立的地址,而一个composite device里不管具有多少接口,它都只有一个地址。上述是站在host controller的层次。

而对于系统软件来说,没有这么复杂,所有的hub和设备都是一个个的逻辑设备。站的越高,看的越远,往往如此简单。

一个USB逻辑设备就是一系列端点(endpoint)的集合,它与主机之间的通信发生在主机上的一个缓冲区和设备上的一个端点之间,通过管道来传输数据。意思就是管道的一端是主机上的一个缓冲区,一端是设备上的端点。

最后,从协议规范中贴上一个更加详细的图

usb驱动开发1之学习准备的更多相关文章

  1. HarmonyOS USB DDK助你轻松实现USB驱动开发

    HDF(Hardware Driver Foundation)驱动框架是HarmonyOS硬件生态开放的基础,为开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动能力,让开发者能精准且高效地开发驱 ...

  2. 庖丁解牛:USB 驱动开发技术彻底解密

    我们知道如果开发工程师不懂RS232 肯定会让人笑话可以想象面向未来USB 接口无处不在因此掌握USB 的原理固件编程及其驱动开发技术势必成为当务之急USB 即插即用的优点和灵活性运用于各种电子产品现 ...

  3. 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】

    转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...

  4. usb驱动开发24之接口驱动

    从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...

  5. USB驱动开发大全【转】

    本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...

  6. usb驱动开发15之设备生命线

    总算是进入了HCD的片儿区,既然来到一个片区,怎么都要去拜会一下山头几个大哥吧.,先回忆一些我们怎么到这里的?给你列举一个调用函数过程usb_control_msg->usb_internal_ ...

  7. usb驱动开发14之设备生命线

    直接看代码吧. /*-------------------------------------------------------------------*/ /** * usb_submit_urb ...

  8. usb驱动开发12之设备生命线

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

  9. usb驱动开发10之usb_device_match

    在第五节我们说过会专门分析函数usb_device_match,以体现模型的重要性.同时,我们还是要守信用的. 再贴一遍代码,看代码就要不厌其烦. static int usb_device_matc ...

随机推荐

  1. Microsoft Dynamics CRM 2013 --选项集的多选

    由于从Microsoft Dynamics CRM 2011到Microsoft Dynamics CRM 2013,界面的风格发生了很大的变化 故原先在2011上开发的选项集多选在2013上面已经不 ...

  2. [转] X-RIME: 基于Hadoop的开源大规模社交网络分析工具

    转自http://www.dataguru.cn/forum.php?mod=viewthread&tid=286174 随着互联网的快速发展,涌现出了一大批以Facebook,Twitter ...

  3. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q97-Q99)

    04 }Which code segment should you add at line 03?A. currentItem["ClassificationMetadata"] ...

  4. 转 Android学习 之 ColorStateList按钮文字变色

    Windows平台VC,对于不同的按钮状态,采用不同的颜色显示文字,实现起来比较复杂,一般都得自绘按钮.但是Android里面实现起来非常方便. 我们首先添加一个ColorStateList资源XML ...

  5. linux下使用正确的用户名密码,本地无法连接mysql

    问题现象: Linux系统为CentOS 7.0 64位,通过IP远程mysql时,可以正常访问,确定账号密码没有问题.但是本地连接mysql时,提示ERROR 1045 (28000): Acces ...

  6. MFC 网络编程 -- 总结

    原文链接:http://www.cnblogs.com/lidabo/archive/2012/07/19/2598734.html 1.基于 TCP 的 socket 编程 /* 服务器端程序流程: ...

  7. Hadoop_YARN框架

    Hadoop学习笔记总结 01. YARN框架 1. 新一代的框架介绍 YARN的职能就是将资源调度和任务调度分开.资源管理器ResourceManager全局管理所有应用程序计算资源的分配,每一个j ...

  8. Elastic search入门

    首先是下载elasticsearch https://www.elastic.co/downloads,解压: 然后下载了中文分析器ik,github上搜索elasticsearch-ik就能找到,h ...

  9. 边工作边刷题:70天一遍leetcode: day 75

    Group Shifted Strings 要点:开始就想到了string之间前后字符diff要相同. 思维混乱的地方:和某个string的diff之间是没有关系的.所以和单个string是否在那个点 ...

  10. POJ 2449 Remmarguts' Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...