📄 pwmdirver.cpp
字号:
#include <windows.h>
#include <tchar.h>
#include <nkintr.h>
#include <oalintr.h>
#include <ceddk.h>
#include <windev.h>
#include <devload.h>
#include <notify.h>
#include <Pkfuncs.h>
#include<Winbase.h>
#ifdef __cplusplus
extern "C"
{
#endif
BOOL VirtualCopy( LPVOID, LPVOID, DWORD, DWORD );
#ifdef __cplusplus
}
#endif
#define IOP_BASE 0xB1600000 // 0x56000000
typedef struct {
unsigned int rGPACON; // 00
unsigned int rGPADAT;
unsigned int rPAD1[2];
unsigned int rGPBCON; // 10
unsigned int rGPBDAT;
unsigned int rGPBUP;
unsigned int rPAD2;
// unsigned int rGPCCON; // 20
// unsigned int rGPCDAT;
// unsigned int rGPCUP;
// unsigned int rPAD3;
//unsigned int rGPDCON; // 30
// unsigned int rGPDDAT;
// unsigned int rGPDUP;
// unsigned int rPAD4;
// unsigned int rGPECON; // 40
// unsigned int rGPEDAT;
// unsigned int rGPEUP;
// unsigned int rPAD5;
// unsigned int rGPFCON; // 50
// unsigned int rGPFDAT;
/* unsigned int rGPFUP;
unsigned int rPAD6;
unsigned int rGPGCON; // 60
unsigned int rGPGDAT;
unsigned int rGPGUP;
unsigned int rPAD7;
unsigned int rGPHCON; // 70
unsigned int rGPHDAT;
unsigned int rGPHUP;
unsigned int rPAD8;
unsigned int rMISCCR; // 80
unsigned int rDCKCON;
unsigned int rEXTINT0;
unsigned int rEXTINT1;
unsigned int rEXTINT2; // 90
unsigned int rEINTFLT0;
unsigned int rEINTFLT1;
unsigned int rEINTFLT2;
unsigned int rEINTFLT3; // A0
unsigned int rEINTMASK;
unsigned int rEINTPEND;
unsigned int rGSTATUS0; // AC
unsigned int rGSTATUS1; // B0
unsigned int rGSTATUS2; // B4
unsigned int rGSTATUS3; // B8
unsigned int rGSTATUS4;*/ // BC
}IOPreg;
#define CLKPWR_BASE 0xB0C00000 // 0x4C000000
typedef struct {
unsigned long rLOCKTIME;//00
unsigned long rMPLLCON;//04
unsigned long rUPLLCON;//08
unsigned long rCLKCON;//0C
unsigned long rCLKSLOW;//10
unsigned long rCLKDIVN;//14
}CLKPWRreg;
#define PWM_BASE 0xB1100000 // 0x51000000
typedef struct {
unsigned int rTCFG0;//00
unsigned int rTCFG1;//04
unsigned int rTCON;//08
unsigned int rTCNTB0;//0C
unsigned int rTCMPB0;//10
unsigned int rTCNTO0;//14
// unsigned int rTCNTB1;
// unsigned int rTCMPB1;
// unsigned int rTCNTO1;
// unsigned int rTCNTB2;
/// unsigned int rTCMPB2;
// unsigned int rTCNTO2;
// unsigned int rTCNTB3;
// unsigned int rTCMPB3;
// unsigned int rTCNTO3;
// unsigned int rTCNTB4;
// unsigned int rTCNTO4;
}PWMreg ;
//#define UART0_BASE 0xB1000000 // 0x50000000
//#define UART1_BASE 0xB1004000
//#define UART2_BASE 0xB1008000
#define INT_BASE 0xB0A00000 // 0x4A000000
typedef struct {
unsigned int rSRCPND;
unsigned int rINTMOD;
unsigned int rINTMSK;
unsigned int rPRIORITY;
unsigned int rINTPND;
unsigned int rINTOFFSET;
unsigned int rSUBSRCPND;
unsigned int rINTSUBMSK;
}INTreg;
//BOOL WINAPI DllEntryPoint(HANDLE hinstDLL,DWORD dwReason,LPVOID lpvReserved);
DWORD PWM_Init (LPCTSTR pContext,LPCVOID lpvBusContext);
BOOL PWM_Deinit (DWORD hDeviceContext);
DWORD PWM_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode);
BOOL PWM_Close(DWORD hOpenContext);
BOOL PWM_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD
dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut);
void PWM_PowerUp(DWORD hDeviceContext);
void PWM_PowerDown(DWORD hDeviceContext);
DWORD PWM_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
DWORD PWM_Write(DWORD hOpenContext, LPVOID pBuffer, DWORD Count);
DWORD PWM_Seek(DWORD hOpenContext,long Amount,WORD Type);
DWORD WINAPI ThreadIST(LPVOID a);
//void SetupInterrupt(void);
//DWORD WINAPI ThreadIST( LPVOID lpvParam );
//#include<s2410.h>
#include<CEDDK.h>
//链接ceddk.lib
#pragma comment(lib, "CEDDK.lib")
#pragma comment(lib, "corelibc.lib")
#pragma comment(lib, "LIBCD.lib")
//HANDLE g_hevInterrupt;
HANDLE g_htIST;
DWORD g_dwSysInt;
//HANDLE PWMIST;
//#define SYSINTR_DEVICES 8
//#define SYSINTR_FIRMWARE (SYSINTR_DEVICES+8)
//#define SYSINTR_TIMER0 (SYSINTR_FIRMWARE+19)
DWORD SysInt=SYSINTR_TIMER0;
LPDWORD dwThreadID;
HANDLE Interruptevent;
//#define CLKPWR1 (*(volatile unsigned long *)PWM_CLKDIVN)
//#define CLKPWR2 (*(volatile unsigned long *)PWM_MPLLCON)
//#define IOP1 (*(volatile unsigned long *)PWM_GPBCON)
//#define IOP2 (*(volatile unsigned long *)PWM_GPBUP)
//#define PWM1 (*(volatile unsigned long *)PWM_TCFG0)
//#define PWM2 (*(volatile unsigned long *)PWM_TCFG1)
//#define PWM3 (*(volatile unsigned long *)PWM_TCNTB0)
//#define PWM4 (*(volatile unsigned long *)PWM_TCMPB0)
//#define PWM5 (*(volatile unsigned long *)PWM_TCON)
volatile IOPreg *v_pIOPRegs;
volatile CLKPWRreg *v_pCLKPWRegs;
volatile INTreg *v_pINTRegs;
volatile PWMreg *v_pPWMRegs;
//unsigned long PWM_CLKDIVN;
//unsigned long PWM_MPLLCON;
//unsigned long PWM_GPBCON;
//unsigned long PWM_GPBUP;
//unsigned long PWM_TCFG0;
//unsigned long PWM_TCFG1;
//unsigned long PWM_TCNTB0;
//unsigned long PWM_TCMPB0;
//unsigned long PWM_TCON;
//PHYSICAL_ADDRESS CLKDIVN={0x4C000014,0};
//PHYSICAL_ADDRESS MPLLCON={0x4C000004,0};
//PHYSICAL_ADDRESS GPBCON = {0x56000010,0};
//PHYSICAL_ADDRESS GPBUP={0x56000018,0};
//PHYSICAL_ADDRESS TCFG0={0x51000000,0};
//PHYSICAL_ADDRESS TCFG1={0x51000004,0};
//PHYSICAL_ADDRESS TCNTB0={0x5100000C,0};
//PHYSICAL_ADDRESS TCMPB0={0x4C000010,0};
//PHYSICAL_ADDRESS TCON={0x4C000008,0};
BOOL WINAPI DllEntry(HANDLE hinstDLL,DWORD dwReason,LPVOID lpvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1,(TEXT("STRINGS:PWM DLL_PROCESS_ATTACH\n")));
return TRUE;
case DLL_THREAD_ATTACH:
RETAILMSG(1,(TEXT("STRINGS:PWM DLL_ THREAD _ATTACH\n")));
return TRUE;
case DLL_THREAD_DETACH:
RETAILMSG(1,(TEXT("STRINGS: PWM DLL_THREAD_DETACH \n")));
return TRUE;
case DLL_PROCESS_DETACH:
RETAILMSG(1,(TEXT("STRINGS: PWM DLL_ PROCESS _DETACH \n")));
return TRUE;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
RETAILMSG(1,(TEXT("STRINGS: PWM DLL_ PROCESS _ EXITING \n")));
break;
case DLL_SYSTEM_STARTED:
RETAILMSG(1,(TEXT("STRINGS: PWM DLL_ SYSTEM _STARTED \n")));
break;
#endif
}
return TRUE;
}
//在PWM_Init函数中,首先声明一个事件,于PWM中断联系起来,这样,一旦TCNTBN
//为0时就会收到硬件发来的中断,在PWM_Init函数中的事件就会被触发
DWORD PWM_Init(LPCTSTR,LPCVOID lpvBusContext)
{
RETAILMSG (1,(TEXT("enter PWM_Init!\n\r")));
DWORD dwRet=0;
dwRet=1;
v_pIOPRegs = (volatile IOPreg*)VirtualAlloc(0, sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
RETAILMSG (1,(TEXT("PWM_Init:11111!\n\r")));
if (v_pIOPRegs == NULL)
{
RETAILMSG (1,(TEXT("v_pIOPRegs is not allocated\n\r")));
return dwRet;
}
if (!VirtualCopy((PVOID)v_pIOPRegs, (PVOID)IOP_BASE, sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE))
{
RETAILMSG (1,(TEXT("v_pIOPRegs is not mapped\n\r")));
return dwRet;
}
RETAILMSG (1,(TEXT("v_pIOPRegs is mapped to %x\n\r"), v_pIOPRegs));
v_pCLKPWRegs = (volatile CLKPWRreg*)VirtualAlloc(0, sizeof(CLKPWRreg), MEM_RESERVE, PAGE_NOACCESS);
RETAILMSG (1,(TEXT("PWM_Init:22222!\n\r")));
if (v_pCLKPWRegs == NULL)
{
RETAILMSG (1,(TEXT("v_pCLKPWRegs is not allocated\n\r")));
return dwRet;
}
if (!VirtualCopy((PVOID)v_pCLKPWRegs, (PVOID)CLKPWR_BASE, sizeof(CLKPWRreg), PAGE_READWRITE|PAGE_NOCACHE))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -