📄 jpegdec.c
字号:
/*
* 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 + -