Linux的USB驱动分析


 USBUniversialSerial Bus通用串行总线)它是一种串行总线。在USB的接口协议中,USB被划分为USB主机和USB设备两部分,主机是USB的核心,他管理着每个USB设备,每一次USB数据通信都是必须由USB主机发起。本文也是针对USB主机部分展开介绍。

一、Linux下的USB分层架构


Ø USB设备指具体的物理设备,如U盘、鼠标、键盘等。它通过物理USB线或集线器连接到USB主控制器。

Ø USB主机控制器(HC)负责USB总线的状态管理、帧产生、链表管理。

Ø USB主机控制器驱动(HCD)负责管理主控制器、为各种类型的传输分配带宽、创建和维护各种数据链表并负责根集线器的相关管理,为USB核心层提供相应的接口函数,提供根HUB配置、控制功能,完成4种类型的数据传输。

Ø USB核心负责实现一些核心的功能,为USB设备驱动程序提供服务,提供一个用于访问和控制USB硬件的统一接口(urb),而不用去考虑系统当前存在哪种USB主机控制器。

Ø USB设备驱动程序通过向USB核心提交urb请求来完成数据传输。其中USBcoreHCD已经由linux内核提供,而作为USB驱动开发者只需要关注如何提交urb请求即可实现USB通信(usb_submit_urb),这也是为什么一些有关USB驱动开发的书籍资料会花费大量篇幅来介绍urb的原因。

Ø URBUSBrequest block)(USB请求块)被用来以一种异步方式往/从特定的USB设备上的特定USB端点发送/接收数据。一个典型urb生命周期如下所示:

1)        USB设备驱动程序建立;

2)        分配给一个特定USB设备的特定端点;

3)        USB设备驱动程序递交到USB核心;

4)        USB核心递交到特定设备的特定USB主控制器驱动程序;

5)        USB主控制器驱动程序处理,它同设备进行USB传送;

6)        urb结束之后,USB主控制器驱动程序通知USB设备驱动程序;

二、USB设备

 USB设备组织结构中,从上到下分为设备(device)、配置(config)、接口(interface)和端点(endpoint)四个层次。对于这四个层次的简单描述如下:

² 设备通常具有一个或多个的配置

² 配置经常具有一个或多个的接口

² 接口没有或具有一个以上的端点

Linux的USB驱动分析


 其中每个USB设备都对应一个PIDVIDUSB总线就是通过VIPPID来匹配相应的USB设备驱动程序。LinuxUSB设备驱动程序绑定在接口上,每个USB接口在主机看来都是一个独立的功能设备。端点可以看作是单向的管道,USB最终通过端点来收发数据,端点有4种类型:控制、中断、批量、等时。

三、USB主机控制器及驱动

 HCUSB主机系统的硬件核心,提供USB的物理层功能,HC向上提供了一个接口协议HCIUSB主机控制器驱动程序是此接口的具体实现者。HCD负责将USB事务发送到USB主机控制器芯片,并最终将串行数据发送到电缆上,USB主机控制器完成的所有USB数据传输,都是围绕着HCD所建立的ED链表和TD链表进行。当USB上层驱动发送一个urb请求时会调用ep_add_ed等函数对ED链表和TD链表进行插入、删除等操作。

Linux的USB驱动分析

Linux的USB驱动分析

四、LinuxUSB核心

 USB是一个非常复杂的东西,官方的USB说明文档可达几千页,如果需要看完这些文档并且实现这些功能是一件非常痛苦的事情,幸运的是LINUX内核提供了一个称之为USBcore的子系统来处理大部分的复杂性。USBcore为我们提供了如:USB设备热插拔、USB枚举、集线器管理、设备与驱动的管理、电源管理、urb请求处理、、、等等功能,USBcore使我们编写USB驱动程序变得简单。

五、Linux下的USB驱动模型

 Linux下有两种USB驱动:USB设备驱动(USB通用驱动)和USB接口驱动。

Ø USB设备驱动(USB通用驱动)

USB设备驱动是针对整个USB设备的,它由Linux内核启动时调用usb_init而注册,所以USB设备驱动是Linux内核自身提供的,不需要我们编写。它的一个用处是当主机有USB设备插入时使用该驱动,从而在“/sys”子系统下生产USB设备目录,在“/dev”目录下生产USB设备文件。我们可以借助“usbfs文件系统”和“usblib.so”库中的接口来操作“/dev”目录下的USB设备文件,通过这个机制我们可以在Linux应用层来编写USB驱动。

Ø USB接口驱动

USB接口驱动才是我们平时需要编写的USB驱动,它是针对USB接口的。一个USB设备可能有多个接口,例如USB扬声器可以包含两个接口:一个USB键盘和一个USB音频流,此时我们需要两个不同的驱动程序来处理一个硬件设备。可以这样简单的理解:一个USB硬件设备可以包含多个逻辑设备(接口),USB接口驱动就是为每个逻辑设备编写驱动。

以下我们用“usb_skel”的USB接口驱动实例(Linux/drivers/usb/usb-skeleton.c)来分析LinuxUSB驱动模型:

 




 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值