// can.cpp : Defines the entry point for the DLL application.
//
#include <windows.h>
#include "can.h"
#include "canhw.h"
#include <hwdefs.h>
#include <pkfuncs.h>
#include <memory.h>
#include <oalintr.h>
#include <nkintr.h>
extern "C"{
#define DEVICE_NAME "SJACAN"
#define AUTO_RESET_EVENT FALSE
#define SJA_IOCTL_READ_REGISTER 100
#define SJA_IOCTL_WRITE_REGISTER 101
#define SJA_IOCTL_READ_COUNT 102
#define SJA_IOCTL_DISABLE_RECEIVE 103
#define SJA_IOCTL_ENABLE_RECEIVE 104
#define MAX_BUFFER_COUNT 220
#define MAXWAIT 2000
HANDLE hThread = NULL;
HANDLE hCanEvent;
DWORD dwError;
BOOL bStop;
DWORD gIntrCan = SYSINTR_GPIO;
unsigned int dwCurrWrite;
unsigned int dwCurrRead;
unsigned int dwPositionTemp1,dwPositionTemp2;
unsigned char DataBuffer[MAX_BUFFER_COUNT];
unsigned int ReceiveCount;
BOOL DataFlag = 1;
unsigned char Receive(unsigned char *RCdata);
void Transmit(unsigned char *TXdata);
unsigned char SJA1000_READ(unsigned sja_reg_addr);
void SJA1000_WRITE(unsigned sja_reg_addr, unsigned value);
static ULONG SJA1000_Can_Intr(PVOID Reserved);
int InitializeSJA(void);
void Egpio_Init(void);
void SJA1000_CLR_AEN(void);
void SJA1000_SET_AEN(void);
unsigned char Sram_Read(PVOID VBASE);
void Sram_Write(unsigned int Value,PVOID VBASE);
BOOL WriteBuffer(unsigned char *Wdata,unsigned int count);
void BufferInit(void);
PVOID SJA1000_VBASE;
PVOID nGCS3_VBASE;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
DWORD CAN_Init (DWORD dwContext)
{
DWORD dwRet = 1;
NKDbgPrintfW(TEXT("CAN init...\r\n"));
gIntrCan = SYSINTR_GPIO;
SJA1000_VBASE = VirtualAlloc(0, 0x04, MEM_RESERVE, PAGE_NOACCESS);
dwRet = VirtualCopy(SJA1000_VBASE, (PVOID)(SJA1000_PHYBASE>>8), 0x04, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);
nGCS3_VBASE = VirtualAlloc(0, 0x04, MEM_RESERVE, PAGE_NOACCESS);
dwRet = VirtualCopy(nGCS3_VBASE, (PVOID)(nGCS3_PHYBASE>>8), 0x04, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL);
hCanEvent = CreateEvent( NULL, AUTO_RESET_EVENT, FALSE, NULL);
InterruptDone( gIntrCan );
InterruptDisable( gIntrCan );
if(InterruptInitialize(gIntrCan, hCanEvent, NULL, 0))
{
if(!(hThread = CreateThread( NULL, 0, SJA1000_Can_Intr, hCanEvent, CREATE_SUSPENDED, NULL))) //CREATE_SUSPENDED
//if(!(hThread = CreateThread( NULL, 0, SJA1000_Can_Intr, hCanEvent, 0, NULL)))
{
dwRet = FALSE;
NKDbgPrintfW( TEXT("CAN driver thread create failed. \r\n"));
}
else
{
bStop = FALSE;
CeSetThreadPriority(hThread, 152);
}
}
else
{
NKDbgPrintfW(TEXT("InterruptInitialize Failed.\r\n"));
}
SJA1000_WRITE(SJA1000_INT_IER,0x00);
return dwContext;
}
BOOL CAN_Deinit (DWORD hDeviceContext)
{
BOOL bRet = TRUE;
if ( hThread )
{
TerminateThread(hThread,-1);
CloseHandle(hThread);
hThread=NULL;
}
InterruptDone( gIntrCan );
InterruptDisable( gIntrCan );
if(hCanEvent)
{
CloseHandle( hCanEvent );
hCanEvent = NULL;
}
return bRet;
}
DWORD CAN_Open (DWORD hDeviceContext,DWORD AccessCode, DWORD ShareMode)
{
Egpio_Init();
InitializeSJA();
BufferInit();
SJA1000_WRITE(SJA1000_INT_IER,0x1);
ResumeThread(hThread);
return hDeviceContext;
}
BOOL CAN_Close (DWORD hOpenContext)
{
BOOL bRet = TRUE;
SJA1000_WRITE(SJA1000_INT_IER,0x0);
SuspendThread(hThread);
return bRet;
}
BOOL CAN_IOControl (DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
BOOL bRet = TRUE;
char m_TempBuffer[2];
unsigned int m_ReturnCount;
unsigned int dwTemp;
unsigned char tempdata;
memcpy(&m_TempBuffer,pBufIn,dwLenIn);
switch (dwCode)
{
case SJA_IOCTL_WRITE_REGISTER:
SJA1000_WRITE(m_TempBuffer[0],m_TempBuffer[1]);
break;
case SJA_IOCTL_READ_REGISTER:
m_TempBuffer[1] = SJA1000_READ(m_TempBuffer[0]);
memcpy(pBufOut,&m_TempBuffer,sizeof(m_TempBuffer));
dwLenOut = sizeof(m_TempBuffer);
break;
case SJA_IOCTL_READ_COUNT:
dwPositionTemp2 = dwCurrWrite;
if(dwPositionTemp2 >= dwPositionTemp1)
{
dwTemp = dwPositionTemp2 - dwPositionTemp1;
DataFlag = 1;
}
else
{
dwTemp = MAX_BUFFER_COUNT - dwPositionTemp1 + dwPositionTemp2;
DataFlag = 0;
}
dwPositionTemp1 = dwPositionTemp2;
m_ReturnCount = dwTemp;
memcpy(pBufOut,&m_ReturnCount,sizeof(m_ReturnCount));
dwLenOut = sizeof(m_TempBuffer);
break;
case SJA_IOCTL_DISABLE_RECEIVE:
tempdata = SJA1000_READ(SJA1000_INT_IER);
tempdata &= 0xfe;
SJA1000_WRITE(SJA1000_INT_IER,tempdata);
break;
case SJA_IOCTL_ENABLE_RECEIVE:
tempdata = SJA1000_READ(SJA1000_INT_IER);
tempdata |= 0x1;
SJA1000_WRITE(SJA1000_INT_IER,tempdata);
break;
default:
bRet = FALSE;
break;
}
return bRet;
}
void CAN_PowerDown (DWORD hDeviceContext)
{
return;
}
__declspec(dllexport)
void CAN_PowerUp (DWORD hDeviceContext)
{
return;
}
DWORD CAN_Read (DWORD hOpenContext,LPVOID pBuffer,DWORD Count)
{
unsigned int dwTemp;
unsigned int i,j = 0;
unsigned char * DataPoint;
DataPoint = (unsigned char *)pBuffer;
if(DataFlag == 0)
{
dwTemp = Count - MAX_BUFFER_COUNT + dwCurrRead;
for(i = dwCurrRead; i < MAX_BUFFER_COUNT; i ++, j++)
*(DataPoint + j) = DataBuffer[i];
for(i = 0; i < dwTemp; i++,j++)
*(DataPoint + j) = DataBuffer[i];
dwCurrRead = dwTemp;
}
else
{
for(i = 0; i < Count; i ++)
{
*(DataPoint + i) = DataBuffer[dwCurrRead + i];
}
dwCurrRead += Count;
if(dwCurrRead == MAX_BUFFER_COUNT)
dwCurrRead = 0;
}
ReceiveCount -= Count;
return Count;
}
DWORD CAN_Seek (DWORD hOpenContext,long Amount,DWORD Type)
{
DWORD dwRet = TRUE;
return dwRet;
}
DWORD CAN_Write (DWORD hOpenContext,LPCVOID pSourceBytes,DWORD NumberOfBytes)
{
DWORD dTotal = 0;
int i;
int Times = 0, mPNumber = 19;
int temp = 0;
int j=0, k = 0, mPDataPoint = 0;
SJA1000_WRITE(17,30);
SJA1000_WRITE(18,70);
Times = NumberOfBytes / 8;
temp = NumberOfBytes % 8;
for(i = 0; i < Times; i++)
{
mPNumber = 19;
do{
}while( !(SJA1000_READ(SJA1000_SR)&SJA1000_SR_TBS) );
SJA1000_WRITE(16,0x08);
for(j = 0; j < 8; j++)
{
SJA1000_WRITE(mPNumber,*((unsigned int *)pSourceBytes + mPDataPoint));
++ mPNumber;
++ mPDataPoint;
}
do{
}while( !(SJA1000_READ(SJA1000_SR)&0x08) );
SJA1000_WRITE(SJA1000_CMR,0x01);
}
if(temp)
{
mPNumber = 19;
do{
}while( !(SJA1000_READ(SJA1000_SR)&0x04) );
SJA1000_WRITE(16,temp);
for(i = 0; i < temp; i++)
{
SJA1000_WRITE(mPNumber,*((unsigned int *)pSourceBytes+mPDataPoint));
++ mPDataPoint ;
++ mPNumber;
}
do{
}while( !(SJA1000_READ(SJA1000_SR)&0x08) );
SJA1000_WRITE(SJA1000_CMR,0x01);
}
return dTotal;
}
unsigned char SJA1000_READ(unsigned sja_reg_addr)
{
unsigned char value;
SJA1000_SET_AEN();
Sram_Write(sja_reg_addr,nGCS3_VBASE);
SJA1000_CLR_AEN();
value = Sram_Read(SJA1000_VBASE);
return value;
}
void SJA1000_WRITE(unsigned sja_reg_addr, unsigned value)
{
SJA1000_SET_AEN();
Sram_Write(sja_reg_addr,nGCS3_VBASE);
SJA1000_CLR_AEN();
Sram_Write(value, SJA1000_VBASE);
}
BOOL WriteBuffer(unsigned char *Wdata,unsigned int count)
{
BOOL bRet = 1;
unsigned int i,j = 0;
unsigned int tempdata;
tempdata = dwCurrWrite + count;
ReceiveCount += count;
if(tempdata > MAX_BUFFER_COUNT)
{
for(i = dwCurrWrite; i < MAX_BUFFER_COUNT; i ++,j ++)
{
DataBuffer[i] = Wdata[j];
}
for(i = 0; i < (tempdata - MAX_BUFFER_COUNT); i ++)
{
DataBuffer[i] = Wdata[j++];
}
dwCurrWrite = t
WinCe 4.2 Can卡驱动
需积分: 3 188 浏览量
2008-09-02
14:56:40
上传
评论
收藏 6KB RAR 举报
阿岑
- 粉丝: 0
- 资源: 4
最新资源
- MT2301ACTR-VB一款SOT23封装P-Channel场效应MOS管
- Vue 3 开发PC端实战从零到上线.docx
- Unity 资源插件之 Environment Weather Effect
- sap-me-products-how-to-guide-en.pdf
- sap-me-production-tracking-how-to-guide-en.pdf
- sap-me-production-lines-how-to-guide-en.pdf
- 路斯特伺服操作手册,应用手册 v1.00
- sap-me-process-workflow-how-to-guide-en.pdf
- sap-me-printing-how-to-guide-en.pdf
- sap-me-pod-how-to-guide-en.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0