⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_driver.cpp

📁 CE device driver exam
💻 CPP
字号:
// Test_Driver.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <windows.h>
#include <ceddk.h>

#define S3C2410X_BASE_REG_PA_UART0              (0x50000000)            
#define S3C2410X_BASE_REG_PA_UART1              (0x50004000)            
#define S3C2410X_BASE_REG_PA_UART2              (0x50008000)       

#define WRITE_DATA 1

//#define CALLERBUFFER_TEST

#define BUFSIZE 256

#ifdef _MANAGED
#pragma managed(push, off)
#endif

typedef struct {
    UINT32 ULCON;                   // line control reg
    UINT32 UCON;                    // control reg
    UINT32 UFCON;                   // FIFO control reg
    UINT32 UMCON;                   // modem control reg
    UINT32 UTRSTAT;                 // tx/rx status reg
    UINT32 UERSTAT;                 // rx error status reg
    UINT32 UFSTAT;                  // FIFO status reg
    UINT32 UMSTAT;                  // modem status reg
    UINT32 UTXH;                    // tx buffer reg
    UINT32 URXH;                    // rx buffer reg
    UINT32 UBRDIV;                  // baud rate divisor

} S3C2410X_UART_REG, *PS3C2410X_UART_REG;


typedef struct {
	WCHAR *data;
	DWORD size;
} DATA_STRUCT, *pDATA_STRUCT;


volatile S3C2410X_UART_REG *g_pUARTReg;


/* Global Variables on SER Driver */  
HANDLE g_hInstance;
WCHAR achBuffer[BUFSIZE];
WCHAR DriverBuffer[MAX_PATH]; //=L"I am a Buffer in the Driver";

VOID WriteSerialByte(PCHAR string, int numberofchars)
{
	
	for (int i=0; i<numberofchars; i++)
	{
		while(((g_pUARTReg->UTRSTAT) & 0x02) == 0);
		g_pUARTReg->UTXH = (UINT32) string[i];
	}
	return;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL WINAPI  
DllEntry(HANDLE hinstDLL, 
              DWORD dwReason, 
              LPVOID /* lpvReserved */)
{
    switch(dwReason)
    {
    case DLL_PROCESS_ATTACH:
        g_hInstance = hinstDLL;
        RETAILMSG(1,(TEXT("Test Driver : DLL_PROCESS_ATTACH\n")));
        return TRUE;
    case DLL_PROCESS_DETACH:
        RETAILMSG(1,(TEXT("Test Driver : DLL_PROCESS_DETACH\n")));
        break;
    }

    return TRUE;
}


//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL TES_Close(DWORD hOpenContext)
{
    BOOL bRet = TRUE;
    RETAILMSG(1,(TEXT("Test Driver : TES_Close\n")));

    return bRet;
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL TES_Deinit(DWORD hDeviceContext)
{
    BOOL bRet = TRUE;

	RETAILMSG(1,(TEXT("Test Driver : TES_Deinit :: Deinitialize Memory for I2C and LED \r\n")));

	if (g_pUARTReg)
    {
        MmUnmapIoSpace((PVOID)g_pUARTReg, sizeof(S3C2410X_UART_REG));
        g_pUARTReg = NULL;
    }

    return bRet;
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD TES_Init(DWORD dwContext)
{
     DWORD dwRet = 0;
//	 PHYSICAL_ADDRESS PA;
	 CHAR string[] = "\r\n Test Driver :: Windows Embedded CE 6.0 !!! \r\n";

	 RETAILMSG(1,(TEXT("Test Application Driver : TES_Init :: Initialize Memory for Serial port \r\n")));

// Initialize memory for Serial port (Debug port)
/*
     PA.QuadPart = S3C2410X_BASE_REG_PA_UART1;

     g_pUARTReg =(volatile S3C2410X_UART_REG  *) MmMapIoSpace(PA, sizeof(S3C2410X_UART_REG), FALSE);

     if(!g_pUARTReg)
     {
        RETAILMSG(1,(TEXT("Test Driver : TES_Init :: Memory for Serial port Initialize Failed !!!\r\n")));
	    return dwRet;
     }
*/
	 g_pUARTReg = (volatile S3C2410X_UART_REG *)VirtualAlloc(0, sizeof *g_pUARTReg, MEM_RESERVE, PAGE_NOACCESS);
	 
	 if (g_pUARTReg == NULL)
	 {
        RETAILMSG(1,(TEXT("Test Driver : TES_Init :: VirtualAlloc failed for Serial port !\r\n")));
	 }
	 else
	 {
		 if (!VirtualCopy((PVOID)g_pUARTReg, (PVOID)(S3C2410X_BASE_REG_PA_UART1 >> 8), sizeof *g_pUARTReg, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
        {
            RETAILMSG(1,(TEXT("Test Driver : TES_Init :: VirtualCopy failed for Serial port !\r\n")));
            VirtualFree((PVOID)g_pUARTReg, 0, MEM_RELEASE);
            g_pUARTReg = NULL;
        }
     }

	dwRet=1;

	WriteSerialByte(string, sizeof(string));


    return dwRet;
} 


//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL TES_IOControl(DWORD hOpenContext, 
                   DWORD dwCode, 
                   PBYTE pBufIn, 
                   DWORD dwLenIn, 
                   PBYTE pBufOut, 
                   DWORD dwLenOut, 
                   PDWORD pdwActualOut)
{
    BOOL bRet = TRUE;
	PVOID validPointer = NULL;
   
	switch(dwCode)
	{

	case WRITE_DATA :

		pDATA_STRUCT pData = (DATA_STRUCT *)pBufIn;

#ifdef CALLERBUFFER_TEST
		
		__try
		{
			if( S_OK == CeOpenCallerBuffer(&validPointer, (PVOID)(pData->data), (DWORD)pData->size, ARG_I_WSTR, FALSE))
			{
				RETAILMSG(1,(TEXT("Test Driver : CeOpenCallerBuffer OK. \r\n")));

				memcpy (DriverBuffer, validPointer, sizeof(DriverBuffer)); 

				RETAILMSG(1,(TEXT("Test Driver : Received application buffer : %s \r\n"),DriverBuffer));

				CeCloseCallerBuffer((PVOID)validPointer, (PVOID)pData->data, (DWORD)pData->size, ARG_I_WSTR);
			}
			else
			{
				RETAILMSG(1,(TEXT("Test Driver :CeOpenCallerBuffer FAILED !!! . \r\n")));
			}

		}

		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			RETAILMSG(1,(TEXT(" Invalid argument passed in IO_CTL. \r\n")));
		}

#else

		RETAILMSG(1,(TEXT("Test Driver : Not using the CeOpenCallerBuffer. \r\n")));

		// !!!!  Critical error can be occured when caller's buffer to be copyed into the Driver's Buffer 
		// !!!!  if not using a Access Checking. 
        __try
		{

			memcpy (DriverBuffer, pData->data, sizeof(DriverBuffer)); 

			RETAILMSG(1,(TEXT("Test Driver : Received application buffer : %s \r\n"),DriverBuffer));

		}
		__except(1)
		{

			RETAILMSG(1,(TEXT("Test Driver : There are wrong parameters \r\n")));

		}

//		pData->size = sizeof(DriverBuffer);

#endif

		break;

	}
	
	return bRet;
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD TES_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    DWORD dwRet = 0;
   
    dwRet = 1;
	
	RETAILMSG(1,(TEXT("Test Driver : TES_Open :: Opened driver for Application \r\n")));
    return dwRet;
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void TES_PowerDown(DWORD hDeviceContext)
{
    RETAILMSG(1,(TEXT("Test Driver : TES_PowerDown :: \r\n")));
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void TES_PowerUp(DWORD hDeviceContext)
{
    RETAILMSG(1,(TEXT("Test Driver : TES_PowerUp :: \r\n")));
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD TES_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
    DWORD dwRet = 0;
   
	DWORD cbBuffer = wcslen(achBuffer) + 1;
    dwRet = min(cbBuffer, Count);
    wcsncpy((LPWSTR)pBuffer, achBuffer, dwRet);
	
	RETAILMSG(1,(TEXT("Test Driver : TES_Read \r\n")));
    return dwRet;
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD TES_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
    DWORD dwRet = 0;
    RETAILMSG(1,(TEXT("Test Driver : TES_Seek \r\n")));
    return dwRet;
} 

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD TES_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
    DWORD dwRet = 0;
    
	dwRet = min(BUFSIZE, NumberOfBytes);
    wcsncpy(achBuffer, (LPWSTR)pSourceBytes, dwRet);

	RETAILMSG(1,(TEXT("Test Driver : TES_Write \r\n")));
    return dwRet;
}


#ifdef _MANAGED
#pragma managed(pop)
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -