?? ch365dll.h
字號:
// 2003.09.10
// 2003.12.08 V1.2
// 2004.05.08 V1.3
// 2004.12.10 V1.5
// 2005.10.20 V1.6
//****************************************
//** Copyright (C) W.ch 1999-2004 **
//** Web: http://www.winchiphead.com **
//****************************************
//** DLL for PCI interface chip CH365 **
//** C, VC5.0 **
//****************************************
//
// PCI總線接口芯片CH365的應(yīng)用層接口庫 V1.6
// 南京沁恒電子有限公司 作者: W.ch 2005.10
// CH365-DLL V1.6 , Support: IO/MEM/INT
// 運行環(huán)境: Windows 98/ME, Windows 2000/XP
//
#ifndef _CH365_DLL_H
#define _CH365_DLL_H
#ifdef __cplusplus
extern "C" {
#endif
#define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // 定義獲取結(jié)構(gòu)成員相對偏移地址的宏
#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的內(nèi)存分配
#endif
#ifndef NTSTATUS
typedef LONG NTSTATUS; // 返回狀態(tài)
#endif
typedef struct _PCI_CONFIG { // 定義PCI配置空間數(shù)據(jù)結(jié)構(gòu)
USHORT mPcVendorId; // 00H 供應(yīng)商標(biāo)識
USHORT mPcDeviceId; // 02H 設(shè)備標(biāo)識
USHORT mPcCommandReg; // 04H 命令寄存器
USHORT mPcStatusReg; // 06H 狀態(tài)寄存器
UCHAR mPcRevisionId; // 08H 修改標(biāo)識
UCHAR mPcProgramIf; // 09H 寄存器級編程接口
UCHAR mPcSubClass; // 0AH 子類代碼
UCHAR mPcBaseClass; // 0BH 基本分類代碼
UCHAR mPcCacheLine; // 0CH 緩存行長度
UCHAR mPcLatenTimer; // 0DH 延遲計數(shù)器
UCHAR mPcHeaderType; // 0EH 頭標(biāo)類型
UCHAR mPcBistReg; // 0FH 內(nèi)含自測試寄存器
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 子系統(tǒng)供應(yīng)商標(biāo)識
USHORT mPcSubSysDev; // 2EH 子系統(tǒng)設(shè)備標(biāo)識
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的數(shù)據(jù)結(jié)構(gòu)
UCHAR mPerRomSig[4]; // 00H PCI擴展ROM簽名字符串'PCIR'
USHORT mPerVendorId; // 04H 供應(yīng)商標(biāo)識
USHORT mPerDeviceId; // 06H 設(shè)備標(biāo)識
USHORT mPerVpdPtr; // 08H 重要產(chǎn)品數(shù)據(jù)指針
USHORT mPerStrucLen; // 0AH PCI擴展ROM數(shù)據(jù)結(jié)構(gòu)的長度
UCHAR mPerRevision; // 0CH PCI擴展ROM數(shù)據(jù)結(jié)構(gòu)的修改版本
UCHAR mPerProgramIf; // 0DH 寄存器級編程接口
UCHAR mPerSubClass; // 0EH 子類代碼
UCHAR mPerBaseClass; // 0FH 基本分類代碼
USHORT mPerImageLen; // 10H 映像長度
USHORT mPerImageRev; // 12H 映像中代碼/數(shù)據(jù)的修改版本
UCHAR mPerCodeType; // 14H 代碼類型
UCHAR mPerIndicator; // 15H 映像指示標(biāo)志
USHORT mPerReserved; // 16H
} mPCI_EXP_ROM, *mPPCI_EXP_ROM;
typedef struct _CH365_CFG_REG { // CH365芯片的配置寄存器
mPCI_CONFIG mCh365CfgPci; // 00H-3FH,共64字節(jié)為標(biāo)準(zhǔn)PCI配置空間
UCHAR mCh365CfgCtrl; // 40H 芯片控制寄存器,高5位只讀
UCHAR mCh365CfgDin; // 41H 8位總線輸入端口,只讀
UCHAR mCh365CfgState; // 42H 芯片狀態(tài)寄存器,只讀
UCHAR mCh365CfgResv; // 43H
} mCH365_CFG_REG, *mPCH365_CFG_REG;
typedef struct _CH365_IO_REG { // CH365芯片的I/O空間
UCHAR mCh365IoPort[0xf0]; // 00H-EFH,共240字節(jié)為標(biāo)準(zhǔn)的I/O端口
union { // 以字或者以字節(jié)為單位進行存取
USHORT mCh365MemAddr; // F0H 存儲器接口: A15-A0地址設(shè)定寄存器
struct { // 以字節(jié)為單位進行存取
UCHAR mCh365MemAddrL; // F0H 存儲器接口: A7-A0地址設(shè)定寄存器
UCHAR mCh365MemAddrH; // F1H 存儲器接口: A15-A8地址設(shè)定寄存器
};
};
UCHAR mCh365IoResv2; // F2H
UCHAR mCh365MemData; // F3H 存儲器接口: 存儲器數(shù)據(jù)存取寄存器
UCHAR mCh365I2cData; // F4H I2C串行接口: I2C數(shù)據(jù)存取寄存器
UCHAR mCh365I2cCtrl; // F5H I2C串行接口: I2C控制和狀態(tài)寄存器
UCHAR mCh365I2cAddr; // F6H I2C串行接口: I2C地址設(shè)定寄存器
UCHAR mCh365I2cDev; // F7H I2C串行接口: I2C設(shè)備地址和命令寄存器
UCHAR mCh365IoCtrl; // F8H 芯片控制寄存器,高5位只讀
UCHAR mCh365IoBuf; // F9H 本地數(shù)據(jù)輸入緩存寄存器
UCHAR mCh365Speed; // FAH 芯片速度控制寄存器
UCHAR mCh365IoResv3; // FBH
UCHAR mCh365IoTime; // FCH 硬件循環(huán)計數(shù)寄存器
UCHAR mCh365IoResv4[3]; // FDH
} mCH365_IO_REG, *mPCH365_IO_REG;
typedef struct _CH365_MEM_REG { // CH365芯片的存儲器空間
UCHAR mCh365MemPort[0x8000]; // 0000H-7FFFH,共32768字節(jié)為標(biāo)準(zhǔn)的存儲器單元
} mCH365_MEM_REG, *mPCH365_MEM_REG;
typedef struct _WIN32_COMMAND { // 定義WIN32命令接口結(jié)構(gòu)
union {
ULONG mFunction; // 輸入時指定功能代碼
NTSTATUS mStatus; // 輸出時返回操作狀態(tài)
};
PVOID mAddress; // 起始地址,返回地址
ULONG mLength; // 存取長度,返回后續(xù)數(shù)據(jù)的長度
UCHAR mBuffer[4]; // 數(shù)據(jù)緩沖區(qū),長度為0至32KB
} mWIN32_COMMAND, *mPWIN32_COMMAND;
// WIN32應(yīng)用層接口命令
#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數(shù)
#define mMAX_BUFFER_LENGTH max( sizeof( mCH365_IO_REG ), sizeof( mCH365_MEM_REG ) ) // 數(shù)據(jù)緩沖區(qū)最大長度
#define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // 最大數(shù)據(jù)長度加上命令結(jié)構(gòu)頭的長度
#define mCH365_MEM_BASE_AUTO ( (PVOID)0xffffffff ) // 自動設(shè)定CH365的存儲器基址
#define mCH365_INT_LINE_AUTO 0xffffffff // 自動檢測CH365的中斷號
// 寄存器的位定義
#define mBitAddr15Out 0x01 // 設(shè)定A15輸出值,1*:high,0:low
#define mBitSysExtOut 0x02 // 設(shè)定SYS_EX輸出值,1:high,0*:low
#define mBitIntAction 0x04 // 設(shè)定中斷激活狀態(tài),1:action,0*:inaction
#define mBitPciIdDef 0x01 // 只讀,PCI設(shè)備標(biāo)識的當(dāng)前選擇,1*:default,0:external
#define mBitPortHit 0x04 // 只讀,本地硬件定址功能的啟用狀態(tài),1:啟用,0*:禁用
#define mBitInterRom 0x10 // 只讀,內(nèi)部Mini-ROM功能的啟用狀態(tài),1:啟用,0*:禁用
#define mBitSysExtOe 0x40 // 只讀,SYS_EX輸出三態(tài)控制/輸出使能,1*:啟用,0:禁用
#define mBitIntEnable 0x80 // 只讀,中斷功能的啟用狀態(tài),1:啟用,0*:禁用
#define mBitI2cStatus 0x01 // I2C接口的操作控制和狀態(tài),1:開始/正在操作,0*:空閑/操作完成
#define mBitI2cSclOut 0x80 // 選擇I2C接口的SCL輸出,1:SYS_EX,0*:A15
#define mBitSpeedAct 0x07 // 速度控制,激活狀態(tài)的脈沖寬度,實際寬度為該值乘以30nS
#define mBitSpeedInact 0x10 // 速度控制,非激活狀態(tài)的空閑寬度,1:前45nS/后15nS,0:前15nS/后15nS
#define mBitSpeedPreft 0x80 // 速度控制,預(yù)取狀態(tài)控制位,1:預(yù)取位有效,0:預(yù)取位無效
// 應(yīng)用層接口的功能代碼
#define mFuncNoOperation 0x00000000 // 無操作
#define mFuncGetVersion 0x00000001 // 獲取驅(qū)動程序版本號
#define mFuncGetIoBaseAddr 0x00000004 // 讀取I/O端口基址
#define mFuncSetIoBaseAddr 0x00000005 // 設(shè)置I/O端口基址
#define mFuncGetMemBaseAddr 0x00000006 // 讀取存儲器基址
#define mFuncSetMemBaseAddr 0x00000007 // 設(shè)置存儲器基址,自動設(shè)定存儲器基址
#define mFuncGetInterLine 0x00000008 // 讀取中斷號
#define mFuncSetInterLine 0x00000009 // 設(shè)置中斷號,自動檢測中斷號
#define mFuncWaitInterrupt 0x0000000a // 等待中斷,直到CH365產(chǎn)生中斷
#define mFuncAbortWaitInter 0x0000000b // 放棄等待中斷,終止等待
#define mFuncSetExclusive 0x0000000c // 設(shè)置獨占使用
#define mFuncReadIoByte 0x00000010 // 讀取輸入輸出端口,在同一個端口地址以字節(jié)為單位連續(xù)讀取
#define mFuncReadIoWord 0x00000011 // 讀取輸入輸出端口,在同一個端口地址以字為單位連續(xù)讀取
#define mFuncReadIoDword 0x00000012 // 讀取輸入輸出端口,在同一個端口地址以雙字為單位連續(xù)讀取
#define mFuncReadIoBlock 0x00000013 // 讀取輸入輸出端口,每讀取一個字節(jié),端口地址加一
#define mFuncWriteIoByte 0x00000014 // 寫入輸入輸出端口,在同一個端口地址以字節(jié)為單位連續(xù)寫入
#define mFuncWriteIoWord 0x00000015 // 寫入輸入輸出端口,在同一個端口地址以字為單位連續(xù)寫入
#define mFuncWriteIoDword 0x00000016 // 寫入輸入輸出端口,在同一個端口地址以雙字為單位連續(xù)寫入
#define mFuncWriteIoBlock 0x00000017 // 寫入輸入輸出端口,每寫入一個字節(jié),端口地址加一
#define mFuncReadMemByte 0x00000018 // 讀取存儲器/寄存器
#define mFuncReadMemWord 0x00000019 // 讀取存儲器/寄存器
#define mFuncReadMemDword 0x0000001a // 讀取存儲器/寄存器
#define mFuncWriteMemByte 0x0000001c // 寫入存儲器/寄存器
#define mFuncWriteMemWord 0x0000001d // 寫入存儲器/寄存器
#define mFuncWriteMemDword 0x0000001e // 寫入存儲器/寄存器
#define mFuncReadConfig 0x00000020 // 讀取PCI配置空間
#define mFuncWriteConfig 0x00000021 // 寫入PCI配置空間
#define mFuncReadBuffer1 0x00000024 // 讀取中斷命令緩沖區(qū)1
#define mFuncWriteBuffer1 0x00000025 // 寫入中斷命令緩沖區(qū)1
#define mFuncReadBuffer2 0x00000026 // 讀取中斷命令緩沖區(qū)2
#define mFuncWriteBuffer2 0x00000027 // 寫入中斷命令緩沖區(qū)2
typedef VOID ( CALLBACK * mPCH365_INT_ROUTINE ) ( VOID ); // 中斷服務(wù)程序
HANDLE WINAPI CH365OpenDevice( // 打開CH365設(shè)備,返回句柄,出錯則無效
BOOL iEnableMemory, // 是否需要支持存儲器
BOOL iEnableInterrupt ); // 是否需要支持中斷
VOID WINAPI CH365CloseDevice( ); // 關(guān)閉CH365設(shè)備
ULONG WINAPI CH365GetVersion( ); // 獲得DLL版本號,返回版本號
ULONG WINAPI CH365DriverCommand( // 直接傳遞命令給驅(qū)動程序,出錯則返回0,否則返回數(shù)據(jù)長度
mPWIN32_COMMAND ioCommand ); // 命令結(jié)構(gòu)的指針
// 該程序在調(diào)用后返回數(shù)據(jù)長度,并且仍然返回命令結(jié)構(gòu),如果是讀操作,則數(shù)據(jù)返回在命令結(jié)構(gòu)中,
// 返回的數(shù)據(jù)長度在操作失敗時為0,操作成功時為整個命令結(jié)構(gòu)的長度,例如讀一個字節(jié),則返回mWIN32_COMMAND_HEAD+1,
// 命令結(jié)構(gòu)在調(diào)用前,分別提供:命令功能代碼,起始地址(可選),存取數(shù)據(jù)的長度(可選),
// 命令結(jié)構(gòu)在調(diào)用后,分別返回:操作狀態(tài)代碼,返回的基址(可選),后續(xù)數(shù)據(jù)的長度(可選),
// 操作狀態(tài)代碼是由WINDOWS定義的代碼,可以參考NTSTATUS.H,
// 返回的基址只適用于下列命令:獲取I/O基址,獲取存儲器基址,獲取中斷號,對于其它命令則保持輸入時的起始地址
// 后續(xù)數(shù)據(jù)的長度是指讀操作返回的數(shù)據(jù)長度,數(shù)據(jù)存放在隨后的緩沖區(qū)中,對于寫操作一般為0
ULONG WINAPI CH365GetDrvVersion( ); // 獲得驅(qū)動程序版本號,返回版本號,出錯則返回0
BOOL WINAPI CH365GetIoBaseAddr( // 獲取I/O端口的基址
mPCH365_IO_REG *oIoBaseAddr ); // 保存I/O端口基址的單元地址
BOOL WINAPI CH365SetIoBaseAddr( // 設(shè)定I/O端口的基址
mPCH365_IO_REG iIoBaseAddr ); // 指定I/O端口基址
BOOL WINAPI CH365GetMemBaseAddr( // 獲取存儲器的基址
mPCH365_MEM_REG *oMemBaseAddr ); // 保存存儲器基址的單元地址
BOOL WINAPI CH365SetMemBaseAddr( // 設(shè)定存儲器的基址
mPCH365_MEM_REG iMemBaseAddr ); // 指定存儲器基址,為0則關(guān)閉存儲器,為-1則自動設(shè)定
BOOL WINAPI CH365GetIntLine( // 獲取中斷號
PULONG oIntLine ); // 保存中斷號的單元地址
BOOL WINAPI CH365SetIntLine( // 設(shè)定中斷號
ULONG iIntLine ); // 指定中斷號,為0則關(guān)閉中斷,為-1則自動檢測并設(shè)定
BOOL WINAPI CH365WaitInterrupt( ); // 等待中斷事件
BOOL WINAPI CH365AbortWaitInt( ); // 放棄等待中斷
BOOL WINAPI CH365SetIntRoutine( // 設(shè)定中斷服務(wù)程序
mPCH365_INT_ROUTINE iIntRoutine ); // 指定中斷服務(wù)程序,為NULL則取消中斷服務(wù),否則在中斷時調(diào)用該程序
BOOL WINAPI CH365ReadIntCommand( // 讀取中斷命令緩沖區(qū)
mPWIN32_COMMAND oCommand, // 指向一個足夠大的緩沖區(qū),用于保存讀取的命令結(jié)構(gòu)
ULONG iCmdIndex ); // 中斷命令序號,為1或者2
BOOL WINAPI CH365WriteIntCommand( // 寫入中斷命令緩沖區(qū)
mPWIN32_COMMAND iCommand, // 指向作為中斷命令的命令結(jié)構(gòu)
ULONG iCmdIndex ); // 中斷命令序號,為1或者2
BOOL WINAPI CH365ReadIoByte( // 從I/O端口讀取一個字節(jié)
PVOID iAddr, // 指定I/O端口的地址
PUCHAR oByte ); // 指向一個字節(jié)單元,用于保存讀取的字節(jié)數(shù)據(jù)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -