您好,欢迎访问三七文档
Linux设备驱动之usb设备驱动详解分类:Linux驱动程序2011-04-1715:506639人阅读评论(0)收藏举报linuxinterfacedescriptorstructbufferclass1.Linuxusb设备驱动框架USB是通用串行总线的总称,Linux内核几乎支持所有的usb设备,包括键盘,鼠标,打印机,modem,扫描仪。Linux的usb驱动分为主机驱动与gadget驱动。前者是设备连接到计算机上,通过主机驱动扫描usb设备,控制所连接的设备。而gadget驱动一般用于嵌入式设备,gadget驱动用于控制嵌入式设备。Linux的usb驱动两种类型图如下:左侧是usb的主机驱动,右侧是gadget驱动。下面着重介绍一下usb的主机驱动:(1)usb主机控制器-直接与硬件设备交互。(2)usbcore-向usb设备驱动提供API以及usb主机控制器驱动的程序。使用usbcore所提供的函数,宏来完成数据处理的功能。(3)usb设备驱动,即usb接口驱动,一般所说的usb驱动指的是usb接口驱动2.usb系统的组成部分usb系统一般由三个部分组成,主机,一个或多个usbhub,以及与之些hub连接的usb设备。(1)主机在任何的usb系统中仅有一个主机,主机系统中的usb接口即上图中的主机控制器,主机控制器可由硬件,软件或固件组成。主机主要负责:a.检测usb设备的连接与拆除b.管理主机与usb设备之间的控制流c.管理主机与usb设备之间的数据流d.收集状态和活动的统计e.为连接的usb设备提供电源(2)usb设备所有的usb设备都是通过地址来存取的,这个地址在连接或枚举时分配。usb设备对usb系统来说是端点的集合,一组端点实现一个接口。设备端点是usb设备中唯一可寻址的部分。它是主机与设备之间通信流的结束点。一系列的相互独立的端点构成了usb逻辑设备。每个端点支持流进设备或者是流出设备。主机与设备端点上的usb数据传输是通过管道的方式。(3)hub所有的usbdevice都连接在hub端口上。3.usb传输模式(1)控制传输模式(Control)控制传输模式支持双向传输,用来处理从usb主机端口到usb设备端口的数据传输,用于控制指令,设备状态查询以及确认命令。(2)等时传输方式(lsochronous)等时传输是一种周期性的连续性的意向传输模式,通常用于对时间有着密切关系的信息的传输,对准确性要求不高,但对时间要求极为敏感的设备,如视频,音频的传输。(3)中断传输模式(Interrupt)中断传输模式用于非周期性的,自然发生的,数据量小的传输,数据传输的方向是从设备到主机。如usb键盘和鼠标(4)批量传输模式(bulk)批量传输模式是一种单向的,用于大量数据传输的模式,该方式用来传输正确无误的数据。通常打印机,扫描仪,数码相机以这种方式与主机连接4.usb设备组成(1)一个usb设备由可以有一个或多个配置(2)一个配置通常可以有一个或多个接口(3)一个接口通常可以有一个或多个端点通常所尽的usb设备驱动是指接口驱动,即一个接口对应一个驱动。所以Linuxusb设备有四大描述符,分别为设备描述符,配置描述符,接口描述符,端点描述符。下面看一个这几个描述符的相关数据结构:structusb_device_descriptor{_u8bLength;//此描述符的字节数_u8bDescriptorType;//描述符的种类为设备_u16bcdUSB;//此设备与描述符兼容的usb设备说明版本号(BCD码)_u8bDeviceClass;//设备类码_u8bDeviceSubClass;//设备子类码_u8bDeviceProtocol;//协议码_u8bMaxPacketSize0;//端点0的最大包大小_u16idVendor;//厂商标志_u16idProduct;//产品标志_u16bcdDevice;//设备发行号_u8iManufacturer;//描述厂商的字串索引_u8iProduct;//描述产品信息的字串索引_u8iSerialNumber;//描述设备序列号信息的字串索引_u8bNumConfigurations;//此设备支持的配置数}_attribute_((packed));设备类码的典型值如下:#defineUSB_CLASS_PER_INTERFACE0#defineUSB_CLAS_AUDIO1//声音设备#defineUSB_CLASS_COMM2//调制解调器,网卡,ISDN连接#defineUSB_CLASS_HID3//HID设备,如鼠标,键盘#defineUSB_CLASS_PHYSICAL5//物理设备#defineUSB_CLASS_STILL_IMAGE6//静止图像捕捉设备#defineUSB_CLASS_PRINTER7//打印机#defineUSB_CLASS_MASS_STORAGE//8批量存储设备#defineUSB_CLASS_HUB9//USBHUBS#defineUSB_CLASS_CSCID0x0B//智能卡#defineUSB_CLASS_VIDEO0X0E//视频设备,如网络摄像头#defineUSB_CLASS_VENDOR_SPEC0xFF//厂商自定义的设备structusb_config_descriptor{_u8bLength;//此描述符的字节数_u8bDescriptorType;//配置描述符类型_u16wTotalLength;//此配置信息的总长(包括配置,接口,端点和设备类型及厂商定义的描述符)_u8bNumInterfaces;//此配置所支持的接口数_u8bConfigurationValue;//在setConfiguration()请求中用作参数来选定此配置_u8iConfiguration;//描述此配置的字串描述符索引_u8bmAttributes;//电源配置特性_u8bMaxpowe;r//此配置下的总线电源耗电量}_attribute_((packed));配置描述符给出了usb设备配置信息,以及此配置下的接口数。每个接口可能的独立操作。structusb_interface_descriptor{_u8bLength;//此描述符的字节数_u8bDescriptorType;//接口描述符类_u8bInterfacNumber;//接口号,当前配置所支持的接口数组索引,从0开始_u8bNumEndpoints;//此接口用的端点数量,如果是0,说明此接口只有缺省控制通道_u8bAlernateSetting;//可选设备的索引值_u8bInterfaceClass;//类值,0值作为将来保留使用如果是0FFH,此接口由厂商说明_u8bInterfaceSubClass;//子类码_u8bInterfaceProtocol;//协议码_u8iInterface;//描述此接口的字串描述符索引}_attribute_((packed));structusb_endpoint_descriptor{_u8bLength;//此描述符的字节数_u8bDescriptorType;//端点描述符类_u8bEndpointAddress;此描述符所描述的端点的地址_u8bmAtrributes;//所指定的端点的特性,如果是00=控制传送,01=等时传送,10=批传送,11=中断传送_u8wMaxPacketSize;//当前配置下端点能够发送与接收的最大数据包大小_u8bInterval;//轮询数据传送端点的时间间隙_u8bRefresh_u8bSynchAddress}_attribute_((packed));以上给出了usb中的设备描述符,配置描述符,接口描述符和端点描述符。5.usb设备驱动的几个重要的数据结构usb_driver,usb_device,usb_bus./**788*structusb_driver-identifiesUSBinterfacedrivertousbcore789*@name:ThedrivernameshouldbeuniqueamongUSBdrivers,790*andshouldnormallybethesameasthemodulename.791*@probe:Calledtoseeifthedriveriswillingtomanageaparticular792*interfaceonadevice.Ifitis,probereturnszeroanduses793*usb_set_intfdata()toassociatedriver-specificdatawiththe794*interface.Itmayalsouseusb_set_interface()tospecifythe795*appropriatealtsetting.Ifunwillingtomanagetheinterface,796*return-ENODEV,ifgenuineIOerrorsoccured,anappropriate797*negativeerrnovalue.798*@disconnect:Calledwhentheinterfaceisnolongeraccessible,usually799*becauseitsdevicehasbeen(orisbeing)disconnectedorthe800*drivermoduleisbeingunloaded.801*@unlocked_ioctl:Usedfordriversthatwanttotalktouserspacethrough802*theusbfsfilesystem.Thisletsdevicesprovidewaysto803*exposeinformationtouserspaceregardlessofwherethey804*do(ordon't)showupotherwiseinthefilesystem.805*@suspend:Calledwhenthedeviceisgoingtobesuspendedbythesystem.806*@resume:Calledwhenthedeviceisbeingresumedbythesystem.807*@reset_resume:Calledwhenthesuspendeddevicehasbeenresetinstead808*ofbeingresumed.809*@pre_reset:Calledbyusb_reset_device()whenthedevice810*isabouttobereset.811*@post_reset:Calledbyusb_reset_device()afterthedevice812*hasbeenreset813*@id_table:USBdriversuseIDtabletosupporthotplugging.814*ExportthiswithMODULE_DEVICE_TABLE(usb,...).Thismustbeset815*oryourdriver'sprobefunctionwillnevergetcalled.816*@dynids:usedinternallytoholdthelistofdynamicallyaddeddevice817*idsforthisdriver.818*@drvwrap:Driver-modelcorestructurewrapper.819*@no_dynamic_id:ifsetto1,theUSBcorewillnotallowdynamicidstobe820*addedtothisdriverbypreventingthesysfsfilefrombeingcreated.821*@supports_au
本文标题:USB驱动详解
链接地址:https://www.777doc.com/doc-2865353 .html