📄 canwdm.h
字号:
// 2003.08.10
//****************************************
//** Copyright (C) W.ch 1999-2003 **
//** Web: http://www.winchiphead.com **
//****************************************
//** WDM for PCI interface chip CH365 **
//** C, VC5.0, Windows 98 DDK **
//****************************************
//
// PCI总线接口芯片CH365的WDM驱动程序 V1.0
// 南京沁恒电子有限公司 作者: W.ch 2003.08
// CH365-WDM V1.0 , Support: IO/MEM/INT
// 运行环境: Windows 98/ME, Windows 2000/XP
//
#ifndef _CAN_WDM_H
#define _CAN_WDM_H
#define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // 定义获取结构成员相对偏移地址的宏
#ifndef max
#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // 较大值
#endif
#ifndef min
#define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // 较小值
#endif
#ifdef ExAllocatePool
#undef ExAllocatePool // 删除带TAG的内存分配
#endif
#ifndef NTSTATUS
typedef LONG NTSTATUS; // 返回状态
#endif
typedef struct _PCI_CONFIG { // 定义PCI配置空间数据结构
USHORT mPcVendorId; // 00H 供应商标识
USHORT mPcDeviceId; // 02H 设备标识
USHORT mPcCommandReg; // 04H 命令寄存器
USHORT mPcStatusReg; // 06H 状态寄存器
UCHAR mPcRevisionId; // 08H 修改标识
UCHAR mPcProgramIf; // 09H 寄存器级编程接口
UCHAR mPcSubClass; // 0AH 子类代码
UCHAR mPcBaseClass; // 0BH 基本分类代码
UCHAR mPcCacheLine; // 0CH 缓存行长度
UCHAR mPcLatenTimer; // 0DH 延迟计数器
UCHAR mPcHeaderType; // 0EH 头标类型
UCHAR mPcBistReg; // 0FH 内含自测试寄存器
ULONG mPcBaseAddr0; // 10H 基址寄存器0
ULONG mPcBaseAddr1; // 14H 基址寄存器1
ULONG mPcBaseAddr2; // 18H 基址寄存器2
ULONG mPcBaseAddr3; // 1CH 基址寄存器3
ULONG mPcBaseAddr4; // 20H 基址寄存器4
ULONG mPcBaseAddr5; // 24H 基址寄存器5
ULONG mPcCardCis; // 28H
USHORT mPcSubSysVen; // 2CH 子系统供应商标识
USHORT mPcSubSysDev; // 2EH 子系统设备标识
ULONG mPcExpansRom; // 30H 扩展ROM基址寄存器
UCHAR mPcCapPtr; // 34H
UCHAR mPcReserved1[3]; // 35H
ULONG mPcReserved2; // 38H
UCHAR mPcInterLine; // 3CH 中断线寄存器
UCHAR mPcInterPin; // 3DH 中断引脚寄存器
UCHAR mPcMinGrant; // 3EH
UCHAR mPcMaxLatency; // 3FH
} mPCI_CONFIG, *mPPCI_CONFIG;
typedef struct _PCI_EXP_ROM { // PCI扩展ROM的数据结构
UCHAR mPerRomSig[4]; // 00H PCI扩展ROM签名字符串'PCIR'
USHORT mPerVendorId; // 04H 供应商标识
USHORT mPerDeviceId; // 06H 设备标识
USHORT mPerVpdPtr; // 08H 重要产品数据指针
USHORT mPerStrucLen; // 0AH PCI扩展ROM数据结构的长度
UCHAR mPerRevision; // 0CH PCI扩展ROM数据结构的修改版本
UCHAR mPerProgramIf; // 0DH 寄存器级编程接口
UCHAR mPerSubClass; // 0EH 子类代码
UCHAR mPerBaseClass; // 0FH 基本分类代码
USHORT mPerImageLen; // 10H 映像长度
USHORT mPerImageRev; // 12H 映像中代码/数据的修改版本
UCHAR mPerCodeType; // 14H 代码类型
UCHAR mPerIndicator; // 15H 映像指示标志
USHORT mPerReserved; // 16H
} mPCI_EXP_ROM, *mPPCI_EXP_ROM;
typedef struct _CH365_CFG_REG { // CH365芯片的配置寄存器
mPCI_CONFIG mCh365CfgPci; // 00H-3FH,共64字节为标准PCI配置空间
UCHAR mCh365CfgCtrl; // 40H 芯片控制寄存器,高5位只读
UCHAR mCh365CfgDin; // 41H 8位总线输入端口,只读
UCHAR mCh365CfgState; // 42H 芯片状态寄存器,只读
UCHAR mCh365CfgResv; // 43H
} mCH365_CFG_REG, *mPCH365_CFG_REG;
typedef struct _CH365_IO_REG { // CH365芯片的I/O空间
UCHAR mCh365IoPort[0xf0]; // 00H-EFH,共240字节为标准的I/O端口
union { // 以字或者以字节为单位进行存取
USHORT mCh365MemAddr; // F0H 存储器接口: A15-A0地址设定寄存器
struct { // 以字节为单位进行存取
UCHAR mCh365MemAddrL; // F0H 存储器接口: A7-A0地址设定寄存器
UCHAR mCh365MemAddrH; // F1H 存储器接口: A15-A8地址设定寄存器
};
};
UCHAR mCh365IoResv2; // F2H
UCHAR mCh365MemData; // F3H 存储器接口: 存储器数据存取寄存器
UCHAR mCh365I2cData; // F4H I2C串行接口: I2C数据存取寄存器
UCHAR mCh365I2cCtrl; // F5H I2C串行接口: I2C控制和状态寄存器
UCHAR mCh365I2cAddr; // F6H I2C串行接口: I2C地址设定寄存器
UCHAR mCh365I2cDev; // F7H I2C串行接口: I2C设备地址和命令寄存器
UCHAR mCh365IoCtrl; // F8H 芯片控制寄存器,高5位只读
UCHAR mCh365IoBuf; // F9H 本地数据输入缓存寄存器
UCHAR mCh365Speed; // FAH 芯片速度控制寄存器
UCHAR mCh365IoResv3; // FBH
UCHAR mCh365IoTime; // FCH 硬件循环计数寄存器
UCHAR mCh365IoResv4[3]; // FDH
} mCH365_IO_REG, *mPCH365_IO_REG;
typedef struct _CH365_MEM_REG { // CH365芯片的存储器空间
UCHAR mCh365MemPort[0x8000]; // 0000H-7FFFH,共32768字节为标准的存储器单元
} mCH365_MEM_REG, *mPCH365_MEM_REG;
typedef struct _WIN32_COMMAND { // 定义WIN32命令接口结构
union {
ULONG mFunction; // 输入时指定功能代码
NTSTATUS mStatus; // 输出时返回操作状态
};
PVOID mAddress; // 起始地址,返回地址
ULONG mLength; // 存取长度,返回后续数据的长度
UCHAR mBuffer[16]; // 数据缓冲区,长度为0至32KB
} mWIN32_COMMAND, *mPWIN32_COMMAND;
typedef struct _Can_FRAME{
UCHAR ExF_StartFrame; //启始帧
UCHAR ExF_IDRegion; //域代号
UCHAR ExF_IDSub; //子类代号
UCHAR ExF_Func; //功能代号
UCHAR ExF_Func_Ex; //功能模式模式扩展0xff@@(低四位无关)
UCHAR ExF_DATA[8]; //传送最多8位数据
} m_Can_Frame,* p_Can_Frame;
typedef struct _Rece_Buffer{
m_Can_Frame * Frame ; //13位帧长度
volatile int Head_op ; //链接指针
volatile int Tail_op ;
int m_Max_Rece_Len;
} m_ReceBuffer, *p_ReceBuffer;
// WIN32应用层接口命令
#define IOCTL_CH365_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f36 << 2 | METHOD_BUFFERED ) // 专用接口
#define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32命令接口的头长度
#define mCH365_MAX_NUMBER 16 // 最多同时连接的CH365数
#define mMAX_BUFFER_LENGTH max( sizeof( mCH365_IO_REG ), sizeof( mCH365_MEM_REG ) ) // 数据缓冲区最大长度
#define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // 最大数据长度加上命令结构头的长度
#define mCH365_MEM_BASE_AUTO ( (PVOID)0xffffffff ) // 自动设定CH365的存储器基址
#define mCH365_INT_LINE_AUTO 0xffffffff // 自动检测CH365的中断号
#define MAX_RECE_BUFFER_SIZE 102400
// 寄存器的位定义
#define mBitAddr15Out 0x01 // 设定A15输出值,1*:high,0:low
#define mBitSysExtOut 0x02 // 设定SYS_EX输出值,1:high,0*:low
#define mBitIntAction 0x04 // 设定中断激活状态,1:action,0*:inaction
#define mBitPciIdDef 0x01 // 只读,PCI设备标识的当前选择,1*:default,0:external
#define mBitPortHit 0x04 // 只读,本地硬件定址功能的启用状态,1:启用,0*:禁用
#define mBitInterRom 0x10 // 只读,内部Mini-ROM功能的启用状态,1:启用,0*:禁用
#define mBitSysExtOe 0x40 // 只读,SYS_EX输出三态控制/输出使能,1*:启用,0:禁用
#define mBitIntEnable 0x80 // 只读,中断功能的启用状态,1:启用,0*:禁用
#define mBitI2cStatus 0x01 // I2C接口的操作控制和状态,1:开始/正在操作,0*:空闲/操作完成
#define mBitI2cSclOut 0x80 // 选择I2C接口的SCL输出,1:SYS_EX,0*:A15
#define mBitSpeedAct 0x07 // 速度控制,激活状态的脉冲宽度,实际宽度为该值乘以30nS
#define mBitSpeedInact 0x10 // 速度控制,非激活状态的空闲宽度,1:前45nS/后15nS,0:前15nS/后15nS
#define mBitSpeedPreft 0x80 // 速度控制,预取状态控制位,1:预取位有效,0:预取位无效
// 应用层接口的功能代码
#define mFuncNoOperation 0x00000000 // 无操作
#define mFuncGetVersion 0x00000001 // 获取驱动程序版本号
#define mFuncGetIoBaseAddr 0x00000002 // 读取I/O端口基址
#define mFuncGetMemBaseAddr 0x00000003 // 读取存储器基址
#define mFuncCanInitialize 0x00000004 // CAN设备初始化例程
#define mFuncCanReceive 0x00000005 // CAN设备接收例程
#define mFuncCanSend 0x00000006 // CAN设备发送例程
#define mFuncSetInterLine 0x00000007 // 设置设备中断线程
#define mFuncWaitingSend 0x00000008
#define mFuncWaitingReceive 0x00000009
#define mFuncGetInterLine 0x0000000a
#define mFuncAbortWaitInter 0x0000000b
//CAN CONTROLER REGISTER DEFINE
#define ModeRegister_Addr 0x00 /*MOD */
#define CmdRegister_Addr 0x01 /*CMR */
#define StateRegister_Addr 0x02 /*SR */
#define IntRegister_Addr 0x03 /*IR */
#define IntEnRegister_Addr 0x04 /*IER */
#define BusTimeRegister0_Addr 0x06 /*BTR0 */
#define BusTimeRegister1_Addr 0x07 /*BTR1 */
#define OutPutCtrRegister_Addr 0x08 /*OCR */
#define ArbitrationLCatch_Addr 0x0B /*ALC Read Only */
#define ErrorCCRegister_Addr 0x0C /*ECC */
#define ErrorWarningLR_Addr 0x0D /*EWLR */
#define RXERRegister_Addr 0x0E /*RXERR */
#define TXERRegister_Addr 0x0F /*TXERR */
#define SFFIDBuffer_Addr 0x10 /*BID*2 */
#define EFFIDBuffer_Addr 0x10 /*BID*4 */
#define SFF_DATA 0x13 /*SFF */
#define EFF_DATA 0x15 /*EFF */
#define RXRamBuffer_Addr 0x1E /*RBSA */
#define CDR_Addr 0x1F /*CDR */
#define ACR0_Addr 0x10 /*ACR0 */
#define ACR1_Addr 0x11 /*ACR1 */
#define ACR2_Addr 0x12 /*ACR2 */
#define ACR3_Addr 0x13 /*ACR3 */
#define AMR0_Addr 0x14 /*AMR0 */
#define AMR1_Addr 0x15 /*AMR1 */
#define AMR2_Addr 0x16 /*AMR2 */
#define AMR3_Addr 0x17 /*AMR3 */
////////////////////////////////////////////////////////////////////////////////////////
/**************CFG Define******************************************************************/
/*MOD_CFG*/
#define MOD_RM 0x01 /*复位模式 */
#define MOD_LOM 0x02 /*只听模式 */
#define MOD_STM 0x04 /*自检模式 */
#define MOD_AFM 0x08 /*验收滤波器模式 */
#define MOD_SM 0x10 /*睡眠模式 */
/*CMR_CFG*/
#define CMR_TR 0x01 /*发送请求 */
#define CMR_AT 0x02 /*终止发送 */
#define CMR_RR 0x04 /*释放接收缓冲 */
#define CMR_CDO 0x08 /*清除数据溢出 */
#define CMR_SRR 0x10 /*自动接受模式 */
/*IR*/
#define RI_RI 0x01 /*接受中断 */
#define RI_TI 0x02 /*发送中断 */
#define RI_EI 0x04 /*出错报警中断 */
#define RI_DOI 0x08 /*数据溢出中断 */
#define RI_WUI 0x10 /*唤醒中断 */
#define RI_EPI 0x20 /*错误认可中断 */
#define RI_ALI 0x40 /*仲裁丢失中断 */
#define RI_BEI 0x80 /*总线错误中断 */
/*SR*/
#define SR_RBS 0x01 /*接收缓冲器状态 1:有有效报文 */
#define SR_DOS 0x02 /*数据溢出状态 RXFIFO 满 */
#define SR_TBS 0x04 /*发送缓冲器状态 1:CPU可以向缓冲起发送报文 */
#define SR_TCS 0x08 /*发送完成状态1:最近依次发送已完成 */
#define SR_RS 0x10 /*接受状态 1:正在接收 */
#define SR_TS 0x20 /*发送状态 1:正在发送 */
#define SR_ES 0x40 /*错误状态 1:至少有一个错误计数器溢出 */
#define SR_BS 0x80 /*总线状态 1:关闭 */
/*IER*/
#define IER_RIE 0x01 /*接受中断使能 */
#define IER_TIE 0x02 /*发送中断使能 */
#define IER_ELE 0x04 /*出错报警中断使能 */
#define IER_DOIE 0x08 /*数据溢出中断使能 */
#define IER_WUIE 0x10 /*唤醒中断使能 */
#define IER_EPIE 0x20 /*错误认可中断使能 */
#define IER_ALIE 0x40 /*仲裁丢失中断使能 */
#define IER_BEIE 0x80 /*总线错误中断使能 */
/*ERRO*/
#define ALC_MASK 0x1F /*仲裁丢失捕捉编码 */
#define ECC_ERRC_MASK 0xC0 /*错误类型编码00,01,10,11:位错,格式错,填充错,其他类型*/
#define ECC_DIR_MASK 0x20 /*错误定位RX:1,TX:0 */
#define ECC_SEG_MASK 0x1F /*错误代码编码 */
/*DLC*/
#define STFrame_FF_MASK 0x80 /*帧结构标识 */
#define STFrame_RTR_MASK 0x40 /*远程帧标识 */
/*CDR*/
#define CDR_Clock_OFF 0x08 /*关闭外部时钟输出 */
#define CDR_CBP_RX0 0x40 /*旁路比较器 */
#define CDR_Mode_Switch 0x80 /*BasicCAN */
/*SELF DEFINE */
#define GetDataLength(ID) (ID&0x0F) /*取得数据帧长度 */
UCHAR CanIntEn= 0x73;
//{5EA71865-00F6-4fbf-9B19-FC58C894A261}
static const GUID CanGuid= { 0x5ea71865, 0xf6, 0x4fbf, { 0x9b, 0x19, 0xfc, 0x58, 0xc8, 0x94, 0xa2, 0x61 } };
#endif // _CAN_WDM_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -