⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jpegdec.c

📁 TE3320和DSP的VP口无缝连接后的驱动程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *  Copyright 2003 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */
/* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
/**************************************************************************/
/* saa7115.c file */
/**************************************************************************/
#include <std.h>
#include <csl_i2c.h>      
#include <csl_stdinc.h>
#include <edc.h>
#include <jpegdec.h>

//#include "_iic.h"
//#include "_saa7115.h"

typedef enum {INTERLACED = TRUE, PROGRESSIVE = FALSE} FrameType ;   
/*
static void configSAA7115(Int decNum, SAA7115_Mode inMode,                     
    SAA7115_Mode outMode, SAA7115_AnalogFormat inFormat);
static void enableIPortOutput(Int channel, Bool iPortOutputEnable);
static void enableTask(Uns channel, Uns task, Uns enableFlag);
static void initSAA7115Def(Uns channel);
static void powerdownSAA7115(Int channel, Bool powerDownEnable);
static void resetSAA7115(Int channel);
static void scalerReset(Uns channel);
static void setInOutImageSize(Uns channel, Uns inType, Uns outType);
static void setNTSCScalerParameters(Uns channel,Uns task, Uns frameType);
static void setScalerGlobals(Uns channel);
static void setSAA7115InputFormat(Int channel, SAA7115_AnalogFormat inFormat);
static void setSAA7115SyncMode(Int channel, Bool enableBT656Sync);
static void setupUserDefResolution(Arg arg);
*/
static Int  TE3320_ctrl(EDC_Handle handle, TE3320_Cmd cmd, Arg arg);
static Int  TE3320_close(EDC_Handle handle);
static EDC_Handle  TE3320_open(String devName, Arg optArg);

extern Int EXTERNALHEAP;


EDC_Fxns TE3320_Fxns = {
     TE3320_open,
     TE3320_close,
     TE3320_ctrl                   
};
//default values of all registers
static TE3320_ConfParams te3320Params = {
	0x1000,
	0x0000,
	0x0000,
	0x00D2,
	0x0000,
	0xffff,
	0x0100,
	0x0000,
	0x0167,
	0x0100,
	0x0258,
	0x02b7,
	0x0100,
	0x01c6,
	0x0000,
	0x0064,
	0x0002,
	0x0000,
	0x0000,
	0x0000,
	0x0000,
	0x0001,
	0x0000
};


/////////////////////////////////////////////////////////////////////////////////////////
void jpgdelay(int times)
{
	int i,j;
	for(i=0;i<times;i++)
	{
		for(j=0;j<0x40000;j++)
			asm("NOP");
	}
}


///////read indirect register with little endian 32-bit
Uint32 RD_IDR(Uint32 addr)
{
	Uint32 tmp=0;
	tmp = ((addr<<24)&0xff000000)|((addr<<8)&0x00ff0000);
	JEPGDEC_DR(DR_iIADDR) = tmp;
	
	jpgdelay(1);

	tmp = JEPGDEC_DR(DR_iIDATA)&0xffff0000;
	tmp = ((tmp>>8)&0x0000ff00)|((tmp>>24)&0x000000ff);

	return tmp;
}

///////write inrdirect register with little endian 32-bit
int WR_IDR(Uint32 addr, Uint32 val)
{
	Uint32 tmp=0;
	if(addr>0x0064)
		return -1;
	tmp = ((addr<<24)&0xff000000)|((addr<<8)&0x00ff0000);
	JEPGDEC_DR(DR_iIADDR) = tmp;
	
	tmp = 0;
	tmp |= ((val<<8)&0x00ff0000);
	tmp |= ((val<<24)&0xff000000);
	
	JEPGDEC_DR(DR_iIDATA) = tmp;

	return 1;
}



//////
int Set32bitLE(void)
{
	Uint32 val=0;
	//software reset
	JEPGDEC_DR(DR_iIADDR) = IREG_SWRESET;
	JEPGDEC_DR(DR_iIDATA) = 0x0001;
	jpgdelay(3) ;
	JEPGDEC_DR(DR_iIADDR) = IREG_SWRESET;
	JEPGDEC_DR(DR_iIDATA) = 0x0000;
	jpgdelay(6) ;
	//set GO register =0
	JEPGDEC_DR(DR_iGO)=0x0000;

//	JEPGDEC_DR(DR_iIADDR) = IREG_MOD;
//	val = RD_IDR(IREG_MOD);
	JEPGDEC_DR(DR_iIADDR) = 0x0000;
	jpgdelay(1);
	val = JEPGDEC_DR(DR_iIDATA)&0x00001800;

	if(val == 0x00001000)
	{
		//set MODE register
		JEPGDEC_DR(DR_iIADDR) = IREG_MOD;
		val = JEPGDEC_DR(DR_iIDATA)&0x0ffff;

	//little endian 32bits
		val &= 0xefff;
		val |= 0x0800;
		JEPGDEC_DR(DR_iIADDR) = IREG_MOD;
		JEPGDEC_DR(DR_iIDATA) = val;	

		val = RD_IDR(IREG_MOD);

		if(val != 0x0800)
			return -1;
		return 1;

	}
	else
	{
		return -2;
	}
}




//configure the TE3320
int configTE3320(TE3320_ConfParams *pParams)
{
	//set the MODE
	WR_IDR(IREG_MOD,pParams->irMODE);
	//set the CNTL
	WR_IDR(IREG_CNTL,pParams->irCNTL);
	//set the MCNT1
	WR_IDR(IREG_MCNT1,pParams->irMCNT1);
	//set the MCNT2
	WR_IDR(IREG_MCNT2,pParams->irMCNT2);
	//set the IMASK
	WR_IDR(IREG_IMASK,pParams->irIMASK);
	//set the Y2RP1
	WR_IDR(IREG_Y2RP1,pParams->irY2RP1);
	//set the Y2RP2
	WR_IDR(IREG_Y2RP2,pParams->irY2RP2);
	//set the Y2RP3
	WR_IDR(IREG_Y2RP3,pParams->irY2RP3);
	//set the Y2RP4
	WR_IDR(IREG_Y2RP4,pParams->irY2RP4);
	//set the Y2RP5
	WR_IDR(IREG_Y2RP5,pParams->irY2RP5);
	//set the Y2RP6
	WR_IDR(IREG_Y2RP6,pParams->irY2RP6);
	//set the Y2RP7
	WR_IDR(IREG_Y2RP7,pParams->irY2RP7);
	//set the Y2RP8
	WR_IDR(IREG_Y2RP8,pParams->irY2RP8);
	//set the Y2RP9
	WR_IDR(IREG_Y2RP9,pParams->irY2RP9);
	//set the HBLANK
	WR_IDR(IREG_HBLANK,pParams->irHBLANK);
	//set the VBLANK
	WR_IDR(IREG_VBLANK,pParams->irVBLANK);
	//set the JDISMODE
	WR_IDR(IREG_JDISMODE,pParams->irJDISMODE);
	
	return 1;	
}

void getTE3320cfg(TE3320_ConfParams *pParams)
{
	//get the indrect registers
	pParams->irMODE = (Uint16)(RD_IDR(IREG_MOD)&0x0000FFFF);
	pParams->irCNTL = (Uint16)(RD_IDR(IREG_CNTL)&0x0000FFFF);
	pParams->irMCNT1 = (Uint16)(RD_IDR(IREG_MCNT1)&0x0000FFFF);
	pParams->irMCNT2 = (Uint16)(RD_IDR(IREG_MCNT2)&0x0000FFFF);
	pParams->irIFACT = (Uint16)(RD_IDR(IREG_IFACT)&0x0000FFFF);
	pParams->irIMASK = (Uint16)(RD_IDR(IREG_IMASK)&0x0000FFFF);
	pParams->irY2RP1 = (Uint16)(RD_IDR(IREG_Y2RP1)&0x0000FFFF);
	pParams->irY2RP2 = (Uint16)(RD_IDR(IREG_Y2RP2)&0x0000FFFF);
	pParams->irY2RP3 = (Uint16)(RD_IDR(IREG_Y2RP3)&0x0000FFFF);
	pParams->irY2RP4 = (Uint16)(RD_IDR(IREG_Y2RP4)&0x0000FFFF);
	pParams->irY2RP5 = (Uint16)(RD_IDR(IREG_Y2RP5)&0x0000FFFF);
	pParams->irY2RP6 = (Uint16)(RD_IDR(IREG_Y2RP6)&0x0000FFFF);
	pParams->irY2RP7 = (Uint16)(RD_IDR(IREG_Y2RP7)&0x0000FFFF);
	pParams->irY2RP8 = (Uint16)(RD_IDR(IREG_Y2RP8)&0x0000FFFF);
	pParams->irY2RP9 = (Uint16)(RD_IDR(IREG_Y2RP8)&0x0000FFFF);
	pParams->irHBLANK = (Uint16)(RD_IDR(IREG_HBLANK)&0x0000FFFF);
	pParams->irVBLANK = (Uint16)(RD_IDR(IREG_VBLANK)&0x0000FFFF);
	pParams->irYVALUE = (Uint16)(RD_IDR(IREG_YVALUE)&0x0000FFFF);
	pParams->irXVALUE = (Uint16)(RD_IDR(IREG_XVALUE)&0x0000FFFF);
	pParams->irJFORMAT = (Uint16)(RD_IDR(IREG_JFORMAT)&0x0000FFFF);
	pParams->irJDISMODE = (Uint16)(RD_IDR(IREG_JDISMODE)&0x0000FFFF);
	pParams->irVERSION = (Uint16)(RD_IDR(IREG_VERSION)&0x0000FFFF);
	pParams->irSWRESET = (Uint16)(RD_IDR(IREG_SWRESET)&0x0000FFFF);
}


///////getGOSTATUS direct register with little endian 32-bit
void getGOSTATUS(Uint32 *pGoStatus)
{
	Uint32 tmp0=0;
	Uint32 tmp1=0;

	tmp0 = (JEPGDEC_DR(DR_iGO))&0xFFFF0000;
	tmp0 =  ((tmp0<<8)&0xff000000)|((tmp0>>8)&0x00ff0000);
	tmp1 = (JEPGDEC_DR(DR_iSTATUS)>>16)&0x0000ffff;
	tmp1 =  ((tmp1<<8)&0x0000ff00)|((tmp1>>8)&0x000000ff);
	tmp1 |= tmp0;	

	*pGoStatus = tmp1;
}
///////getGOSTATUS direct register with little endian 32-bit
Uint32 GOSTATUS(void)
{
	Uint32 tmp0=0;
	Uint32 tmp1=0;

	tmp0 = (JEPGDEC_DR(DR_iGO))&0xFFFF0000;
	tmp0 =  ((tmp0<<8)&0xff000000)|((tmp0>>8)&0x00ff0000);
	tmp1 = (JEPGDEC_DR(DR_iSTATUS)>>16)&0x0000ffff;
	tmp1 =  ((tmp1<<8)&0x0000ff00)|((tmp1>>8)&0x000000ff);
	tmp1 |= tmp0;	

	return tmp1;
}

///////startTE3320 GO direct register with little endian 32-bit
int startTE3320(Uint16 go)
{
	Uint32 tmp=0;
	
	if((go<1)||(go>2))
		return -1;

	tmp = ((go<<24)&0xff000000)|((go<<8)&0x00ff0000);

	JEPGDEC_DR(DR_iGO) = tmp;

	return 1;
}

///////stopTE3320 GO direct register with little endian 32-bit
void stopTE3320(void)
{
	JEPGDEC_DR(DR_iGO) = 0x00000000;
}

///////resetTE3320 indirect register with little endian 32-bit
void resetTE3320(void)
{
	WR_IDR(IREG_SWRESET,0x0001);
	jpgdelay(3);
	WR_IDR(IREG_SWRESET,0x0000);
	jpgdelay(6);
}


///////writeJPEGdata register with little endian 32-bit
void writeJPEGdata(Uint32 * pdwbuf,int dwords)
{
	int i=0;
	
	for(i=0;i<dwords;i++)
		JEPGDEC_DR(DR_iJDATA) =*(pdwbuf+i);
}


/*
 * ========  TE3320_close ========
 */
static Int  TE3320_close(EDC_Handle handle) 
{
    Int devId = (int)handle;


    /*First Check if the Handle is correct */
    if(devId == 0 || devId == 1) {
        //close the  TE3320 chip 
        return EDC_SUCCESS;    
    } else {
        return EDC_FAILED;
    }
}

/*
 * ========  TE3320_ctrl ========
 */
static Int  TE3320_ctrl(EDC_Handle handle, TE3320_Cmd cmd, Arg arg)
{
    Int devId = (int)handle;                    

  //First Check if the Handle is correct 
    if(devId != 0 && devId != 1) {
        return EDC_FAILED;
    }
    
    switch(cmd) {
        case EDC_START:	//set the GO register
		{
			Uint16 startcmd = *((Uint16 *)arg);
			startTE3320(startcmd);
		}
        break;
        case EDC_STOP:	//soft GO register to 0
			stopTE3320();
        break;
        case EDC_RESET:	//soft reset
			resetTE3320();
        break;
        case EDC_CONFIG: 
        {
			TE3320_ConfParams *pCfgParams = (TE3320_ConfParams *)arg;
			memcpy(&te3320Params,(Uint8 *)pCfgParams,sizeof(TE3320_ConfParams));
			//call configure function
			configTE3320(pCfgParams);
        }
        break;
        case EDC_GET_CONFIG:	//get the all configuration of all registers
		{
			TE3320_ConfParams *pParams = (TE3320_ConfParams *)arg;
			getTE3320cfg(pParams);
		}
        break;
        case EDC_GET_GOSTATUS:	//get the direct register STATUS
		{
			Uint32 *pGoStatus = (Uint32 *)arg;
			getGOSTATUS(pGoStatus);
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -