?? can.cpp
字號:
// CAN.cpp : Defines the entry point for the DLL application.
//
#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include "stdafx.h"
#include "can.h"
#include "spi.h"
#include "mcp2515.h"
#include <pkfuncs.h>
CAN_CTRL_BLK_t CAN_CtrlBlk;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
OutputDebugString(L"can driver - DLL_PROCESS_ATTACH \n");
break;
case DLL_THREAD_ATTACH:
// OutputDebugString(L"can driver - DLL_THREAD_ATTACH \n");
break;
case DLL_THREAD_DETACH:
// OutputDebugString(L"can driver - DLL_THREAD_DETACH \n");
break;
case DLL_PROCESS_DETACH:
OutputDebugString(L"can driver - DLL_PROCESS_DETACH \n");
break;
}
return TRUE;
}
static DWORD WINAPI CAN0_IntrThread(LPVOID pContext)
{
DWORD dwRet;
while (!CAN_CtrlBlk.abortThread0)
{
dwRet = WaitForSingleObject(CAN_CtrlBlk.hIntr0Event, INFINITE);
if (CAN_CtrlBlk.abortThread0)
return 0;
SetEvent(CAN_CtrlBlk.hRx0Event);
InterruptDone(CAN_CtrlBlk.can0Intr);
}
DEB_0(1, _T(" exiting IST\r"));
return 0;
}
extern "C" DWORD CAN_Init(LPCTSTR pContext, LPCVOID lpvBusContext)
{
DWORD IrqCan0 = IRQ_EINT8;
DWORD IrqCan1 = IRQ_EINT9;
RETAILMSG (1, (TEXT("+ ")TEXT(__FUNCTION__)TEXT("\r\n")));
SPI_Init(SPI_PORT_0);
MCP2515_Init(CAN_125kbps);
CAN_CtrlBlk.hIntr0Event = CreateEvent(NULL, FALSE, FALSE, NULL);
CAN_CtrlBlk.hRx0Event = CreateEvent(NULL, FALSE, FALSE, NULL);
KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR,
&IrqCan0,
sizeof(DWORD),
&CAN_CtrlBlk.can0Intr,
sizeof(DWORD),
NULL);
InterruptDisable(CAN_CtrlBlk.can0Intr);
InterruptInitialize(CAN_CtrlBlk.can0Intr, CAN_CtrlBlk.hRx0Event, NULL, 0);
CAN_CtrlBlk.hCan0Thread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CAN0_IntrThread,
NULL,
0,
NULL);
DEBUGMSG (1, (TEXT("- ")TEXT(__FUNCTION__)TEXT("\r\n")));
return TRUE;
}
extern "C" BOOL CAN_Deinit(DWORD hDeviceContext)
{
DEBUGMSG (1, (TEXT("+ ")TEXT(__FUNCTION__)TEXT("\r\n")));
SPI_Deinit(SPI_PORT_0);
if (CAN_CtrlBlk.hCan0Thread)
{
CAN_CtrlBlk.abortThread0 = TRUE;
SetEvent(CAN_CtrlBlk.hIntr0Event);
SetEvent(CAN_CtrlBlk.hRx0Event);
Sleep(200);
}
// Release interrupt resource
InterruptDone(CAN_CtrlBlk.can0Intr);
InterruptDisable(CAN_CtrlBlk.can0Intr);
KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,
&CAN_CtrlBlk.can0Intr,
sizeof(DWORD),
NULL,
0,
NULL);
CloseHandle(CAN_CtrlBlk.hIntr0Event);
CloseHandle(CAN_CtrlBlk.hRx0Event);
DEBUGMSG (1, (TEXT("- ")TEXT(__FUNCTION__)TEXT("\r\n")));
return TRUE;
}
extern "C" DWORD CAN_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
DEBUGMSG (1, (TEXT("+ ")TEXT(__FUNCTION__)TEXT("\r\n")));
SPI_Open(SPI_PORT_0);
//SetEvent(g_hTxEvent);
ResetEvent(CAN_CtrlBlk.hRx0Event);
DEBUGMSG (1, (TEXT("- ")TEXT(__FUNCTION__)TEXT("\r\n")));
return 1;
}
extern "C" BOOL CAN_Close(DWORD hOpenContext)
{
DEBUGMSG (1, (TEXT("+ ")TEXT(__FUNCTION__)TEXT("\r\n")));
SPI_Close(SPI_PORT_0);
SetEvent(CAN_CtrlBlk.hRx0Event);
DEBUGMSG (1, (TEXT("- ")TEXT(__FUNCTION__)TEXT("\r\n")));
return TRUE;
}
extern "C" DWORD CAN_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
DEBUGMSG (1, (TEXT("+ ")TEXT(__FUNCTION__)TEXT("\r\n")));
DWORD dwRet;
LPCVOID pReadBuffer;
if ((pBuffer == NULL) || (Count <= 0))
return 0;
pReadBuffer = MapPtrToProcess((UCHAR *)pBuffer, GetCallerProcess());
dwRet = WaitForSingleObject(CAN_CtrlBlk.hRx0Event, CAN_RW_TIMEOUT);
if (dwRet == WAIT_TIMEOUT)
return 0;
ResetEvent(CAN_CtrlBlk.hRx0Event);
MCP2515_Read((CAN_MSG_t *)pBuffer);
DEBUGMSG (1, (TEXT("- ")TEXT(__FUNCTION__)TEXT("\r\n")));
return Count;
}
extern "C" DWORD CAN_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD Count)
{
DEBUGMSG (1, (TEXT("+ ")TEXT(__FUNCTION__)TEXT("\r\n")));
// DWORD dwRet;
LPCVOID pWriteBuffer;
if ((pBuffer == NULL) || (Count <= 0))
return 0;
pWriteBuffer = MapPtrToProcess((UCHAR *)pBuffer, GetCallerProcess());
// dwRet = WaitForSingleObject(g_hTxEvent, CAN_RW_TIMEOUT);
// if (dwRet == WAIT_TIMEOUT)
// {
// return 0;
// }
// ResetEvent(g_hTxEvent);
MCP2515_Write((CAN_MSG_t *)pWriteBuffer);
DEBUGMSG (1, (TEXT("- ")TEXT(__FUNCTION__)TEXT("\r\n")));
return Count;
}
extern "C" BOOL CAN_IOControl(HANDLE pCAN, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut,
DWORD dwLenOut, PDWORD pdwActualOut)
{
BOOL bRc = TRUE;
return bRc;
}
extern "C" ULONG CAN_Seek(PVOID Context, LONG Position, DWORD Type)
{
return (ULONG)-1;
}
extern "C" BOOL CAN_PowerUp(PVOID Context)
{
return TRUE;
}
extern "C" BOOL CAN_PowerDown(PVOID Context)
{
return TRUE;
}
//////////////////////////////////////////////////////
// Functions below for internal using
//////////////////////////////////////////////////////
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -