欢迎来到得力文库 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
得力文库 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    LinuxUSBgadget设备驱动解析4443.docx

    • 资源ID:62485366       资源大小:346.87KB        全文页数:36页
    • 资源格式: DOCX        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    LinuxUSBgadget设备驱动解析4443.docx

    Linuux UUSB gaddgett设备驱驱动解析析(1)“功能体体验”利用Liinuxx USSB ggadgget设设备驱动动可以实实现一些些比较有有意思的的功能,举举两个例例子: 1、一个个嵌入式式产品中中的某个个存储设设备,或或是一个个存储设设备的某某个分区区,可以以作为一一个U盘盘被PCC设别,从从而非常常方便的的完成文文件交互互,这个个功能被被广泛的的应用于于手机、数数码相机机等产品品中。2、 一个嵌入入式设备备通过UUSB连连接到你你的PCC后,在在你的PPC端会会出现一一个新的的网络连连接,在在嵌入式式设备上上也会有有一个网网卡设备备,你可可以配置置它们的的IP地地址,并并进行网网络通讯讯,俗称称USBBNETT。所有USSB通讯讯的设备备端都有有usbb deevicce程序序,通常常称它们们为ussb固件件。在一一些功能能简单的的设备里里,用一一些专用用的可编编程USSB控制制器就可可以了。而而在一些些运行了了类似llinuux操作作系统的的复杂的的嵌入式式系统中中,要完完成ussb ddeviice程程序,就就会要求求你不仅仅熟悉uusb devvicee控制器器的操作作,还要要熟悉操操作系统统的驱动动架构。我想通过过 “功能体体验”、“驱动调调试”、“gaddgett驱动结结构分析析”、“编写一一个自己己的gaadgeet驱动动”这4个个方面解解析liinuxx ussb ggadgget设设备驱动动的编写写方法。一、liinuxx模拟UU盘功能能的实现现在硬件环环境为华华清远见见的fss24110平台台,软件件环境为为linnux-2.66.266的liinuxx系统上上,实现现模拟UU盘的功功能。向内核添添加代码码#inccludde <<asmm/arrch/reggs-ggpioo.h>>#inncluude <assm/aarchh/reegs-cloock.h>#inccludde <<asmm/pllat-s3cc24xxx/uudc.h>修改arrch/armm/maach-s3cc24110/mmachh-smmdk224100.c/*USSB ddeviice上上拉电阻阻处理 */ staaticc vooid smddk24410_udcc_puulluup(eenumm s33c24410_udcc_cmmd_ee cmmd) u8 *s33c24410_pulllupp_innfo = "" ", "Puull-up enaablee", ""Pulll-uup ddisaablee", ""UDCC reesett, iin ccasee off" ; prrinttk(""smddk24410_udcc: %sn",s3cc24110_ppulllup_inffoccmd); s33c24410_gpiio_ccfgppin(S3CC24110_GGPG99, SS3C224100_GPPG9_OUTTP); sswittch (cmmd) ccasee S33C24410_UDCC_P_ENAABLEE : ss3c224100_gppio_settpinn(S33C24410_GPGG9, 1); /sset gpgg9 ooutpput HIGGH bbreaak; ccasee S33C24410_UDCC_P_DISSABLLE : s33c24410_gpiio_ssetppin(S3CC24110_GGPG99, 00); /seet ggpg99 ouutpuut LLOW breeak; casse SS3C224100_UDDC_PP_REESETT : /FFIXMME! bbreaak; ddefaaultt: bbreaak; stattic strructt s33c24410_udcc_maach_inffo ssmdkk24110_uudc_cfgg _iniitdaata = .udcc_coommaand = ssmdkk24110_uudc_pulllupp, ;stattic strructt pllatfformm_deevicce *smddk24410_devvicees _iniitdaata = , &ss3c_devvicee_ussbgaadgeet, /*USBB gaadgeet ddeviice设设备登记记*/ ;stattic voiid _innit sdmmk24410_iniit(vvoidd) uu32 uplll_vvaluue; sett_s33c24410ffb_iinfoo(&ssmdkk24110_llcdccfg); ss3c224xxx_uddc_sset_plaatdaata(&smmdk224100_uddc_ccfg); /* 初初始化*/ ss3c_devvicee_sddi.ddev.plaatfoorm_datta = &ssmdkk24110_mmmc_cfgg; /* TTurnn offf ssusppendd onn booth USBB poortss, aand swiitchh thhe * sseleectaablee USSB pportt too USSB ddeviice modde. */ ss3c224100_moodiffy_mmiscccr(S3CC24110_MMISCCCR_USBBHOSST | SS3C224100_MIISCCCR_UUSBSSUSPPND00 | S33C24410_MISSCCRR_USSBSUUSPNND1, 0xx0);/* 设置UUSB时时钟 */ uppll_vallue = ( 00x788 <<< S33C24410_PLLLCONN_MDDIVSSHIFFT) | (00x022 <<< S33C24410_PLLLCONN_PDDIVSSHIFFT) | (00x033 <<< S33C24410_PLLLCONN_SDDIVSSHIFFT); whiile (uppll_vallue != reaadl(S3CC24110_UUPLLLCONN) wwrittel(uplll_vvaluue, S3CC24110_UUPLLLCONN); udeelayy(200); 修改drriveers/usbb/gaadgeet/stattic voiid sstarrt_ttrannsfeer(sstruuct fsgg_deev *fsgg, sstruuct usbb_epp *eep, strructt ussb_rrequuestt *rreq, innt *pbuusy, ennum fsgg_buuffeer_sstatte *staate) innt rc; uudellay(8000); 配置内核核支持UU盘模拟拟<*> UUSB Gaddgett Suuppoort -> UUSB Perriphheraal CConttrolllerr (SS3C224100 USSB DDeviice Conntroolleer) -> S3CC24110 UUSB Devvicee Coontrrolller * S33C24410 udcc deebugg meessaagess <MM> USSB GGadgget Driiverrs <M>> Stooragge GGadgget3、编译译内核#makke zzImaage #maake moddulees在目录ddrivverss/ussb/ggadgget下下生成gg_加载驱动动,测试试功能利用前面面的生成成的内核核,启动动系统后后,加载载g_#inssmodd g_ # inssmodd g_ sstalll=00 reemovvablle=11 0.03 USBB: uusb_gaddgett_reegissterr_drriveer() ''g_' 00.044 USSB: binndinng ggadgget driiverr ''g_' 00.055 USSB: s3cc24110_sset_sellfpoowerred() gg_ ggadgget: SStorragee Gaadgeet, verrsioon: 20 Octtobeer 220044 g_ gaadgeet: Nummberr off LUUNs=1 gg_ ggadgget-lunn0: ro=0, fille: /deev/mmtdbblocck3 0.006 UUSB: uddc_eenabble callledd smmdk224100_uddc: Pulll-uup eenabble连接设备备到wiindoows,wwinddowss系统会会自动设设备到一一个新的的U盘加加入。格格式化UU盘,存存入文件件。卸载载U盘后后,在目目标板上上执行如如下操作作:# mkkdirr /mmnt/gaddgett # mouunt -t vfaat /devv/mttdbllockk2 /mntt/gaadgeet/ #lls可以看到到winndowws存入入U盘的的文件。二、ussbneet功能能的实现现配置内核核支持uusbnnet<*> UUSB Gaddgett Suuppoort -> UUSB Perriphheraal CConttrolllerr (SS3C224100 USSB DDeviice Conntroolleer) -> S3CC24110 UUSB Devvicee Coontrrolller * S33C24410 udcc deebugg meessaagess <MM> USSB GGadgget Driiverrs <<M> Ettherrnett Gaadgeet (witth CCDC Ethhernnet suppporrt) * RNNDISS suuppoort2、编译译内核#makke zzImaage #maake moddulees在目录ddrivverss/ussb/ggadgget下下生成gg_ettherr.koo3、加载载驱动,测测试功能能利用前面面的生成成的内核核,启动动系统后后,加载载g_eetheer.kko#inssmodd g_ethher.ko #iffconnfigg ussb0 1922.1668.11.1220 ussb0 Linnk eencaap:EEtheerneet HHWadddr 5E:C5:F6:D4:2B:91 ineet aaddrr:1992.1168.1.1120 Bcaast:1922.1668.11.2555 MMaskk:2555.2255.2555.0 UP BROOADCCASTT RUUNNIING MULLTICCASTT MTTU:115000 Meetriic:11 RXX paackeets:2533 errrorrs:00 drroppped:0 ooverrrunns:00 frramee:0 TX paccketts:443 eerroors:0 ddropppedd:0 oveerruuns:0 ccarrrierr:0 colllissionns:00 txxqueeuellen:10000 RRX bbytees:3352777 (34.4 KKiB) TXX byytess:1001522 (99.9 KiBB)连接设备备到wiindoows,wwinddowss系统会会提示安安装驱动动,根据据提示安安装上RRNDIIS驱动动。这个个驱动可可以在网网络上找找到。此此时wiindoows会会新生成成一个网网络连接接,配置置它的iip地址址等信息息。然后后就可以以和目标标系统通通过USSB实现现网络通通讯了。Linuux UUSB gaddgett设备驱驱动解析析(2)-驱驱动调试试作者:刘刘洪涛, 华清清远见嵌嵌入式学学院金牌牌讲师。这一节主主要把在在实现“linnux模模拟U盘盘功能”过程中中的一些些调试过过程记录录下来,并并加以解解析。一、 背景知识识 1、UUSB Masss SStorragee类规范范概述UUSB 组织在在uniiverrsall Seeriaal BBus Masss SStorragee Cllasss Sppaceeifiicattionn 1.1版本本中定义义了海量量存储设设备类(MMasss Sttoraage Claass)的的规范,这这个类规规范包括括四个 独立立的子类类规范,即即: 11. UUSB Masss SStorragee Cllasss Coontrrol/Bullk/IInteerruupt (CBBI) Traanspportt2.UUSB Masss SStorragee Cllasss Buulk-Onlly TTrannspoort33.USSB MMasss Sttoraage Claass ATAA Coommaand Bloock 4.UUSB Masss SStorragee Cllasss UFFI CCommmandd Sppeciificcatiion 前两个个子规范范定义了了数据/命令/状态在在USBB 上的的传输方方法。BBulkk- OOnlyy 传输输规范仅仅仅使用用Bullk 端端点传送送数据/命令/状态,CCBI 传输规规范则使使用Coontrrol/Bullk/IInteerruupt 三种类类型的端端点进行行数据/命令/状态传传送。后后两个子子规范则则定义了了存储介介质的操操作命令令。ATTA 命命令规范范用于硬硬盘,UUFI 命令规规范是针针对USSB 移移动存储储。 MMicrrosooft Winndowws 中中提供对对Masss SStorragee 协议议的支持持,因此此USBB 移动动设备只只需要遵遵循 MMasss Sttoraage 协议来来组织数数据和处处理命令令,即可可实现与与PC 机交换换数据。而而Flaash 的存储储单元组组织形式式采用FFAT116 文文件系统统,这样样,就可可以直接接在Wiindoows的的浏览器器中通过过可移动动磁盘来来交换数数据了,WWinddowss 负责责对FAAT166 文件件系统的的管理,UUSB 设备不不需要干干预FAAT166 文件件系统操操作的具具体细节节。 USB(HHostt)唯一一通过描描述符了了解设备备的有关关信息,根根据这些些信息,建建立起通通信,在在这 些些描述符符中,规规定了设设备所使使用的协协议、端端点情况况等。因因此,正正确地提提供描述述符,是是USBB 设备备正常工工作的先先决条件件。 LLinuux-22.6.26内内核中在在利用UUSB gaddgett驱动实实现模拟拟U盘时时主要涉涉及到、ss3c224100_uddc.cc等驱动动文件(这这些文件件的具体体结构,将将在下一一篇文章章中描述述)。此此时我们们想先从从这些代代码中找找到USSB描述述描述符符,从中中确定使使用的存存储类规规范,从从而确定定协议。确确定通讯讯协议是是我们调调试的基基础。 存储储类规范范是由接接口描述述符决定定的。接接口描述述符各项项的定义义义如下下: 其其中,bbIntterffaceeClaass、bbIntterffaceeSubbClaass、bbIntterffaceeProotoccol可可以判断断出设备备是否是是存储类类,以及及属于哪哪种存储储子类和和存储介介质的操操作命令令。 在在文件中中, /* UUSB prootoccol vallue = tthe traanspportt meethood */ #deffinee USSB_PPR_CCBI 0xx00 / CConttroll/Buulk/Intterrruptt #ddefiine USBB_PRR_CBB 0x001 / Coontrrol/Bullk ww/o intterrruptt #ddefiine USBB_PRR_BUULK 00x500 / BBulkk-onnly /* USBB suubcllasss vaaluee = thee prrotoocoll enncappsullatiion */ #deefinne UUSB_SC_RBCC 0x001 / Reeducced Bloock Commmannds (fllashh) #deffinee USSB_SSC_880200 00x022 / SFFF-880200i, MMCC-2, ATTAPII (CCD-RROM) #ddefiine USBB_SCC_QIIC 0xx03 / QIIC-1157 (taape) #ddefiine USBB_SCC_UFFI 0xx04 / UFFI (flooppyy) #deffinee USSB_SSC_880700 00x055 / SSFF-80770i (reemovvablle) #deefinne UUSB_SC_SCSSI 0x006 / Traansppareent SCSSI 默默认的情情况是: modd_daata = / Deffaullt vvaluues .trranssporrt_pparmm = "BBBB", .pprottocool_pparmm = ""SCSSI",默认的赋赋值如下下: bInnterrfacceCllasss=088 表示示:存储储类 bInnterrfacceSuubCllasss=0xx06 表示:透明的的SCSSI指令令 bbIntterffaceeProotoccol=0x550 表表示:bbulkk-onnly 传输 2、BBulkkOnnly 传输协协议下面面看看BBulkkOnnly 传输协协议:(详详细的规规范请阅阅读UUnivverssal Serriall BuusMaass Stooragge CClasssBuulk-Onlly TTrannspoort) 设备插插入到UUSB 后,UUSB 即对设设备进行行搜索,并并要求设设备提供供相应的的描述符符。在UUSBHHostt 得到到上述描描述符后后,即完完成了设设备的配配置,识识别出为为BullkOOnlyy 的MMasss Sttoraage 设备, 然后即即进入BBulkkOnnly 传输方方式。在在此方式式下,UUSB 与设备备间的所所有数据据均通过过BullkIIn和BBulkkOuut 来来进行传传输,不不再通过过控制端端点传输输任何数数据。 在这种种传输方方式下,有有三种类类型的数数据在UUSB 和设备备之间传传送,CCBW、CCSW 和普通通数据。CCBW(CCommmandd Bllockk Wrrappper,即即命令块块包)是是从USSB HHostt 发送送到设备备的命令令, 命命令格式式遵从接接口中的的bInnterrfacceSuubCllasss 所指指定的命命令块,这这里为SSCSII 传输输命令集集。USSB设备备需要将将SCSSI 命命令从CCBW 中提取取出来,执执行相应应的命令令,完成成以后,向向Hosst 发发出反映映 当前前命令执执行状态态的CSSW(CCommmandd Sttatuus WWrappperr),HHostt 根据据CSWW 来决决定是否否继续发发 送下下一个CCBW 或是数数据。HHostt 要求求USBB 设备备执行的的命令可可能为发发送数据据,则此此时需要要将 特特定数据据传送出出去,完完毕后发发出CSSW,以以使Hoost 进行下下一步的的操作。UUSB 设备所所执行的的操作可可用下图图描述: CBW的的格式如如下:dCBWWSiggnatturee: CBWW的标识识,固定定值:44342253555h (liittlle eendiian)。dCCBWTTag: 主主机发送送的一个个命令块块标识,设设备需要要原样作作为dCCSWTTag(CCSW中中的一部部分)再再发送给给Hosst;主主要用于于关联CCSW到到对应的的CBWW。 ddCBWWDattaTrranssferrLenngthh: 本次CCBW命命令要求求在命令令与回应应之间传传输的字字节数。如如果为00,则不不传输数数据。bbmCBBWFllagss: 反映数数据传输输的方向向,0 表示来来自Hoost,11 表示示发至HHostt; bbCBWWLUNN: 对于有有多个LLUN逻逻辑单元元的设备备,用来来选择具具体目标标。如果果没有多多个LUUN,则则写0。bCBWCBLength: 命令的长度,范围在016.CBWCCB: 传输输的具体体命令,符符合bIInteerfaaceSSubCClasss.中中定义的的命令规规范,此此处是SSCSII CSSW命令令格式如如下:dCSWWSiggnatturee: CSWW的标识识,固定定值:55342253555h (liittlle eendiian)dCSSWTaag: 设置置这个标标识和CCBW中中的dCCBWTTag一一致,参参照上面面关于ddCBWWTagg的解释释dCSSWDaataRResiiduee: 还需要要传送的的数据,此此数据根根据dCCBWDDataaTraansfferLLenggth本次已已经传送送的数据据得到 bCSSWSttatuus: 指示示命令的的执行状状态。如如果命令令正确执执行,bbCSWWStaatuss 返回回0 即即可。3、SCCSI指指令集Bulkk-Onnly 的CBBW 中中的CBBWCBB 中的的内容即即为如下下格式的的命令块块描述符符(Coommaand Bloock Desscriiptoor)。SSCSII-2 有三种种字长的的命令,66 字节节、100字节和和12字字节,MMicrrosooft Winndowws 环环境下支支持122 字节节长的命命令。 Opeerattionn Coode: 操作代代码,表表示特定定的命令令。高33 位为为Grooup Codde,共共有8 种组合合, 即8 个组,低低5 五五位为CCommmandd Coode,可可以有332 种种命令。 Loogiccol uniit NNumbber: 为了兼兼容SCCSI1 而而设的,此此处可以以不必关关心。 Loogiccal bloock adddresss: 为为高位在在前,低低位在后后的逻辑辑块地址址,即扇扇区地址址。第22 位为为高位,第第3、44、5 依次为为低位。 Trranssferr leengtth: 为为需要从从逻辑块块地址处处开始传传输的扇扇区数(比比如在WWritte 命命令中)。 Paarammeteer llistt leengtth: 为为需要传传输的数数据长度度(比如如在Moode Sennse 命令中中); Allloccatiion lenngthh: 为初初始程序序为返回回数据所所分配的的最大字字节数,此此值可以以为零,表表示不需需要传送送数据。 SSCSII指令集集的Diirecct AAcceessss 类型型存储介介质的传传输命令令有许多多, MMasss Sttoraage协协议只用用到了其其中的一一些。更更多的SSCSII指令参参见: 指令令代码 指指令名称称 说明 04hh Foormaat UUnitt 格式化化存储单单元 112h Inqquirry 索索取器件件信息 1Bhh Sttartt/Sttop looad/unlloadd 555h MModee seelecct 允许HHostt对外部部设备设设置参数数。 5Ahh Moode Seensee 向hoost传传输参数数 EEh Preevennt/AAlloow MMediium Remmovaal 写写保护 >288h Reead(110) Hosst读存存储介质质中的二二进制数数据 AA8h RReadd(122) 同同上,不不过比较较详细一一点 225h RReadd Caapaccityy 要求求设备返返回当前前容量 23hh Reaad FFormmat Cappaciity 查查询当前前容量及及可用空空间 033h Reequeest Seensee 请请求设备备向主机机返回执执行结果果,及状状态数据据 001h Reexerro UUnitt 返回回零轨道道 2BBh Seeek(110) 为设备备分配到到特定地地址 11Dh SSendd DDiaggnossticc 执行固固件复位位并执行行诊断 00hh TTestt Unnit Reaady 请求设设备报告告是否处处于Reeadyy状态 2FFh Veeriffy 在存存储中验验证数据据 2AAh Wrritee(100) 从从主机向向介质写写二进制制数据 AAhh Wriite(112) 同上,不不过比较较详细 2EEh Wriite andd Veeriffy 写二二进制数数据并验验证 对于不同同的命令令,其命命令块描描述符略略有不同同,其要要求的返返回内容容也有所所不同,根根据相 应的文文档,可可以对每每种请求求作出适适当的回回应。比比如,下下面是IINQUUIRYY 请求求的命令令块描述述符和其其返回内内容的数数据格式式:如:INQQUIRRY 命令描描述符: 返回数据据格式 Hoost 会依次次发出IINQUUIRYY、Reead Cappaciity、UUFI Modde SSensse 请请求,如如果上述述请求的的返回结结果都正正确,则则Hosst 会会发出RREADD 命令令,读取取文件系系统0 簇0 扇区的的MBRR 数据据,进入入文件系系统识别别阶段。 4、利用用USBB Viiew观观察结果果 可通通过USSB VVieww软件查查看到UUSB设设置阶段段获取到到的信息息。 二、出现的的主要问问题 在调调试过程程中遇到到了一个个问题。现现象是:在目标标板加载载完驱动动后,即即执行完完: # inssmodd g_ sstalll=00 reemovvablle=11 后,接接好USSB线。此此时在wwinddowss端设备备出有uusb stooragge设备备加入,但但出现不不了盘符符。 下面面记录下下调试过过程。三、调试试过程 根根据规范范,当完完成SCCSI指指令集中中Inqquirry 命命令时,可可以出现现盘符。所所以可以以通过bbushhounnd软件件查看通通讯过程程,找出出原因。 下面是利用bushound工具在出现问题时采集到的数据。 Dev Phase Data Info Time Cmd.Phase. Ofs - - - - - - 266 CTLL 80 06 00 01 - 000 000 112 000 GEET DDESCCRIPPTR 00us 1.1.00 266 DI 12 01 10 01 - 000 000 000 110 - 255 055 a55 a44 - 12 03 01 02 .%. 44.8mms 1.2.00 03 01 . 1.2.116 226 CTTL 800 066 000 022 - 00 00 09 00 GGET DESSCRIIPTRR 14uus 22.1.0 226 DII 099 022 200 000 - 01 01 04 c0 - 001 . . 3.99ms

    注意事项

    本文(LinuxUSBgadget设备驱动解析4443.docx)为本站会员(you****now)主动上传,得力文库 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知得力文库 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于得利文库 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

    © 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

    黑龙江省互联网违法和不良信息举报
    举报电话:0468-3380021 邮箱:hgswwxb@163.com  

    收起
    展开