Linux-USB-gadget设备驱动_第1页
Linux-USB-gadget设备驱动_第2页
Linux-USB-gadget设备驱动_第3页
Linux-USB-gadget设备驱动_第4页
Linux-USB-gadget设备驱动_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux usb gadget 驱动利用Linux USB gadget设备驱动可以实现一些比较有意思的功能,举两个例子:1、一个 嵌入式产品中的某个存储设备,或是一个存储设备的某个分区,可以作为一个U盘被PC: 设别,从而非常方便的完成文件交互,这个功能被广泛的应用于手机、数码相机等产品 中。2、一个嵌入式设备通过USB连接到你的PC后,在你的PC端会岀现一个新的网络连 接,在嵌入式设备上也会有一个网卡设备,你可以配豊它们的IP地址,并进行网络通讯, 俗称 USBNETo所有USB通讯的设备端都有usb device程序,通常称它们为usb固件。在一些功能简单的 设备里,用一些专用的可编程

2、USB控制器就可以了。而在一些运行了类似linux操作系统 的复杂的嵌入式系统中,要完成usb device程序,就会要求你不仅熟悉usb device控制 器的操作,还要熟悉操作系统的驱动架构。我想通过“功能体验”、“驱动调试”、“gadget驱动结构分析”、“编写一个自己的g adget驱动”这4个方而解析linux usb gadget设备驱动的编写方法。linux模拟U盘功能的实现在硬件环境为华淸远见的fs2410平台,软件环境为linux-2. 6. 26的linux系统上,实现 模拟U盘的功能。向内核添加代码include #include include 修改 arch/arm/

3、mach-s3c2410/mach-smdk2410. c/*USB device _E拉电阻处理*/static void smdk2410_udc_pullup(enum s3c2410_udc_cmd_e cmd)u8 *s3c2410_pullup_info = put HIGH9 output LOWstatic structPull-up enable7,/zPull-up disable7,UDC reset, in case of;printk (z,smdk2410_udc:玄sn, s3c2410_pullup_infocmd);s3c2410_gpio_cfgpin(S3

4、C2410_GPG9, S3C2410_GPG9_0UTP);switch (cmd)case S3C2410_UDC_P_ENABLE :s3c2410_gpio_setpin(S3C2410_GPG9, 1); /set gpg9 outbreak;case S3C2410_UDC_P_DISABLE : s3c2410_gpio_setpin(S3C2410_GPG9, 0); /set gpgbreak;case S3C2410_l;DC_P_RESET :/FIXME!break;default:break; udjcommand=smdk2 410_udc_pu 11 up,;s3

5、c2410_udc_mach_info smdk2410_udc_cfg _initdata = static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,&s3c_device_usbgadget,/*USB gadget device 设备登记*/;static void _init sdmk2410_init(void)u32 upll_value;set_s3c2410fb_info(&smdk2410_lcdcfg); s3c24xx_udc_set_platdata(&smdk2410_udc_cfg); /

6、* 初始化*/ s3c_device_sdi dev platfo:rin_data = &smdk2410_mmc_cfg; /* Turn off suspend on both USB ports, and switch the * selectable USB port to USB device mode */s3c2410.modify_misccr(S3C2410_MISCCR-USBH0STS3C2410_MISCCR_USBSUSPND0S3C241OJIISCCR.USBSUSPNDl, 0x0); /*设置USB时钟*/upll_value =(0x78 S3C2410_

7、PLLC0N_MDIVSHIFT)I (0x02 S3C2410_PLLC0N_PDIVSHIFT)I (0x03 S3C2410_PLLC0N_SDIVSHIFT);wh订e (upll.value != readl(S3C2410.UPLLC0N) writeKupll.value, S3C2410.UPLLC0N); udelay(20);修改 drivers/usb/gadget/struct usb_request *req, int *pbusy, enum fsg_buffer_state *state)intrc;udelay(800);配宜内核支持盘模拟*USB Gadget

8、 Support USB Peripheral Controller (S3C2410 USB Device Controlle r) S3C2410 USB Device Controller*S3C2410 udc debug messages USB Gadget DriversStorage Gadget3、编译内核 #make zImage#make modules在目录 drivers/usb/gadget 卜生成 g_加载驱动,测试功能利用前而的生成的内核,启动系统后,加载g_ttinsmod g_# insmod g_ stall二0 removable=l0. 03 USB:

9、 usb_gadget_register_driver 0 *USB Gadget DriversEthernet Gadget (with CDC Ethernet support)*RNDIS support0. 04 USB: binding gadget driver g_0. 05 USB: s3c2410_set_selfpowered0g_ gadget: Storage Gadget, version: 20 October 2004g_ gadget: Number of LUNs=lg_ gadget-lunO: ro=0t file: /dev/mtdblock30. 0

10、6 USB: udc_enable calledsmdk2410_udc: Pull-up enable连接设备到windows, windows系统会自动设备到一个新的l盘加入“格式化U盘,存入文 件。卸载U盘后,在目标板上执行如下操作:# mkdir /mnt/gadget# mount -t vfat /dev/mtdblock2 /mnt/gadget/#ls可以看到windows存入U盘的文件。二、usbnet功能的实现 配置内核支持usbnet* USB Gadget Support USB Peripheral Controller (S3C2410 USB Device Con

11、troller) S3C2410 USB Device ControllerS3C2410 udc debug messages2、编译内核#make zImage#make modules在目录 drivers/usb/gadget 卜生成 g_ether ko3、加载驱动,测试功能利用前而的生成的内核,启动系统后,加载g_ether. ko#insmod g_ether ko#ifconfig usbO 192. 168.1.120usbO Link encap:Ethernet HWaddr 5E:C5:F6:D4:2B:91inet addr: 192. 168. 1. 120 Bea

12、st: 192. 168. 1. 255 Mask:255. 255. 255. 0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:253 errors:0 dropped:0 overruns:0 frame:0TX packets:43 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:35277 (34. 4 KiB) TX bytes:10152 (9.9 KiB)连接设备到windows, windows系统会提示

13、安装驱动,根据提示安装上RNDIS驱动。这个驱 动可以在网络上找到。此时windows会新生成一个网络连接,配宜它的ip地址等信息。然 后就可以和目标系统通过USB实现网络通讯了这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解 析。一、背景知识1、USB Mass Storage 类规范概述USB 组织在 universal Serial Bus Mass Storage Class Spaceification11版本中泄义了海量存储设备类(Mass Storage Class)的规范,这个类规范包括四个独立的子类规范.即:1. USB Mass Stora

14、ge Class Control/Bulk/Interrupt (CBI) Transport2. USB Mass Storage Class Bulk-Only Transport3. USB Mass Storage Class ATA Command Block4.USB Mass Storage Class UFI Command Specification前两个子规范立义了数据/命令/状态在USB上的传输方法。Bulk- Only 传输规范仅仅使用Bulk端点传送数据/命令/状态,CBI传输规范则使用Control/Bulk/In terrupt三种类型的端点进行数据/命令/状态传

15、送。后两个子规范则泄义了存储介质的操 作命令。ATA命令规范用于硬盘,UFI命令规范是针对USB移动存储。Microsoft Windows中提供对Mass Storage协议的支持,因此USB移动 设备只需要遵循Mass Storage协议来组织数据和处理命令,即可实现与PC机交换数 拯。而Flash的存储单元组织形式采用FAT16文件系统,这样,就可以直接在Windows的 浏览器中通过可移动磁盘来交换数据了 Windows负责对FAT16文件系统的管理,USB设 备不需要干预FAT16文件系统操作的具体细节。USB (Host)唯一通过描述符了解设备的有关信息,根据这些信息,建立起 通信

16、,在这些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述 符,是USB设备正常工作的先决条件。Linux-2. 6. 26内核中在利用USB gadget驱动实现模拟U盘时主要涉及到、s3c2410_udc.c等驱动文件(这些文件的具体结构,将在下一篇文章中描述)。此时 我们想先从这些代码中找到USB描述描述符,从中确左使用的存储类规范,从而确左协 议。确左通讯协议是我们调试的基础。存储类规范是由接口描述符决立的。接口描述符各项的左义义如下:OffsetFieldSizeValueDescriptionDbLenffth1dumberSize of this aescnpio

17、r in bytes1bDepfofTye1Ccnstan?INTERFACE Descriptor Type3bJrfterfaceNurnbef1NumberN umber of this i nterface. Zero-based value identify)ng the index in the array of concurrent interfaces supsorted ly th s configuration3bAitemsteSettifig1dumberVa ue used to select this alternate setting for the interf

18、ace identified in rhe prior field4bNumnapQjntsiMumberNumber of endaoinits usq oy This nterface rexcxding endpo;n zero). If this value i zero, this interface ony uses rhe Default Central Hx5O/n-feceC/ess1C;assC!ass ccae as&ianed by the US8-1F).A value oi zero is reser/ed for future tandardizatror.If

19、th-s field is set to FFH. the interface class is ventfor-specifc.Al) other values are reserved for assignment by the USB-lr.6bimerfaceStfD da ss1SubclassSuocias code(assnel by me uS5-ir) These cooes are qualrfied by tiie vafue of the blnterfaceC/ass neldIf the D旳沁aCJsssfeid is reset cc zero . :his f

20、ield must also be reset to zero.If th bint erf ace C/ass fie!d is noi set w FFH. all values are reserved for assignmeni oy rhe US6-IF.75/ntefsc5Pro?5co/1ProtocolProtocol code (azgnea oy the USB? These codes- are qua ified by the value of the binterfaceClass arid the bfnterf28hRead (10)Host读存储介质中的二进制

21、数据A8hRead (12)同上,不过比较详细一点25hRead Capacity要求设备返回当前容量23hRead Format Capacity查询当前容量及可用空间03hRequestSense请求设备向主机返回执行结果,及状态数据OlhRexero Unit返回零轨道2BhSeek (10)为设备分配到特左地址lDhSendDiagnostic执行固件复位并执行诊断OOhTest Unit Ready请求设备报告是否处于Ready状态2FhVerify在存储中验证数据2AhWrite (10)从主机向介质写二进制数据AAhWrite (12)同上,不过比较详2EhWrite and V

22、erify写二进制数据并验证对于不同的命令,其命令块描述符略有不同,其要求的返回内容也有所不同,根据相应的 文档,可以对每种请求作岀适当的回应。比如,下而是INQUIRY请求的命令块描述符和其 返回内容的数据格式:如:INQUIRY命令描述符:Table INQUIRY CommandBrtByte765432100Operation Code (12h)1Logical Unit NumberReservedEVPD(0)2Page Code3口 esen/ed4Allocation Length5Reserved6Reserved7Reserved3Reserved9Reserved10R

23、esen/ed11Reserved返回数据格式Table INQUIRY Data FormatBit Byte765A32100ReservedPeripheral DevEce Type1RMBReserved2ISO VersionECMA VersionANSI Version (OOh)3ReservedResponse Data Format4Additional Length (31)57Reserved8Vendor Information1516Product Identification3132Product Revision Level35n.nnHost 会依次发出 I

24、NQUIRY、Read Capacity. UFI Mode Sense 请求,如 果上述请求的返回结果都正确,则Host会发岀READ命令,读取文件系统0簇0扇区的 MBR数据,进入文件系统识别阶段。4、利用USB View观察结果0UIKI Rst ControllerFile-becked Swrage laosecManufacture: Lliuk 2.6,26. 5 with s3c2410_itk-VirtiEl IEB 砒 l Hst ControllerSerial 帥收L J73M175E775 Speed: 12ib/s (ful 1)USB Version; 1.10可

25、通过USB View软件査看到USB设置阶段获取到的信息。Device Q a.ss: OOOifc )Itevice Subclass: COLevies Fmtcwl: CO hfeLTfium tefaul t Ehdpoirrt Si28: 16 ttaber of Gonfiurations; 1 VMfld: 0525Prdixt I & a45Config Number; 1hkiflcer of Interfaces: 1 Attributes: cO f-fajfowr ttebi: MInterface Murrher: 0T1 hl . .I C畑 usb-sdzr3eA

26、l termte Nuite-: 0Cl ass: C6(stor.) Sub Cl ass: 06Protocol; 50 Number of Endpoints: 2Endpoint Mress: 81 Direction; in Attribute: 2 Type: Efulk hbx Packet Si: 64 Interval: OmsEndpoint Address: C2 Direction: out Attribute: 2 Type; Bulk 由 z Packet Si 厉;64 Interval: Orns二、出现的主要问题在调试过程中遇到了一个问题。现象是:在目标板加载

27、完驱动后,即执行完:# insmod g_ stall二0 removable=l后,接好USB线。此时在windows端设备岀有usb storage设备加入,但出现不了盘符。下面记录下调试过程。三、调试过程根据规范,当完成SCSI指令集中Inquiry命令时,可以岀现盘符。所以可以 通过bushound软件查看通讯过程,找出原因。下而是利用bushound工具在岀现问题时采集到的数据。DevPhaseDataTimInfoCmd Phase Ofs26CTLGET DESCRIPTROus26DI-12 03 01 02 4. Sms1.2. 1626CTLGET DESCRIPTR14u

28、s26DI3. 9ms26CTL80 06 00 01 - 00 00 12 001. 1.012 01 10 01 - 00 00 00 10 - 25 05 a5 a41.2.003 01 .80 06 00 02 - 00 00 09 002. 1.009 02 20 00 - 01 01 04 cO - 012. 2.080 06 00 02 - 00 00 20 00GET DESCRIPTR17us3. 1.026DI09 02 20 00 一 01 01 04cO - 01 09 04 00-00 02 08 06 4.9ms3. 2.002 - 02 40 00 00 P.26

29、CTLGET DESCRIPTR60us26DI3. 9ms26DI33. 9ms26CTL50 05 07 05 - 81 02 40 00 - 00 07 053. 2. 1680 06 00 03 - 00 00 02 004. 1.009 02 20 00 - 01 01 04 cO - 01 2. 2.004 0 3. 1.080 06 00 03 一 00 00 04 00GET DESCRIPTR26DI15us5. 1.004 03 09 043. 9m4. Oms6. 2.0s6. 1. 026CTL0GET DESCRIPTR80 06 03 03 -lOus0904 02

30、 01.2. 1626DIla 0326CTL80 06 03 03 - 09 04 la 00GET DESCRIPTR19us7. 1.046 696c 65一 2d 5374 6f - 72 20 42631 00 37 00 . 3. 7. 2.1626SET CONFIG26SET INTERFACE26CLASS26DI0. 4. 1.7.CTLCTLCTLDI10. 2.04. 9ms16us60msla 03 33 00 - 37 00 32 00 一 30 00 34 00 一35 00 36 00000901 00 - 00 0001Ob00 00 - 00 00al62m

31、s7. 2.0一 37 00 37 00 一 35 0000 0000 00 - 00 00005. 6. 7. 7. 5. 7. 2.8. 1.000 009. 1.001 0010. 1. 03. 9ms2680 00 06 12 USBC.0 00 - 00 00 00268 20 20 20DO55 534243-08 60 eO 86 - 24 00 00 00 一DI985us11.1.0000000 24一 00 000000 - 00 00 011. 1. 167 61 - 64 67 65 7400 80 02 02 一Linux 10msGadgetIf 0000 00 -

32、4c69 6e 75 - 712. 1.012. 1. 1630 33 31 3226CTL80 06 00 02 - 00 00 20 00031212. 1. 32GETDESCRIPTR893ms13.1.026DI09 02 20 00 - 01 01 04 cO - 01 09 04 00 -00 02 08 06 4.1ms13. 2. 050 05 07 05 - 81 02 40 00 - 00 07 05 02 - 02 40 00 00 P13. 2. 1626CTL80 06 00 02 - 00 00 20 00GET DESCRIPTR2. 7sc14. 1. 026

33、DI09 02 20 00 - 01 01 04 cO - 01 09 04 00 -00 02 08 06 4 4ms14.2.050 05 07 05 - 81 02 40 00 - 00 07 0502 - 02 40 00 00 P14 2. 1626USTS 05 00 00 cOno response2 8sc15. 1.0注意上而红色部分的代码,DO发岀了 55 53 42 43开始的CBW命令块,命令码是12,即I nquiry命令。要求目标返回Inquiry命令要求的数据,长度是0x24o接下来设备端通过D I返回了设备信息。按照规范,在返回完了数据后,设备端还应该通过DI向

34、系统返回CSW 的值。但实际的捕获内容并没有。所以导致不能正确岀现盘符。在中,发送数据时都会调用到start_transfer ()函数。在此函数中加入printk 调试语句,观察现象。发现只要加入的调试语句,windows端就能够正常设別设备了。于 是,可以猜测是因为需要在连续两次发送之间加上一些延时。在函数中加入udelay (80 0)后,windows系统可以正常发现设备了。具体的代码架构,将在下一遍文章中解析。下面是程序正常后,用bushound捕获到的数据。红色部分,可以看出设备正确的按照规范在发送完数据后,返回CSW信息。55 5342 43-08 2GG 36-24DGC000

35、-S00006 1200 00 00 24 00 00 CO 00 00 0(100 CO - UU 00 00USBC. 4.987usUJ.16販似00 800202 lfOOITOO-4:6975-7820 2020Lirin?:J Gins12J.046 60 6c 65 - 2d 53 74 6f-72 204761 64 6? 65 g匚恥 Stor Gdjet1Z1J6d30 3331 3203121213255534253-0320.086 -0300 CO00 COUSBS.,.1 Orris134.0卩2 DQ5553 42 43-08 刀幻 86-fcOO 00CO-SO

36、03Qa23USBC.ft刀邓咖a00 00 00 00-00 00 CO fc-00 00(0 00 0300 OO14.1.16藐Eoo oomoo-tn oo oo od .0000 00 co.00 cd 00 002.0ms00 00 00 DO-00 00 CO 00 - CO 00 0003 00 OD 00 001皿600 00 OD 00-00 DO CO 00,3255 53 42 33 - 03 20 G 86 - ft 00 OD 00 - 01USES .998osBi;o2OQ53 42 43 032D.D 86-12 CO00 00-80 000; 03USBC1

37、.0msALLOOOQM12-OOOCTO-COQflOfl(XI.OOalOfl17116p笏八70 000600 - 03 毁妙 0a - CO Q0 毁眼 29 OO 毁吸P)1 Oms朋力a00)8.116USBS.996us55 5342 53-(E2D.S86 03QQQQQO 00四、总结做好USB gadget驱动、或者USB host驱动调试需要:掌握一立的知识基础包括:USB协议、具体的类设备规范、USB驱动程序架构、USB设备端控制器操作等。合理利用调试工具。包括:USB view、bushound、及一些硬件USB信号分析仪。Linux USB设备端驱动有两部分组成。一

38、部分是USB设备控制器(USB Device Controller,UDC)驱动、另一部分是硬件无关的功能驱动(如:鼠标、u盘、usb串口、usb网络等):也可以分为 3 层的,分别是:Controller DriversGadget DriversUpper Layer s,大概意思都差不多。J 控制器(USB Device Controller, UDC)驱动Gadget框架提岀了一套标准API,在底层,USB设备控制器驱动则实现这一套API,不 同的UDC需要不同的驱动,甚至基于同样的UDC的不同板子也需要进行代码修改。这一 层是硬件相关层。Linux标准内核里支持各种主流SOC的udc

39、驱动,如:S3C2410. PXA270等。你可以通 过内核直接配豊支持。你也可以通过修改它们获取更髙的效率。如:s3c2410.uda. c中并没有利用到控制器的dma功能,你可以根据需要修改它。要理解UDC驱动代码就必须对相应的硬件控制器熟悉。当然,如果你对此不感兴趣,或没 时间熟悉,也可以暂时跳过对硬件相关部分。本文也侧重于对软件结构的描述,不关心硬 件细节。下面给出在UDC驱动中涉及到的一些关键数据结构及API,参考s3c2410_uda. c1.关键的数据结构及APIgadget api提供了 usb device controller驱动和上层gadget驱动交互的接口。下面列 出

40、一些关键的数据结构。struct usb_gadget /代表一个 UDC 设备/* readonly to gadget driver */const struct usb_gadget_ops *ops; /设备的操作集 struct usb_ep *epO; /epO (USB 协议中的端点 0), 处理setup ()i求struct list_head ep_list; /* of usb_ep */本设备支持的端点链表enum usb_device_speed speed; /如:USB_SPEED_LOW、 USB_SPEED_FULL 等unsigned is_dualspee

41、d: 1; /支持 full/high speedunsigned is_otg: 1: /OTG 的特性unsigned is_a_peripheral: 1: /当前是 A-periphera1,而不是Ahostunsigned b_hnp_enable:1;unsigned a_hnp_support:1:unsigned a_alt_hnp_support:1;const char *name;;struct device dev;struct usb_gadget_driver /代表一个 gadget 设备 driver, 如: 中的 fsg_driver/又如:如 zero, c 中的 zero_driverchar *function; /个字符串,如Gadget Zero enum usb_device_speed speed;int (*bind) (struct usb_gadget *);void (*unbind)(struct usb_gadget *);int (*setup)(struct usb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论