第六章 WINCE5 SD驱动彻底解析.doc

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?以前也曾经写过类似的文章,但是每次调试到sd的时候都会有些许收获,在此就来个全乎的吧,哈哈! 一,? MS SD驱动架构 在代码分析之前很有必要先看一张图,这样至少可以大致了解模块的作用,也可以知道该模块内的源文件甚至函数是为谁服务的。 ? ? 这张图,初次见到的时候没有怎么在意。不过通过阅读源代码的时候,才发现这张图真真切切的反映了真个代码的调用流程。很清晰而又简明直接的一张图。 从图上,我们可以看出从APP到硬件的执行有3层,首先hardware部分我们可以先不用理会,而clients的上半部分也可以先不用理会,因为那是MS在系统中已经做好了。好了,剩下的也就是图中的深红色的部分。 通常,对于软件驱动工程师来说,这剩下的部分可以分为3个层次:SDclient,SDbus,SDhc。MS对Wince下的sd驱动也是这么划分并分目录存放的。源代码在\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\SDCARD目录下。牛也吹了,下面的部分我们就分别来介绍这3层,主要以详细的函数调用流程为主,请在阅读本文的时候对照源代码一起分析。 一,? SD主机控制器驱动(SDHC) ???? 首先在开始之前有必要说一下,这里之所以要先介绍SDHC驱动这部分,主要是因为,该层是直接与硬件SDHC打交道的,并且与上一层的SDBUS驱动交互。这里必然提供了很多接口来支持SDBUS的服务(当然SDBUS也提供了很多的接口来支持SDHC),从功能的实现方面讲,上层的功能函数调用最终是要调用到最底层驱动的函数,以实现与硬件的交互。 ? ???? 地球人都知道,这些驱动最终展示给系统的真面目是DLL文件。那我们要分析它们的源代码也最好从它的入口函数DllEntry或者说从包含该函数的文件开始。为了具体一些,这里以s3c2440的sdhc为例分析。Come on! [sdhc\sdhcbase\sdhcmain.cpp] BOOL DllEntry(HINSTANCE hInstance, ULONG Reason, LPVOID pReserved) { BOOL fRet = TRUE; if(Reason == DLL_PROCESS_ATTACH) { DEBUGREGISTER(hInstance); DisableThreadLibraryCalls( (HMODULE) hInstance ); if( !SDInitializeCardLib() ) { fRet = FALSE; } else if( !SD_API_SUCCESS( SDHCDInitializeHCLib() ) ) { SDDeinitializeCardLib(); fRet = FALSE; } g_fRegisteredWithBusDriver = FALSE; } if(Reason == DLL_PROCESS_DETACH) { SDHCDDeinitializeHCLib(); SDDeinitializeCardLib(); } return(TRUE); } 虽然DllEntry函数都是千片一律的,但是这里还是给了我们两个突破口,如上蓝色部分。SDInitializeCardLib这个函数没有什么特别之处,总是能返回true。不过从这里我们知道了有SDCARD_API_FUNCTIONS g_SDClientApiFunctions这么个全局的结构体变量,从字面上可以大致猜测其目的,留待分析。SDHCDInitializeHCLib这个函数缺是个重量级的初始化函数。 [public\common\oak\drivers\sdcard\sdhclib\sdhclib.cpp] static SDHOST_API_FUNCTIONS g_SDHostFuncs; // SDHCDInitializeHCLib - Initialize the host controller library // // Return: SD_API_STATUS // Notes: Call from DLL entry // SD_API_STATUS SDHCDInitializeHCLib() { #ifdef DEBUG memset(g_SDHostFuncs, 0xCC, sizeof(g_SDHostFuncs)); #

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档