一、引言
USB(Universal Serial Bus)即通用串行总线,是一种全新的双向同步传输的支持热插拔的数据传输总
线,其目的是为了提供一种兼容不同速度的、可扩充的并且使用方便的外围设备接口,同时也是为了解决
计算机接口的太多的弊端而设计的。一个 USB 系统主要有三部分组成:USB 互连、USB 主机、USB 设备三部
分组成的,其结构如图 1 所示。在编写 USB 设备驱动程序设计时,可以分为三部分编写:主机端设备驱动
程序、主机控制器驱动程序设计和设备端驱动程序三部分,在本文中重点介绍主机端驱动程序的设计。
二、USB 设备驱动程序的设计
USB 设备驱动程序的设计包括主机端设备驱动程序设计、主机控制器驱动程序设计和设备端驱动程序
设计三部分组成。主机端设备驱动程序就是通常说的设备驱动程序,它是主机环境中为用户应用程序提供
一个访问 USB 外设的接口。Linux 为这部分驱动程序提供编程接口,驱动程序设计者只要按照需求编写驱
动程序框架,通过调用操作系统提供的 API 接口函数可以完成对 USB 外设的特定访问。
主机控制驱动主要是对 USB 主机控制器的驱动,在大多数 PC 环境下,主机控制器都是由操作系统提供。
嵌入式设备一般都没有 USB 主机控制器,只是工作在 Slave 模式下。如果要使 USB 具有主机功能,那么设
备中需要选用一个带主机控制器的 USB 接口控制芯片, 同时自己还要有实现该主机控制器的驱动程序。目
前 Linux 内核中只提供 USB 主机控制器的开放主机控制器和通用主机控制器接口两种规格,而这两种规格
主要用在 PC 架构中。USB 主机端驱动程序与主机控制器的结构如图 2 所示。其中 USB 核是 Linux 的一个子
模块,集中定义了一组 USB 相关的数据结构、宏以及 API 函数。
USB 设备驱动程序是常说的设备固件程序的一部分,提供设备信息与主机的通信接口。设备端 USB 驱
动程序设计由以下几部分处理程序组成。初始化例程:完成描述符指针、端点、配置改变等操作。数据传
输例程:完成控制传输、批量传输、中断传输及同步传输等传输方式下的数据收发工作。标准设备处理请
求:处理标准设备请求。厂商请求处理:处理生产商指定请求。其他操作:处理主机发出的端口复位、配
置改变等操作。
1.USB 设备驱动程序框架
USB 驱动程序首先要向 Linux 内核注册自己,并告诉系统它所支持的设备类型以及它所支持的操作。
这些信息通过一个 usb_driver 结构来传递。usb_driver 结构如下:
static struct usb_driver skel_driver = {
name: "skeleton";/*驱动程序的名称*/
probe: skel_probe; /*设备列举时被调用*/
disconnect: skel_disconnect; /*设备被卸载时被调用*/
fops: &skel_fops; /*指向一个 file_operation 结构,内核通过它来访问驱动程序的文件操作函数,
与用户程序的 read、write 等操作进行交互*/
minor USB_SKEL_MINOR_BASE; /*指向设备的次设备号,用于系统识别主设备号相同的设备(即一个
驱动程序可以同时支持多个 USB 设备*/