#ifndef CAN1680
#define CAN1680
#include "AMCC.h"
#define  BYTE  unsigned char
#define  UI    unsigned int
#define  UL    unsigned long

dword  base_addr0;
dword  base_addr1;
dword  base_addr2;
dword  giIrqNum;

BYTE rBuf0[10], rBuf1[10];
BYTE gSendFlag0, gSendFlag1;
BYTE gRecFlag0, gRecFlag1;

/*add by jinzhong*/
#define CANBUS_PROTOCOL_20A      0  /* protocol 2.0A, add by jinzhong*/
#define CANBUS_PROTOCOL_20B      1  /* protocol 2.0B, add by jinzhong*/
#define PELICAN_DOUBLE_FILTER                 0     // in prelican mode, use two 2bytes code and mask to filter

#define PELICAN_SINGLE_FILTER                 8     /* in prelican mode, use a 4bytes code and mask to filter*/
typedef unsigned long DWORD;
typedef unsigned char UCHAR;
typedef struct tag_PT_FilterSetting
{
DWORD       dwFilterType;           /* filter type: 0 - two 2bytes accept code and accept mask
8 - a 4 bytes accept code and accept mask */
UI       uchAcceptCode0;
UI       uchAcceptCode1;
UI       uchAcceptCode2;
UI       uchAcceptCode3;
UI       uchAcceptMask0;
UI       uchAcceptMask1;
UI       uchAcceptMask2;
UI       uchAcceptMask3;
}PT_FilterSetting;

/* Data Frame Format */
#define PELICAN_EFF                    0x80     /* Extended Frame Format*/
#define PELICAN_SFF                    0x00     /* Standard Frame format  */

typedef struct {
	BYTE acc_code;
	BYTE acc_mask;
	BYTE bt0;
	BYTE bt1;
	BYTE protocoltype;/*add by jinzhong*/
	PT_FilterSetting  ssFilterSetting;
}CAN_STRUCT;
/*end added*/

typedef struct {
        UI   id;
        BYTE rtr;
        BYTE dlen;
        BYTE data[8];
} MSG_STRUCT;
/*add by jinzhong*/
typedef struct {
	UCHAR ff;
	UCHAR rtr;      /* EFF RTR 0 0 DLC.3 DLC.2 DLC.1 DLC.0 */
	unsigned long	  id;       /* not present in standard frames */
	UCHAR dlen;
	UCHAR data[8];
} CAN_MSG_T_EX, *PCAN_MSG_T_EX;
/*edd added*/
#define CAN_MSG_LEN sizeof(MSG_STRUCT)
#define CAN_MSG_EX_LEN sizeof(CAN_MSG_T_EX)/*add by jinzhong*/
#define RD_FIFO_EX_LEN (1000*CAN_MSG_EX_LEN)/*add by jinzhong*/
#define RD_FIFO_LEN (1000*CAN_MSG_LEN)
#define FIFO_EMPTY    -1
#define FIFO_OK        0
#define FIFO_FULL      1
#define FIFO_OVERFLOW  2
#define ULONG unsigned long
typedef struct
{
	ULONG head;
	ULONG tail;
	ULONG status;
	ULONG size;
	unsigned char buffer[RD_FIFO_LEN];
}CAN_RD_FIFO_T;

/*add by jinzhong*/
typedef struct {
	ULONG head;
	ULONG tail;
	ULONG status;
	ULONG size;
	UCHAR buffer[RD_FIFO_EX_LEN];
} CAN_RD_FIFO_EX_T;
/*end added*/
extern  int can_err_no;

/*===============  functions declaration ==========================*/
/* set can card hardware setting , if successful return 1, else return 0*/
/*----------------------------------------------------------------------
input:
   segment :set memory decode segment value, 0xC000 to 0xDF00
   irq1    : can port#1 irq number
   irq2    : can port#2 irq number
----------------------------------------------------------------------*/


int canInitHW( void);

//int canReleaseHW();
/* reset can controller */
int  canReset( BYTE port );

/* initiallize and configure can controller */
int  canConfig( BYTE port, CAN_STRUCT can);

/* change can controller to normal run mode */
int  canNormalRun( BYTE port );

/* send a message */
int canSendMsg( BYTE  port, MSG_STRUCT send_msg);

/* receive a message */
int  canReceiveMsg( BYTE port, MSG_STRUCT *msg_ptr,BYTE * IsEmpty);

BYTE canExitHW(void);
int  canSetProtocolType( BYTE port,BYTE protocoltype );
/*add by jinzhong*/
int  canReceiveMsgEx( BYTE port, CAN_MSG_T_EX *msg_ptrex, BYTE * IsEmpty);
int canSendMsgEx( BYTE  port, CAN_MSG_T_EX msgex);
#endif