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