2416的LED驅動 for wince6


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 controlLED2: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);
}







發佈了34 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章