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