欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    MMCSD卡驱动程序的设计通信10123赵翔.docx

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

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

    MMCSD卡驱动程序的设计通信10123赵翔.docx

    ARM嵌入式系统课程设计-MMC/SD卡驱动程序设计班级:通信100l学号:3100601023:翔指导老师:清华2012. 6. 30课程设计时间:2013.6.24大学第一章引言1.1课程设计目的O第二章课程设计平台构建与流程11.1 嵌入式系统开发平台构建11.2 课程设计流程11.3 课程设计硬件结构与工作原理1第三章BOOtlOader移植与下载33. 1源代码安装33.1 源代码分析移植与编译33.2 下载4第四章LinUX核移植与下载54. 1LinUX核源代码安装54.2LinUX核源代码分析与移植64.3LinUX核编译与下载6第五章课程设计功能模块驱动程序设计145. 1MMC/SD卡模块注册初始化:145. 2设备文件操作接口定义155. 3MMC接口初始化155.1 GPIO初始化函数165.2 SD移除操作函数175. 6读数据块操作175.7写数据块操作18第六章根文件系统建立与文件系统下载206. 1根文件系统分析206.2 文件系统映像文件生成206.3 文件系统下载216.4 功能模块运行与调试23第七章完成课堂上布置的三个思考题25第八章课程设计总结与体会278.1课程设计中遇到的问题以与解决方法278.2总结和体会27第一章引言1.1 课程设计目的1) 了解PXA27X微处理器GPlO的功能2) 了解MMC卡驱动程序的架构与编程方法3)掌握MMC卡的使用方法1.2 课程设计任务与要求1)理解基于LinUX的嵌入式系统交叉开发环境,对嵌入式系统的开发流程有详细的了解;2)掌握开发工具链的构建方法,能独立进行系统开发操作;3)掌握LinUX的常用命令,在IinUX系统下能熟练的使用这些常用命令;4)熟悉IinUX核的知识以与原理,掌握定制LinUX核的方法;5)基于LinUX操作系统,以与XSBaSe270ARM实验开发平台一套,把MMC存储卡挂载目标板上并进行文件的复制操作。第二章课程设计平台构建与流程2.1 嵌入式系统开发平台构建1) 装有LinllX操作系统的PC机一台;2) XSBase270ARM实验开发平台一套3) MMC存储卡一块2.2 课程设计流程1) BootIoader移植与下载2)Linux核移植与下载3)功能模块程序设计与交叉编译4)根文件系统建立与文件系统下载2.3 课程设计硬件结构与工作原理1)目标板的MMC卡硬件接口目标板的MMC/SD卡的硬件接口如图1.1所示,根据PXA27x的MMC/SD/SDIO控制器的信号功能以与PXA27x的GPlo的功能分配,命令控制线MMCMD与GPlOlI2相连,此时引脚GPIOlI2必须配置成转换功能1(AlternateFunction1)的输入或输出方式(具体参考PXA27X开发手册),时钟端MMCLK利用了通用10口GP1032转换功能1输出方式,4位总线MMDATO到MMDAT3分别与GPI011KGPI0110.GPlOlO9和GP1092相连,都时使用了通用IO口的转换功能1的榆入或输出方式。图1.2为MMC/SD卡的供电电路图。图1.1目标板的MMC/SD卡的硬件接口VCC_5R232U102;-MMC-PWR-ENMIC5207C13O.1UFC12IOuFVlN VOUTSHDN BPGNDMMC PWR:C14O.1UF图1.2MMC/SD卡的供电电路图2) PXA270的MMC/SD/SDIO控制器PXA270的MMC/SD/SDIO控制器在访问PXA270处理器的软件与MMC存储堆和支持MMC、SD与SDIO通信协议之间充当联结作用。PXA27x的MMC控制器协议规遵守多媒体卡系统规V3.2MultiMediaCardSystemSpecificationVersion3.2);MMCSDSDlo控制器采用标准的MMC传输协议或串行通信接口SPl协议模式。访问PXA270的软件使用MMC传输协议或SPl模式作为与MMC控制器通信的协议。目标板的SD驱动程序采用了MMC通信传输协议。3) MMC卡的通信协议主机与MMC卡的所有通信都是由主机发起,主机发出广播和点对点两种类型通信命令,在广播通信命令中,主机发出的命令被所有的卡接受,只有部分命令需要响应;而在点对点通信命令中,命令被发送到具体地址的卡中,并由该卡对所接受的命令做出响应。第三章Bootloader移植与下载3.1 源代码安装先将D:emdorEELiod_V4_SDK目录下的Linux-2.4复制到虚拟机里root的主文件夹中,然后用如下指令进行解压:rootubuntu:-#IsDesktopHBHInfsroot公共的视Ml文档音乐ftpminicomogsetQTEenv.sh模板BB片下依桌面ootUbUntU:#cdLinux-2.4rootubuntu:Linux-2.4#Isroot(ubuntu:Linux-2.4#cdBootloaderrootubuntu:Bootloader#ISBoot-XSBase27.tar.gzrootubuntu:Bootloader#tarzxvfBoot-XSBase27.tar.gzBoot-XSBase27/利用上述命令解压后,bootloader源代码解压到当前目录中BooLXSBase270文件夹中。3,2源代码分析移植与编译在解压的目录里进行make编译。rootIocaIhostBootLoader!$cdBoot-XSBase270rootubuntu:Boot-XSBase270#makecIeanrootubuntu:Bootloader#cdBoot-XSBase27rootubuntu:Boot-XSBase276#makecleanInfileincludedfromcontest.c:l:include/stdio.h:7:warning:conflictingtypesforbuilt-infunction/putcrootiIbUntu:BootXSBase278#InakerootIocaIhostBoot-XSBase270$makerootubuntu:BootXSBase278#makeClean编译完成后,在当前目录下会生成bootloader映象文件boot。3.3下载打开实验台电源,启动H-JTAG和H-FlaSher,在H-FlaSher中装载配置文件pxa270.hfc,点击PrOgramming中的CheCk,ScrFiIe选择D:emdorEELiod_V4_SDKLinu-2.4images中的boot文件,点击PrOgram,烧写成功后点击Verify校脸。4.1 第四章LinUX核移植与下载4.2 1.inUX核源代码安装核解压rootgubuntu:-#IsDesktopH11fsroot公共的视频文档音乐ftpminicom.logsetQTEenv.sh模板BB片下黄桌面rootubuntu:-#cdLinux-2.4rootubuntu:Linux-2.4#Isrootubuntu:Linux-2.4#cdBootloaderrootubuntu:Bootloader#IsBoot-XSBase27.tar.gzrootubuntu:Bootloader#tarzxvfBoot-XSBase270.tar.gz1.inUX核源代码分析与移植1.inUX提供三个不同的命令进行LinUX的配置,效果完全一样:makeconf i g控制台命令行方式配置命令make menuconf i g文本菜单方式配置命令makexconf i gX窗口图形界面方式配置命令其他部分命令:Make mrproper命令清除所有的旧的配置和旧的编译目标文件等。Make dep命令搜索LinUX编译输出与源代码之间的依赖关系、并生成依赖文件。Make cIean清除以前构造核时生成的所有目标文件、模块文件和临时文件。Make zImage编译LinUX核,生成压缩的核映像文件。4.3 3LinUX核编译与下载D核解压root(aubuntu:*#cdtmprootubuntu:tmp#Isorbit-rootssh-BpZKUh1536vmware-root<eyring-16YzTppulse-vrwfNI5pSMMH<Jiff!FOOtgubuntu:tmp#ISorbit-root门ceyring-16YzTppulse-VrwfNISpSMMHvmware-root1.inux-2.4.21-51Board_EDR.tar.gzssh-BpZKUh1536rootubuntu:tmp#tarzxvflinux-2.4.21-51BoardEDR.tar.gzlinux-2.4.21-51BoardEDR/2)核配置rootubuntu:tmp#cdlinux-2.4.21-51BoardEDRrootubuntu:linux-2.4.21-51Board_EDR#makemrpropermakel:正在进入目录'/tmp/IinUX-2.4.21-51BOardEDRarcharmboot'rm-fImageXipImageZlmagebootplmagemake2:正在进入目录'tmplinux-2.4.21-51BoardEDRarcharmbootcompressed,rootubuntu:linux-2.4.21-51Board_EDR# make menuconfigNo architecture defined. You may want toconfig, ebsallconfig, footbridgeconfig, No architecture defined. You may want to config, ebsallconfig, footbridgeconfig, rm -f include/asmuse a pre-packaged config.etc.use a pre-packaged config, etc.make a5lmake a5lLinUX针对MMC/SD核配置的步骤:(1)在主菜单下选择LOadabIemOdUIesupport>*EnableLoadablemoduleSupport利用模块可将不常用的设备驱动或功能作为模块放在核外部,必要时动态地调用。操作结束后从存中删除,这样可以有效地使用存,同时也可减小了核的大小。模块可以自行编译并具有独立的功能,即使需要改变模块的功能,也不用对整个核进行修改。文件系统,设备驱动,二进制格式等很多功能都支持模块。一定要选择(按空格键)SetversioninformationonaIISymboIsformodules利用这个功能能够让核使用其它核版本模块或没有包含在此kernel的特殊的模块。一般选择N。*KerneImoduleLoader这个设置使kernel对模块处于常备状态。在不使用InSmOd或rmmod命令情况下,kernel程序自动将需要执行的模块调用到存中,一定时间不使用该模块时自动将其从存删除,一般要选择*。(2)再回到主菜单下选择GeneraIsetup>选择“Supportforhot-pluggabledevices”,出现"MMCSDdevicedriversv:点击''MMCSDdevicedrivers",进入下一页选择:LinuxKernelv2.4.21-rmkl-pxal-xsbase27ConfigurationArrowkeysnavigatethemenu.<Enter>selectsHighlightedlettersarehotkeys.Pressing<Y><M>modularizesfeatures.Press<Esc><Esc>toLegend:built-inexcluded<M>modulesubmenus->.includes,<N>excludes,exit,<?>forHelp.<>modulecapable!三()*ompressedbootloaderinROM/flash(NEW)OmpressedROMbootloaderbaseaddress(NEW)ompressedROMbootloaderBSSaddress(NEW)upportCPUclockchange(EXPERIMENTAL)(NEW)CIdevicenamedatabaseupportforhot-pluggabledevicesCMClA/CardBusSUPPortIC/SDdevicedrivers*NtworkingsupportystemVIPCSelect<Exit><Help>用向下的箭头,选择LOadanAlternaeConfigurationFiIe选项,输入配置文件名archarmdef-configsxsbase270,退出并保存。2)配置完成后,重新编译核,需要输入以下指令:rootubuntu:IinUX2.4.2151BoadEDR#makederootubuntu:Linux-.21-51BoardEDR#ma生成的zlmage存放路径为:(三)ooo%二图标视图0jQIJmIX24KerneIjIinUX24.2151Board一EDRIarChIannlboot,oot臬面bootp Compresse instalLsh Makefile Zlmage文件系统网络次盘驱动器olll将zImage拷贝到tftpboot文件夹下:rootubuntu:linux-2.4.21-51Board_EDR#cparch/arm/boot/zlmage/tftpboot/.f3)核烧写重新打开一个终端,输入命令:rootubuntu:minicom然后重启开发板电源,Terminal文件(f)编辑直看他)搜索(三)终端(I)帮助出)Support:http:/www.51BVersion:l.ee.3flash:base=x,size=x2Ethportcanaccess,thebaseaddressisxc3G9EthchipisLAN91C111autobootinprogress,pressanykeytostop.Bootdelay2secondsautobootaborted.=OperationMenu=ConianndLinemode1 Viewcurrentconfiguration2 Bootp3 DownloaddefaultKernel(zlmage)4 FlashKernel5 DownloaddefaultFilesystem(rootfs.img)6 FlashFilesystem7 Bootsystem8 Rebootsystem9 Resettofactorydefaultconfigurationa SetdefaultKernelfilenameandFilesystemfilenameb Setbootdelaytimec Help(togetalistofcommands)PIeaSeenteryourSeIeCtion:看到Boot启动信息后按任意键启动BoOt的OPeratiOnMenu,我们需要用这个boot嵌工具下载核。然后再提示信息PleaseenteryourseIection后面输入2,获取本地IP地址:Pleaseenteryourselection:2mymacaddressis00:08:0C:81:1D:90trytosendbootppacket.replypacketisreceivedfromubuntu(192.168.10)myipaddressis192.168.5=OperationMenu=ComanndLinemode1 Viewcurrentconfiguration2 Bootp3 DownloaddefaultKernel(zlmage)4 FlashKernel5 DownloaddefaultFilesystem(rootfs.img)6 FlashFilesystem7 Bootsystem8 Rebootsystem9 Resettofactorydefaultconfigurationa SetdefaultKernelfilenameandFilesystemfilenameb Setbootdelaytimec Help(togetalistofcommands)可以看到OPeratiOnMenu菜单上方显示:Myipaddressis192.168.O.50,则表示板载LinUX与UbUntU服务器连接成功。输入3,下载核文件ZImage(在Ubuntu的文件系统的/tftpboot/目录中)下载成功后选择4,烧写核。Pleaseenteryourselection:3tftpstart.myipaddress:192.168.5serveripaddress:192,168.0.100filename:zlmagestoreat:0×A00800loadingstart.1256088(0x0132A98)bytesreceived.done.=OperationMenu=ComanndLinemode1 Viewcurrentconfiguration2 Bootp3 DownloaddefaultKernel(zlmage)4 FlashKernel5 DownloaddefaultFilesystem(rootfs.img)6 FlashFilesystem7 Bootsystem8 Rebootsystem9 Resettofactorydefaultconfigurationa SetdefaultKernelfilenameandFilesystemfilenameb Setbootdelaytimec Help(togetalistofcommands)Pleaseenteryourselection:4eraseat0x00040-xl7ffff:done,writeatx004000-xl72a97withxa8:done.=OperationMenu=0ComanndLinemode1 Viewcurrentconfiguration2 Bootp3 DownloaddefaultKernel(zlmage)4 FlashKernel5 DownloaddefaultFilesystem(rootfs.img)6 FlashFilesystem7 Bootsystem8 Rebootsystem9 Resettofactorydefaultconfigurationa SetdefaultKernelfilenameandFilesystemfilenameb Setbootdelaytimec Help(togetalistofcommands)第五章课程设计功能模块驱动程序设计5.1MMC/SD卡模块注册初始化:staticint_devinitmmc_pxa_moduIe_init(void)(intret=-ENODEV;#ifdefCONFIG_ARCH_RAMSESRAMSES_MMC_ON();udelay(1000);#endifhost=mmc_register(MMC_REG_TYPE_HOST,&pxa_mmc_controlIer_tmpl_rec,sizeof(pxa_mmc_hostdata_rec_t);/registertheSDdeviceif(!host)MMC,DEBUG(MMC_DEBUG_LEVELO,failedtoregisterwithMMCcoren");gotoerror;)ret=O;error:returnret;)5.2设备文件操作接口定义staticmmc_controlIer_tmpl_rec_tpxa_mmc_controller_tmpl_rec=(owner:THIS_MODULE,name:"PXA250",bIock_size_max:PXA_MMC_BLKSZ_MAX,nob_max:PXA_MMC_NOB_MAX,probe:pxa_mmc_probe,init:pxa_mmc_init,remove:_devexit_p(pxa_mmc_remove),update_acq:pxa_mmc_update_acq,init_card_stackpxa_mmc_init_card_stack,check_card_stack:pxa_mmc_check_card_stack,setup_card:pxa_mmc_setup_card,stream_read:pxa_mmc_stream_read,read_block:pxa_mmc_read_bIock,read_mblock:pxa_mmc_read_mbIock,stream_write:pxa_mmc_stream_write,write_bIock:pxa_mmc_write_bIock,write_mbIock:pxa_mmc_write_mbIock);5.3MMC接口初始化staticintpxa_mmc_init(mmc_controller_tctrIr)(intret="ENODEV;pxa_mmc_hostdata_thostdata=(pxa_mmc_hostdata_t)ctrIr->host_data;*1.aIlocatebuffer*/hostdata->iobuf.iodata=kmalloc(PXA_MMC_IODATA_SIZE,GFP_ATOMIC);/2Kif(!hostdata->iobuf.iodata)(ret=-ENOMEM;gotoerror;)*2.initializeiobuf*/hostdata->iobuf.bIksz=PXA_MMC_BLKSZ_MAX;*currentbIocksizeinbytes1024*/hostdata->iobuf.bufsz=PXA_MMC_10DATA_SIZE;*buffersizeforeachtransfer*/hostdata->iobuf.nob=PXA_MMC_BLOCKS_PER_BUFFER;*numberofblocks*/*3requestirq*/if(request_irq(IRQ_MMC,pxa_mmc_irq,0,"MMC",ctrIr)MMC_ERR0R(,failedtorequestIRQ_MMCn");gotoerror;)*4initGPIOaboutMMC/SD/SDI0*/init_gpio();CKEN=CKEN12_MMC;*enableMMCunitclock*/ret=0;gotoout;error:kfree(hostdata->iobuf.iodata);out:returnret;J5.4 GPlO初始化函数staticvoidinit_gpio(void)(GPCR1=0x1;/clearpi32GPDR1=GPDR1(1«0);/configpin32asoutputGAFR1_L=(GAFR1_L&0xfffffffc)(2«0);/)pin32isusedforfunction2->MMCLK/MMDATOPIN92GPSR2=Ox10000000;/pin92configuredasanoutput,setpinlevelhigh(one).GPDR2=Ox10000000;/pin92asoutput/GPDR2=GPDR2&(1<<28);GAFR2_U=(GAFR2.U&Oxfcffffff)(1<<24)pin32isusedforfunction1->MMDAT<0>/MMDAT1PIN109GPSR3=(1<<13);GPDR3=(1<<13);GAFR3_L=(GAFR3,L&0xf3ffffff)(1<<26);/MMDAT2PIN110GPSR3=(1<<14);GPDR3=(1<<14);GAFR3_L=(GAFR3,L&Oxcfffffff)(1<<28);/MMDAT3PIN111GPSR3=(1<<15);GPDR3=(1<<15);GAFR3_L=(GAFR3_L&0x3fffffff)(1<<3O);/MMCMDPIN112GPSR3=OxOOO1OOOO;GPDR3=0x00010000;/GPDR3=GPDR3&*(1<<16);GAFR3.U=(GAFR3_U&Oxfffffffc)(1«0);/function1GPSR3=0x0000e000;/PIN111-PIN109GPDR3=0×0000e000;GAFR3.L=(GAFR3,L&0x03ffffff)0x54000000;)5.5 SD移除操作函数/removetheMMCthenfreesystemresourcestaticvoidpxa_mmc_remove(mmc_controller_tctrIr)(pxa_mmc_hostdata_thostdata=(pxa_mmc_hostdata_t)ctrIr->host-data;kfree(hostdata->iobuf.iodata);*1)freebuffer(s)*/free_irq(IRQ_MMC,ctrIr);*1)releaseirq*/CKEN&="CKEN12_MMC;*disableMMCunitclock*/)5.6读数据块操作staticintpxa_mmc_read_bIock(mmc_controller_tctrIr,mmc_data_transfer_req_ttransfer)(intret=-ENODEV;u16argh=OUL,argl=OUL;*sendCMD16(SET_BLOCK_LEN)whenrequestedblocksizeisnotthedefault*forthecurrentcard*/if(transfer->bIksz!=ctrIr->stack.seIected->info.read_bI_Ien)argh=transfer->bIksz»16;argl=transfer->bIksz;if(ret=pxa_mmc_stop_bus_cIock(ctrIr)gotoerror;MMC_CMD=CMD(16);*SET_BLOCK_LEN*/MMC_ARGH=argh;MMC_ARGL=argl;MMC_CMDAT=MMC_CMDAT_R1;MMC_DEBUG(MMC_DEBUG_LEVEL3,"CMD16(0x%04x%04x)n",argh,argl);if(ret=pxa_mmJCOmPlete_cmd(ctrIr,MMC_R1,FALSE)gotoerror;)*CMD17(READ_SINGLE_BLOCK)*/argh=transfer->addr»16;argl=transfer->addr;if(ret=pxa_mmc_stop_bus_cIock(ctrIr)gotoerror;MMC_CMD=CMD(17);*READ_SINGLE_BLOCK*/MMC_ARGH=argh;MMC_ARGL=argl;MMC_CMDAT=MMC_CMDAT_R1MMC_CMDAT_READMMC_CMDAT_BLOCKMMC_CMDAT_DATA_EN;MMC_NOB=1;MMC_BLKLEN=transfer->blksz;MMC_DEBUG(MMC_DEBUG_LEVEL3,*,CMD17(0x%04x%04x)n",argh,argl);if(ret=pxa_mmJCOmPlete_cmd(ctrIr,MMC_R1,FALSE)gotoerror;*transferthedatatothecalIersuppliedbuffer*/if(ret=pxa_mmc_read_buffer(ctrIr,transfer->blksz)<O)/transfer->bIkszgotoerror;if(ret=pxa_mmc_copy_frofn_buffer(ctrIr,transfer->type,transfer->buf,ret)<O)gotoerror;transfer->buf÷=ret;transfer->cnt-=ret;transfer->nob-=1;pxa_mmc_set_state(ctrIr,PXA_MMC_FSM_END_IO);if(ret=pxa_mmc_compIete_io(ctrIr,transfer->cmd,transfer->mode)gotoerror;ret=0;error:returnret;12 .7写数据块操作staticintpxa_mmc_write_bIock(mmc_controller_tctrIr,mmc_data_transfer_req_ttransfer)(intret=-ENODEV;u16argh=OUL,argl=OUL;*sendCMD16(SET_BLOCK_LEN)whenrequestedbIocksizeisnotthedefault*forthecurrentcard*/if(transfer->blksz!=ctrIr->stack.seIected->info.read_bI_Ien)fargh=transfer->blksz»16;argl=transfer->blksz;if(ret=pxa_mmc_stop_bus_cIock(ctrIr)gotoerror;MMC_CMD=CMD(16);*SET_BLOCK_LEN*/MMC_ARGH=argh;MMC_ARGL=argl;MMC_CMDAT=MMC_CMDAT_R1;MMC_DEBUG(MMC_DEBUG_LEVEL3,CMD16(0x%04x%04x)n",argh,argl);if(ret=pxa_mmJComPlete_cmd(ctrIr,MMC_R1,FALSE)gotoerror;)*CMD24(WRITE_SINGLE_BLOCK)*/argh=transfer->addr»16;argl=transfer->addr;if(ret=pxa_mmc_stop_bus_cIock(ctrIr)gotoerror;MMC_CMD=CMD(24);*WRITE_BLOCK*/MMC_ARGH=argh;MMC_ARGL=argl;MMC_CMDAT=MMC_CMDAT_R1MMC_CMDAT_WRITEMMC_CMDAT_BLOCKMMC_CMDAT_DATA_EN;MMC_NOB=1;MMC_BLKLEN=transfer->blksz;MMC_DEBUG(MMC_DEBUG_LEVEL3,CMD24(0x%04x%04x)n",argh,argl);if(ret=pxa_mmc_compIete_cmd(ctrIr,MMC_R1,FALSE)gotoerror;*transferthedatatothecalIersuppIiedbuffer*/if(ret=pxa_mmc_copy_to_buffer(ctrIr,transfer->type,transfer->buf,transfer->cnt)<O)gotoerror;if(ret=pxa_mmc_write_buffer(ctrIr,ret)<O)gotoerror;t

    注意事项

    本文(MMCSD卡驱动程序的设计通信10123赵翔.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开