470 lines
14 KiB
C
470 lines
14 KiB
C
//----------------------------------------------------------------------------
|
|
// STINIT.C
|
|
//----------------------------------------------------------------------------
|
|
// Description : Initialization routines (and reset)
|
|
//----------------------------------------------------------------------------
|
|
// Copyright SGS Thomson Microelectronics ! Version alpha ! Jan 1st, 1995
|
|
//----------------------------------------------------------------------------
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Include files
|
|
//----------------------------------------------------------------------------
|
|
#include "stdefs.h"
|
|
#include "common.h"
|
|
#include "STllapi.h"
|
|
#include "error.h"
|
|
#ifdef STi3520A
|
|
#include "STi3520A.h"
|
|
#else
|
|
#include "STi3520.h"
|
|
#endif
|
|
|
|
//----------------------------------------------------------------------------
|
|
// GLOBAL Variables (avoid as possible)
|
|
//----------------------------------------------------------------------------
|
|
extern PCARD pCard;
|
|
extern U8 Sequence;
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Private Constants
|
|
//----------------------------------------------------------------------------
|
|
#define PLL
|
|
//#define PES
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Private Types
|
|
//----------------------------------------------------------------------------
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Private GLOBAL Variables (static)
|
|
//----------------------------------------------------------------------------
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Functions (statics one are private)
|
|
//----------------------------------------------------------------------------
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
U16 VideoTestReg(PVIDEO pVideo)
|
|
{
|
|
#ifndef STi3520A
|
|
VideoWrite ( MWP + 1, 0x55 );
|
|
VideoWrite ( MWP + 2, 0x55 );
|
|
if ( VideoRead ( MWP + 1 ) != 0x55 )
|
|
return ( BAD_REG_V );
|
|
if ( VideoRead ( MWP + 2 ) != 0x55 )
|
|
return ( BAD_REG_V );
|
|
VideoWrite ( MWP + 1, 0xAA );
|
|
VideoWrite ( MWP + 2, 0xAA );
|
|
if ( VideoRead ( MWP + 1 ) != 0xAA )
|
|
return ( BAD_REG_V );
|
|
if ( VideoRead ( MWP + 2 ) != 0xAA )
|
|
return ( BAD_REG_V );
|
|
return ( NO_ERROR );
|
|
#else
|
|
VideoWrite ( MWP , 0x05 );
|
|
VideoWrite ( MWP , 0x55 );
|
|
VideoWrite ( MWP , 0xAA );
|
|
if ( (VideoRead(MWP) & 0x1F) != 0x05 )
|
|
return ( BAD_REG_V );
|
|
if ( VideoRead(MWP) != 0x55 )
|
|
return ( BAD_REG_V );
|
|
if ( (VideoRead(MWP) & 0xFC) != 0xA8 )
|
|
return ( BAD_REG_V );
|
|
return ( NO_ERROR );
|
|
#endif
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
static U16 VideoTestMemPat(PVIDEO pVideo, U16 pattern, U16 pattern1)
|
|
{
|
|
#define MAXMEM 0x7FF
|
|
U16 i, j;
|
|
S16 counter;
|
|
|
|
VideoSetMWP(0L);
|
|
counter = 0;
|
|
for (i = 0; i < MAXMEM; i++) {
|
|
while (!VideoMemWriteFifoEmpty()) {
|
|
counter ++;
|
|
if (counter == 0xFF)
|
|
return BAD_MEM_V;
|
|
}
|
|
|
|
for (j = 0; j < 16; j++)
|
|
VideoWrite(MWF, 0);
|
|
}
|
|
|
|
VideoSetMWP(0L);
|
|
counter = 0;
|
|
for (i = 0; i < MAXMEM; i++) {
|
|
while (!VideoMemWriteFifoEmpty()) {
|
|
counter ++;
|
|
if (counter == 0xFF)
|
|
return ( BAD_MEM_V );
|
|
}
|
|
|
|
for ( j = 0; j < 8; j++ )
|
|
VideoWrite ( MWF, pattern);
|
|
counter = 0;
|
|
while (!VideoMemWriteFifoEmpty()) { // ACCESS TO MEM FIFO IS SLOWER !!!
|
|
counter ++;
|
|
if (counter == 0xFF)
|
|
return ( BAD_MEM_V );
|
|
}
|
|
|
|
for ( j = 0; j < 8; j++ )
|
|
VideoWrite ( MWF, pattern1);
|
|
}
|
|
|
|
VideoSetMRP(0L);
|
|
counter = 0;
|
|
// test Read Fifo Full
|
|
for ( i = 0; i < MAXMEM; i++ ) {
|
|
while ( !VideoMemReadFifoFull() ) {
|
|
counter ++;
|
|
if(counter == 0xFF)
|
|
return ( BAD_MEM_V );
|
|
}
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
counter = VideoRead(MRF);
|
|
if (counter != pattern) {
|
|
return BAD_MEM_V;
|
|
}
|
|
}
|
|
|
|
counter = 0;
|
|
while (!VideoMemReadFifoFull()) {
|
|
counter ++;
|
|
if (counter == 0xFF)
|
|
return BAD_MEM_V;
|
|
}
|
|
|
|
for (j = 0; j < 8; j++ ) {
|
|
counter = VideoRead (MRF);
|
|
if ( counter != pattern1 ) {
|
|
return BAD_MEM_V;
|
|
}
|
|
}
|
|
}
|
|
#if 0 // DO NOT TEST BLOCK MOVE !!!
|
|
/*******************************/
|
|
/* test block move function */
|
|
/*******************************/
|
|
// initialise a second memory area starting at @ 3000
|
|
VideoSetMWP(0x3000L);
|
|
// 3000 = 98304 bytes = 0x18000
|
|
for ( i = 0; i < 0x1FFF; i++ ) // write 65528 bytes
|
|
{
|
|
// test Write Fifo Empty
|
|
counter = 0;
|
|
while ( !VideoMemWriteFifoEmpty() )
|
|
{
|
|
counter ++;
|
|
if(counter == 0xFF)
|
|
return ( BAD_MEM_V );
|
|
}
|
|
for(j = 0 ; j < 4 ; j++)
|
|
{
|
|
VideoWrite ( MWF, 0xBB );
|
|
VideoWrite ( MWF, 0xFF );
|
|
}
|
|
}
|
|
// starts block move and waits for idle
|
|
if(VideoBlockMove(pVideo, 0x3000, 0, 0x1FFF)) //If time out error return error message
|
|
{
|
|
return ( BAD_MEM_V );
|
|
}
|
|
// test result of block move
|
|
VideoSetMRP(0L);
|
|
|
|
// test Read Fifo Full
|
|
for ( i = 0; i < 0x1FFF; i++ )
|
|
{
|
|
counter = 0;
|
|
while ( !VideoMemReadFifoFull() )
|
|
{
|
|
counter ++;
|
|
if(counter == 0xFF)
|
|
return ( BAD_MEM_V );
|
|
}
|
|
for(j = 0 ; j <4; j++);
|
|
{
|
|
counter = VideoRead ( MRF );
|
|
if ( counter != 0xBB )
|
|
return ( BAD_MEM_V );
|
|
counter = VideoRead ( MRF );
|
|
if ( counter != 0xFF )
|
|
return ( BAD_MEM_V );
|
|
}
|
|
}
|
|
#endif
|
|
return ( NO_ERROR );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
U16 VideoTestMem(PVIDEO pVideo)
|
|
{
|
|
if (VideoTestMemPat(pVideo, 0x55, 0xAA) == NO_ERROR)
|
|
return VideoTestMemPat(pVideo, 0xAA, 0x55);
|
|
else {
|
|
SetErrorCode(ERR_TEST_MEMORY_FAILED);
|
|
return BAD_MEM_V;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
U16 VideoTestInt(PVIDEO pVideo)
|
|
{
|
|
U16 a = 0;
|
|
|
|
pVideo->errCode = NO_ERROR;
|
|
pVideo->VsyncInterrupt = FALSE;
|
|
pVideo->intMask = TOP | BOT;
|
|
DisableIT();
|
|
VideoWrite ( ITM, pVideo->intMask >> 8 );
|
|
VideoWrite ( ITM + 1, pVideo->intMask & 0xFF );
|
|
EnableIT();
|
|
|
|
// wait for first VSYNC occurrence
|
|
while ( pVideo->VsyncInterrupt == FALSE )
|
|
{
|
|
WaitMicroseconds(1000);
|
|
a++; /* incremented every 1 ms */
|
|
if ( a >= ( 2000 + ( pVideo->decSlowDown * 20 ) ) )
|
|
{
|
|
pVideo->errCode = NO_IT_V;
|
|
SetErrorCode(ERR_NO_VIDEO_INTR);
|
|
break;
|
|
}
|
|
}
|
|
|
|
DisableIT();
|
|
VideoWrite ( ITM, 0 );
|
|
VideoWrite ( ITM + 1, 0 ); /* disable Sti3500 interrupts */
|
|
|
|
#ifdef STi3520A
|
|
VideoWrite ( ITM1, 0 ); /* disable Sti3500 interrupts */
|
|
#endif
|
|
EnableIT();
|
|
|
|
VideoRead ( ITS ); /* to clear interrupts flags */
|
|
#ifdef STi3520A
|
|
VideoWrite ( ITS + 1, 0 ); /* disable Sti3500 interrupts */
|
|
VideoWrite ( ITS1, 0 ); /* disable Sti3500 interrupts */
|
|
#endif
|
|
return ( pVideo->errCode );
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID VideoInitVar(PVIDEO pVideo)
|
|
{
|
|
Sequence =1;
|
|
pVideo->currDCF = 0x00; /* one clock delay + force black
|
|
* background */
|
|
pVideo->LastCdCount = 0;
|
|
pVideo->fullVerFilter = 0x0;
|
|
pVideo->halfVerFilter = 0x4;
|
|
pVideo->Xdo = pCard->OriginX; /* pre initialise XDO */
|
|
pVideo->Ydo = pCard->OriginY; /* pre initialise YDO */
|
|
pVideo->Xd1 = 0xFFFF; /* pre initialise end of video
|
|
* window */
|
|
pVideo->Yd1 = 0xFFFF; /* pre initialisa end of video
|
|
* window */
|
|
pVideo->fastForward = 0; /* accelerate if set */
|
|
pVideo->decSlowDown = 0;
|
|
pVideo->perFrame = FALSE;
|
|
pVideo->LastPipeReset = 2;
|
|
pVideo->errCode = 0;
|
|
pVideo->StreamInfo.countGOP = 0;
|
|
pVideo->StreamInfo.frameRate = 5; // just to avoid erroneous warning
|
|
pVideo->useSRC = 0x0; // disable SRC
|
|
pVideo->seqDispExt = 0;
|
|
pVideo->skipMode = 0;
|
|
pVideo->currCommand = 0;
|
|
pVideo->needDataInBuff = 0;
|
|
pVideo->currPictCount = 0; /* first picture of the bit stream */
|
|
pVideo->defaultTbl = 0; /* To know if default tables are already into the chip */
|
|
pVideo->GOPindex = 0;
|
|
// initialisation of the picture structures
|
|
pVideo->pictArray[0].tempRef = 1025;
|
|
pVideo->pictArray[1].tempRef = 1023;
|
|
pVideo->pictArray[2].tempRef = 1025;
|
|
pVideo->pictArray[3].tempRef = 1025;
|
|
pVideo->currTempRef = 1022; /* display pVideo->decSlowDownral reference */
|
|
pVideo->pNextDisplay = &pVideo->pictArray[3];
|
|
pVideo->pCurrDisplay = &pVideo->pictArray[3]; // this is only for correct
|
|
// start up
|
|
pVideo->pictArray[0].nb_display_field = 2;
|
|
// 2 field display time for MPEG1
|
|
pVideo->pictArray[1].nb_display_field = 2;
|
|
pVideo->pictArray[2].nb_display_field = 2;
|
|
pVideo->pictArray[3].nb_display_field = 2;
|
|
pVideo->pictArray[0].first_field = TOP; // default for MPEG1 bit streams
|
|
pVideo->pictArray[1].first_field = TOP; // top field first
|
|
pVideo->pictArray[2].first_field = TOP;
|
|
pVideo->pictArray[3].first_field = TOP;
|
|
pVideo->fieldMode = 0; // indicates frame picture by
|
|
// default
|
|
pVideo->frameStoreAttr = FORWARD_PRED;
|
|
pVideo->vbvReached = 0;
|
|
pVideo->notInitDone = 1; // timing generator,picture size
|
|
// initialised only once
|
|
pVideo->intMask = 0x0;
|
|
pVideo->Gcf = 0; // GCF set to 0 by default
|
|
pVideo->Ctl = A35; // CTL set to 0 by default
|
|
pVideo->InvertedField = FALSE;
|
|
#ifdef STi3520A
|
|
pVideo->FistVsyncAfterVbv = NOT_YET_VBV;
|
|
pVideo->Ccf = 0; // GCF set to 0 by default
|
|
#endif
|
|
VideoReset35XX(pVideo); // software reset needed before
|
|
// the SKIP until SEQ is called
|
|
// prepare to skipuntil first Seq
|
|
|
|
pVideo->NextInstr.Tff = 1 ;
|
|
pVideo->NextInstr.Seq = 1 ;
|
|
pVideo->NextInstr.Exe = 1 ;
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// Display susie to test the display
|
|
//----------------------------------------------------------------------------
|
|
/*
|
|
VOID DisplaySusie(PVIDEO pVideo)
|
|
{
|
|
#ifdef STi3520A
|
|
FILE *fp; //////////////////////////////////
|
|
U16 i, NbRead;
|
|
U8 data[8];
|
|
fp = fopen("susie.yuv","rb");
|
|
if(fp ==NULL)
|
|
{
|
|
printf("\nCan Not Open Susie.yuv ");
|
|
return (FALSE);
|
|
}
|
|
// Load Susie to mem location 0
|
|
VideoSetMWP(32L);
|
|
NbRead = fread(data, 1, 8, fp);
|
|
while(NbRead)
|
|
{
|
|
while(!VideoMemWriteFifoEmpty());
|
|
for(i = 0; i<8; i++)
|
|
VideoWrite(MWF, data[i]);
|
|
NbRead = fread(data, 8, 1, fp);
|
|
}
|
|
fclose(fp);
|
|
// Initialize Display
|
|
VideoWrite(DFP , 0);
|
|
VideoWrite(DFP + 1 , 1);
|
|
|
|
VideoWrite(VID_XFS , 1);
|
|
VideoWrite(VID_XFS , 0x4A);
|
|
VideoWrite(VID_XFW , 0x16);
|
|
VideoWrite(VID_XFA , 0);
|
|
VideoWrite(VID_XFA , 0);
|
|
VideoInitXY(pVideo);
|
|
VideoSetSRC(pVideo, 352, 720);
|
|
VideoSRCOn(pVideo);
|
|
//Enable Display
|
|
VideoSetHalfRes(pVideo);
|
|
VideoEnableDisplay( pVideo );
|
|
#endif
|
|
}
|
|
*/
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
VOID VideoReset35XX(PVIDEO pVideo)
|
|
{
|
|
pVideo->StreamInfo.modeMPEG2 = 0;
|
|
|
|
pVideo->NextInstr = pVideo->ZeroInstr;// Clear Next Instruction
|
|
#ifdef PES
|
|
VideoWrite( PES_VID,0x20 );
|
|
VideoWrite( PES_AUD,0x23 );
|
|
#endif
|
|
|
|
#ifdef PLL
|
|
VideoInitPLL();
|
|
#endif
|
|
VideoWaitDec ( pVideo ); // put decoder in Wait mode
|
|
|
|
VideoSetBBStart(pVideo, 0);// Set Bit Buffer parameters before Soft Reset
|
|
VideoSetBBStop(BUF_FULL);
|
|
VideoSetBBThresh(BUF_FULL);
|
|
VideoEnableInterfaces ( pVideo, ON );
|
|
VideoEnableErrConc( pVideo, ON);
|
|
VideoSoftReset ( pVideo );
|
|
VideoEnableDecoding ( pVideo, ON );
|
|
VideoSetDramRefresh( pVideo, 36 ); // Set DRAM refresh to 36 default DRAM ref period
|
|
|
|
VideoDisableDisplay(pVideo);
|
|
VideoMaskInt(pVideo);
|
|
VideoRead ( ITS ); /* to clear ITS */
|
|
#ifdef STi3520A
|
|
VideoRead ( ITS +1 );
|
|
VideoRead ( ITS1);
|
|
#endif
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
// PLL initialization
|
|
//----------------------------------------------------------------------------
|
|
static void VideoInitPLL(void)
|
|
{
|
|
#ifdef STi3520A
|
|
VideoWrite(CKG_CFG, 0);
|
|
WaitMicroseconds(1000);
|
|
VideoWrite(CKG_CFG, 0x2);
|
|
VideoWrite(CKG_PLL, 0xC3);
|
|
VideoWrite(CKG_VID, 0x23);
|
|
VideoWrite(CKG_VID, 0x0);
|
|
VideoWrite(CKG_VID, 0x0F);
|
|
VideoWrite(CKG_VID, 0xFE);
|
|
WaitMicroseconds(10000);
|
|
#endif
|
|
/* start added by yann dec 28th, 95 */
|
|
#ifndef STi3520A
|
|
//Configure CLK bit
|
|
VideoWrite(CMD, 0x00);
|
|
VideoWrite(CMD+1, 0x40); /* select second bank of registers */
|
|
VideoWrite(GCF, 0x00); /* access to GCF2 */
|
|
VideoWrite(GCF+1, 0x00); // Disable ClK 80
|
|
#define PLL0 6
|
|
// Program PLL register: PLL clock from VXIN = NotCLK
|
|
VideoWrite(PLL0, 0x00);
|
|
VideoWrite(PLL0+1, 0x44);
|
|
|
|
/***************************************/
|
|
/*Read PLL puts PLL in power down mode */
|
|
/***************************************/
|
|
VideoRead(PLL0);
|
|
VideoRead(PLL0+1);
|
|
WaitMicroseconds(10000);
|
|
|
|
/***************************************/
|
|
/*Read PLL again to re-initialize */
|
|
/***************************************/
|
|
VideoRead(PLL0);
|
|
VideoRead(PLL0+1);
|
|
|
|
VideoWrite(PLL0, 0x01);
|
|
VideoWrite(PLL0+1, 0x8D);
|
|
WaitMicroseconds(100000UL);
|
|
#endif
|
|
}
|
|
|
|
//------------------------------- End of File --------------------------------
|