基于WinCE的I2C驱动程序设计

发布者:快乐旅行最新更新时间:2012-11-13 来源: 21ic 关键字:WinCE  I2C驱动  S3C2410 手机看文章 扫描二维码
随时随地手机看文章
  引言

  随着以计算机技术、通信技术和软件技术为核心的信息技术的迅速发展,嵌入式系统在各行业得到了广泛的应用,极大地推动了行业的渗透性应用。

  嵌入式系统是“以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统”,由嵌入式硬件和嵌入式软件两部分组成。嵌入式软件包括嵌入式操作系统和嵌入式应用软件。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);
  }[page]

  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 \\ \\ " ) ) );
        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 ( !S

tartDispatchThread( 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中,对各个寄存器进行操作,进行数据的赋值,得到I

2C读取的数据和发送数据。

  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]. ARM920T datasheet http://www.dzsc.com/datasheet/ARM920T_139814.html.

      [2]. RISC datasheet http://www.dzsc.com/datasheet/RISC_1189725.html.

      [3]. 陈向群,等. Windows CE.NET系统分析及实验教程. 北京:机械工业出版社,2003

      [4]. 周毓林,等. Windows CE.net内核定制及应用开发. 北京:电子工业出版社,2005

      [5]. Microsoft.Windows CE设备驱动程序开发指南. 北京:北京希望电子出版社,1999

关键字:WinCE  I2C驱动  S3C2410 引用地址:基于WinCE的I2C驱动程序设计

上一篇:基于ARM的汽车电子控制系统单元设计
下一篇:如何处理ARM体系下浮点数Middle-Endian问题

推荐阅读最新更新时间:2024-03-16 13:13

S3C2410 IIS总线sample code 分析
MMRESULT waveInClose(HWAVEOUT hwi) { if((RecStatus.handle!=hwi)||(RecStatus.Status!=DEVICE_REC)) return MMSYSERR_INVALHANDLE; rIISCON = 0x0; //IIS Interface stop rIISFCON = 0x0; //For FIFO flush rCLKCON &= ~0x20000; //disable IIS colock //rMPLLCON = save_MPLLCON; //restore MPLLCON value Set
[单片机]
基于ARM920T微处理器的IDE硬盘接口设计与实现
1 引言 20世纪90年代后期,嵌入式系统在工业控制、远程监控和数据采集等领域的应用日趋广泛,人们对嵌入式系统的存储容量也提出了较高的要求。因此研制适用于嵌入式系统的大容量、高速率、高可靠性的数据存储系统变得日益重要。本文针对一款基于ARM920T芯片的开发板,根据ATA硬盘接口规范,设计了IDE硬盘接口电路,实现了对IDE硬盘的读写,可以在Linux系统中对其上的文件系统自由访问,达到了高速率和高可靠性的要求。 2 ARM920T与S3C2410介绍 ARM 包括一系列微处理芯片技术。ARM920T是ARM系列微处理器的一种,它采用5阶段管道化ARM9TDMI内核,同时配备了Thumb扩展、EmbeddedICE调
[单片机]
嵌入式Linux系统中I2C总线设备的驱动设计
引言 I2C总线是PHILIPS公司推出的两线式串行总线,用于连接微控制器及其外围设备,具有简单、高效等特点。由于其接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互联成本,特别适用于嵌入式产品。 而Linux系统具有开源、免费、网上资源丰富等优点,目前已成为嵌入式系统的主流选择。因此如何在嵌入式Linux系统中实现I2C功能成为实际开发中的问题。 I2C总线 I2C 总线通过串行数据SDA 和串行时钟SCL线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别。根据数据传输时的功能不同,把器件分为主机和从机。主机是初始化总线的数据传输并产生允许传输的时钟信
[单片机]
嵌入式Linux系统中<font color='red'>I2C</font>总线设备的<font color='red'>驱动</font>设计
ucos在s3c2410上运行过程整体剖析-- 整体运行环境及工具说明
基础知识里已经基本上讲解了UCOS要生活的家(即硬件平台环境),还有就是为了让高级语言写的程序能变成在硬件平台上直接运行的程序,编译器都干了些什么。还有这个C语言运行的环境问题,也就是从硬件和汇编语言的角度去理解高级语言。 下面我们就从硬件加电到UCOS真正运行起来这样一种思路讲解一个嵌入式实时操作系统的实现原理以及它所包含的精髓。好了,现在就介绍一下我们所有的软硬件设施和用到的所有的工具。 硬件:用的硬件平台是博创2410-S,而它用的核心是ARM920T 软件: VIVI 、UCOS (博创公司给的ucos实验的第十个实验ucos的移植) 工具:ADS1.2 我们用的所有代码都在一个ads1.2的工程里。 大致上是这样
[单片机]
arm-linux-gcc4.4.3编译s3c2410平台linux内核
一、首先下载linux内核: linux-2.6.14.tar.bz2 下载地址: http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 二、解压linux-2.6.14.tar.bz2: tar -jxvf linux-2.6.14.tar.bz2 三、配置Makefile文件: 1、打开源码根目录下的Makefile文件: gedit Makefile 修改Makefile文件: ARCH ?= arm CROSS_COMPILE ?= arm-linux- 2、查看目录结构: ls -l linux-2.6.14/arch/arm/ d
[单片机]
基于JTAG接口实现ARM的FPGA在线配置
  引 言   随着通信技术的发展,出现越来越多的无线接入技术,为了解决不同标准间的互通和兼容,人们提出了软件无线电(Software Defined Radio,SDR)技术。SDR技术要求通信终端具有可重配置能力,根据特定通信网络情况,动态地改变调制/解调、编解码、交织/解交织等方案。SDR终端的实现往往都是基于可重配置的硬件环境,如现场可编程逻辑阵列(Field Programmable Gate Array,FPGA)、数字信号处理器(Digital Signal Processor,DSP),而不是专用集成电路(Application Specific Integrated Circuit,ASIC)等特定的硬件电路和芯
[单片机]
基于JTAG接口实现ARM的FPGA在线配置
嵌入式智能家居控制系统的研究与设计
系统结构设计     本文将控制系统分为现场控制级(主机)和多个控制对象级(分机)。现场控制级设备能够收集到控制对象的各种信息,对这些数据进行处理,并能够在设定的条件下产生报警。通过该系统,可以得到家居的各种运行状态(例如,房间温度、湿度,煤气泄漏报警等),并能根据现场情况做出相应的调整控制(例如,照明及家电控制等)。其家居控制系统结构如图1所示。 图1 家居控制系统结构图     本文仅研究设计智能家居的现场控制部分,图1中的GSM和GPRS等远程通信模块作为以后系统的扩展升级。主机MCU选用ARM9芯片S3C2410,因其具有丰富的功能端口而适合设计要求和日后扩展。S3C2410嵌入式微处理器集成了众多的常用资
[嵌入式]
基于S3C2410A的嵌入式系统的U-Boot移植
0 引 言 ARM嵌入式处理器已被广泛应用于消费电子产品、无线通信、网络通信和工业控制等领域。其中,ARM9的芯片更是以其低价格、低功耗、高性能在手持设备中占据着重要市场。在嵌入式操作系统中,Linux,Vxworks,WinCE三足鼎立,其中Linux由于其开源性、稳定性、安全性、可裁减性更是一支独放。在嵌入式系统中,如何实现在ARM9平台下Linux操作系统的引导工作是嵌入式技术开发的重要环节。 1 嵌入式系统的软件组成 1.1 系统的软件组成 嵌入式的软件系统主要由Bootloader、操作系统、文件系统、应用程序等组成。其中,Bootloader是介于硬件和操作系统之间的一层,其作用就好像PC机中的BIOS。系统加电运
[单片机]
基于<font color='red'>S3C2410</font>A的嵌入式系统的U-Boot移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved