linux的USB驱动分析

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

1、Linux下的USB分层架构

linux的USB驱动分析_第1张图片

  1. USB设备指具体的物理设备,如U盘、鼠标、键盘等。它通过物理USB线或集线器连接到USB主控制器。
  2. USB主机控制器(HC)负责USB总线的状态管理、帧产生、链表管理。
  3. USB主机控制器驱动(HCD)负责管理主控制器、为各种类型的传输分配带宽、创建和维护各种数据链表并负责根集线器的相关管理,为USB核心层提供相应的接口函数,提供根HUB配置、控制功能,完成4种类型的数据传输。
  4. USB核心负责实现一些核心的功能,为USB设备驱动程序提供服务,提供一个用于访问和控制USB硬件的统一接口(urb),而不用去考虑系统当前存在哪种USB主机控制器。
  5. USB设备驱动程序通过向USB核心提交urb请求来完成数据传输。其中USBcore和HCD已经由linux内核提供,而作为USB驱动开发者只需要关注如何提交urb请求即可实现USB通信(usb_submit_urb),这也是为什么一些有关USB驱动开发的书籍资料会花费大量篇幅来介绍urb的原因。

2、urb生命周期

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

1) 由USB设备驱动程序建立;
       struct urb *usb_alloc_urb(int iso_packets, gfp_t mem_flags);

2) 分配给一个特定USB设备的特定端点;
       static inline void usb_fill_XXX_urb(struct urb *urb,

                 struct usb_device *dev,

                 unsigned int pipe,

                 void *transfer_buffer,

                 int buffer_length,

                 usb_complete_t complete_fn,

                 void *context,

                        int interval);

        XXX 为int中断,bulk批量,control控制 等时传输没有初始化函数,只能手动初始化

3) 由USB设备驱动程序递交到USB核心;
       int usb_submit_urb(struct urb *urb, gfp_t mem_flags);
       
4) 由USB核心递交到特定设备的特定USB主控制器驱动程序;

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

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

3、USB设备组织结构

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

  1. 设备通常具有一个或多个的配置
  2. 配置经常具有一个或多个的接口
  3. 接口没有或具有一个以上的端点
    linux的USB驱动分析_第2张图片
            其中每个USB设备都对应一个PID和VID,USB总线就是通过VIP和PID来匹配相应的USB设备驱动程序。Linux的USB设备驱动程序绑定在接口上,每个USB接口在主机看来都是一个独立的功能设备。端点可以看作是单向的管道,USB最终通过端点来收发数据,端点有4种类型:控制、中断、批量、等时。

4、USB主机控制器及驱动

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

5、USB核心(内核基本上已经完成)

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

6、USB驱动(我们关注的部分)

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

1、USB设备驱动(USB通用驱动)

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

2、USB接口驱动

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

你可能感兴趣的:(linux的USB驱动分析)