USB设备驱动开发深度解析
- 格式:pdf
- 大小:615.66 KB
- 文档页数:31
Linux 下wifi 驱动开发(四)——USB接口WiFi驱动浅析前面学习了SDIO接口的WiFi驱动,现在我们来学习一下USB接口的WiFi驱动,二者的区别在于接口不同。
而USB接口的设备驱动,我们前面也有学习,比如USB摄像头驱动、USB鼠标驱动,同样都符合LinuxUSB驱动结构:USB设备驱动(字符设备、块设备、网络设备)|USB 核心|USB主机控制器驱动不同之处只是在于USB摄像头驱动是字符设备,而我们今天要学习的WiFi驱动是网络设备;当然由我们编写的部分还是USB设备驱动部分,下面进入USB接口WiFi驱动的分析,如何分析呢?我们下面从这几个方面入手:从硬件层面上看,WIFI设备与CPU通信是通过USB接口的,与其他WIFI设备之间的通信是通过无线射频(RF)。
从软件层面上看,Linux操作系统要管理WIFI设备,那么就要将WIFI设备挂载到USB总线上,通过USB子系统实现管理。
而同时为了对接网络,又将WIFI设备封装成一个网络设备。
我们以USB接口的WIFI模块进行分析:a -- 从USB总线的角度去看,它是USB设备;b -- 从Linux设备的分类上看,它又是网络设备;c -- 从WIFI本身的角度去看,它又有自己独特的功能及属性,因此它又是一个私有的设备;通过上述的分析,我们只要抓住这三条线索深入去分析它的驱动源码,整个WIFI驱动框架就会浮现在你眼前。
一、框架整理1、USB设备驱动现在我们先从USB设备开始,要写一个USB设备驱动,那么大致步骤如下:a -- 需要针对该设备定义一个USB驱动,对应到代码中即定义一个usb_driver结构体变量代码如下:[cpp]view plain copyb -- 填充该设备的usb_driver结构体成员变量代码如下:[cpp]view plain copyc -- 将该驱动注册到USB子系统代码如下:[cpp]view plain copy以上步骤只是一个大致的USB驱动框架流程,而最大和最复杂的工作是填充usb_driver结构体成员变量。
边干边写之——USB设备开发过程解析(前台VB+驱动VC+固件GCC)[声明:]1、本文为开发工作过程中的心得体会,认识粗浅表述不周之处请见谅;2、本文内容供广大爱好者学习交流之用,如需转载请注明出处并告知本人。
KKND 08年11月21日清晨发表于VBGood论坛Dreamon-II Labs.******************************************************************************[正文]其实弄清楚USB的工作流程后开发USB设备是很简单的事情。
简单来说无非是这样的过程:开发设备硬件-> 编写设备固件程序-> 编写驱动程序-> 开发应用程序其中后3项主要是软件编程工作,也是本文讨论的重点。
应用程序与USB硬件设备通信自底向上需要完成三部分程序的开发:固件程序 <-USB总线驱动程序-> 设备驱动程序 <-系统I/O管理器-> 用户应用程序以下分别将这三部分程序中用于实现通信的核心代码加以介绍。
固件程序:固件程序也就是所谓的“下位机”程序,它运行于设备上,由设备上的单片机执行,用于控制USB接口芯片与主机进行通信。
开发环境:GCC + AVR Studio……/******************************************************************* USB中断处理,该中断由USB接口芯片产生,由下位机CPU处理******************************************************************/void usb_isr(void){……if ( D12_int_flags & D12_INT_ENDP0OUT ) control_out_handler(); // 产生USB控制端点接收中断时调用该函数……}/******************************************************************* 处理USB控制端点接收事件******************************************************************/ void control_out_handler( void ){……control_dispatcher(); // 调用分发处理函数}/******************************************************************* 分发处理,根据URB 的请求类型和请求号选择相应的处理函数******************************************************************/ void control_dispatcher( void ){uchar type, req;type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;req = ControlData.DeviceRequest.bRequest;……if ( type == USB_VENDOR_REQUEST ) // 处理用户自定义请求{// 根据请求号选择请求处理函数表入口if ( req < NUMBER_VENDOR_REQ ) (*VendorDeviceRequest[req])();}……}/******************************************************************* 用于处理用户请求的函数入口表******************************************************************/ const pfnvoid VendorDeviceRequest[] ={fun0,fun1,fun2,……};/******************************************************************* 用户请求处理函数实现******************************************************************/void fun0(void){uint8_t txdata[LEN];……single_transmit(txdata, LEN);}驱动程序:目前Windows系统下的驱动程序通常采用WDM模型(Win32 Driver Model,Win32驱动模型),采用Microsoft提供的DDK开发,借助第三方驱动程序开发工具比如DriverStudio 可以大大简化开发过程。
嵌入式USB设备驱动的研究与设计开发随着科技的飞速发展,嵌入式系统已经成为现代生活中不可或缺的一部分。
而作为嵌入式系统中最常见的外设之一,USB设备的驱动程序对于系统的正常运行起着至关重要的作用。
因此,对嵌入式USB设备驱动的研究与设计开发具有极高的实用价值和深远的意义。
嵌入式USB设备驱动的研究主要涉及到硬件和软件两个方面。
在硬件方面,需要对USB接口的工作原理进行深入研究,了解USB设备的接口规范以及各种USB设备的特性和使用场景。
同时,还需要研究与开发USB设备的驱动电路,确保其能够与嵌入式系统正常通信,并能实现数据的传输和交互。
在软件方面,嵌入式USB设备驱动的设计开发主要包括驱动程序的编写和优化。
首先,需要针对不同的USB设备类型和功能,编写相应的驱动程序。
例如,对于USB存储设备,需要编写文件系统的驱动程序,实现对存储设备的读写操作;对于USB打印机,需要编写打印机控制命令的驱动程序,实现打印功能等。
其次,还需要优化驱动程序的性能,提高系统的响应速度和稳定性。
这需要通过对驱动程序进行调试和测试,发现并修复可能存在的问题,确保驱动程序能够在不同的嵌入式平台上正常运行。
嵌入式USB设备驱动的研究与设计开发还涉及到与操作系统的兼容性和互通性。
不同的嵌入式系统可能采用不同的操作系统,如Linux、Windows等。
因此,在进行驱动程序的设计和开发时,需要考虑到不同操作系统的特点和要求,确保驱动程序能够在不同的操作系统环境下正常运行和兼容。
总之,嵌入式USB设备驱动的研究与设计开发是一个涉及到硬件和软件的综合性工作。
通过对USB接口的研究和了解,编写和优化驱动程序,考虑与操作系统的兼容性和互通性,可以实现嵌入式系统与USB设备之间的良好交互和数据传输,为现代生活中的各种嵌入式系统提供稳定可靠的外设支持。
这将进一步推动嵌入式系统的发展和应用,为人们的生活带来更多便利和创新。
第17章USB设备驱动USB设备驱动和PCI设备驱动是PC中最主要的两种设备驱动程序。
与PCI协议相比,USB协议更复杂,涉及面较多。
本章将介绍USB设备驱动开发。
首先介绍USB协议,使读者对USB协议有个整体认识。
然后介绍USB设备在WDM中的开发框架。
由于操作系统的USB总线驱动程序提供了丰富的功能调用,因此开发USB驱动开发变得相对简单,只需要调用USB总线驱动接口。
17.1 USB总线协议USB总线协议比PCI协议复杂的多,涉及USB物理层协议,又涉及USB传输层协议等。
对于USB驱动程序开发者来说,不需要对USB协议的每个细节都很清楚。
本节概要地介绍USB总线协议,并对驱动开发者需要了解的地方进行详细介绍。
17.1.1 USB设备简介USB即通用串行总线(Universal Serial Bus),是一种支持即插即用的新型串行接口。
也有人称之为“菊链(daisy-chaining)”,是因为在一条“线缆”上有链接127 个设备的能力。
USB要比标准串行口快得多,其数据传输率可达每秒4Mb~12Mb(而老式的串行口最多是每秒115Kb)。
除了具有较高的传输率外,它还能给外围设备提供支持。
需要注意的是,这不是一种新的总线标准,而是计算机系统连接外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。
到现在为止,计算机系统连接外围设备的接口还没有统一的标准,例如,键盘的插口是圆的、连接打印机要用9针或25针的并行接口、鼠标则要用9针或25针的串行接口。
USB能把这些不同的接口统一起来,仅用一个4针插头作为标准插头,如图17-1所示。
通过这个标准插头,采用菊花链形式可以把所有的外设连接起来,并且不会损失带宽。
USB正在取代当前PC上的串口和并口。
第17章 USB 设备驱动431图17-1 USB 的四条传输线以USB 方式连接设备时,所有的外设都在机箱外连接,连接外设不必再打开机箱;允许外设热插拔,而不必关闭主机电源。
linux设备驱动(28)usb驱动开发过程总结设备驱动程序是操作系统内核和机器硬件之间的接⼝,由⼀组函数和⼀些私有数据组成,是应⽤程序和硬件设备之间的桥梁。
在应⽤程序看来,硬件设备只是⼀个设备⽂件,应⽤程序可以像操作普通⽂件⼀样对硬件设备进⾏操作。
设备驱动程序是内核的⼀部分,主要完成以下功能:对设备的初始化和释放;把数据从内核传送到硬件设备和从硬件设备读取数据;读取应⽤程序数据传送给设备⽂件和回送应⽤程序请求的数据;检测和处理硬件设备出现的错误。
1 Linux USB⼦系统分析在Linux系统中,USB主机驱动程序由3部分组成:USB主机控制器驱动(HCD)、USB核⼼驱动(USBD)和不同种类的USB设备类驱动,如下所⽰。
其中HCD和USBD被称为协议软件或者协议栈,这两部分共同处理与协议相关的操作。
USB设备类驱动可以包含多个,不同的功能接⼝对应不同的驱动程序,它们不直接与USB设备硬件打交道,⽽是通过协议软件的抽象处理来完成与设备的不同功能接⼝之间的通信。
在Linux USB⼦系统中,HCD是直接和硬件进⾏交互的软件模块,是USB协议栈的最底层部分,是USB主机控制器硬件和数据传输的⼀种抽象。
HCD向上仅对USB总线驱动程序服务,HCD提供了⼀个软件接⼝,即HCDI,使得各种USB主机控制器的硬件特性都被软件化,并受USB总线驱动程序的调⽤和管理。
HCD向下则直接管理和检测主控制器硬件的各种⾏为。
HCD提供的功能主要有:主机控制器硬件初始化;为USBD层提供相应的接⼝函数;提供根HUB(ROOT HUB)设备配置、控制功能;完成4种类型的数据传输等。
USBD部分是整个USB主机驱动的核⼼,主要实现的功能有:USB总线管理;USB总线设备管理、USB总线带宽管理、USB的4种类型数据传输、USB HUB驱动、为USB设备驱动提供相关接⼝、提供应⽤程序访问USB系统的⽂件接⼝等。
其中USB HUB作为⼀类特殊的USB设备,其驱动程序被包含在USBD层。
USB驱动分析一这个故事中使用的是2.6.10的内核代码.Linux内核代码目录中, 所有去设备驱动程序有关的代码都在drivers/目录下面,在这个目录中我们用ls命令可以看到很多子目录. localhost:/usr/src/linux-2.6.10/drivers # lsKconfig atm cdrom eisa ide macintosh message net parport s390 tc w1Makefile base char fc4 ieee1394 mca misc nubuspci sbus telephony zorroacorn block cpufreq firmware input md mmc oprofile pcmcia scsi usbacpi bluetooth dio i2c isdn media mtd parisc pn p serial video其中usb目录包含了所有usb设备的驱动,而usb目录下面又有它自己的子目录,进去看一下,localhost:/usr/src/linux-2.6.10/drivers # cd usb/locahost:/usr/src/linux-2.6.10/drivers/usb # lsKconfig Makefile README atm class core gadget host image input me dia misc net serial storage usb-skeleton.c注意到每一个目录下面都有一个Kconfig文件和一个Makefile,这很重要.稍后会有介绍. 而我们的故事其实是围绕着drivers/usb/storage这个目录来展开的.实际上这里边的代码清清楚楚地展示了我们日常频繁接触的U盘是如何工作的,是如何被驱动起来的.但是这个目录里边的冬冬并不是生活在世外桃源,他们总是和外面的世界有着千丝万缕的瓜葛.可以继续进来看一下,localhost:/usr/src/linux-2.6.10/drivers/usb # cd storage/localhost:/usr/src/linux-2.6.10/drivers/usb/storage # lsKconfig debug.c freecom.c isd200.c protocol.c sddr09.c shuttle_ usbat.c unusual_devs.hMakefile debug.h freecom.h isd200.h protocol.h sddr09.h shuttle _usbat.h usb.cdatafab.c dpcm.c initializers.c jumpshot.c scsiglue.c sddr55.c transport.c usb.hdatafab.h dpcm.h initializers.h jumpshot.h scsiglue.h sddr55.h transpor t.h咋一看,着实吓了一跳,用`wc -l *`这个命令统计一下,12076行,晕死...wc [ -c | -m ] [ -l ] [ -w ] [文件]或者wc -k [ -c ] [ -l ] [ -w ] [文件]注:缺省情况下,wc 命令对File 参数指定的文件中的行数、字数和字节数进行计数。