資源簡介
s3c2440下LED燈驅動的源代碼,詳細的中文注釋,適合初學者學習

代碼片段和文件信息
#include??
#include?se_regs.h>
#include?
#define?DEBUG 1 ? /*定義一個宏變量,用于串口輸出信息用,定義為0時,不輸出*/
volatile?S3C2440A_IOPORT_REG?*p2440a_ioport_reg?=?NULL; /*IO寄存器對應的虛擬地址指針*/
void?LED_ThreadFun(); /*聲明一個線程函數*/
HANDLE?LED_Event; /*?事件句柄?*/
HANDLE?LED_Thread; /*?線程句柄?*/
//驅動入口函數
bool?WINAPI?DLLEntry(?HANDLE?hInstDll
??????????????????????DWORD?dwReason
??????????????????????LPVOID?lpvReserved)
{???
switch(dwReason)
{
case?DLL_PROCESS_ATTACH:
RETAILMSG(DEBUG?(TEXT(“LEDDrv:??DLL_PROCESS_ATTCH?\r\n“)?)?);? // 提示動態庫加載
DisableThreadLibraryCalls((HMODULE)hInstDll);
break;
case?DLL_PROCESS_DETACH:
RETAILMSG(DEBUG?(TEXT(“LEDDrv:??DLL_PROCESS_DETACH?\r\n“)?)?);? // 提示動態庫卸載
break;
}
????return?TRUE;?????? ??
}
//LEDDrv初始化函數
DWORD?LED_Init(LPCTSTR?pContextLPVOID?lpvBusContext)
{
RETAILMSG(DEBUG?(TEXT(“LEDDrv:?LED_Init?\r\n“)?)?);
//?為IO寄存器申請一段虛擬內存空間
p2440a_ioport_reg?=?(volatile?S3C2440A_IOPORT_REG*)VirtualAlloc(0?sizeof(S3C2440A_IOPORT_REG)?MEM_RESERVE?PAGE_NOACCESS);
if?(!p2440a_ioport_reg)
??{
??RETAILMSG(DEBUG?(TEXT(“LEDDrv:?VirtualAlloc?failed!\r\n“)));
??return(FALSE);
??}
??else
?? RETAILMSG(DEBUG?(TEXT(“LEDDrv:?VirtualAlloc?OK\r\n“)));
??
??//將虛擬空間映射到寄存器的物理地址空間,映射后可通過寄存器指針p2440a_ioport_reg來訪問寄存器
if?(!VirtualCopy((PVOID)p2440a_ioport_reg?(PVOID)(S3C2440A_base_REG_PA_IOPORT?>>?8)?sizeof(S3C2440A_IOPORT_REG)?PAGE_PHYSICAL?|?PAGE_READWRITE?|?PAGE_NOCACHE))
??{
??RETAILMSG(DEBUG?(TEXT(“LEDDrv:?VirtualCopy?failed!\r\n“)));
??return(FALSE);
??}
??else
?? RETAILMSG(DEBUG?(TEXT(“LEDDrv:??VirtualCopy?OK\r\n“)));
??
??//對IO進行初始化
??p2440a_ioport_reg->GPGCON?&=0xfff00000; //清空GPG0、GPG1、GPG2、GPG8的控制寄存器
??
??p2440a_ioport_reg->GPGCON?|=0x55555; //設置GPG0、GPG1、GPG2、GPG8為輸出狀態
??
??p2440a_ioport_reg->GPBDAT?&=0xfef8; //設置GPG0、GPG1、GPG2、GPG8輸出低電平
??
??p2440a_ioport_reg->GPBUP?|=0xff; //設置GPG0、GPG1、GPG2、GPG8上拉無效
??? ??
//創建事件
LED_Event=CreateEvent(NULLfalsefalseNULL);
if(!LED_Event)
{
RETAILMSG(DEBUG(TEXT(“LEDDrv:?CreateEvent?faile\r\n“)));
return?false;
}
else
RETAILMSG(DEBUG(TEXT(“LEDDrv:?CreateEvent?OK\r\n“)));
//創建線程LED_Thread
LED_Thread=CreateThread((LPSECURITY_ATTRIBUTES)NULL
0
(LPTHREAD_START_ROUTINE)LED_ThreadFun
0
0
NULL
);
//如果創建線程失敗
if(!LED_Thread)
{
RETAILMSG(DEBUG(TEXT(“LEDDrv:?CreateThread?faile?\r\n“)));
return?false;
}
else
RETAILMSG(DEBUG(TEXT(“LEDDrv:?CreateThread?OK\r\n“)));
return?1;
}
BOOL??LED_Deinit(DWORD?hDeviceContext)
{
RETAILMSG(DEBUG(TEXT(“LEDDrv:?LED_Deinit\r\n“))); ????
return?true;
}
DWORD?LED_Open(DWORD?hDeviceContextD
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????650??2004-07-01?12:00??LEDDrv\makefile
?????文件????????114??2008-06-15?13:08??LEDDrv\LEDDrv.def
?????文件???????8847??2008-06-18?01:49??LEDDrv\Build.log
?????文件????????765??2008-06-15?18:36??LEDDrv\sources.bak
?????文件????????765??2008-06-17?23:44??LEDDrv\sources
?????文件???????4804??2008-06-18?01:48??LEDDrv\LEDDrv.cpp.bak
?????文件???????4808??2008-06-18?01:58??LEDDrv\LEDDrv.cpp
?????文件?????????66??2008-06-18?01:49??LEDDrv\obj\ARMV4I\retail\_ob
?????文件??????18229??2008-06-18?01:49??LEDDrv\obj\ARMV4I\retail\LEDDrv.obj
?????目錄??????????0??2008-07-14?23:12??LEDDrv\obj\ARMV4I\retail
?????目錄??????????0??2008-07-14?23:12??LEDDrv\obj\ARMV4I
?????目錄??????????0??2008-07-14?23:12??LEDDrv\obj
?????目錄??????????0??2008-07-14?23:12??LEDDrv
-----------?---------??----------?-----??----
????????????????39048????????????????????13
- 上一篇:HFSS Vivaldi天線模型
- 下一篇:Word 多文件搜索器1.0
評論
共有 條評論