📄 w99200.cpp
字号:
#include <stdio.h>
#include <time.h>
#include"syslib.h"
#include "pci.h"
#include "xdefine.h"
#include "w99200f.h"
#include "w99200.h"
//#include "data.h"
extern unsigned long _IOBase; // I/O base for video
#define I2C_READY 0x0040 // 6-bit=1 I2C ready
#define SA7114_W 0x0042 // SAA7114 Write Mode
#define SA7114_R 0x0043 // SAA7114 Read Mode
#define SA7113_W 0x004A
#define SA7113_R 0x004B
//extern int _dMem_Data[64];
//extern int _dSDRAM_Data[2052];
//extern int _dAUDIO_Data[32];
extern int _ulAIR; // Address Index Register
extern int _ulDPR; // Data Port Register
extern int _ulODPR; // the Output port of the Output-FIFO
extern int _dMem_Data[64];// 4*64=256 Bytes
extern int _dSDRAM_Data[2052]; // 2048*4=8192 Bytes
extern int _dAUDIO_Data[32]; // 32*4=128 Bytes
extern int _dDef_Regs[135]; // Default Value of Registers
extern int iSA;
extern unsigned char _cBus;
extern unsigned char _cDeviceNO;
void W99200Outpdw(int port, int data)
{
// _outpdw((WORD) port,data);// direct outport a double word
sysOutLong((int)port,(int)data);
//pciConfigOutByt(_cBus,_cDeviceNO,/*_funID*/PCI_FUNCTION_ID,port,data);
}
void W99200OutIndexdw(int Port, int IndexData, int DataAddress, int Data)
{
W99200Outpdw(Port,IndexData); // outport register index
W99200Outpdw(DataAddress,Data); // outport data
}
int W99200WriteReg(int index, int value)
{
// printf("WriteReg: Index=%x, value=%x\n", index, value);
W99200OutIndexdw(_IOBase+_ulAIR,index,_IOBase+_ulDPR,value);
//printf("wewewew\n");
return TRUE;
}
int W99200Inpdw(int Port)
{
int data=0;
// data=_inpdw((WORD) Port); // direct inport a double word
data=sysInWord((int)Port);
return data;
}
int W99200InIndexdw (int Port, int IndexData, int DataAddress)
{
int data=0;
W99200Outpdw(Port,IndexData); // outport register index
data=W99200Inpdw(DataAddress);
return data;
}
int W99200ReadReg(int index)
{
int ulRet;
ulRet=W99200InIndexdw(_IOBase+_ulAIR,index,_IOBase+_ulDPR);
return ulRet;
}
void W99200ReSet()
{
int value;
value=0xFF;
W99200WriteReg(Video_reset, value);
}
int W99200IMEM_Write(int Mem)
{
int dMem_Select;
int dSize;
int i;
dSize=64;
dMem_Select=Mem;
// Set the internal memories size by index
if ( dMem_Select==0x09 || dMem_Select==0x0b )
dSize=48;
if ( dMem_Select==0x11 || dMem_Select==0x15 || dMem_Select==0x1d || dMem_Select==0x2b|| dMem_Select==0x0c)
dSize=32;
if ( dMem_Select==0x1a)
dSize=16;
// Soft reset
W99200ReSet();
// Configuration
W99200WriteReg(Vwork_mode, 0x0008);
W99200WriteReg(Vmem_select,dMem_Select);
// Start Command
W99200WriteReg(Vstart, 0x00FF);
// Forward Data transfer
for ( i=0 ; i < dSize ; i++)
W99200WriteReg(Vdata_in, _dMem_Data[i]);
// Stop Command
W99200WriteReg(Vstop, 0x00FF);
return TRUE;
}
int W99200FIFO_Thr(void)
{
int ulRet;
ulRet=0x00;
ulRet=W99200ReadReg(0x0f); // otis 4/20 adding
//if( ulRet & 0x3c )
//if ( (ulRet & 0x0020) == 0x0020 )
// printf( " \n int_source ->%lx",ulRet);
if ( (ulRet & 0x0002) == 0x0002 )
{
//W99200WriteReg(Vint_clear,0x02);
return TRUE;
}
return FALSE;
}
int W99200FIFO_End(void)
{
int ulRet;
clock_t start, end;
// Polling FIFO passes the threshold
start=clock();
// do
{
ulRet=W99200ReadReg(Vint_source); // 1-bit=1: FIFO passed the threshold
if ( (ulRet & 0x0001) == 0x0001 )
return TRUE;
end=clock();
} //while( (end-start) < 500 );
return FALSE;
}
int W99200I2CStatus(void)
{
int dValue;
int ulRet;
clock_t start, end;
//W99200WriteReg(Vint_enable,I2C_READY);// enable interrupt I2C ready
// Polling I2C Status
start=clock();
ulRet=0;
do
{
//ulRet=W99200ReadReg(I2c_status); // 0-bit=0 false;1 success
ulRet=W99200ReadReg(Vint_source); // 0-bit=0 false;1 success
if ( (ulRet & 0x0040) == 0x0040 )
{
W99200WriteReg(Vint_clear,I2C_READY);//4/21..................
/*
if ( W99200ReadReg(I2c_status)== 0x01 )
return TRUE;
else */
return TRUE;
}
end=clock();
}while( (end-start) < 500);
dValue=0x00FF; // I2c_stop = any data
//W99200WriteReg(I2c_stop, dValue);// I2C Stop
return FALSE;
}
int W99200I2CWrite(int Subadrs, int *Value,UINT Count)
{
int dValue[256];
int iResult=0;
UINT uCount,i;
// printf("Subadrs=%x Value=%x\n", Subadrs, *Value);
uCount=Count;
// Read the written data
for ( i=0 ; i < uCount ; i++ )
{
dValue[i]=*Value;
Value++;
}
// enable interrupt I2C ready
//W99200WriteReg(Vint_enable, I2C_READY);
// *** I2C Start
W99200WriteReg(I2c_start, 0x00FF); // I2c_start: any data
// *** Write Device ID, SAA7114 Write Mode=42, Read Mode=43
if ( iSA==2 )
W99200WriteReg(I2c_data, SA7114_W);
else
W99200WriteReg(I2c_data, SA7113_W);
printf("**%d\n",iSA);
//W99200F_DELAY(); // otis adding 4/1
// Check I2C Acknowledge
if ( W99200I2CStatus()== TRUE )
{
// Write Subaddress
W99200WriteReg(I2c_data, Subadrs);
//W99200F_DELAY(); // otis adding 4/1
if ( W99200I2CStatus()!= TRUE ) // Check I2C Acknowledge
return FALSE;
// Write data
for ( i=0 ; i < uCount ; i++ )
{
W99200WriteReg(I2c_data, dValue[i]);
// W99200F_DELAY(); // otis adding 4/1
if ( W99200I2CStatus()!= TRUE ) // Check I2C Acknowledge
return FALSE;
}
// I2C Stop
W99200WriteReg(I2c_stop, 0x00FF); // I2c_stop = any data
//W99200F_DELAY(); // otis adding 4/1
if ( W99200I2CStatus() == TRUE )
return TRUE;
else
return FALSE;
}
else
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -