1引言通用串行总线(UniversalSerialBus,USB)是一个连接外部设备的串行总线标准[1],其最大的特点是支持热插拔(HotPlug)和即插即用(Plug&Play)。随着现在嵌入式微处理器的工艺和接口技术发展,价格低、功能强大、结构小巧的CPU和外设为嵌入式设备提供了稳定可靠的硬件架构,从而快速地促
进了嵌入式系统的发展,同时,USB快速发展已经取代了串并口等传统的外部接口成为外部设备与PC之间数据传输的主要通道。2USB基础USB是一种电缆总线,支持在主机和各种即插即用的外设之间进行数据传输[2]。由主机预订的标准协议使各种设备分享USB带宽,当其他设备和主机在运行时,总线允许添加、设置、使用及拆除外设。一个USB系统包含三种硬件设备:USB主机(USBHOST)、USB设备(USBDEVICE)、USB集线器(USBHUB)。在USB系统中,USB总线通信基于轮询机制(PolledBus),主机在整个系统中处于主导地位,任何一次数据通信都是由主机发起的。USB具有四种传输方式:控制传输、批量传输、中断传输、同步传输,其数据通信是双向的,数据从主机传向USB设备称为下行通信,数据从USB设备传向主机称为上行通信,控制权是在主机方,不支持设备间的直接通信。3USB驱动程序结构在Linux系统中,USB整个驱动由USB主机控制器驱动部分和USB设备驱动部分组成。USB主机控制器驱动部分,主要是用来驱动芯片上的主机控制器硬件。USB设备驱动部分是指具体的设备,例如USB鼠标、USB摄像头等设备驱动[3],如图1是USB驱动的总体架构。USB主机控制器驱动程序负责与USB接口之间的通信和USB的数据传输。USB核心负责USB总线管理、USB的hub驱动程序、USB设备驱动程序接口以及应用程序访问USB系统的文件接口。USB设备类驱动程序是与应用程序交互的对应模块,它主要实现特定USB设备的访问,为应用程序提供访问接口。USB设备使用USB核心提供的函数与设备通信,所以它应是与平台无关的。4USB设备驱动程序实现的关键内容USB驱动程序最基本是要完成四部分内容:驱动程序所支持的设备列表、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)[4]。4.1驱动程序支持的设备列表结构体structusb_device_id提供了一系列不同类型的该驱动程序支持的USB设备,对于一个id只控制一个特定的USB设备的驱动程序来说,structusb_device_id表被定义为:#defineUSB_SKEL_VENDOR_ID0xfff0#defineUSB_SKEL_PRODUCT_ID0xfff0Staticstructusb_device_idskel_table[]={{USB_DEVICE(USB_SKEL_VENDOR_ID,USB_SKEL_PRODUCT_ID)},shou{}};MODULE_DEVICE_TABLE(usb,skel_table);MODULE_DEVICE_TABLE的第一个参数是设备类型,如果是USB设备,那就是usb。第二个参数是设备表的名称,这个设备表达最后一个参数是空的,用于标识结束。代码定义了USB_SKEL_VEN-DOR_ID是0xfff0,USB_SKEL_PRODUCT_ID是0xfff0,图1USB驱动总体架构
也就是说,当有一个设备接到集线器上时,usb子系统会检查到这个设备的vendorID和productID。4.2注册USB驱动程序所有的USB设备驱动程序在注册和注销时都