WinCE 5.0下面SD卡驱动的开发。这是我做的第一个项目,当时做这个项目花费了相当的时间和精力,搞的我精疲力尽。几乎可以说当时对WinCE一点都不懂。也不知道从何处下手,就东看西看。东改西改,改的是一塌糊涂。幸好老板和老大都比较宽容,给了我充裕的时间和支持,将自己有关SD卡在WinCE 5。0下面的驱动理解的点滴给记录下来,希望能够对别人有所帮助。
    目前WinCE下面的驱动主要有两种架构,一种就是WinCE自带的三层架构(Host,BUS,Client)。另外就是直接将驱动写成Block驱动的形式,分真正的驱动和一个专门用来Loader的程序。本人用的微软自带的三层架构,下面将较为详细的介绍一下这种架构,以及如何在这种架构下来实现SD卡驱动。(建议大家做SD卡驱动前先将SD card的Spec看一下(下载SDSPEC),知道其的一些特性,主要包括初始化流程,那些命令是干什么的。还有就是有那些内部寄存器。这些寄存器又是又通过那些命令获得的,了解了这些才能再以后能有个好的调试。) 有关SD卡的一些规格(网上一大堆到处都又)本文将不做介绍,主要介绍其在WinCE下面的实现。
WinCE下面SD卡的架构如下图所示:

如图所示:最下面的是你的H/W部分,其中SD Host Controller是你的SD硬件控制器部分,你写驱动需要这部分的SPEC。接着上面的SD Host Controller Driver就是你需要实现的部分了,直接和你的控制器打交道。 而BUS层则是位于Host和Client之间的一层,主要用来进行两层之间的通信,并根据不同的设备来加载不同的Client驱动,如果是SD Memory卡就加载SD Memory。如果是具有WIFI功能的SDIO卡就会加载这个SDIO WIF驱动。
     驱动BUS Driver和Client Driver均由微软提供,但是不是微软自己写的。貌似是一个叫什么BSQUARE公司开发的。其中BUS层的代码位于C:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDBUSDRIVER下面。(C:/WINCE500是你安装WinCE的目录)。而Client端的代码位于C:/WINCE500/PUBLIC/COMMON/OAK/DRIVERS/SDCARD/SDCLIENTDRIVERS下面,其下面微软带了一个两个Client 驱动(BLUETOOTH 和 SDMEMORY)。下面介绍各层的主要功能,BUS层主要是:枚举板上的卡,并决定他们的类型(MMC, SD Memory or SDIO),配置合适的电流给卡,根据注册表的值加载clients,把总线要求入队列,把来自host controller的异步通知入队列,总线要求完成,SDIO 中断,设备插入/拔出,出错时重试等功能。
其主要的处理流程主要在sdhceventhandlers.cpp中的handleAddDevice()中,在这里面包括了卡的识别,卡的上电,卡的种类的识别,加载Client端的驱动等工作,在调试的时候,可以在这里面添加一些Debug信息,看初始化出要出错出在哪里,并根据相应的回应来驱动为什么出错。其中 
    while (NULL != pCurrentDevice) 
   {
        // try to load devices
        CSDBusDriver::SDLoadDevice(pCurrentDevice);
        pCurrentDevice = pCurrentDevice->pNext;
    }
     这段主要就是用来根据上面得到的信息来Load Client端驱动的。其中如果仅仅是存储卡的话,就会load SDMemory.dll。而如果是SDIO WIFI卡的话,就会load相应的WIFI Client端驱动。其中初始化的流程主要就在这个函数里面实现:
   主要的命令有:CMD5----CMD55/CMD41---CMD2--CMD3等等,具体的CMD参考SD的SPEC。这些命令均有BUS层下给HOST Controller层的。
   其中Host Controller层主要实现将命令下给H/W,并且得到相应的Response,把这些response按照相应的格式放到某个Buffer中,传给bus层,由bus层来处理。bus层就是根据这些response来确定卡的类型,卡的大小,卡的传输速度,卡的一些属性的。
    卡的读写: 文件系统的读写会先到SDMemory层,SDMemory先将CardIO转化为DISKIO然后通过BUS层传递给Host Controller,其中读写主要由CMD17和CMD18,以及CMD24和CMD25。在完成每一次BUS层的处理之后,都要想BUS层发送一个BUSRequest Handle Complete事件,通知BUS层读写操作已经完成。读写操作需要用到DMA操作,这里需要COPY动作,因为DMA需要物理地址,而层传下来的BUF是虚拟地址。
      以上部分,大概是WinCE下面SD卡驱动的大概,有很多地方都没有讲解清楚。拖了这么久才写完。唉,好多东西还不是很明白,有什么问题,希望大家交流,

wince下SD卡驱动开发相关推荐

  1. 【SD卡】关于DJYOS下SD卡驱动开发详解

    关于DJYOS下SD卡驱动开发详解 王建忠 2011/6/21 1      开发环境及说明 硬件平台:tq2440(CPU: s3c2440) 操作系统:DJYOS1.0.0 1.1    说明 T ...

  2. CE下基于Zylonite硬件平台的SD卡驱动开发

    摘要:本文结合实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)对嵌入式系统Windows CE5.0的底层驱动(SD卡)的架构进行了分析和研究,以MARVELL公司提供的基于IN ...

  3. Linux SD卡驱动开发(五) —— SD 卡驱动分析Core补充篇

    Core层中有两个重要函数 mmc_alloc_host 用于构造host,前面已经学习过,这里不再阐述:另一个就是 mmc_add_host,用于注册host 前面探测函数s3cmci_probe, ...

  4. SD卡驱动开发随笔(1)

    前不久刚写完SD卡驱动,最后的运行和读写文件效果自己也比较满意以下是性能测试结果 ----------------------------------------------------------- ...

  5. STM32下SD卡驱动详解

    http://hy907539007.blog.163.com/blog/static/1888458622012932656384/ 自己在这几个月中为了毕业设计放下了对S3C2440的学习,从而着 ...

  6. Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇

    回顾一下前面的知识,MMC 子系统范围三个部分: HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的. CORE 部分: 这是整个MMC 的核心存,这部分完成 ...

  7. Linux SD卡驱动开发(六) —— SD卡启动过程总体分析

    一.工作流程 mmc驱动主要文件包括 drivers/mmc/card/block.c drivers/mmc/card/queue.c drivers/mmc/core/core.c drivers ...

  8. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  9. linux sd卡驱动教程,Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

最新文章

  1. .net应用程序如何批上XP的外衣?
  2. spring_在基于Spring的Web应用程序中使用Http Session
  3. Fibonacci in the Pocket
  4. 在Visual Studio中使用任何C++编译器
  5. [react] 写出React动态改变class切换组件样式
  6. Python --之练习题
  7. MySQL语句集锦(持续更新)
  8. SpringCloud-路由网关(Zuul)
  9. QT分析之网络编程(七)
  10. 关于Spring Cloud Config服务器介绍
  11. poj2594 Treasure Exploration 二分匹配之最小路径覆盖+传递闭包
  12. 历代Windows版本
  13. Face photo recognition using sketch (人脸画像合成)
  14. Android应用分类
  15. Latex 公式左对齐
  16. craig gentry_为Craig投票!
  17. 怎么搭建自己的内测分发平台?
  18. Win7系统打印机不能打印的问题
  19. 阅读--收集--尝试
  20. Unity打包Android项目报错

热门文章

  1. 韩顺平c语言视频笔记,韩顺平视频笔记
  2. 如何对列表/元组进行排序(列表/元组)?
  3. markdown编辑器_Markdown编辑器
  4. 目标检测中的多尺度特征
  5. Python---复制文件夹
  6. 爬取全球疫苗接种信息可视化分析(已修改)
  7. 天津大学大作业管理概论答案
  8. mysql与oracle实现行转列并指定分隔符
  9. C++中的char,char*,char[]
  10. 网易2018校园招聘编程题真题集合3字符串碎片