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

摘要:本文结合实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)对嵌入式系统Windows CE5.0的底层驱动(SD卡)的架构进行了分析和研究,以MARVELL公司提供的基于INTEL Zylonite硬件平台的BSP为基础,利用Windows CE5.0的Platform Builder集成开发环境(IDE)开发适合实际项目的SD卡驱动代码,分别以轮询和中断方式实现该驱动的动态加载,并深入分析SD卡驱动(流驱动)的详细的加载过程。 
关键词:Zylonite  Platform Builder   BSP  SD卡驱动 

0
、引言

随着通信领域新业务需求的不断增长及计算机技术,半导体技术和电子技术的术的迅速发展,嵌入式系统异军突起,已经渗透到社会生活的方方面面了。它是集软件,硬件于一体的高可靠性系统。其最大特点即为可以通过裁减装卸系统模块来配置整个平台所要求的功能。


         Windows CE
是由微软公司所开发的一个嵌入式操作系统,它与Windows平台的编程接口有很强的兼容性。其平台开发工具Platform Builder是一个完全集成的开发环境(IDE)。本项目所涉及的硬件开发套件Intel Zylonite Development System装配有IntelXscale芯片处理器Monahans L(PXA300),并配有相关外设电路接口(USB2.0SD/MMC,音频,以太网口等)及外设(触摸屏,KEYPAD,扬声器,听筒,话筒等)。其独特的结构优化能力保证了操作环境和通用应用设备可以在高频率和的情况下快速处理任务。

 

1 WINCE 下的SD卡驱动架构

Wince SD卡驱动协议栈组成 

u       HOST硬件底层部分 (主控制端驱动)       SDHC_XXX.DLL

u       BUS 中间逻辑命令层 (总线驱动)                     SDBUS.DLL

u       CLIENT上层(客户端驱动)                              SDMEMORY.DLL

 

1.1主控制端驱动

 

     主控制端驱动控制包含主控制器硬件,遵循主控制端驱动接口,它被用于总线驱动通信和设置操作参数。主控制器驱动接口提供一个硬件提取层,在总线和主控制端执行之间。即:SDHC_XXX.DLL是最底层,因为这层是硬件关联层,因此取名XXX便是为了对应的具体的硬件BSP包(如本项目的硬件平台是ZYLONITE,其硬件供应商给的BSP包名即为ZYLONITE,在实际项目中我们便将SDHC_XXX.DLL取代为SDHC_ZYLONITE.DLL),它负责具体的发命令,大多数情况下都需要修改。

1.2总线驱动

总线驱动作为提取和管理层处于主控制驱动和客户端驱动之间。它包括在SDbus.dll文件。为客户端驱动提供了标准的API,允许运行在任何的基于windows ce设备。总线驱动将是独立于应用程序和主控制端驱动,在不同的处理器之间移植,并不需要改动。SDBus.dll是中间层,负责整合命令和管理。

1.3客户端驱动

客户端驱动和SD客户端驱动通信接口允许客户端驱动去和SD设备通信。客户端驱动接口是有计划地抽象SD总线物理设备的执行,提供了客户端驱动最大的弹性。客户端驱动接口允许客户端驱动去衡量一个单一的,同步的访问存储卡驱动使用一个线程,异步通信设备驱动。SDMemory.dll是最高层,类似于应用层。

 

2.立足微软SD卡协议栈开发Zylonite BSP包的SD卡驱动

当我们开发SD卡驱动时,并详细分析比较了MicrosoftSD驱动架构和Intel所提供的BSP内的参考SD卡驱动以后,可以得出如下结论:

l         针对主控制端驱动(SDHC_XXX.DLL):因为这一层是直接操作硬件的一层,所以大多数情况下都需要修改。修改的内容基本为收发命令部分以及数据传输和硬件初始化部分.

l         针对总线驱动(SDBUS.DLL):因为这一层处于主控制驱动和客户端驱动之间,用于他们之间的通信,SD卡总线请求都放在它里面,微软提供了非常完备的样例代码,所以我们一般都不需要改动,直接调用它的接口就可以了。

l         针对客户端驱动( SDMEMORY.DLL):因为SDMemory就是所谓的Client层,类似于应用层,它还可用来识别卡的,不同种类的卡,比如sd memory card等,鉴于我们只需开发SD卡部分的驱动,所以也不需要怎么修改了(如果我要开发SD接口的SDIO设备,那么就得在这层做比较大的改动了)。

Intel所提供的BSP内的参考SD卡驱动自己实现了主控制端驱动(SDHC_ZYLONITE.DLL),而调用并保留了总线驱动(SDBUS.DLL)和客户端驱动( SDMEMORY.DLL)。因此结合具体的硬件设计(SD卡的CONNECTOR等),我们的主要任务便是利用BSP内的SD卡主控制端驱动代码,开发(配置并改进)我们实际项目内的SD卡驱动。

2.1、Zylonite BSP内的SD主控制端驱动概述

SD卡的驱动程序是以流的形式提供的,而该SD主控制端驱动以sdhc_zylonite.dll 的形式提供,入口在:\WINCE500\PLATFORM\Zylonite\public\csp\monahans\sdhc

有如下两个文件:

l         sdcontrol.c:内含一个非常重要的线程---SDControllerISTHandler,         

                主要负责卡与控制器的交互,处理控制器接收的消息等,具体的控制和处理函数均在此文件中。

l         main.c:      SDH(主控制端驱动)的导出流接口在该文件中实现,并   

                     包含有主控制端驱动的(sdhc_zylonite.dll)的入口点。

SD卡硬件初始化及其主控制端驱动的注册表信息设置路径为:

 \WINCE500\PLATFORM\Zylonite\Platform\ZYLONITE\SRC\DRIVERS\SDHC

主要文件为:

l         impl.c: 主要是在加载SD卡主控制端驱动时初始化硬件。内含一个非

 常重要的线程---- SDCardDetectIstThread,专门处理SD卡的插拔操作。但是具体的插拔操作也是在Sdcontrol.c文件实现的。

2.2、结合实际项目的开发流程

2.2.1 SD卡的外部引脚及功能配置

在实际项目(一款以WINCE为操作系统内核的GSM/PHS双模智能手机)中,SD卡的外部引脚与Monahans_L的GPIO连接图及连接控制器的电路图如下所示:


 


    由上可得,先要配置SD卡的外部引脚及功能。SD卡的引脚配置在其下的 \source 文件夹的xllp_mmc_board.c文件XllpMMCConfigure函数内修改。(特别注意:GPIO34要配成检测SD卡插入的中断源。)

2.2.2、分析修改并改进主控制端驱动重要线程及硬件初始化部分代码

l         SD卡主控制端驱动加载及架构解析

需要声明的是SD卡驱动加载顺序是:

加载SDBus.dll→加载sdhc_zylonite.dll→加载sdmemory.dll

我们在这里只详细讨论第2步(sdhc_zylonite.dll的加载),此时SDBus.dll已经加载成功。WINCE系统初始化后,会载入DEVICE.EXE, 对应代码devload.C中的WINMAIN函数会被调用起来,从而启动InitDevice函数,此函数会搜寻(\WINCE500\PLATFORM\Zylonite\Platform\ZYLONITE\SRC\DRIVERS\SDHC下的sdhc_zylonite.reg)注册表根键,准备参数调用WIN32 API接口-----Activedevice,接着利用Dllmaincrtstartup函数找到sdhc_zylonite.dll的入口,执行该文件的入口函数DllMain()然后继续返回到DEVICE.EXE(devload.C),调用launchdevice()函数,再调用sdhc_zylonite.dll的入口main.c文件内的SDH_Init(),自此将开始将开始SD卡主控制端驱动的初始化过程:

1. 调用SDH_Init()

2. 调用 SDHCDAllocateContext() 来分配一段主控制器的上下文

a)Context 是总线驱动和主控制端驱动共享的

3. 主控制端驱动使用SDHCDSetXxx宏来填充这个上下文结构

a)这个步骤是把主控制器向总线驱动描述一下

b)包括函数指针,支持的电流,最大时钟,槽数目,SDIO的支持等等。

4. 调用 SDHCDRegisterHostController() 来把自己向总线驱动注册一下

5.  当总线驱动准备处理SD事件时,它会调用主控制端驱动的init 函数(pContext->pInitHandler)

接着便是sdbus.dll驱动部分的代码和SD卡主控制端驱动部分的交互设置:比如设置电源、时钟和总线宽度等。一般都是sdbus.dll发起请求,再去调用主控制端驱动部分的API,这里最后详细分析插槽状态交互确认,因为这是成功加载sdhc_zylonite.dll的关键。当有SD卡在插槽,sdbus.dll的slotstatuschange()调用并建立一个重要线程SDcardDetectIstThread(),当探测到有卡,即返回给sdbus.dll, 总线驱动即可调用HandleAddDevice()函数,自此初始化结束,sdhc_zylonite.dll加载成功。

l         对主控制端驱动重要线程SDcardDetectIstThread()代码的改进

在前面的叙述中,可以看出线程SDcardDetectIstThread()在sdhc_zylonite.dll最后的加载起决定性作用。然而我们发现在INTEL所给的BSP中,在检测卡的过程里,其采用了轮询的方式----即每隔一定的时间,CPU都会去读一次GPIO34的电平,以确定SD卡是否被插入或拔出,以此来判定是否去加载或卸载SD卡的客户端和主控制端驱动。很显然,这种方式的弊端是占用了过多的CPU资源,效率很低,严重影响了整个系统的实时性。因此,最能解决这个问题的办法无外乎是使用中断检测的方式。以下特别叙述采用2种不同的中断机制的方式实现:

1中断绑定静态配置:

1.在Bsp_cfg.h文件内定义一个系统中断号SYSINTR_SDMMC_DETECT

#define SYSINTR_SDMMC_DETECT (SYSINTR_FIRMWARE+N) N为当前已定义的最大值(以保证此中断未使用过)。

2.在Xllp_gpio_plat.h文件中找出GPIO34的定义:#define XLLP_GPIO_MMC_CD_0 34

3.在intr.c文件里将系统中断号和IRQ关联:

OALIntrStaticTranslate(SYSINTR_SDMMC_DETECT, IRQ_GPIO_SHARE(XLLP_GPIO_MMC_CD_0));

4.在主控制端驱动的硬件初始化代码Impl.c中的InitializeHardware()加入 EnablesdcardInterrupt()函数。

5.在Impl.c中完善EnablesdcardInterrupt(),加入GPIO上升沿或下降沿的检测和SET EVENT。  

6.在Impl.c文件中定义hCardInsertInterruptEvent并在SetupCardDetectIST()内创建hCardInsertInterruptEvent

7.Impl.c文件中初始化dwSysintrCD= SYSINTR_SDMMC_DETECT,并绑定相应的EVENT:InterruptInitialize    (dwSysintrCD,hCardInsertInterruptEvent,NULL,0)

8.     改进线程SDcardDetectIstThread()的While部分代码,加入WaitForSingleObject( hCardInsertInterruptEvent, dwTimeout );只有当hCardInsertInterruptEvent被置上,才会往下走,否则一直在此处等待。

9.同上原理改写CardremoveInterrupt用于动态卸载SD卡主控制端驱动。

2中断绑定动态配置:

1.               在Impl.c文件的SetupCardDetectIST()函数内动态配置系统中断号和硬件中断源:KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwSDCDIrq, sizeof(DWORD), &(dwSysintrCD), sizeof(DWORD), NULL))。此处的&dwSDCDIrq可在SD卡主控制端驱动的注册表内更改后,用LoadPlatformRegistrySettings函数加载进来。可在sdhc_zylonite.reg 文件内将"CardDetectIRQ" 的值改为“IRQ_GPIO_SHARE_BASE+x-2” 在本平台内,IRQ_GPIO_SHARE_BASE=52,X=34。

2.               接上5-6-7-8-9。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pthread-win32在VC2005下的使用

pthread-win32是一个在Win32环境下的Unix POSIX线程库的移植. 有了它, 可以比较方便的移植Unix/Linux多线程程序到Windows下. 在VC2005下使用也很简单: 下载, 地址是 http://sourceware.org/pthreads-win32 里面include目录中是头文件, lib目录中是.lib和.dll文件. 在VC项目的属…

【转】apt命令

转自:apt命令详解 - 简书 apt命令可以说是Ubuntu系统下最为重要的命令,安装、更新、卸载软件,升级系统内核都离不开apt命令。 一、apt的简介 apt的全称是Advanced Packaging Tool是Linux系统下的一款安装包管理工具。 最初的时候&#xff…

maple 2018 窗口关闭提示乱码_如果解决SOLIDWORKS工程图转CAD字体出现乱码的问题_SolidWorks生信科技...

操作SOLIDWORKS工程图转CAD时,由于SOLIDWORKS使用的是Windows字体,而CAD使用的是线性字体,字体就容易出现乱码的苦恼。一般出现乱码是因为字体映射里面没有中文,所以会导致乱码。遇到这种情况,只需找到字体映射文件&am…

【转】apt 和 apt-get的区别

转自:https://www.sysgeek.cn/apt-vs-apt-get/ Ubuntu 16.04 发布时,一个引人注目的新特性便是 apt 命令的引入。其实早在 2014 年,apt 命令就已经发布了第一个稳定版,只是直到 2016 年的 Ubuntu 16.04 系统发布时才开始引人关注…

准确检测图像的轮廓 opencv_图像处理案例实战

1. 切边源图像: 需求:扫描仪扫描到的法律文件,需要切边,去掉边缘空白,这样看上去才真实,人工操作成本与时间花费高,希望程序自动实现,高效、准确。 实现思路:边缘检测 轮…

pp助手苹果版_再见!PP助手iOS端即将下线 曾是中国最大的苹果助手

苹果PP助手即将下线 在今日PP助手官方发布公告:尊敬的PP助手iOS版用户:衷心感谢您多年以来对我们的支持及厚爱。因业务调整,PP助手将于2020年2月28日正式下线iOS版产品,包括PP助手iOS版、PP助手iOS PC版等。 对您造成的不便还望理…

oppo手机工程模式清除数据需要密码_手机隐藏的快捷键都有哪些?

手机从开发出来到现在,已经换了很多代了,从大哥大,小灵通,到诺基亚到山寨机到苹果到华为,几十年过去了。手机从奢侈品一下飞去每个人手里,反正我手机有手机已经快10年了,所以我相信每个人对自己…

关于竖表转横表的问题

本文作者:dinya内容摘要:在开发过程,经常遇到一些将表的显示方式进行转换的需求,我们习惯性称之为竖表到横表的转换,本文通过一个例子来简要说明常见的两种竖表转横表的问题。本文适宜读者范围:oracle初级&…

全系光谱完整版

宇宙射线也叫电磁波,其中包含γ射线、X射线、紫外线、可见光、红外线、近红外、远红外,还有无线电和超声波。 无线电波是振荡电路中自由电子作周期性的运动产生的. 红外线、可见光、紫外线是原子外层电子受激发产生的. X射线是原…

cat 几行_迷风花说Cat!Cat因为林教练是好教练回去现实却给了一巴掌

滔博TES前主教练迷风花26日发布了微博,就自己离职、Cat林教练事件以及汤汤纵情转会事件进行了澄清,网友粉丝们在看到教练迷风花发布的微博后,更加了解了很多事情的真相,粉丝们纷纷对教练迷风花送上了祝福,教练迷风花到…

前端和后端的英文_计算机专业的本科生在前端、后端、测试和运维之间该如何选择...

首先,对于计算机专业的同学来说,在选择发展方向的时候往往会遇到一些困惑,当前随着计算机技术体系的不断壮大,计算机领域的岗位分类也越来越细化,而且在新技术的推动下,还在不断出现新的岗位,比…

医学影像后处理技术超详细收藏版(上)

转自:医学影像后处理技术超详细收藏版(上) 导语: 医学图像后处理是通过综合运用计算机图像处理技术,医学知识,将由各种数字化成像技术所获得的人体信息按照一定的需要在计算机上表现出来,使之…

【转】VTK和ITK中的坐标系统

当我们在处理医学图像和应用时,一个问题就是坐标系统之间的不同。在图像应用中通常有三个坐标系,分别是世界坐标系,解剖坐标系和图像坐标系。 每种坐标系目的不同,呈现数据的方式也不一样。 解剖坐标系由三个平面组成,…

(ZT)在日本市场推广 iPhone 应用的经验

原贴:http://www.cocoachina.com/appstore/market/2010/0728/1942.html 本文作者为 CocoaChina 会员 “lawrencewu”,是一位专攻日本市场的 iPhone 开发者。他的10款 App (9个收费,一个免费)在9个月的时间里已经取得了…

嵌入式系统 Boot Loader 技术内幕

1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入…

互联网医院 2020年突出成就_【关注】中国社科院发布2020中国医院互联网影响力排行榜...

导 读:11月4日,中国社科院健康业发展研究中心联合好大夫在线,发布2020中国医院互联网影响力排行榜,这是该榜单连续第5年发布。中国社科院健康业发展研究中心以好大夫在线平台611.6亿次的患者浏览轨迹、6648万患者的在线问诊记录、4.7亿次医…

h5链接加上 vconsole_又出爆款!凯美瑞和红旗H5没法比!

论舒适性而言,三厢版车型的优势还是十分明显的。基本可以满足日常商务用途和家用等多种用车环境。今天带来的两款车都是三厢车,分别是红旗H5和宝马1系。那这两款车究竟是骡子是马,还是让大家一起来看看它们的实际表现吧。车型:红旗…

HDOJ 1010 HDU 1010 Tempter of the Bone ACM 1010 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋题目地址:http://acm.hdu.edu.cn/showproblem.php?pid1010 题目描述:代码Tempter of the BoneTime Limit: 2000/1000MS (Java/Others) Memory Limit: 65536/32768K (Java/Others)Total Submission(s): 16817Accepted …

console application_灵活使用 console 让 js 调试更简单

摘要: 玩转console。原文:灵活使用 console 让 js 调试更简单作者:前端小智Fundebug经授权转载,版权归原作者所有。Web 开发最常用的高度就是 console.log ,虽然 console.log 占有一席之地,但很多人并没有意…

a byte of python中文版_面试官问 Python 版 “垃圾回收”机制,我没答上来

点击“开发者技术前线”,选择“星标?”13:21 在看|星标|留言, 真爱选自《萌萌哒的柯基》 作者:heroyfhttps://www.heroyf.club/2019/10/23/python_gc/前言对于python来说,一切皆为对象,所有的变量赋值都遵循着对象引…