资源简介

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\_objects.mac

     文件      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


评论

共有 条评论