usb驱动开发1之学习准备
此系列是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之学习准备的更多相关文章
- HarmonyOS USB DDK助你轻松实现USB驱动开发
HDF(Hardware Driver Foundation)驱动框架是HarmonyOS硬件生态开放的基础,为开发者提供了驱动加载.驱动服务管理和驱动消息机制等驱动能力,让开发者能精准且高效地开发驱 ...
- 庖丁解牛:USB 驱动开发技术彻底解密
我们知道如果开发工程师不懂RS232 肯定会让人笑话可以想象面向未来USB 接口无处不在因此掌握USB 的原理固件编程及其驱动开发技术势必成为当务之急USB 即插即用的优点和灵活性运用于各种电子产品现 ...
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- usb驱动开发24之接口驱动
从第一节我们已经知道,usb_generic_driver在自己的生命线里,以一己之力将设备的各个接口送给了linux的设备模型,让usb总线的match函数,也就是usb_device_match, ...
- USB驱动开发大全【转】
本文转载自:http://www.360doc.com/content/12/0504/19/8363527_208666082.shtml 编写USB驱动程序步骤:1所有usb驱动都必须创建主要结构 ...
- usb驱动开发15之设备生命线
总算是进入了HCD的片儿区,既然来到一个片区,怎么都要去拜会一下山头几个大哥吧.,先回忆一些我们怎么到这里的?给你列举一个调用函数过程usb_control_msg->usb_internal_ ...
- usb驱动开发14之设备生命线
直接看代码吧. /*-------------------------------------------------------------------*/ /** * usb_submit_urb ...
- usb驱动开发12之设备生命线
函数usb_control_msg完成一些初始化后调用了usb_internal_control_msg之后就free urb.剩下的活,全部留给usb_internal_control_msg去做了 ...
- usb驱动开发10之usb_device_match
在第五节我们说过会专门分析函数usb_device_match,以体现模型的重要性.同时,我们还是要守信用的. 再贴一遍代码,看代码就要不厌其烦. static int usb_device_matc ...
随机推荐
- SharePoint List来做项目管理
其实这是一个常见的问题,已经不仅仅只是一次用SharePoint List来做项目管理了. 核心 1. SharePoint List Lookup自己来实现项目的父子关系 2. 权限控制,直接控制在 ...
- 每日vim插件--vim中的文本对象及相关插件
最近在个人博客上 http://foocoder.com 每天都会介绍一个vim插件,想起来园子也好久没更新了,也来更新一篇. 今天按读者留言的要求,介绍下文本对象.同时还会介绍我在用的几个文本相关 ...
- Linux useful command
查看linux系统里面的各个目录.文件夹的大小和使用情况, 先切换到需要查看的目录,如果需要查看所有linux目录的使用情况就直接切换到系统跟目录,然后执行: du -h --max-depth=1 ...
- IOS 杂笔-3 (property参数)
(1)内存管理相关参数 Retain:对对象release旧值,retain新值(适用于OC对象类型) Assign:直接赋值(默认,适用于非oc对象类型) Copy:release旧值,copy新值 ...
- 《慕客网:IOS动画案例之会跳动的登入界面(上)》学习笔记 -Sketch的使用
选中需要放进文件夹里的文件,然后按command+G,就会自动生成文件夹并把需要放进的文件包含进去了.(组 Group) 选中需要锁住的图层,然后按command+shift+L就可以将图层锁住.(锁 ...
- javascript 全局变量 局部变量 var 与不加var的区别
一.外部的为全局,内部的为局部变量. 二.加var为局部变量(在方法内),不加var为全局变量(当方法内有一次使用后) <script type="text/javascrip ...
- python 连接 db2
export IBM_DB_DIR=/home/db2inst1/sqllib export IBM_DB_LIB=/home/db2inst1/sqllib/lib http://programmi ...
- 《只是为了好玩:Linux之父林纳斯自传》
<只是为了好玩:Linux之父林纳斯自传> 基本信息 作者: (美)Linus Torvalds David Diamond 译者: 陈少芸 出版社:人民邮电出版社 ISBN:978 ...
- java Hello 出现以下结果:Bad command or the file name 可能是什么原因
没有这个命令或文件名 原因可能是没有成功安装jdk或者没有配置好jdk 的环境变量,或者没有编译相应的文件. 2. 出现以下结果:Exception in thread “main” java.lan ...
- 单点登录系统(SSO)之CAS(中央认证服务)
SSO(Single Sign On)单点登录系统,是在多个系统中值要求只要登录一次,就可以用已登录的身份访问多个系统,去掉了每次访问不同的系统都要重新登录的弊端. CAS(中央/集中认证服务):Th ...