新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于WinCE的II2C驱动程序设计

基于WinCE的II2C驱动程序设计

作者:时间:2012-06-02来源:网络收藏

然后在文件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 编写程序

  采用的是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 nr" ) ) );
        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 = (17) | (06) | (15) | (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_MACHINEDriversBuiltInSTRINGS]
  "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

王小芳 硕士研究生,主要研究方向为智能仪器控制。
王典洪 博士生导师,主要研究方向为智能仪器控制、计算机图像处理。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭