// // MODULE : BOARD.C // PURPOSE : Board specific code goes here // AUTHOR : JBS Yadawa // CREATED : 7/20/96 // // Copyright (C) 1996 SGS-THOMSON Microelectronics // // // REVISION HISTORY : // // DATE : // // COMMENTS : // #include "common.h" #include "strmini.h" #include "stdefs.h" #include "board.h" #include "debug.h" #include "common.h" #include "i20reg.h" #include "bt856.h" #include "memio.h" #include "codedma.h" #define POSTOFFICEREG 0x200 #define INCTL 0x01 #define AUXCTL 0x02 #define INTR_CTRL 0x40 #define INTR_STATUS 0x3C static BYTE PrevVideoAdr = 0xFF; static BYTE GPIOReg; BYTE FARAPI BoardReadAudio(BYTE Reg) { BYTE NewVideoAdr = Reg & 0x7E; DWORD PoReg=0; HostDisableIT(); if(NewVideoAdr != PrevVideoAdr) { PrevVideoAdr = NewVideoAdr; PoReg = NewVideoAdr | 0x00830000; memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); } if(Reg&0x80) { if(Reg&0x01) PoReg = 0x00150000; else PoReg = 0x00140000; } else { if(Reg&0x01) PoReg = 0x00110000; else PoReg = 0x00100000; } memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); PoReg = memInDword(POSTOFFICEREG); HostEnableIT(); return ((BYTE)PoReg); } BYTE FARAPI BoardReadVideo(BYTE Reg) { BYTE NewVideoAdr = Reg & 0x7E; DWORD PoReg=0; HostDisableIT(); if(NewVideoAdr != PrevVideoAdr) { PrevVideoAdr = NewVideoAdr; PoReg = NewVideoAdr | 0x00830000; memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); } if(Reg&0x80) { if(Reg&0x01) PoReg = 0x00150000; else PoReg = 0x00140000; } else { if(Reg&0x01) PoReg = 0x00110000; else PoReg = 0x00100000; } memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); PoReg = memInDword(POSTOFFICEREG); HostEnableIT(); return ((BYTE)PoReg); } void FARAPI BoardWriteAudio(BYTE Reg, BYTE Data) { BYTE NewVideoAdr = Reg & 0x7E; DWORD PoReg=0; HostDisableIT(); if(NewVideoAdr != PrevVideoAdr) { PrevVideoAdr = NewVideoAdr; PoReg = NewVideoAdr | 0x00830000; memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); } if(Reg&0x80) { if(Reg&0x01) PoReg = Data | 0x00970000; else PoReg = Data | 0x00960000; } else { if(Reg&0x01) PoReg = Data | 0x00930000; else PoReg = Data | 0x00920000; } memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); HostEnableIT(); } void FARAPI BoardWriteVideo(BYTE Reg, BYTE Data) { BYTE NewVideoAdr = Reg & 0x7E; DWORD PoReg=0; HostDisableIT(); if(NewVideoAdr != PrevVideoAdr) { PrevVideoAdr = NewVideoAdr; PoReg = NewVideoAdr | 0x00830000; memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); } if(Reg&0x80) { if(Reg&0x01) PoReg = Data | 0x00970000; else PoReg = Data | 0x00960000; } else { if(Reg&0x01) PoReg = Data | 0x00930000; else PoReg = Data | 0x00920000; } memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); HostEnableIT(); } void FARAPI BoardSendAudio(LPBYTE lpBuffer, WORD size) { } void FARAPI BoardSendVideo(WORD * Buffer, WORD Size) { } void FARAPI BoardEnableIRQ(void) { memOutByte(INTR_CTRL+3,0x71); // DPF((Trace,"PCI Intr = %x", memInByte(INTR_CTRL+3))); } void FARAPI BoardDisableIRQ(void) { memOutByte(INTR_CTRL+3,0x00); // DPF((Trace,"PCI Intr = %x", memInByte(INTR_CTRL+3))); } void FARAPI BoardAudioSetSamplingFrequency(DWORD Frequency) { } void FARAPI BoardEnterInterrupt(void) { } void FARAPI BoardLeaveInterrupt(void) { // memOutByte(INTR_STATUS+3,0xFF); // DPF((Trace,"PCI Intr = %x", memInByte(INTR_STATUS+3))); } BOOL FARAPI BoardOpen(DWORD Base) { static char dbgstr[120]; PrevVideoAdr = 0xFF; DPF((Trace,"Allocating Memory Base!!\n")); if(!AllocMemoryBase(Base, 0x1000)) { DPF((Trace,"Can not covert Physical to Linear")); return FALSE; } DPF((Trace, "GPIO = %lx", memInDword(I20_GPREG))); memOutDword(I20_GPREG, 0x000000ff); Delay(100); memOutDword(I20_GPREG, 0x010000ff); Delay(100); memOutDword(I20_GPREG, 0x000000ff); Delay(100); memOutDword(I20_GPREG, 0x010000ff); Delay(4000); DPF((Trace, "GPIO = %lx", memInDword(I20_GPREG))); // Gen Purpose Directions // O I O O O O I I // SPIDO SPIDI SPICLK SPIEN SRESET STIRST STIREQ AXREQ memOutByte(I20_GPREG, 0x43); // 0 0 1 1 0 0 0 0 // SPIDO SPIDI SPICLK SPIEN SRESET STIRST STIREQ AXREQ memOutByte(I20_GBREG+3, 0x30); Delay(100); // 0 0 0 1 0 0 0 0 // SPIDO SPIDI SPICLK SPIEN SRESET STIRST STIREQ AXREQ memOutByte(I20_GBREG+3, 0x10); Delay(100); BoardWriteEPLD(INCTL, 0x01); Delay(100); BoardWriteEPLD(AUXCTL, 0x00); Delay(100); // 0 0 0 1 1 1 0 0 // SPIDO SPIDI SPICLK SPIEN SRESET STIRST STIREQ AXREQ memOutByte(I20_GBREG+3, 0x1C); GPIOReg = 0x1C; Delay(100); memOutByte(I20_GBREG, 0x00); Delay(100); memOutByte(I20_GBREG+1, 0x00); Delay(100); BoardWriteEPLD(INCTL, 0x01); Delay(100); BoardWriteEPLD(AUXCTL, 0x00); Delay(100); BTInitEnc(); BTSetVideoStandard(NTSC_PLAY); BTInitEnc(); BTSetVideoStandard(NTSC_PLAY); return TRUE; } BOOL FARAPI BoardClose(void) { FreeMemoryBase(); return TRUE; } void FARAPI Delay(DWORD Microseconds) { /* DWORD i, j; for (i = 0; i < Microseconds*20; i++) j = inp(0x0070)%2; // the action of reading takes about 1ęs */ KeStallExecutionProcessor(Microseconds); } void FARAPI BoardWriteEPLD(BYTE Reg, BYTE Data) { DWORD PoReg=0; HostDisableIT(); PoReg = Data | 0x00800000 | ((DWORD)(Reg&0x07) << 16); memOutDword(POSTOFFICEREG, PoReg); while(memInDword(POSTOFFICEREG)&02000000L); HostEnableIT(); } void FARAPI BoardWriteGPIOReg(BYTE Bit, BOOL Val) { BYTE x; if(Val) { x = 1 << Bit; GPIOReg |= x; memOutByte(I20_GBREG+3, GPIOReg); } else { x = 1 << Bit; x = ~x; GPIOReg &= x; memOutByte(I20_GBREG+3, GPIOReg); } } BOOL FARAPI BoardReadGPIOReg(BYTE Bit) { BYTE x; x = memInByte(I20_GBREG+3); return ((x>> Bit)&0x01); }