Windows CE系統將GPIO的真實位址(例如2440的GPIO的基地址為0x56000000)映射到虛擬位址空間(GPIO對應為0xB1600000),這 樣,通過對這段虛擬位址空間的操作,就能夠完成對GPIO或者其他片內資源的控制、輸入輸出工作。要操作一個平台的GPIO,在其對應BSP中按照基地址,找到虛擬位址,並且找到方便操作這個地址的資料結構就可以了,關鍵函數就是 VirtualAlloc和VirtualCopy。下面以操作Samsung S3C2440的GPIO為例,講述這個步驟:
1.首先在BSP中的s2440.h檔案,找到虛擬位址映射以及操作GPIO的寄存器結構體(這個在自己製作一些特殊裝置的BSP時,會依據需要而發生更改)
#define IOP_BASE 0xB1600000 // 0x56000000typedef struct {unsigned int rGPACON;// 00unsigned int rGPADAT;unsigned int rPAD1[2];unsigned int rGPBCON;// 10unsigned int rGPBDAT;unsigned int rGPBUP;unsigned int rPAD2;unsigned int rGPCCON;// 20unsigned int rGPCDAT;unsigned int rGPCUP;unsigned int rPAD3;unsigned int rGPDCON;// 30unsigned int rGPDDAT;unsigned int rGPDUP; unsigned int rPAD4;unsigned int rGPECON;// 40unsigned int rGPEDAT;unsigned int rGPEUP;unsigned int rPAD5;unsigned int rGPFCON;// 50unsigned int rGPFDAT;unsigned int rGPFUP; unsigned int rPAD6;unsigned int rGPGCON;// 60unsigned int rGPGDAT;unsigned int rGPGUP; unsigned int rPAD7;unsigned int rGPHCON;// 70unsigned int rGPHDAT;unsigned int rGPHUP; unsigned int rPAD8;unsigned int rMISCCR;// 80unsigned int rDCKCON;unsigned int rEXTINT0;unsigned int rEXTINT1;unsigned int rEXTINT2;// 90unsigned int rEINTFLT0;unsigned int rEINTFLT1;unsigned int rEINTFLT2;unsigned int rEINTFLT3;// A0unsigned int rEINTMASK;unsigned int rEINTPEND;unsigned int rGSTATUS0;// ACunsigned int rGSTATUS1;// B0unsigned int rGSTATUS2;// B4 ;;; SHLunsigned int rGSTATUS3;// B8unsigned int rGSTATUS4;// BCunsigned int rFLTOUT;// C0unsigned int rDSC0;unsigned int rDSC1;unsigned int rMSLCON;unsigned int rGPJCON;// D0unsigned int rGPJDAT;unsigned int rGPJUP;unsigned int rPAD9;}IOPreg;
二、因為我用的mini2440開發板的GPB0接在蜂鳴器上,所以我以操作GPB0為例編寫代碼。這樣給GPB0一個高電平,那麼蜂鳴器就會響,反之蜂鳴器就會停止發聲
#ifdef __cplusplusextern "C"{#endifBOOL VirtualCopy( PVOID, PVOID, DWORD, DWORD );#ifdef __cplusplus}#endifvoid GPIO() //通過GPIO控制蜂鳴器{volatile IOPreg *v_pIORegs;v_pIORegs = (volatile IOPreg *)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);if(v_pIORegs){if(VirtualCopy((PVOID)v_pIORegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE | PAGE_NOCACHE)){v_pIORegs->rGPBCON = 1; //將GPB0設定為OUTPUTv_pIORegs->rGPBDAT = 0x3ff; //設定為高電平,蜂鳴器發聲Sleep(3000);v_pIORegs->rGPBDAT = 0; //恢複為低電平,蜂鳴器停止發聲}VirtualFree((LPVOID)v_pIORegs, 0, MEM_RELEASE);v_pIORegs = NULL;}}
@written by .cpp
百度空間:http://hi.baidu.com/anglecloudy
部落格園:http://www.cnblogs.com/dotcpp