📄 can.cpp
字号:
//******************************************************************************
//*
//* System On Chip(SOC)
//*
//* Copyright (c) 2002 sjsunny, Inc.
//* All rights reserved.
//*
//* This software is the confidential and proprietary information of Sjsunny Sci&Tech
//* , Inc("Confidential Information"). You Shall not disclose such
//* Confidential Information and shall use it only in accordance with the terms
//* of the license agreement you agreed with sjsunny.
//*
//*-----------------------------------------------------------------------------
//*
//* PG9315 BSP (Windows CE.NET)
//*
//* SJA1000 can bus control driver
//*
//* @author WZL@sjsunny.com
//*
//* @date 2005/04/01
//*
//* Log:
//* 2005/04/01 Start
//*
//******************************************************************************/
#include <windows.h>
#include <windef.h>
#include <types.h>
#include <excpt.h>
#include <tchar.h>
#include <devload.h>
#include <winbase.h>
#include <pegdser.h>
#include <CEDDK.h>
#include "nkintr.h"
#include "oalintr.h" //interrupt
#include "fifo.h"
#include "CAN.h"
#include "SJA1000.h"
#include "SJA1000p.h"
#define CANDEBUG 1
HANDLE hMem=NULL;
DWORD dwCount;
static BOOL g_bCANWork = 0;
//CFifo g_fifo;
RXFIFO rxfifo;
bool m_bfifoValid = true;
BOOL APIENTRY DllEntry( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1,(TEXT("1:DLL_PROCESS_ATTACH,PG_CAN - DLL_PROCESS_ATTACH\n")));
break;
case DLL_PROCESS_DETACH:
RETAILMSG(1,(TEXT("2:DLL_PROCESS_DETACH,PG_CAN - DLL_PROCESS_DETACH\n")));
break;
case DLL_THREAD_ATTACH:
RETAILMSG(1,(TEXT("3:DLL_THREAD_ATTACH,PG_CAN - DLL_THREAD_ATTACH\n")));
break;
case DLL_THREAD_DETACH:
RETAILMSG(1,(TEXT("4:DLL_THREAD_DETACH,PG_CAN - DLL_THREAD_DETACH\n")));
break;
}
return TRUE;
}
static BYTE bySend[5]= {0xaa,0x03,0x02,0x11,0x22 };
BYTE byRec[5] ;
DWORD CAN_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
UINT bResult = 1;
UINT iValue = 0xaabbccdd;
unsigned int uCDR = 0xc8; //高位为1设定SJA1000为peliCAN模式关闭外部CLKOUT,CDR.6为CBP=1,设置有点问题如果要用TX1的话应该设置成88H
unsigned int uOCR = 0x1a;//设置为正常输出模式
unsigned int uBTR0 = 0x18, uBTR1 = 0xef; //我们板子上用的是24M的晶振,所以得到的是20K的波特率,by黎科峰,SJW=0+1,SAM=1,采样3次。
//定义了CAN系统时钟Tscl=50Tclk (Tclk=XTAL振荡周期) Tsjw=Tscl
unsigned int uACR = 0x00000000, uAMR = 0xffffffff;//允许所有的ID传输数据
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Init - Context:\r\n ")));
if( !CanP_VirtualAlloc() )
return 0;
//initcan( );
sja1000p_chip_config( uCDR, uOCR, uBTR0, uBTR1, uACR, uAMR );
RETAILMSG( 1, (TEXT(" can :: %x.\r\n"), InterruptInitialize ));
RETAILMSG( CANDEBUG, (TEXT(" can :: %x.\r\n"), InterruptInitialize ));
RETAILMSG( CANDEBUG, (TEXT("can :: CANBUS_INT = %x.\r\n"), SYSINTR_CANBUS ));
m_hCanIntEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if (m_hCanIntEvent == NULL) {
RETAILMSG( 1, (TEXT(" can event create error\r\n")));
return 0x1234;
}
if (!InterruptInitialize(SYSINTR_CANBUS,m_hCanIntEvent,NULL,0)) {
RETAILMSG(1, (TEXT(" can InterruptInitialize error \r\n")));
return 0x1234;
}
InterruptDone(SYSINTR_CANBUS);
RETAILMSG(CANDEBUG, (TEXT(" can InterruptInitialize ok \r\n")));
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Init\r\n")));
RETAILMSG(1,(TEXT("PG_CAN - ~ CAN_Init\r\n")));
return 0x1234;
}
BOOL CAN_Deinit( DWORD hDeviceContext )
{
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Deinit\n")));
g_bCANWork = FALSE;
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Deinit\n")));
return TRUE;
}
DWORD CAN_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode )
{
RETAILMSG(1,(TEXT("PG_CAN - CAN_Open\n")));
RETAILMSG(1,(TEXT("PG_CAN - ~ CAN_Open\n")));
return 0x5678;
}
BOOL CAN_Close( DWORD hOpenContext )
{
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Close\n")));
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Close\n")));
return TRUE;
}
bool CANEventHandler( unsigned& ureg ) //process int
{
ureg = can_read_reg ( SJAIR );
if ( ureg & IER_RIE )//RECEIVE INTERRUPT
{
RETAILMSG(CANDEBUG, (TEXT("regCANBusIR.RI1 \r\n")));
peli_DATA_RECEIVE ( rxfifo );
ResetEvent(m_hCanIntEvent);
can_write_reg( CMR_RRB, SJACMR);
can_write_reg( IR_RI, SJAIR );
m_bfifoValid = true;
// g_fifo.Push( rxfifo );
}
return true;
}
BOOL CAN_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut )
{
HANDLE hTemp = NULL;
TCHAR *tcOut = NULL;
TCHAR *tcIn = NULL;
DWORD dwChars= 0;
BOOL bRet = FALSE;
UINT bReg = 0;
int x;
unsigned int uCDR = 0xc8;
unsigned int uOCR = 0x1a;
unsigned int uBTR0 = 0x18, uBTR1 = 0xef;
unsigned int uACR = 0x00000000, uAMR = 0xffffffff;
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_IOControl\n")));
TestReadAllRegs( );
switch (dwCode) {
case IOCTL_DRIVER_RESET:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_RESET\n")));
if( !sja1000p_enable_configuration())
bRet = TRUE;
}
break;
case IOCTL_DRIVER_WORK:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_WORK\n")));
if( !sja1000p_disable_configuration())
bRet = TRUE;
}
break;
case IOCTL_DRIVER_SET_BANDRATE:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SET_BANDRATE\n")));
memcpy(&uBTR0, pBufIn, sizeof(int));
memcpy(&uBTR1, pBufIn + sizeof(int), sizeof(int));
if( !sja1000p_set_btregs( uBTR0, uBTR1 ) )
bRet = TRUE;
}
break;
case IOCTL_DRIVER_SET_CDR_OCR:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SET_OBJECT \n")));
memcpy(&uCDR, pBufIn, sizeof(int));
memcpy(&uOCR, pBufIn + sizeof(int), sizeof(int));
if (sja1000p_set_cdr_ocrregs( uACR, uAMR))
return -1;
}
break;
case IOCTL_DRIVER_SET_OBJECT:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SET_OBJECT \n")));
memcpy(&uACR, pBufIn, sizeof(int));
memcpy(&uAMR, pBufIn + sizeof(int), sizeof(int));
if (sja1000p_extended_mask( uACR, uAMR))
return -1;
}
break;
case IOCTL_DRIVER_SET_REG:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_BCAN_HW_INIT\n")));
memcpy(&uACR, pBufIn, sizeof(int));
memcpy(&uAMR, pBufIn + sizeof(int), sizeof(int));
if (sja1000p_extended_mask( uACR, uAMR))
return -1;
}
break;
case IOCTL_DRIVER_SEND_REQ:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SEND_REQ \n")));
}
break;
case IOCTL_DRIVER_SEND_QUIT:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SEND_QUIT \n")));
}
break;
case IOCTL_DRIVER_RELEASE_RBUFF:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_RELEASE_RBUFF \n")));
}
break;
case IOCTL_DRIVER_CLEAR_OVERLAP:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_CLEAR_OVERLAP \n")));
}
break;
case IOCTL_DRIVER_SLEEP:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SLEEP \n")));
}
break;
case IOCTL_DRIVER_CAN_EVENT:
{
RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_CAN_EVENT \n" )));
WaitForSingleObject(m_hCanIntEvent, INFINITE);
RETAILMSG(1, (TEXT(" can_event \r\n")));
CANEventHandler( bReg );
if (! ( bReg & IER_RIE ))//RECEIVE INTERRUPT
{
ResetEvent(m_hCanIntEvent);
}
InterruptDone(SYSINTR_CANBUS);
}
break;
default:
RETAILMSG(1,(TEXT("Unknown IOCTL\n")));
break;
}
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_IOControl\n")));
return TRUE;
}
void CAN_PowerUp( DWORD hDeviceContext )
{
}
void CAN_PowerDown( DWORD hDeviceContext )
{
}
DWORD CAN_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
DWORD dwRetCount=0x20; // default to error
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Read\r\n")));
if( m_bfifoValid )
{
memcpy( pBuffer, (LPVOID)(&rxfifo), 13*4 );
m_bfifoValid = false;
}
else
RETAILMSG(CANDEBUG,(TEXT(" fifo no valid\r\n")));
// peli_DATA_RECEIVE( pBuffer );
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Read\r\n")));
return dwRetCount;
}
DWORD CAN_Write( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
RETAILMSG(1,(TEXT("hOpenContext - ")));
peli_DATA_WRITE( (unsigned * )pBuffer );
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Write\r\n")));
return Count;
}
DWORD CAN_Seek( DWORD hOpenContext, long Amount, WORD Type )
{
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -