#include "PCITMC12.H" /* -------------------------------------------------------------------- */ float PTMC12_FloatSub2(float fA, float fB) { return(fA-fB); } short PTMC12_ShortSub2(short nA, short nB) { return(nA-nB); } WORD PTMC12_DriverInit(WORD *wBoards) { WORD wReturnCode; wReturnCode=GetAddress(); if ( wReturnCode ) { *wBoards=0; return( wReturnCode ); } *wBoards=wTotalBoards; return( wReturnCode ); } WORD PTMC12_DriverClose(void) { return( NoError ); } WORD PTMC12_GetDriverVersion(WORD *wDriverVersion) { *wDriverVersion=0x100; return( NoError ); } /* -------------------------------------------------------------------- */ WORD PTMC12_GetConfigAddressSpace(WORD wBoardNo, WORD *wBaseAddr, WORD *wIrq , WORD *wPLX) { WORD wIndex; if (wGetAddress==0) { if (GetAddress()!=0) return(FindBoardError); } if ( wBoardNo>=wTotalBoards ) return ExceedBoardNumber; wIndex=wBoardNo; *wBaseAddr = wConfigSpace[wIndex][0]; *wIrq = wConfigSpace[wIndex][1]; *wPLX = wConfigSpace[wIndex][2]; return(NoError); } WORD GetAddress(void) { DWORD dConfigAddress,dBaseAddress,dwVal; WORD HiWord,LoWord,wVal; WORD ReturnCode,ww; UCHAR Bus,Device,Function,WhichLong; WORD VendorID,DeviceID; WORD SubVendorID,SubDeviceID; WORD wIrqNumber; wTotalBoards=0; /* initial board number is 0 */ Bus=0; for (Bus=0; Bus<32; Bus++) /* max 32 PCI-SLOT */ { Function=0; WhichLong=1; for(Device=0; Device<32; Device++) { WhichLong=0; WriteAddress(Bus,Device,Function,WhichLong); VendorID=inport(0xcfc); DeviceID=inport(0xcfe); WhichLong=0x0b; WriteAddress(Bus,Device,Function,WhichLong); SubVendorID=inport(0xcfc); SubDeviceID=inport(0xcfe); if ( VendorID==0x10b5 && DeviceID==0x9050 && /* PLX 9050 */ SubVendorID==0x2129 && SubDeviceID==0x9912) /* PCI-TMC12 */ { WhichLong=5; /* PLX base address */ WriteAddress(Bus,Device,Function,WhichLong); wVal=(inport(0xcfc)&0xfffe); wConfigSpace[wTotalBoards][2]=wVal; WhichLong=6; /* TMC12 base address */ WriteAddress(Bus,Device,Function,WhichLong); dBaseAddress=_inpd(0xcfc); wVal=(WORD)(dBaseAddress&0xfffe); wConfigSpace[wTotalBoards][0]=wVal; WhichLong=15; /* interrupt channel */ WriteAddress(Bus,Device,Function,WhichLong); dwVal=_inpd(0xcfc); wConfigSpace[wTotalBoards][1]=dwVal&0xff; wTotalBoards++; /* increment board number */ if (wTotalBoards >16) return ExceedBoardNumber; wGetAddress=1; } } } return( NoError ); } void WriteAddress(UCHAR bBus, UCHAR bDevice, UCHAR bFunction, UCHAR bWhichLong) { DWORD dOutData; WORD HiWord,LoWord; UCHAR HiByte,LoByte; HiWord=0x8000|bBus; HiByte=(bDevice<<3)|bFunction; LoByte=(bWhichLong<<2) & 0xfc; LoWord=( (WORD)HiByte<<8 )|LoByte; dOutData=( (DWORD)HiWord<<16 ) | LoWord; _outpd(0xcf8,dOutData); }