嵌入式嵌入式Linux下下USB驱动程序的设计驱动程序的设计
在嵌入式系统的开发中,编写设备驱动程序是必须要做的工作。本文给出了USB驱动程序的编写的架构,包括
发现设备、读取设备信息、编写设备操作函数和注册、注销设备等操作,并给出了键盘飞梭驱动程序完整实
例。
一、引言
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设备*/
id_table: skel_table; /*保存设备的厂商ID和产品ID,作为该设备的唯一标识,驱动程序向系统注册后,当下次插入时,系统
根据这个标识查找正确的驱动程序,实现设备的即插即用*/
};
static struct file_operation skel_fops={
{
owner:THIS_MODULE,
read:skel_read,
write:skel_write,
ioctl:skel_ioctl,
open:skel_open,
release:skel_release,