基于PocketPC的CF卡驱动程序设计

本文介绍了基于PocketPC的CF卡驱动程序设计方法,重点阐述了CF卡设备的驱动结构和设计原理,以及使用实现CF+协议的接口芯片TL16PC564的系统设计。同时探讨了CF卡的即插即用问题,并给出一个CF卡PocketPC驱动及应用程序和驱动交互的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
基于PocketPC的CF卡驱动程序设计
[ 作者:任少辉,王 超,李 杰,杨宗平,邹 勇     转贴自:INTERNET     点击数:2816     更新时间:2005-8-8     文章录入:Admin
  Abstract: This paper describles the design of CF Card(Compact Flash) driver on PocketPC, and especially explains the implementation method , the principle of design and structure of CF card driver , the system design that uses the interface chip TL16PC564 which provides all the functions necessary for CF+ protocol, and the problem of PnP(Plug and Play). In final we give an implementation of the CF card driver and the communication between the application and the driver.
  
Key Words: PocketPC Stream Interface Driver  CompactFlash Card  Plug and Play(PnP)
 
   摘  : 本文结合CF(Compact Flash)卡驱动的设计,重点阐述了PocketPC驱动程序的设计方法、CF卡设备的驱动结构和设计原理,介绍了使用实现CF+协议的接口芯片TL16PC564的系统设计,探讨了CF卡的即插即用问题,并且给出了一个CF卡PocketPC驱动及应用程序和驱动交互的实例。
   关键词: PocketPC  流接口驱动  CF卡 ;即插即用
 
1. 概述
在信息和咨讯快速更新的今天,掌上电脑以其方便和易携带性开始得到广泛应用,如在服务行业、导航系统、金融、证券、保险等领域。在掌上电脑高端市场中,由微软开发的嵌入式操作系统 WinCE发展迅速,占有较高的比例。Pocket PC2002采用定制化的Windows CE 3.0操作系统,由Microsoft开发专用于个人数字手持设备。
   为方便扩展,基于 PocketPC 的掌上电脑向用户提供了CF卡通用扩展槽,利用该接口,可设计不同的CF卡实现不同的应用,如CF MODEM卡、CF 网卡、CF数据采集接口卡等。在CF卡的设计中,基于PocketPC 的驱动程序设计非常关键,直接影响着CF卡的性能。本文结合CF卡驱动的设计,介绍了PocketPC驱动程序的设计方法、CF卡设备的驱动结构和设计原理,探讨了CF卡的即插即用问题,并且给出了一个CF卡PocketPC驱动的设计及应用程序和驱动交互的实例。

2.  基于PocketPC的CF卡驱动设计
2.1. PocketPC驱动简介
   Windows CE 3.0 是微软公司针对嵌入式系统开发的实时操作系统,具有可以独立开发的内核和设备驱动程序模型, PocketPC是针对掌上电脑的定制化的WindowsCE操作系统,其驱动模型与Windows CE一致。
   PocketPC 驱动程序模型以静态连接库(.lib文件)或动态连接库(.dll文件)形式实现。支持四种驱动程序类型: Native driver(本机驱动)、Stream Interface driver(流接口驱动)、USB driver和NDIS driver(网络驱动)。本机驱动是指本地设备的驱动程序。如点触式面板,显示器,键盘,发光二极管,电池等的驱动。USB和NDIS驱动模型分别是针对USB设备和网络协议驱动实现。流接口驱动程序是为连接基于Windows CE的平台的外围设备而设计的,包括串口、 PC卡,CF卡等[1]。      
2.2. CF卡驱动架构和原理
   设计 CF卡驱动程序的主要任务是实现PocketPC应用程序对CF卡系统硬件的访问,实现CF卡设备的管理和即插即用。应用程序对CF卡硬件的访问需要考虑驱动程序的体系结构、应用程序与驱动程序的交互、驱动层的中断处理等问题。CF卡即插即用问题涉及设备管理程序、设备文件名等等。
2.2.1. 流接口驱动程序的系统结构
   PocketPC 中CF卡驱动程序的设计对应模式是流接口驱动。流接口驱动程序是一个管理外围设备的DLL,它把设备表示为文件系统的一个特殊文件,主要任务是把外设的使用传递给应用程序。PocketPC 的设备文件存在固定的路径//Windows下,以一个特殊的命名惯例来区分设备文件和其他文件。
   流接口驱动程序接收设备管理器和应用程序通过系统调用的命令,并且封装所有命令,转换成控制设备适当的动作信息。图一表示CF卡的流接口驱动程序和其他系统部件间的相互关系:
 
流接口驱动程序通过内部硬件访问外围设备。对 CF卡而言,内部设备是CF卡插槽,由内置CF卡插槽驱动程序驱动,而CF卡插槽驱动程序提供编写CF卡流接口驱动程序的插槽接口函数。即CF卡的设备驱动程序使用CF卡服务库(由CF卡插槽接口函数组成),CF卡服务库控制CF卡插槽硬件。
2.2.2.实现即插即用

   PocketPC中,中断、I/O端口等系统资源被操作系统接管,并由其根据情况进行智能的分配,当设备连接到掌上电脑时,操作系统能自动识别并启动相应的驱动,这就是即插即用。为实现PocketPC的CF卡即插即用,必须理解两个概念:设备管理程序(Device Manager,DM)和设备文件名。
2.2.3.编写CF卡接口驱动程序DLL

   设备管理程序属于用户层程序,与内核,注册表和流接口驱动程序DLL 相互作用并实现特定功能(见图一),从而实现设备的即插即用。
   DM 执行下列任务[1]:
   a. 初始化驱动程序的加载。
   在系统启动或收到用户在基于 PocketPC 平台上增加外围设备的信息时,开始加载相应驱动;
   b. 向内核注册设备文件名。
   该文件名把应用程序使用的流 I/O函数映射到流接口驱动程序的对应函数;
   c. 启动相应的驱动程序
   通过从外围设备获得即插即用标识符或激活一个检查模块为外围设备寻找合适的设备驱动程序;
   d. 自动卸载设备驱动程序
   通过读写注册表值加载和跟踪驱动程序,当不再需要设备时卸载其驱动程序。
   B)设备文件名 
   应用程序通过文件系统里的特殊入口访问外围设备。
   PocketPC 的文件系统可以识别特殊文件名并重定向文件IO操作到适当的流接口驱动程序。
   设备文件名前缀由三个大写字母组成,用来识别与特殊流接口驱动程序相对应的特殊设备文件名。文件名前缀存储在注册表的相应驱动程序的键值中。在用户生成流接口驱动程序时,必须指定这三个前缀字母。
  C)  即插即用
   驱动加载过程就是对中断、 I/O端口等系统资源进行系统分配的过程。此过程与DM和设备文件名紧密相关。
   a. 加载流接口驱动
   CF 卡加载流接口驱动有两种方法:
   第一种加载的类型是在 DM自动检测到CF卡与PocketPC平台的连接时进行的。
   第二种加载的形式是在 DM不能自动检测到CF卡与平台的连接时,使用该CF的应用程序必须列出该外围设备的驱动程序,即主动调用Register Device( )或者Activate Device( )函数实现驱动的加载。
   即插即用时驱动的加载是采用第一种类型。 实现CF卡即插即用,首先下位机需要修改相应的CIS(Card Information Structure),在驱动中添加检测模块,并且在注册表添加设备注册信息。
   
当系统开启或者 CF卡插入槽后,DM会调用在注册表中设置的检测模块检测插卡类型,如果符合,则会加载相应的驱动。检测模块写成DLL的形式, 调用CF卡插槽接口函数检测CIS中的数据,判断是否对应设备。如果对应,则告诉DM需要加载注册表中指定的相应设备的驱动程序。
   b. 卸载流接口驱动
   流接口驱动根据加载驱动的方式用两种方式分别卸载。
   DM自动加载的设备,当检测到CF卡从插槽拔出时,DM从HKEY_LOCAL_MACHINE/Driver/Active键中删除相应驱动程序项,并调用DeregisterDevice函数从文件系统中删除相应外围设备的文件名,同时通知FreeLibrary函数卸载DLL。
   对应用程序主动加载的驱动设备,应用程序必须在 DLL存在前通过调用函数DelregisterDevice来卸载DLL
2.2.3.编写CF卡接口驱动程序DLL
   CF 卡驱动程序使用CF卡插槽接口函数实现驱动。对每个驱动程序而言,其所要求的标准的入口点用来实现标准文件IO函数和电源管理函数,这些函数由WinCE操作系统的内核使用。这些标准入口点为:XXX_Close, XXX_Denit, XXX_Init, XXX_IOControl, XXX_Open,XXX_ PowerDown, XXX_PowerUp, XXX_Read, XXX_Write等[3]
   生成一个 DLL之前,必须用设备文件名前缀替换入口点名字中的XXX,以对应不同的设备驱动。

3.  CF卡驱动程序设计实例
3.1.CF卡系统设计
   要实现标准的 CF Card,硬件上关键在于接口的实现。我们应用的是Texas Instrument公司的TL16PC564接口芯片来简化设计并使其符合CF+标准。设计方案如图二所示:
 

3.1.1. TL16PC564接口芯片介绍 
  
TL16PC564 接口芯片提供了在子系统串行数据和CF卡并行接口数据之间的串并转换功能[2]。在下位机子系统中,MCU负责处理由上位机和外部系统的数据流交互。此系统结构可以制作各种功能的CF IO卡:如MODEM卡,网卡等。
  
TL16PC564 的接口芯片功能模块如图三所示。
芯片中的 CF Card的属性空间由256字节的CIS和8字节的CCR(卡配置寄存器)组成。该CIS和CCR利用主机CPU和子系统都可访问的DPRAM实现。系统上电时,由子系统负责完成对CIS的初始化。
   TL16PC564 接口芯片的主要特性:
   1) 集成了符合CF+标准的TL16550的PCMCIA接口逻辑,该逻辑提供了外设与CPU之间的数据串并转换功能。
   2) 256字节的CIS和8字节的CCR由DPRAM代替EEPROM,使修改和更新CIS和CCR更加容易。
   3) 提供了完全可编程的串行接口特性。
   4) 可选的串行旁路模式可以使子系统能直接并行访问接收和发送FIFO,使系统设计更加灵活,提高了子系统和主系统CPU间数据传送吞吐率。
3.1.2. TL16PC564接口芯片在多功能CF卡中的设计实现
   CF卡而言,实现CF卡功能的软件设计包括两个方面,一方面是CF card侧MCU对CIS的初始化及数据采集和计算,另一方面是主机侧的驱动程序。在CF Card正常工作前,必须由卡上的MCU对设备进行初始化,即将CIS信息写入属性空间,从而经过主机识别,使主机明确CF Card 的应用类型。      
   在实际设计中,TL16PC564硬件设置为旁路模式,上下位机通过访问FIFO,实现数据的交互。对上位系统驱动而言,数据的发送等价于对TL16PC564的FIFO写数据,当数据的FIFO写满之后,配合16650的控制逻辑,下位系统获得数据到的消息,从而将FIFO的数据读出,完成系统数据通讯下行的流程。上行流程与下行流程类似。由于TL16PC564硬件设置为旁路模式,使下位机可以直接访问FIFO,可以提高通讯速率。我们在实现上下位机通讯过程中,定制了高效的通讯规则,使上下位机数据交互速率最优化,经过测试,系统通讯速度达:56k byte/s。下位系统的MCU可以直接访问FIFO,可以选择不同的集成多功能的MCU或者添加外围模块,实现多种通道的数据的采集和控制。系统设计时,可定制完善可*的通讯规约,实现系统对各种数据通道的控制和访问,达到多功能卡设计的目的。
3.2.CF卡驱动程序的实现
   实现 PocketPC2002的CF卡驱动,即采用EVC3.0+PocketPC SDK ,在EVC里编译代码,生成DLL,然后导入到PocketPC的//Windows目录下,并添加注册表信息,实现即插即用。以上是制作驱动的完整流程[3]
3.2.1.实现流接口驱动的标准接口(设备文件名取CFC)
  A)CFC_Init 
   DM 调用RegisterDevice或Activate Device进入此模块。通过XXX_Init()的返回值判断CF卡初始化是否执行成功。此模块完成以下功能:
   a. 初始化CF卡硬件。
   b. 分配资源。
   c. 注册回调函数,当设备状态变化,则操作系统调用此回调函数CardRegisterClient。
   d. 分配IO资源,调用CF卡插槽驱动接口函数实现。
   e. 注册中断函数,调用CardRequestIRQ( )函数。
   f. 配置CF卡寄存器。
   B)  CFC_Deinit 
   系统DM调用此模块卸载CF卡。需要做的工作是释放申请的资源等。
   C) CFC_Open 
   应用程序调用Createfile时进入此模块,主要是分配资源,数据结构的初始化。
   D) CFC_Close 
   应用程调用API接口CloseHandle(hFile)进入此模块,关闭CF卡的驱动。
   E) CFC_Read 
   应用程调用API接口ReadFile进入此模块,读取CF卡数据。
   F) CFC_Write 
   应用程调用API接口WriteFile进入此模块,向CF卡写数据。
   G)CFC_IOControl 
   应用层调用DeviceIoControl( )进入此模块。
3.2.2. 驱动中断处理
   PocketPC 处理中断的方法是在处理XXX_Init调用的过程中让流接口驱动程序生成一个新的线程,这个线程叫做中断服务线程(IST)。在中断发生时,OS就给IST发信号。CF卡驱动程序的IST从CardRequestIRQ函数接受信号。因为内建CF卡插槽的驱动程序得到由CF卡插槽生成的原始中断,所以PC卡驱动程序并不直接处理中断。在中断发生时,进入CardReguestIRQ指定的PC卡插槽驱动程序调用的回调函数。
3.3. 应用程序与驱动交互
   PocketPC 对设备的操作是采用文件操作实现的。应用层可以调用以下API接口函数对设备进行操作:
   Createfile( ) :创建设备文件
   ReadFile( ) :  读取设备数据
   WriteFile( ) :  放送数据至设备
   DeviceIOControl( ) :  其他的相关操作
   CloseHandle( ) :  关闭设备文件
   应用程序经由 CreateFile( )打开和存取CF卡驱动程序,产生一个对CF卡驱动程序中CFC_Open( )的调用,驱动程序返回一个句柄,然后该句柄被常规的Win32文件功能所用,如WriteFile( )和ReadFile( )。调用WriteFile( )和ReadFile( )分别对应驱动程序的CFC_Write( ),和CFC_Read( )模块。最后,CloseHandle( )调用驱动程序的 CFC_Close( )模块释放内部资源。
3.4.驱动程序的安装
   驱动程序的安装并不只是一个 DLL,包括需要用到的数据文件、配置文件,和添加事先定义好的注册表项[4]。以下是添加系统注册表例子:
[HKEY_LOCAL_MACHINE/Drivers/CFC]
"Dll"="CFCDriver.dll"
"Prefix"="CFC"
   驱动安装过程是将驱动程序“CFCDriver.dll”文件存到POCKET PC中//windows目录下,并且修改注册表,制作安装包可以采样SDK中自带的工具实现。

3 结束语
   本文给出了基于 PocketPC的CF卡驱动程序的设计思路和程序架构,其中具体实现代码限于篇幅,不再文中赘述。基于不同硬件设计,采样相同的驱动框架和设计方法,可以制作不同的CF IO卡,实现多种功能。
参考文献

1. [美]Douglas Boling 著, Programming Windows CE 北京大学出版社 1998[3]
2. TL16PC564. TL16PC564BLV  PCMCIA Universal As Ynchoronous Reciever Transmitter. Texas Instruments, 1998[2]
3. [美]Terence A.Goggin 著 尤滔 张平 周晓权 等译, Windows CE高级开发指南.电子工业出版社 2000,[5]
4. [美]Chris Muench 著 精英科技 译,Windows CE 权威指南,中国电力出版社,2001,[11]
\CF_IDE_Exemple\uCOSII_FAT_CF 演示程序所在文夹 \CF_IDE_Exemple\uCOSII_FAT_CF\arm uC/OS-II ARM7 LPC22xx移植代码 \CF_IDE_Exemple\uCOSII_FAT_CF\SOURCE uC/OS-II V2.52源代码(由于版权原因我们不能提供) \CF_IDE_Exemple\uCOSII_FAT_CF\file \CF_IDE_Exemple\uCOSII_FAT_CF\file\ZLG.FS ZLG/FS文管理系统源代码所在文夹 \CF_IDE_Exemple\uCOSII_FAT_CF\file\ZLG.FS\ATA.c CF存储卡基于ZLG/FS文管理系统的驱动入口文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\ZLG.FS\Fat.h ZLG/FS文管理系统所需的头文,在该文中配置文系统参数 \CF_IDE_Exemple\uCOSII_FAT_CF\file\ZLG.FS\OSFile.h ZLG/FS文管理系统基于uC/OS-II所需的头文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\ZLG.FS\Test.c 本例程的任务文,main()函数在该文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\uCOSII_FAT_CF.mcp ADS1.2打开的工程文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\CF_IDE CF存储卡驱动所在文夹 \CF_IDE_Exemple\uCOSII_FAT_CF\file\CF_IDE\IDE.C CF存储卡驱动源代码文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\CF_IDE\IDE.H CF存储卡驱动需包含的头文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\CF_IDE\SysATA.C 与系统硬相关的源代码文(CF存储卡驱动与系统函数接口) \CF_IDE_Exemple\uCOSII_FAT_CF\file\CF_IDE\SysATA.H 与系统硬相关的头文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\src 创建的工程模板相关文所在的文夹 \CF_IDE_Exemple\uCOSII_FAT_CF\file\src\config.h 配置头文,包含工程中所需的头文 \CF_IDE_Exemple\uCOSII_FAT_CF\file\src\OS_CFG.H uC/OS-II V2.52配置文,事数、任务数等在此配置 \CF_IDE_Exemple\uCOSII_FAT_CF\file\uCOSII_FAT_CF_Data\Debug\uCOSII_FAT_CF.axf AXD软调试时装载的文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值