📄 p9656_lib.h
字号:
#ifndef _P9656_LIB_H_
#define _P9656_LIB_H_
#if !defined(UNIX) && (defined(LINUX) || defined(SOLARIS))
#define UNIX
#endif
#if defined(__KERNEL__)
#include "../../../include/kdstdlib.h"
#endif
#include "../../../include/windrvr.h"
#include "../../../samples/shared/pci_regs.h"
#include "../../../samples/shared/bits.h"
#ifdef __cplusplus
extern "C" {
#endif
// PLX register definitions
enum {
P9656_LAS0RR = 0x00,
P9656_LAS0BA = 0x04,
P9656_PCISR = 0x06,
P9656_MARBR = 0x08,
P9656_BIGEND = 0x0c,
P9656_LMISC = 0x0d,
P9656_PROT_AREA = 0x0e,
P9656_PCIBISTR = 0x0f,
P9656_EROMRR = 0x10,
P9656_EROMBA = 0x14,
P9656_LBRD0 = 0x18,
P9656_DMRR = 0x1c,
P9656_DMLBAM = 0x20,
P9656_DMLBAI = 0x24,
P9656_DMPBAM = 0x28,
P9656_DMCFGA = 0x2c,
P9656_OPQIS = 0x30,
P9656_OPQIM = 0x34,
P9656_IQP = 0x40,
P9656_OQP = 0x44,
P9656_MQCR = 0xc0,
P9656_QBAR = 0xc4,
P9656_MBOX0 = 0x78,
P9656_MBOX1 = 0x7c,
P9656_MBOX2 = 0x48,
P9656_HS_CSR = 0x4a,
P9656_MBOX3 = 0x4c,
P9656_MBOX4 = 0x50,
P9656_MBOX5 = 0x54,
P9656_MBOX6 = 0x58,
P9656_MBOX7 = 0x5c,
P9656_P2LDBELL = 0x60,
P9656_L2PDBELL = 0x64,
P9656_INTCSR = 0x68,
P9656_CNTRL = 0x6c,
P9656_PCIHIDR = 0x70,
P9656_PCIHREV = 0x74,
P9656_DMAMODE = 0x80,
P9656_DMAPADR = 0x84,
P9656_DMALADR = 0x88,
P9656_DMASIZ = 0x8c,
P9656_DMADPR = 0x90,
P9656_DMAMODE1 = 0x94,
P9656_DMAPADR1 = 0x98,
P9656_DMALADR1 = 0x9c,
P9656_DMASIZ1 = 0xa0,
P9656_DMADPR1 = 0xa4,
P9656_DMACSR = 0xa8,
P9656_DMACSR1 = 0xa9,
P9656_DMAARB = 0xac,
P9656_DMATHR = 0xb0,
P9656_DMADAC0 = 0xb4,
P9656_DMADAC1 = 0xb8,
P9656_IFHPR = 0xc8,
P9656_IFTPR = 0xcc,
P9656_IPHPR = 0xd0,
P9656_IPTPR = 0xd4,
P9656_OFHPR = 0xd8,
P9656_OFTPR = 0xdc,
P9656_OPHPR = 0xe0,
P9656_OPTPR = 0xe4,
P9656_QSR = 0xe8,
P9656_LAS1RR = 0xf0,
P9656_LAS1BA = 0xf4,
P9656_LBRD1 = 0xf8,
P9656_DMDAC = 0xfc,
P9656_PCIARB = 0x100,
P9656_PABTADR = 0x104
};
// PLX specific PCI configuration registers
enum {
P9656_VPD_CNTL = 0x4c,
P9656_VPD_NEXT = 0x4d,
P9656_VPD_ADDR = 0x4E,
P9656_VPD_DATA = 0x50
};
typedef enum
{
P9656_DMA_CHANNEL_0 = 0,
P9656_DMA_CHANNEL_1 = 1
} P9656_DMA_CHANNEL;
typedef enum
{
P9656_MODE_BYTE = 0,
P9656_MODE_WORD = 1,
P9656_MODE_DWORD = 2,
P9656_MODE_QWORD = 3 // 64bit is used in memory string transfers
} P9656_MODE;
typedef enum
{
P9656_ADDR_REG = AD_PCI_BAR0,
P9656_ADDR_REG_IO = AD_PCI_BAR1,
P9656_ADDR_SPACE0 = AD_PCI_BAR2,
P9656_ADDR_SPACE1 = AD_PCI_BAR3,
P9656_ADDR_SPACE2 = AD_PCI_BAR4,
P9656_ADDR_SPACE3 = AD_PCI_BAR5,
P9656_ADDR_EPROM = AD_PCI_BAR_EPROM
} P9656_ADDR;
enum { P9656_RANGE_REG = 0x00000080 };
typedef struct P9656_DMA_STRUCT *P9656_DMA_HANDLE;
typedef struct P9656_STRUCT *P9656_HANDLE;
typedef struct
{
DWORD dwCounter; // number of interrupts received
DWORD dwLost; // number of interrupts not yet dealt with
BOOL fStopped; // was interrupt disabled during wait
DWORD dwStatusReg; // value of status register when interrupt occurred
} P9656_INT_RESULT;
typedef void (WINAPI *P9656_INT_HANDLER)( P9656_HANDLE hPlx, P9656_INT_RESULT *intResult);
DWORD P9656_CountCards (DWORD dwVendorID, DWORD dwDeviceID);
BOOL P9656_Open(P9656_HANDLE *phPlx, DWORD dwVendorID, DWORD dwDeviceID, DWORD nCardNum);
void P9656_Close (P9656_HANDLE hPlx);
BOOL P9656_IsAddrSpaceActive(P9656_HANDLE hPlx, P9656_ADDR addrSpace);
void P9656_GetPciSlot(P9656_HANDLE hPlx, WD_PCI_SLOT *pPciSlot);
void P9656_ReadWriteBlockLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf,
DWORD dwBytes, BOOL fIsRead, P9656_MODE mode);
void P9656_ReadBlockLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf, DWORD dwBytes, P9656_MODE mode);
void P9656_WriteBlockLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf, DWORD dwBytes, P9656_MODE mode);
BYTE P9656_ReadByteLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr);
void P9656_WriteByteLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr, BYTE data);
WORD P9656_ReadWordLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr);
void P9656_WriteWordLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr, WORD data);
DWORD P9656_ReadDWordLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr);
void P9656_WriteDWordLocal (P9656_HANDLE hPlx, DWORD dwLocalAddr, DWORD data);
void P9656_ReadWriteBlock (P9656_HANDLE hPlx, DWORD dwOffset, PVOID buf,
DWORD dwBytes, BOOL fIsRead, P9656_ADDR addrSpace, P9656_MODE mode);
BYTE P9656_ReadByte (P9656_HANDLE hPlx, P9656_ADDR addrSpace, DWORD dwOffset);
void P9656_WriteByte (P9656_HANDLE hPlx, P9656_ADDR addrSpace, DWORD dwOffset, BYTE data);
WORD P9656_ReadWord (P9656_HANDLE hPlx, P9656_ADDR addrSpace, DWORD dwOffset);
void P9656_WriteWord (P9656_HANDLE hPlx, P9656_ADDR addrSpace, DWORD dwOffset, WORD data);
DWORD P9656_ReadDWord (P9656_HANDLE hPlx, P9656_ADDR addrSpace, DWORD dwOffset);
void P9656_WriteDWord (P9656_HANDLE hPlx, P9656_ADDR addrSpace, DWORD dwOffset, DWORD data);
void P9656_ReadBlock (P9656_HANDLE hPlx, DWORD dwOffset, PVOID buf,
DWORD dwBytes, P9656_ADDR addrSpace, P9656_MODE mode);
void P9656_WriteBlock (P9656_HANDLE hPlx, DWORD dwOffset, PVOID buf,
DWORD dwBytes, P9656_ADDR addrSpace, P9656_MODE mode);
// interrupt functions
BOOL P9656_IntIsEnabled (P9656_HANDLE hPlx);
BOOL P9656_IntEnable (P9656_HANDLE hPlx, P9656_INT_HANDLER funcIntHandler);
void P9656_IntDisable (P9656_HANDLE hPlx);
// access registers
DWORD P9656_ReadReg (P9656_HANDLE hPlx, DWORD dwReg);
void P9656_WriteReg (P9656_HANDLE hPlx, DWORD dwReg, DWORD dwData);
// access PCI configuration registers
DWORD P9656_ReadPCIReg(P9656_HANDLE hPlx, DWORD dwReg);
void P9656_WritePCIReg(P9656_HANDLE hPlx, DWORD dwReg, DWORD dwData);
// Start DMA to/from card.
// fIsRead - TRUE: read from card to buffer. FALSE: write from buffer to card
// dwBytes - number of bytes to transfer (must be a multiple of 4)
// mode - local bus width.
// dwLocalAddr - local address on card to write to / read from
// channel - uses channel 0 or 1 of the 9656
// buf - the buffer to transfer
P9656_DMA_HANDLE P9656_DMAOpen (P9656_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf,
DWORD dwBytes, BOOL fIsRead, P9656_MODE mode, P9656_DMA_CHANNEL dmaChannel);
void P9656_DMAClose (P9656_HANDLE hPlx, P9656_DMA_HANDLE hDma);
void P9656_DMAStart (P9656_HANDLE hPlx, P9656_DMA_HANDLE hDma, BOOL fBlocking);
BOOL P9656_DMAIsDone (P9656_HANDLE hPlx, P9656_DMA_HANDLE hDma);
BOOL P9656_DMAReadWriteBlock (P9656_HANDLE hPlx, DWORD dwLocalAddr, PVOID buf,
DWORD dwBytes, BOOL fIsRead, P9656_MODE mode, P9656_DMA_CHANNEL dmaChannel);
BOOL P9656_EEPROMReadWord(P9656_HANDLE hPlx, DWORD dwOffset, PWORD pwData);
BOOL P9656_EEPROMWriteWord(P9656_HANDLE hPlx, DWORD dwOffset, WORD wData);
BOOL P9656_EEPROMReadDWord(P9656_HANDLE hPlx, DWORD dwOffset, PDWORD pdwData);
BOOL P9656_EEPROMWriteDWord(P9656_HANDLE hPlx, DWORD dwOffset, DWORD dwData);
BOOL P9656_EEPROMValid(P9656_HANDLE hPlx);
// this string is set to an error message, if one occurs
extern CHAR P9656_ErrorString[];
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -