Linux-USB-gadget設(shè)備驅(qū)動(dòng)(20210516113215)_第1頁(yè)
Linux-USB-gadget設(shè)備驅(qū)動(dòng)(20210516113215)_第2頁(yè)
Linux-USB-gadget設(shè)備驅(qū)動(dòng)(20210516113215)_第3頁(yè)
Linux-USB-gadget設(shè)備驅(qū)動(dòng)(20210516113215)_第4頁(yè)
Linux-USB-gadget設(shè)備驅(qū)動(dòng)(20210516113215)_第5頁(yè)
已閱讀5頁(yè),還剩56頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux usb gadget 驅(qū)動(dòng)利用Linux USB gadget設(shè)備驅(qū)動(dòng)可以實(shí)現(xiàn)一些比較有意思的功能,舉兩個(gè)例子:1、一個(gè) 嵌入式產(chǎn)品中的某個(gè)存儲(chǔ)設(shè)備,或是一個(gè)存儲(chǔ)設(shè)備的某個(gè)分區(qū),可以作為一個(gè)U盤被PC: 設(shè)別,從而非常方便的完成文件交互,這個(gè)功能被廣泛的應(yīng)用于手機(jī)、數(shù)碼相機(jī)等產(chǎn)品 中。2、一個(gè)嵌入式設(shè)備通過(guò)USB連接到你的PC后,在你的PC端會(huì)岀現(xiàn)一個(gè)新的網(wǎng)絡(luò)連 接,在嵌入式設(shè)備上也會(huì)有一個(gè)網(wǎng)卡設(shè)備,你可以配豊它們的IP地址,并進(jìn)行網(wǎng)絡(luò)通訊, 俗稱 USBNETo所有USB通訊的設(shè)備端都有usb device程序,通常稱它們?yōu)閡sb固件。在一些功能簡(jiǎn)單的 設(shè)備里,用一些專用的可編程

2、USB控制器就可以了。而在一些運(yùn)行了類似linux操作系統(tǒng) 的復(fù)雜的嵌入式系統(tǒng)中,要完成usb device程序,就會(huì)要求你不僅熟悉usb device控制 器的操作,還要熟悉操作系統(tǒng)的驅(qū)動(dòng)架構(gòu)。我想通過(guò)“功能體驗(yàn)”、“驅(qū)動(dòng)調(diào)試”、“gadget驅(qū)動(dòng)結(jié)構(gòu)分析”、“編寫一個(gè)自己的g adget驅(qū)動(dòng)”這4個(gè)方而解析linux usb gadget設(shè)備驅(qū)動(dòng)的編寫方法。linux模擬U盤功能的實(shí)現(xiàn)在硬件環(huán)境為華淸遠(yuǎn)見的fs2410平臺(tái),軟件環(huán)境為linux-2. 6. 26的linux系統(tǒng)上,實(shí)現(xiàn) 模擬U盤的功能。向內(nèi)核添加代碼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 設(shè)備登記*/;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); /*設(shè)置USB時(shí)鐘*/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);配宜內(nèi)核支持盤模擬*USB Gadget

8、 Support USB Peripheral Controller (S3C2410 USB Device Controlle r) S3C2410 USB Device Controller*S3C2410 udc debug messages USB Gadget DriversStorage Gadget3、編譯內(nèi)核 #make zImage#make modules在目錄 drivers/usb/gadget 卜生成 g_加載驅(qū)動(dòng),測(cè)試功能利用前而的生成的內(nèi)核,啟動(dòng)系統(tǒng)后,加載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連接設(shè)備到windows, windows系統(tǒng)會(huì)自動(dòng)設(shè)備到一個(gè)新的l盤加入“格式化U盤,存入文 件。卸載U盤后,在目標(biāo)板上執(zhí)行如下操作:# mkdir /mnt/gadget# mount -t vfat /dev/mtdblock2 /mnt/gadget/#ls可以看到windows存入U(xiǎn)盤的文件。二、usbnet功能的實(shí)現(xiàn) 配置內(nèi)核支持usbnet* USB Gadget Support USB Peripheral Controller (S3C2410 USB Device Con

11、troller) S3C2410 USB Device ControllerS3C2410 udc debug messages2、編譯內(nèi)核#make zImage#make modules在目錄 drivers/usb/gadget 卜生成 g_ether ko3、加載驅(qū)動(dòng),測(cè)試功能利用前而的生成的內(nèi)核,啟動(dòng)系統(tǒng)后,加載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)連接設(shè)備到windows, windows系統(tǒng)會(huì)提示

13、安裝驅(qū)動(dòng),根據(jù)提示安裝上RNDIS驅(qū)動(dòng)。這個(gè)驅(qū) 動(dòng)可以在網(wǎng)絡(luò)上找到。此時(shí)windows會(huì)新生成一個(gè)網(wǎng)絡(luò)連接,配宜它的ip地址等信息。然 后就可以和目標(biāo)系統(tǒng)通過(guò)USB實(shí)現(xiàn)網(wǎng)絡(luò)通訊了這一節(jié)主要把在實(shí)現(xiàn)“l(fā)inux模擬U盤功能”過(guò)程中的一些調(diào)試過(guò)程記錄下來(lái),并加以解 析。一、背景知識(shí)1、USB Mass Storage 類規(guī)范概述USB 組織在 universal Serial Bus Mass Storage Class Spaceification11版本中泄義了海量存儲(chǔ)設(shè)備類(Mass Storage Class)的規(guī)范,這個(gè)類規(guī)范包括四個(gè)獨(dú)立的子類規(guī)范.即: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前兩個(gè)子規(guī)范立義了數(shù)據(jù)/命令/狀態(tài)在USB上的傳輸方法。Bulk- Only 傳輸規(guī)范僅僅使用Bulk端點(diǎn)傳送數(shù)據(jù)/命令/狀態(tài),CBI傳輸規(guī)范則使用Control/Bulk/In terrupt三種類型的端點(diǎn)進(jìn)行數(shù)據(jù)/命令/狀態(tài)傳

15、送。后兩個(gè)子規(guī)范則泄義了存儲(chǔ)介質(zhì)的操 作命令。ATA命令規(guī)范用于硬盤,UFI命令規(guī)范是針對(duì)USB移動(dòng)存儲(chǔ)。Microsoft Windows中提供對(duì)Mass Storage協(xié)議的支持,因此USB移動(dòng) 設(shè)備只需要遵循Mass Storage協(xié)議來(lái)組織數(shù)據(jù)和處理命令,即可實(shí)現(xiàn)與PC機(jī)交換數(shù) 拯。而Flash的存儲(chǔ)單元組織形式采用FAT16文件系統(tǒng),這樣,就可以直接在Windows的 瀏覽器中通過(guò)可移動(dòng)磁盤來(lái)交換數(shù)據(jù)了 Windows負(fù)責(zé)對(duì)FAT16文件系統(tǒng)的管理,USB設(shè) 備不需要干預(yù)FAT16文件系統(tǒng)操作的具體細(xì)節(jié)。USB (Host)唯一通過(guò)描述符了解設(shè)備的有關(guān)信息,根據(jù)這些信息,建立起 通信

16、,在這些描述符中,規(guī)定了設(shè)備所使用的協(xié)議、端點(diǎn)情況等。因此,正確地提供描述 符,是USB設(shè)備正常工作的先決條件。Linux-2. 6. 26內(nèi)核中在利用USB gadget驅(qū)動(dòng)實(shí)現(xiàn)模擬U盤時(shí)主要涉及到、s3c2410_udc.c等驅(qū)動(dòng)文件(這些文件的具體結(jié)構(gòu),將在下一篇文章中描述)。此時(shí) 我們想先從這些代碼中找到USB描述描述符,從中確左使用的存儲(chǔ)類規(guī)范,從而確左協(xié) 議。確左通訊協(xié)議是我們調(diào)試的基礎(chǔ)。存儲(chǔ)類規(guī)范是由接口描述符決立的。接口描述符各項(xiàng)的左義義如下: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讀存儲(chǔ)介質(zhì)中的二進(jìn)制

21、數(shù)據(jù)A8hRead (12)同上,不過(guò)比較詳細(xì)一點(diǎn)25hRead Capacity要求設(shè)備返回當(dāng)前容量23hRead Format Capacity查詢當(dāng)前容量及可用空間03hRequestSense請(qǐng)求設(shè)備向主機(jī)返回執(zhí)行結(jié)果,及狀態(tài)數(shù)據(jù)OlhRexero Unit返回零軌道2BhSeek (10)為設(shè)備分配到特左地址lDhSendDiagnostic執(zhí)行固件復(fù)位并執(zhí)行診斷OOhTest Unit Ready請(qǐng)求設(shè)備報(bào)告是否處于Ready狀態(tài)2FhVerify在存儲(chǔ)中驗(yàn)證數(shù)據(jù)2AhWrite (10)從主機(jī)向介質(zhì)寫二進(jìn)制數(shù)據(jù)AAhWrite (12)同上,不過(guò)比較詳2EhWrite and V

22、erify寫二進(jìn)制數(shù)據(jù)并驗(yàn)證對(duì)于不同的命令,其命令塊描述符略有不同,其要求的返回內(nèi)容也有所不同,根據(jù)相應(yīng)的 文檔,可以對(duì)每種請(qǐng)求作岀適當(dāng)?shù)幕貞?yīng)。比如,下而是INQUIRY請(qǐng)求的命令塊描述符和其 返回內(nèi)容的數(shù)據(jù)格式:如:INQUIRY命令描述符:Table INQUIRY CommandBrtByte765432100Operation Code (12h)1Logical Unit NumberReservedEVPD(0)2Page Code3口 esen/ed4Allocation Length5Reserved6Reserved7Reserved3Reserved9Reserved10R

23、esen/ed11Reserved返回?cái)?shù)據(jù)格式Table INQUIRY Data FormatBit Byte765A32100ReservedPeripheral DevEce Type1RMBReserved2ISO VersionECMA VersionANSI Version (OOh)3ReservedResponse Data Format4Additional Length (31)57Reserved8Vendor Information1516Product Identification3132Product Revision Level35n.nnHost 會(huì)依次發(fā)出 I

24、NQUIRY、Read Capacity. UFI Mode Sense 請(qǐng)求,如 果上述請(qǐng)求的返回結(jié)果都正確,則Host會(huì)發(fā)岀READ命令,讀取文件系統(tǒng)0簇0扇區(qū)的 MBR數(shù)據(jù),進(jìn)入文件系統(tǒng)識(shí)別階段。4、利用USB View觀察結(jié)果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、通過(guò)USB View軟件査看到USB設(shè)置階段獲取到的信息。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二、出現(xiàn)的主要問題在調(diào)試過(guò)程中遇到了一個(gè)問題?,F(xiàn)象是:在目標(biāo)板加載

27、完驅(qū)動(dòng)后,即執(zhí)行完:# insmod g_ stall二0 removable=l后,接好USB線。此時(shí)在windows端設(shè)備岀有usb storage設(shè)備加入,但出現(xiàn)不了盤符。下面記錄下調(diào)試過(guò)程。三、調(diào)試過(guò)程根據(jù)規(guī)范,當(dāng)完成SCSI指令集中Inquiry命令時(shí),可以岀現(xiàn)盤符。所以可以 通過(guò)bushound軟件查看通訊過(guò)程,找出原因。下而是利用bushound工具在岀現(xiàn)問題時(shí)采集到的數(shù)據(jù)。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發(fā)岀了 55 53 42 43開始的CBW命令塊,命令碼是12,即I nquiry命令。要求目標(biāo)返回Inquiry命令要求的數(shù)據(jù),長(zhǎng)度是0x24o接下來(lái)設(shè)備端通過(guò)D I返回了設(shè)備信息。按照規(guī)范,在返回完了數(shù)據(jù)后,設(shè)備端還應(yīng)該通過(guò)DI向

34、系統(tǒng)返回CSW 的值。但實(shí)際的捕獲內(nèi)容并沒有。所以導(dǎo)致不能正確岀現(xiàn)盤符。在中,發(fā)送數(shù)據(jù)時(shí)都會(huì)調(diào)用到start_transfer ()函數(shù)。在此函數(shù)中加入printk 調(diào)試語(yǔ)句,觀察現(xiàn)象。發(fā)現(xiàn)只要加入的調(diào)試語(yǔ)句,windows端就能夠正常設(shè)別設(shè)備了。于 是,可以猜測(cè)是因?yàn)樾枰谶B續(xù)兩次發(fā)送之間加上一些延時(shí)。在函數(shù)中加入udelay (80 0)后,windows系統(tǒng)可以正常發(fā)現(xiàn)設(shè)備了。具體的代碼架構(gòu),將在下一遍文章中解析。下面是程序正常后,用bushound捕獲到的數(shù)據(jù)。紅色部分,可以看出設(shè)備正確的按照規(guī)范在發(fā)送完數(shù)據(jù)后,返回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四、總結(jié)做好USB gadget驅(qū)動(dòng)、或者USB host驅(qū)動(dòng)調(diào)試需要:掌握一立的知識(shí)基礎(chǔ)包括:USB協(xié)議、具體的類設(shè)備規(guī)范、USB驅(qū)動(dòng)程序架構(gòu)、USB設(shè)備端控制器操作等。合理利用調(diào)試工具。包括:USB view、bushound、及一些硬件USB信號(hào)分析儀。Linux USB設(shè)備端驅(qū)動(dòng)有兩部分組成。一

38、部分是USB設(shè)備控制器(USB Device Controller,UDC)驅(qū)動(dòng)、另一部分是硬件無(wú)關(guān)的功能驅(qū)動(dòng)(如:鼠標(biāo)、u盤、usb串口、usb網(wǎng)絡(luò)等):也可以分為 3 層的,分別是:Controller DriversGadget DriversUpper Layer s,大概意思都差不多。J 控制器(USB Device Controller, UDC)驅(qū)動(dòng)Gadget框架提岀了一套標(biāo)準(zhǔn)API,在底層,USB設(shè)備控制器驅(qū)動(dòng)則實(shí)現(xiàn)這一套API,不 同的UDC需要不同的驅(qū)動(dòng),甚至基于同樣的UDC的不同板子也需要進(jìn)行代碼修改。這一 層是硬件相關(guān)層。Linux標(biāo)準(zhǔn)內(nèi)核里支持各種主流SOC的udc

39、驅(qū)動(dòng),如:S3C2410. PXA270等。你可以通 過(guò)內(nèi)核直接配豊支持。你也可以通過(guò)修改它們獲取更髙的效率。如:s3c2410.uda. c中并沒有利用到控制器的dma功能,你可以根據(jù)需要修改它。要理解UDC驅(qū)動(dòng)代碼就必須對(duì)相應(yīng)的硬件控制器熟悉。當(dāng)然,如果你對(duì)此不感興趣,或沒 時(shí)間熟悉,也可以暫時(shí)跳過(guò)對(duì)硬件相關(guān)部分。本文也側(cè)重于對(duì)軟件結(jié)構(gòu)的描述,不關(guān)心硬 件細(xì)節(jié)。下面給出在UDC驅(qū)動(dòng)中涉及到的一些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)及API,參考s3c2410_uda. c1.關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)及APIgadget api提供了 usb device controller驅(qū)動(dòng)和上層gadget驅(qū)動(dòng)交互的接口。下面列 出

40、一些關(guān)鍵的數(shù)據(jù)結(jié)構(gòu)。struct usb_gadget /代表一個(gè) UDC 設(shè)備/* readonly to gadget driver */const struct usb_gadget_ops *ops; /設(shè)備的操作集 struct usb_ep *epO; /epO (USB 協(xié)議中的端點(diǎn) 0), 處理setup ()i求struct list_head ep_list; /* of usb_ep */本設(shè)備支持的端點(diǎn)鏈表enum usb_device_speed speed; /如:USB_SPEED_LOW、 USB_SPEED_FULL 等unsigned is_dualspee

41、d: 1; /支持 full/high speedunsigned is_otg: 1: /OTG 的特性u(píng)nsigned is_a_peripheral: 1: /當(dāng)前是 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 /代表一個(gè) gadget 設(shè)備 driver, 如: 中的 fsg_driver/又如:如 zero, c 中的 zero_driverchar *function; /個(gè)字符串,如Gadget Zero enum usb_device_speed speed;int (*bind) (struct usb_gadget *);void (*unbind)(struct usb_gadget *);int (*setup)(struct usb_ga

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論