新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于WinCE的II2C驅(qū)動程序設(shè)計(jì)

基于WinCE的II2C驅(qū)動程序設(shè)計(jì)

作者: 時(shí)間:2012-06-02 來源:網(wǎng)絡(luò) 收藏

然后在文件cfw.c的文件中添加I2C中斷的初始化,禁止和復(fù)位。具體代碼如下:

  在OEMInterruptEnable函數(shù)中加入
  case SYSINTR_IIC:
    s2410INT->rSRCPND=BIT_IIC;
    if (s2410INT->rINTPND BIT_IIC) s2410INT->rINTPND = BIT_IIC;
    s2410INT->rINTMSK= ~BIT_IIC;
    break;
  在OEMInterruptDisable函數(shù)中加入
  case SYSINTR_IIC:
    s2410INT->rINTMSK|= BIT_IIC;
      break;
在armint.c文件中添加ISR程序,處理中斷發(fā)生后返回定義的中斷號。具體代碼如下:
  在OEMInterruptHandler函數(shù)中添加
  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的標(biāo)準(zhǔn)形式。在IIC_Init的函數(shù)中,首先通過函數(shù)VirtualAlloc()和VirtualCopy(),把芯片中針對I2C的物理地址和操作系統(tǒng)的虛存空間聯(lián)系起來,對虛擬地址空間的操作就相當(dāng)于對芯片的物理地址進(jìn)行操作。地址映射的代碼如下:

  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是申請?zhí)摂M地址空間的實(shí)際物理地址在Win CE中的映射地址。
  然后對申請到的虛擬地址進(jìn)行操作,安裝Windows中的的模型進(jìn)行驅(qū)動的編寫,主要包括下面函數(shù)的編寫。

  IIC_Init()
  在函數(shù)中,主要是對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()函數(shù)中,主要是創(chuàng)建線程、關(guān)聯(lián)事件和中斷,主要語句如下:
  InterruptInitialize( 36,pIicHead->hIicEvent,NULL,0 );//關(guān)聯(lián)時(shí)間和中斷
  CreateThread( NULL,0,IicDispatchThread,pIicHead,0,NULL );//創(chuàng)建線程等待時(shí)間
  在IicDispatchThread()函數(shù)中,主要是等待中斷的產(chǎn)生,然后去執(zhí)行:WaitReturn =        WaitForSingleObject( pIicHead->hIicEvent,INFINITE );
  IicEventHandler( pIicHead );//事件處理函數(shù)
  InterruptDone( 36 );
  最后,在函數(shù)IIC_Open、IIC_Read、IIC_Write中,對各個(gè)寄存器進(jìn)行操作,進(jìn)行數(shù)據(jù)的賦值,得到I2C讀取的數(shù)據(jù)和發(fā)送數(shù)據(jù)。

4 I2C驅(qū)動的封裝和添加到Windows CE中

  通過上面的工作,能編譯一個(gè)DLL函數(shù),但這還不能叫流接口。因?yàn)樗慕涌诤瘮?shù)還沒有導(dǎo)出,還需要告訴鏈接程序需要輸出什么樣的函數(shù),為此要建立一個(gè)自己的def文件,可以用記事本建一個(gè),取名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

  然后同樣用記事本編寫一個(gè)注冊表文件,取名為mydrive.reg:

  [HKEY_LOCAL_MACHINEDriversBuiltInSTRINGS]
  "Index"=dword:1
  "Prefix"="IIC"
  "Dll"="MyDriver.dll"
  "Order"=dword:0

  最后編寫自己的CEC文件。主要是添加一個(gè)Build Method,任務(wù)是復(fù)制注冊表到Win CE的系統(tǒng)目錄下面。加一個(gè)Bib File,其主要功能是把編譯的mydrive.dll文件添加到系統(tǒng)內(nèi)核中去。保存寫好的CEC文件。打開Platform Builder,打開“File”菜單,添加剛剛編寫的CEC特征到系統(tǒng)選項(xiàng)中去。生成系統(tǒng)的時(shí)候,添加自己的CEC特性,就可以包含剛剛編寫的I2C驅(qū)動了。
以上介紹了Win CE的驅(qū)動結(jié)構(gòu),并給出了基于Win CE的 I2C部分源代碼。實(shí)驗(yàn)證明該設(shè)計(jì)是可行的。

參考文獻(xiàn)

1 陳向群,等. Windows CE.NET系統(tǒng)分析及實(shí)驗(yàn)教程. 北京:機(jī)械工業(yè)出版社,2003
2 周毓林,等. Windows CE.net內(nèi)核定制及應(yīng)用開發(fā). 北京:電子工業(yè)出版社,2005
3 Microsoft.Windows CE設(shè)備驅(qū)動程序開發(fā)指南. 北京:北京希望電子出版社,1999

王小芳 碩士研究生,主要研究方向?yàn)橹悄軆x器控制。
王典洪 博士生導(dǎo)師,主要研究方向?yàn)橹悄軆x器控制、計(jì)算機(jī)圖像處理。


上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉