2025-04-27 07:49:33 -04:00

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 --------------------------------