http://www.mcu123.com/news/Article/rtos/WinCE/200607/88.html

引言

  随着以计算机技术、通信技术和软件技术为核心的信息技术的迅速发展,嵌入式系统在各行业得到了广泛的应用,极大地推动了行业的渗透性应用。嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”,由嵌入式硬件和嵌入式软件两部分组成。嵌入式软件包括嵌入式操作系统和嵌入式应用软件。Microsoft的桌面操作系统已经为人们熟悉和使用,嵌入式的操作系统 Windows CE.net也日益风行。Windows CE.net是Microsoft推出的功能强大的紧凑、高效、可伸缩的32位嵌入式操作系统,主要面对各种各样的嵌入式系统和产品。该系统所具有的多线程、多任务、完全抢占式的特点是专为各种具有严格资源限制的硬件系统所设计的。为了将操作系统和硬件设备连接起来,联系硬件和软件的驱动就显得很重要。

  下面主要针对三星公司ARM9内核的芯片S3C2410进行分析,介绍在Windows CE.net系统下进行底层设备驱动开发的方法并提供I2C通信的实例。

1 I2C通信协议及S3C2410芯片介绍

  I2C(Inter Integrated Circuit)总线是1980年由Philips公司推出的。 I2C总线用两条线(SDA和SCL)在总线和装置之间传递信息,在微控制器和外部设备之间进行串行通信或在主设备和从设备之间进行双向数据传送。两条通信线通过上拉电阻被拉升至+5 V。在控制系统中的每个集成电路可以通过一个CMOS缓冲器来读每一条线路,也可以通过一个栅极开路的FET管将每一条线的电平下拉。因此,对每个芯片来说,每条线既是输入线,又是输出线。

  I2C总线遵从同步串行传输协议,即各位串行(一位接一位)发送,由时钟(clock)线指示读数据(data)线的时刻。每个数据包前有一个地址,以指示由哪个器件来接收该数据。

  S3C2410是一款基于ARM920T的16/32位RISC微处理器,主要用于手持设备,拥有高性价比,低功耗等特点,也是目前市面上出现较多的嵌入式开发板的处理器之一。芯片拥有16 KB的指令和数据缓存器,有存储管理单元(MMU)、LCD控制器、3个串口、4路DMA、4个时钟定时器、8路10位的A/D转换;支持I2C、 I2S、SPI、主从USB等接口以及SD/MMC卡。

  S3C2410微处理器的I2C总线可以处于下面4种模式下:主接收模式、主发送模式、从接收模式和从发送模式。处理器对I2C进行的操作,主要是对下面的几个寄存器进行读/写:

  ◇ IIC控制寄存器,IICCON(物理地址0X54000000,内存映射后的虚拟地址);
◇ IIC控制/状态寄存器,IICSTAT(物理地址0X54000004);
◇ IIC数据寄存器,IICDS(物理地址0X54000008);
◇ IIC地址寄存器,IICADD(物理地址0X5400000C)。

   本设计主要是CPU工作在主模式下与下面的I2C接口设备进行通信。

2 Windows CE系统驱动特点

  Windows CE.net驱动有两种模型:本机设备驱动程序和流接口驱动程序。本机设备驱动适于集成到基于Windows CE.net平台的设备。这些设备驱动程序是一些硬件所必需的,是由原始设备制造商创建的,用以驱动如键盘、触摸屏、音频设备等,往往在设备售出后就不会再更换,如通用LED驱动、电源驱动、键盘驱动和显示驱动等都是本机设备驱动。对于本机设备驱动程序,Platform Builder提供了一些驱动程序样本,目的是为了方便开发人员快速开发出自己的驱动程序。当Win CE系统启动时,本地设备驱动程序将被加载到系统的内存中。本地驱动程序的开发分为分层驱动和单片驱动程序。分层驱动要利用微软提供的与应用程序通信的上层,称为模块驱动程序层MDD(Model Device Driver)。MDD层通过设备驱动程序接口DDI(Device Driver Interface)与应用程序通信,开发驱动程序通常不修改MDD层,主要关心与具体硬件相关的下层,依赖平台的设备驱动程序层 PDD(Platform Dependent Driver), PDD层通过设备驱动服务接口(Device Driver Service Provider Interface)直接管理硬件。流接口设备驱动程序(指可安装的启动程序)可以由第三方生产商提供,以支持添加到系统中的设备。Windows CE下的设备驱动程序在与应用程序相同的保护级上工作。当系统启动时,大多数驱动程序是由设备管理进程(DEVICE.EXE)加载的,所有这些驱动程序将共享同一个进程地址空间。

3 I2C总线底层驱动设计

  I2C总线驱动是放在Windows CE操作系统的内核下层,位于OEM Adaptation Layer(OAL)层的一个真正的驱动。

3.1 初始化I2C中断和编写ISR例程

  I2C的通信是通过操作I2C的寄存器进行的。在I2C通信中主要对上面介绍的4个寄存器进行读写。通过读写这些寄存器中的命令状态字可以检测和控制I2C总线的行为。在Windows CE.net下,首先要在文件oalintr.h添加I2C的中断号的宏定义:

  #defineSYSINTR_I2C(SYSINTR_FIRMWARE+19)

然后在文件cfw.c的文件中添加I2C中断的初始化,禁止和复位。具体代码如下:

  在OEMInterruptEnable函数中加入
case SYSINTR_IIC:
s2410INT->rSRCPND=BIT_IIC;
if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND = BIT_IIC;
s2410INT->rINTMSK&= ~BIT_IIC;
break;
在OEMInterruptDisable函数中加入
case SYSINTR_IIC:
s2410INT->rINTMSK|= BIT_IIC;
break;
在armint.c文件中添加ISR程序,处理中断发生后返回定义的中断号。具体代码如下:
在OEMInterruptHandler函数中添加
else if (IntPendVal == INTSRC_IIC) {
s2410INT->rSRCPND= BIT_IIC; /* 清除中断 */
if (s2410INT->rINTPND & BIT_IIC) s2410INT->rINTPND= BIT_IIC;
s2410INT->rINTMSK|= BIT_IIC; /* I2C中断禁止 */
return (SYSINTR_RTC_ALARM);
}

3.2 编写流驱动程序

  I2C总线驱动程序采用的是Win CE流驱动的标准形式。在IIC_Init的函数中,首先通过函数VirtualAlloc()和VirtualCopy(),把芯片中针对I2C的物理地址和操作系统的虚存空间联系起来,对虚拟地址空间的操作就相当于对芯片的物理地址进行操作。地址映射的代码如下:

  reg = (PVOID)VirtualAlloc(0, sz, MEM_RESERVE, PAGE_NOACCESS);
if (reg) {
if (!VirtualCopy(reg, addr, sz, PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG( DEBUGMODE,( TEXT( "Initializing interrupt \\n\\r" ) ) );
VirtualFree(reg, sz, MEM_RELEASE);
reg = NULL;
}
}

  其中sz是申请的长度,addr是申请虚拟地址空间的实际物理地址在Win CE中的映射地址。
然后对申请到的虚拟地址进行操作,安装Windows中的流驱动的模型进行驱动的编写,主要包括下面函数的编写。

  IIC_Init()
在函数中,主要是对I2C的初始化,主要语句如下:
v_pIICregs = ( volatile IICreg *)IIC_RegAlloc((PVOID)IIC_BASE, sizeof(IICreg));
v_pIOPregs = ( volatile IOPreg *)IOP_RegAlloc((PVOID)IOP_BASE, sizeof(IOPreg));
v_pIOPregs->rGPEUP|= 0xc000;
v_pIOPregs->rGPECON |= 0xa00000;
v_pIICregs->rIICCON = (1<<7) | (0<<6) | (1<<5) | (0xf);
v_pIICregs->rIICADD= 0x10;
v_pIICregs->rIICSTAT = 0x10;
VirtualFree( ( PVOID )v_pIOPregs,sizeof( IOPreg ),MEM_RELEASE );
v_pIOPregs = NULL;
if ( !StartDispatchThread( pIIcHead) )
{ IIC_Deinit( pIIcHead );return ( NULL );}在StartDispatchThread()函数中,主要是创建线程、关联事件和中断,主要语句如下:
InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//关联时间和中断
CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//创建线程等待时间
在IicDispatchThread()函数中,主要是等待中断的产生,然后去执行:WaitReturn =        WaitForSingleObject( pIicHead->hIicEvent,INFINITE );
IicEventHandler( pIicHead );//事件处理函数
InterruptDone( 36 );
最后,在函数IIC_Open、IIC_Read、IIC_Write中,对各个寄存器进行操作,进行数据的赋值,得到I2C读取的数据和发送数据。

4 I2C驱动的封装和添加到Windows CE中

  通过上面的工作,能编译一个DLL函数,但这还不能叫流接口驱动程序。因为它的接口函数还没有导出,还需要告诉链接程序需要输出什么样的函数,为此要建立一个自己的def文件,可以用记事本建一个,取名mydrive.Def:

  LIBRARY MyDriver
EXPORTS
IIC_Close
IIC_Deinit
IIC_Init
IIC_IOControl
IIC_Open
IIC_PowerDown
IIC_PowerUp
IIC_Read
IIC_Seek
IIC_Write

  然后同样用记事本编写一个注册表文件,取名为mydrive.reg:

  [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\STRINGS]
"Index"=dword:1
"Prefix"="IIC"
"Dll"="MyDriver.dll"
"Order"=dword:0

  最后编写自己的CEC文件。主要是添加一个Build Method,任务是复制注册表到Win CE的系统目录下面。加一个Bib File,其主要功能是把编译的mydrive.dll文件添加到系统内核中去。保存写好的CEC文件。打开Platform Builder,打开“File”菜单,添加刚刚编写的CEC特征到系统选项中去。生成系统的时候,添加自己的CEC特性,就可以包含刚刚编写的I2C驱动了。
以上介绍了Win CE的驱动结构,并给出了基于Win CE的 I2C驱动程序部分源代码。实验证明该设计是可行的。

参考文献

1 陈向群,等. Windows CE.NET系统分析及实验教程. 北京:机械工业出版社,2003
2 周毓林,等. Windows CE.net内核定制及应用开发. 北京:电子工业出版社,2005
3 Microsoft.Windows CE设备驱动程序开发指南. 北京:北京希望电子出版社,1999

王小芳:硕士研究生,主要研究方向为智能仪器控制。

转载于:https://www.cnblogs.com/harber/archive/2008/09/17/1292922.html

基于WinCE的I2C驱动程序设计相关推荐

  1. WinCE的I2C驱动程序设计

    1 I2C 通信协议及S3C2410 芯片介绍 I2C(Inter Integrated Circuit) 总线是1980 年由Philips 公司推出的. I2C 总线用两条线(SDA 和SCL ) ...

  2. 基于S3C2410的触摸屏驱动程序设计

    基于S3C2410的触摸屏驱动程序设计   作者:沈阳农业大学 关键词:  ADS7843  S3C2410  触摸屏  嵌入式Linux  消费电子  触摸屏  消费电子 摘要: 本文介绍了基于三星 ...

  3. linux 图像采集卡驱动程序,基于Linux操作系统的视频采集卡驱动程序设计

    DMA结构: struct saa7146_video_dma { u32 base_odd; u32 base_even; u32 prot_addr; u32 pitch; u32 base_pa ...

  4. 基于linux的驱动设计,《基于LINUX的虚拟驱动设计》-毕业论文.doc

    PAGE 40 l 摘 要 驱动程序是当前最热门.最有发展前途的IT应用技术之一.目前的驱动程序的开发主要应用在包括键盘 .鼠标.扫描仪.打印机以及存储设备等日益普及的设备之间的通讯上.但是要使这些设 ...

  5. 基于μC/OS—III的CC1120驱动程序设计

    基于μC/OS-III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120   嵌入式操作系统   STM32F103ZE   ...

  6. 基于阿里平头哥的单片机软、硬件i2C驱动oled

    基于RiskV的阿里平头哥MCU开箱文章之软硬件i2C驱动oled 12864 Risk-V简介 国产单片机及开发环境CDK iic简介 iIC代码移植详细介绍 # stm32 iic: # 向国产单 ...

  7. 基于嵌入式Linux的千兆以太网卡驱动程序设计及测试

    基于嵌入式Linux的千兆以太网卡驱动程序设计及测试 一. 引言 千兆以太网是一种具有高带宽和高响应的新网络技术,相关协议遵循IEEE 802.3规范标准.采用和10M以太网相似的帧格式.网络协议和布 ...

  8. 基于VXWORKS的NAND FLASH驱动程序设计

    基于VXWORKS的NAND FLASH驱动程序设计 3162412793@qq.com 技术交流QQ群: 691976956 目前,随着电子技术的不断发展,计算机技术也得到飞速的发展,产生了很多新技 ...

  9. WinCE下光电编码器的驱动程序设计

    原文:http://article.ednchina.com/Embedded/20071209103917.htm 来源:中电网 | 作者:杨振坤 甘朝晖 蒋旻 引言 近年来,嵌入式技术发展迅速,嵌 ...

最新文章

  1. 计算机维护方面的知识和技巧,电脑硬件维护常识和方法【图文详解】
  2. Eclipse对于多个Java项目的支持并不友好!
  3. producer send源码_Kafka源码深度剖析系列(七)——Producer核心流程初探
  4. 移动端数据统计,精细化运营的永动机
  5. 直接插入排序比较次数_插入排序(C++)
  6. qt和c#怎么选_请问目前做windows桌面应用程序,MFC、QT、C#哪个更好?
  7. 笨办法学 Python · 续 练习 47:`bc`
  8. SVN 与 CVS 在【版本管理】上的区别~
  9. 终极解决方案——sbt配置阿里镜像源,解决sbt下载慢,dump project structure from sbt耗时问题
  10. 湘潭比赛有感---铩羽之行
  11. linux acrobat,开源Linux Acrobat Javascript编辑器
  12. TBSchedule调度平台疑难解答
  13. 恢复计算机注册表命令,电脑的注册表如果损坏怎么恢复
  14. Python Qt6快速入门-嵌入PyQtGraph图表
  15. U转串口时,鼠标乱动,解决办法
  16. 如何保存网页上的图片原图,大图
  17. scratch学习1 积木区+程序区
  18. DeltaTime详解
  19. 黎曼猜想有可能证明哥德巴赫猜想
  20. QT Connect/Disconnect

热门文章

  1. Java项目:在线拍卖竞价系统(java+SpringBoot+FreeMarker+Mysql+redis)
  2. python dos攻击_利用SMB漏洞DoS攻击任何Windows系统
  3. Android-room的学习
  4. WebStorm 运行Rect Native 项目
  5. php 爬虫_Rad爬虫结合W13Scan扫描器挖掘漏洞
  6. 选择器优先级_CSS选择器优先级指北
  7. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(3):构造具有个人特色的MVP模式
  8. Docker学习笔记_安装ActiveMQ
  9. 黑色星期五阿里云向海淘输出双11技术
  10. 《JavaScript应用程序设计》一一2.3 lambdas