新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于WinCE的I2C驅動程序設計

        基于WinCE的I2C驅動程序設計

        作者: 時間:2012-11-13 來源:網絡 收藏

          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 = (17) | (06) | (15) | (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 的封裝和添加到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特性,就可以包含剛剛編寫的了。

          以上介紹了Win CE的驅動結構,并給出了基于Win CE的 程序部分源代碼。實驗證明該設計是可行的。

          參考文獻

        [1].ARM920Tdatasheethttp://www.dzsc.com/datasheet/ARM920T_139814.html.

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

        [3].陳向群,等. Windows CE.NET系統分析及實驗教程. 北京:機械工業出版社,2003

        [4].周毓林,等. Windows CE.net內核定制及應用開發. 北京:電子工業出版社,2005

        [5].Microsoft.Windows CE設備驅動程序開發指南. 北京:北京希望電子出版社,1999


        上一頁 1 2 下一頁

        關鍵詞: WinCE I2C驅動 S3C2410

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 海宁市| 楚雄市| 陈巴尔虎旗| 天峻县| 中宁县| 临邑县| 扎赉特旗| 东宁县| 阳江市| 尼勒克县| 吉安县| 牙克石市| 孝感市| 永靖县| 香河县| 麦盖提县| 德惠市| 大洼县| 松江区| 宁波市| 抚宁县| 城市| 克拉玛依市| 嘉黎县| 溆浦县| 嘉定区| 宣化县| 资阳市| 松原市| 沙田区| 郑州市| 广河县| 将乐县| 新源县| 夹江县| 蒲江县| 平泉县| 衡水市| 大安市| 克东县| 龙泉市|