2416的LED驱动 for wince6

13 篇文章 0 订阅
10 篇文章 0 订阅


1.注册表

;================= LED ==================
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\LED]
"Prefix"="LED"
"Dll"="led.dll"
"Order"=dword:30
"Index"=dword:1


2.bib

 led.dll        $(_FLATRELEASEDIR)\led.dll                  NK  SHK   //NK存入系统,SHK开机挂起并运行

多解释几个 (NK     U)为存入系统,U为不启动只存储


3.LED.CPP

///----------------------------------------------------------------------------//

// NAME OF PROJECT: uniprOS   Version: 1.0 (development) //
//----------------------------------------------------------------------------//
// NAME OF SOURCE FILE: LED.cpp   //
//----------------------------------------------------------------------------//
//   //
// Data of creation: 2010.02.15   //
// Data of last modification: 2010.02.15   //
//   //
// CONTENTS: unipro stream driver for led control   //
//   //
//----------------------------------------------------------------------------//
// NAME OF PROJECT FILE: LED.dll   //
//----------------------------------------------------------------------------//
// UTILIZING COMPILER: Microsoft Visual Studio 2005   //
//----------------------------------------------------------------------------//
// HEIYUU1.CHANGE - Unipro   //
//----------------------------------------------------------------------------//






#include "stdafx.h"


#include <windows.h>
#include <nled.h>
#include <led_drvr.h>
#include <types.h>
#include "BSP.h"


#include "LED.h"          //包含了.h文件可以使用h文件里的函数定义了
// GPIO virtual address        GPIO虚拟地址
volatile S3C2416_IOPORT_REG *v_pIOPregs;
CRITICAL_SECTION g_Lock; // Protects g_ShadowSettingsInfo


//----------------------------------------------------------------------------//
// DLL entry 设备初始化启动 //
//----------------------------------------------------------------------------//
BOOL APIENTRY DllMain(HANDLE hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved) {
switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH: 
      OutputDebugString(L"\nLED - DLL_PROCESS_ATTACH\n"); 
// RETAILMSG(1,(TEXT("LED - DLL_PROCESS_ATTACH\n")));




    break; 
    case DLL_PROCESS_DETACH: 
   //RETAILMSG(1,(TEXT("LED - DLL_PROCESS_DETACH\n")));
 //OutputDebugString(L"LED - DLL_PROCESS_DETACH\n"); 
break; 
    case DLL_THREAD_ATTACH: 
   //RETAILMSG(1,(TEXT("LED - DLL_THREAD_ATTACH\n")));
      //OutputDebugString(L"LED - DLL_THREAD_ATTACH\n"); 
break; 
    case DLL_THREAD_DETACH: 
   //RETAILMSG(1,(TEXT("LED - DLL_THREAD_DETACH\n")));
      //OutputDebugString(L"LED - DLL_THREAD_DETACH\n"); 
break; 
    default: 
break; 
  }


return TRUE;
}




//----------------------------------------------------------------------------//
// LED initial 设备初始化 //
//----------------------------------------------------------------------------//
DWORD LED_Init(LPCTSTR pContext, LPCVOID lpvBusContext) { 
//Virtual address mapping
//v_pIOPregs = (volatile S3C2416_IOPORT_REG*)DrvLib_MapIoSpace(S3C6410_BASE_REG_PA_GPIO,sizeof(S3C2416_IOPORT_REG),FALSE);
//6410空间地址,2416使用另外一种映射方式,同样(两种方式效果一样)



v_pIOPregs = (volatile S3C2416_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2416_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
//2416空间地址,使用VirtualAlloc需要再使用VirtualCopy拷贝虚拟地址

BOOL RetValue = 1;
if (v_pIOPregs == NULL) 
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
RetValue = 0;
}
else 
{
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2416_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2416_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
RetValue = 0;
}
}
if (!RetValue) 
{
if (v_pIOPregs) 
{
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
}


v_pIOPregs = NULL;
return RetValue;
}
InitializeCriticalSection(&g_Lock);
return(RetValue);






//----------------------------------------------------------------------------//
// LED deinit 卸载一个设备驱动 //
//----------------------------------------------------------------------------//
BOOL LED_Deinit(DWORD hDeviceContext) { //hDeviceContext设备驱动的句柄为整数
VirtualFree((PVOID)v_pIOPregs, 0, MEM_RELEASE);
v_pIOPregs = NULL;
return TRUE; 



//----------------------------------------------------------------------------//
// LED open 打开
打开一个设备。
//hDeviceContext:设备驱动的句柄,在XXX_Init调用时返回的
//AccessCode:访问权限代码,一般是只读或者只写或者读写              
//ShareMode:共享模式,是否支持共享或者独享
//----------------------------------------------------------------------------//
DWORD LED_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { 
OutputDebugString(L"LED - LED Open\n");
return 1; 

//----------------------------------------------------------------------------//
// LED set output configuration 设置输出配置
//----------------------------------------------------------------------------//
VOID Ledoutputconfiguration(BYTE num ) {
  v_pIOPregs->GPMCON=(v_pIOPregs->GPMCON&(~(0x0f<<num)))|0x1;
OutputDebugString(L"Led set output\n"); 
}
//----------------------------------------------------------------------------//
// LED put output bit ,set high 输出,设高
//----------------------------------------------------------------------------//
VOID Ledopen(BYTE num ) {
  v_pIOPregs->GPMDAT|=1<<num;
OutputDebugString(L"Led set high\n"); 
}
//----------------------------------------------------------------------------//
// LED put output bit ,set lower
//----------------------------------------------------------------------------//
VOID Ledclose(BYTE num ) {
  v_pIOPregs->GPMDAT&=~(1<<num);
OutputDebugString(L"Led set lower\n");
}
//----------------------------------------------------------------------------//
// LED close 关闭 //
//----------------------------------------------------------------------------//
BOOL LED_Close(DWORD hOpenContext) {
OutputDebugString(L"LED - LED Close\n");
return TRUE; 



//----------------------------------------------------------------------------//
// LED read 读取
从设备上面读取数据。
//hDeviceContext:设备驱动的句柄,在XXX_Open调用时返回的
//pBuffer:存放数据的Buffer
//Count:读取数据的字节数
//----------------------------------------------------------------------------//
DWORD LED_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { 
return 1;



//----------------------------------------------------------------------------//
// LED write 写入
写数据到设备上面。
// hDeviceContext:设备驱动的句柄,在XXX_Open调用时返回的
//pBuffer:存放数据的Buffer
//Count:写入数据的字节数
//----------------------------------------------------------------------------//
DWORD LED_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count) { 
return 1; 



//----------------------------------------------------------------------------//
// LED power up //
//----------------------------------------------------------------------------//
VOID LED_PowerUp(DWORD hDeviceContext) {   



//----------------------------------------------------------------------------//
// LED down
关闭设备电源
//----------------------------------------------------------------------------//
VOID LED_PowerDown(DWORD hDeviceContext) {   
}  


//----------------------------------------------------------------------------//
// LED seek
移动设备中的数据指针。
//hDeviceContext:设备驱动的句柄,在XXX_Open调用时返回的
//Amount:移动的字节数
//Type:FILE_BEGIN表示从头移动
//FILE_CURRENT表示从当前位置移动
//FILE_END表示从末尾往前移动
//----------------------------------------------------------------------------//
DWORD LED_Seek(DWORD hOpenContext, long Amount, DWORD Type) {   
  return 0;   



//----------------------------------------------------------------------------//
// LED IO control LED2:GPM1   LED3:GPM2    LED1:GPM0    LED4:GPM3  //6410
//寄存器  地址  读/写  描述  复位值 
//GPMCON  0x7F008820  读/写  端口 M  配置寄存器  0x22222222 
//GPMDAT  0x7F008824  读/写  端口 M 数据寄存器  未定义 
//GPMPUD  0x7F008828  读/写  端口 M 上拉/下拉寄存器  0x000002AA 


//
//hDeviceContext:设备驱动的句柄,在XXX_Open调用时返回的
//dwCode:操作码
// pBufIn:输入Buffer
//dwLenIn:输入Buffer的size
//pBufOut:输出Buffer
//dwLenOut:输出Buffer的size
//pdwActualOut:实际输出的字节数
//----------------------------------------------------------------------------//
BOOL LED_IOControl(DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned) {  
 switch (dwIoControlCode) {//这里就是led.h文件里定义的值,只要符合就执行下面的 
 
//GPMCON  位  描述  初始状态    2416为2位,6410为4位,寄存器地址要乘以相应位,6410需要端口乘以4
//GPM0  [3:0]  0000=输入  0001=输出 
//0010=Host I/F CSn                    0011=Ext.Interrupt[23] 
//0100=保留                                  0101=保留 
//0110= CE_CF[1]                        0111=保留 
//0010 


//以下4个输出为2416
    case IOCTL_LED_LED1_OPEN:                                   //LED1 OPEN  GPF0  端口为0
v_pIOPregs->GPFCON&=(~(0x0f<<0)); //寄存器起始地址,2416使用位*2为地址 ,此处0*2=0,地址为0,GPFCON为GPF端口
v_pIOPregs->GPFCON|=0x1<<0;       //0x1设置为输出
v_pIOPregs->GPFDAT|=(0x01<<0);    //高电平(使用“|”计算),0代表位


OutputDebugString(L"Led1 Open- LED IO Control\n"); 
break;
    case IOCTL_LED_LED1_CLOSE:                                      //LED1 CLOSE
v_pIOPregs->GPFCON&=(~(0x0f<<0));
v_pIOPregs->GPFCON|=0x1<<0;
v_pIOPregs->GPFDAT&=~(0x01<<0);   //低电平(使用“&”“~”计算)


OutputDebugString(L"Led1 Close- LED IO Control\n"); 
break;


case IOCTL_LED_LED2_OPEN:                                        //LED2 OPEN   GPF7端口为7
v_pIOPregs->GPFCON&=(~(0x0f<<14));//寄存器起始地址,2416使用位*2为地址 ,此处7*2=14,地址为14,GPFCON为GPF端口
v_pIOPregs->GPFCON|=0x1<<14;
v_pIOPregs->GPFDAT|=(0x01<<7);//高电平(使用“|”计算),7代表位


OutputDebugString(L"Led2 Open -LED IO Control\n"); 
break;
case IOCTL_LED_LED2_CLOSE:                                       //LED2 CLOSE
v_pIOPregs->GPFCON&=(~(0x0f<<14));
v_pIOPregs->GPFCON|=0x1<<14;
v_pIOPregs->GPFDAT&=~(0x01<<7);


OutputDebugString(L"Led2 Close- LED IO Control\n"); 
break;


case IOCTL_LED_LED3_OPEN:                                            //LED3 OPEN  GPG0
v_pIOPregs->GPGCON&=(~(0x0f<<0));
v_pIOPregs->GPGCON|=0x1<<0;
v_pIOPregs->GPGDAT|=0x01<<0;


OutputDebugString(L"Led3 Open - LED IO Control\n"); 
break;
case IOCTL_LED_LED3_CLOSE:                                       //LED3 CLOSE
v_pIOPregs->GPGCON&=(~(0x0f<<0));
v_pIOPregs->GPGCON|=0x1<<0;
v_pIOPregs->GPGDAT&=~(0x01<<0);


OutputDebugString(L"Led3 Close- LED IO Control\n"); 
break;


case IOCTL_LED_LED4_OPEN:                                        //LED4 OPEN GPG2
v_pIOPregs->GPGCON&=(~(0x0f<<4));
v_pIOPregs->GPGCON|=0x1<<4;
v_pIOPregs->GPGDAT|=(0x01<<2);
OutputDebugString(L"Led4 Open - LED IO Control\n"); 
break;
case IOCTL_LED_LED4_CLOSE:                                       //LED4 CLOSE
v_pIOPregs->GPGCON&=(~(0x0f<<4));
v_pIOPregs->GPGCON|=0x1<<4;
v_pIOPregs->GPGDAT&=~(0x01<<2);
OutputDebugString(L"Led4 Close- LED IO Control\n"); 
break;
}


  return TRUE;   
}  










00输入,01输出,10中断,11保留




2.LED.H


//----------------------------------------------------------------------------//
// NAME OF PROJECT: uniprOSVersion: 1.0 (development) //
//----------------------------------------------------------------------------//
// NAME OF SOURCE FILE: SPI.h //
//----------------------------------------------------------------------------//
//   //
// Data of creation: 2010.02.15 //
// Data of last modification: 2010.02.15 //
//   //
// CONTENTS: unipro CNC module.   //
//   //
//----------------------------------------------------------------------------//
// NAME OF PROJECT FILE: uniprOS.exe //
//----------------------------------------------------------------------------//
// UTILIZING COMPILER: Visual Studio 2005 //
//----------------------------------------------------------------------------//
// HEIYUU1CHANGE - Unipro //
//----------------------------------------------------------------------------//


#ifndef LCD_H
#define LCD_H


// constants define
#define IOCTL_LED_LED1_OPEN          0x04001060    //随便定义的,后面只要符合这个值就执行其中一个命令,MFC程序定义相同就执行,值没有意义,相同取值就行
#define IOCTL_LED_LED1_CLOSE        0x04001061
#define IOCTL_LED_LED2_OPEN          0x04001070
#define IOCTL_LED_LED2_CLOSE        0x04001071
#define IOCTL_LED_LED3_OPEN          0x04001080
#define IOCTL_LED_LED3_CLOSE        0x04001081
#define IOCTL_LED_LED4_OPEN          0x04001090
#define IOCTL_LED_LED4_CLOSE        0x04001091


//#define IOCTL_LED_SET_OUTPUT 0x04003060
//#define IOCTL_LED_SET_HIGH 0x04003070
//#define IOCTL_LED_SET_LOWER               0x04003080
#endif


3.C++MFC


// LED_AppDlg.cpp : 实现文件
//


#include "stdafx.h"
#include "LED_App.h"
#include "LED_AppDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif



#define IOCTL_LED_LED1_OPEN          0x04001060
#define IOCTL_LED_LED1_CLOSE        0x04001061
#define IOCTL_LED_LED2_OPEN          0x04001070
#define IOCTL_LED_LED2_CLOSE        0x04001071
#define IOCTL_LED_LED3_OPEN          0x04001080
#define IOCTL_LED_LED3_CLOSE        0x04001081
#define IOCTL_LED_LED4_OPEN          0x04001090
#define IOCTL_LED_LED4_CLOSE        0x04001091



//全局变量
HANDLE hLed;
HANDLE hLedEvent;
HANDLE hThread;


// CLED_AppDlg 对话框

CLED_AppDlg::CLED_AppDlg(CWnd* pParent /*=NULL*/)
: CDialog(CLED_AppDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CLED_AppDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CLED_AppDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CLED_AppDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CLED_AppDlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CLED_AppDlg::OnBnClickedButton3)
ON_BN_CLICKED(IDC_BUTTON4, &CLED_AppDlg::OnBnClickedButton4)
END_MESSAGE_MAP()




// CLED_AppDlg 消息处理程序


BOOL CLED_AppDlg::OnInitDialog()
{
CDialog::OnInitDialog();


// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标


// TODO: 在此添加额外的初始化代码
//打开LED

//创建 跑马灯线程
//hThread = CreateThread (NULL, 0, LedThread, NULL, 0, NULL);


hLed = CreateFile(TEXT("LED1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);


if (hLed == INVALID_HANDLE_VALUE)
{
printf ("can't open LED DRIVER\r\n");
}
else
{
printf ("Open LED DRIVER\r\n");
}
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CLED_AppDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(), 
this->m_hWnd, 
DRA::GetDisplayMode() != DRA::Portrait ? 
MAKEINTRESOURCE(IDD_LED_APP_DIALOG_WIDE) : 
MAKEINTRESOURCE(IDD_LED_APP_DIALOG));
}
}
#endif




void CLED_AppDlg::OnBnClickedButton1()
{
DeviceIoControl(hLed,IOCTL_LED_LED1_OPEN,NULL,1,NULL,0,NULL,NULL);
}

void CLED_AppDlg::OnBnClickedButton3()
{
//CloseHandle(hLedEvent);
CloseHandle(hLed);


EndDialog(IDOK);   
}


void CLED_AppDlg::OnBnClickedButton4()
{
DeviceIoControl(hLed,IOCTL_LED_LED1_CLOSE,NULL,1,NULL,0,NULL,NULL);
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值