📄 l2_cdsp.c
字号:
XBYTE[0x2105] = 0x00; //horizontal mirror enable
XBYTE[0x2103] = 0x24; //horizontal valid shift
XBYTE[0x2104] = 0x0C; //vertical valid shift
}
break;
case 1:
{
//XBYTE[0x2104] = 0x0B; //vertical valid shift
XBYTE[0x2104] = 0x0C; //vertical valid shift
}
break;
case 4:
{
//XBYTE[0x2104] = 0x0B; //vertical valid shift
XBYTE[0x2104] = 0x0C; //vertical valid shift
}
break;
default: break;
}
// return
PRINT_L2(" L2_InitCDSP: Exit\n");
return(status);
}
//-----------------------------------------------------------------------------
//L2_DoCDSP
//-----------------------------------------------------------------------------
/*
routine description:
Perform the color processing. The raw data resides in the source address and
the result will be written to the SDRAM at the destination address.
arguments:
SrcAddr: specify the source address of the image in the SDRAM
SrcHsize: the source image width
SrcVsize: the source image height
DstAddr: the target image address in the DRAM
DstHsize: the target image width
DstVsize: the target image height
OprMode:
0: normal mode
1:Only for AE/AWB window calculation
DSMode:
Bit 3 ~ Bit 0:
0: no horizontal down sample
1: horizontal down sample 2
2: horizontal down sample 4
3: horizontal down sample 8
Bit 7 ~ Bit 4:
0: no vertical down sample
1: vertical down sample 2
2: vertical down sample 4
3: vertical down sample 8
return value:
0x00 - success
0x01 - general error
0x02 - parameter error
others - error
*/
UCHAR L2_DoCDSP(ULONG SrcAddr, USHORT SrcHsize, USHORT SrcVsize,
ULONG DstAddr, USHORT DstHsize, USHORT DstVsize,
UCHAR OprMode, UCHAR DSMode) USING_0
{
UCHAR tmp03, tmp0E, tmp12, tmp49;
UCHAR tmp53, tmp54, tmp55, tmp56, tmp57, tmp58;
UCHAR tmp60, tmp61, tmp62, tmp63, tmp64, tmp65, tmp66, tmp67, tmp68;
UCHAR tmp69, tmp6A, tmp6B, tmp6C, tmp6D, tmp6E;
UCHAR tmpF0, tmpF1, tmpF2, tmpF3, tmpF4, tmpF5, tmpF6, tmpF7, tmpF8;
UCHAR tmpF9, tmpFA, tmpFB, tmpFC, tmpFD;
UCHAR tmp0, tmp1;
UCHAR CapCount;
UCHAR status, CapStatus;
USHORT SrcHoff, DstHoff, LastSrcHsize, LastDstHsize;
UCHAR tgen, clk1xdiv, clk2xdiv, phase1, phase2, phase3;
//body
PRINT_L2(" L2_DoCDSP: Enter\n");
//Turn Off CCDTG , add by ygliu///////////////////////////////////////
tgen = XBYTE[0x2080];
clk1xdiv = XBYTE[0x2A81];
clk2xdiv = XBYTE[0x2A82];
phase1 = XBYTE[0x2A83];
phase2 = XBYTE[0x2023];
phase3 = XBYTE[0x2022];
XBYTE[0x2080] = 0x00; //Enablt TG PLL
XBYTE[0x2A81] = 0x03; //Set Clk1xDiv
XBYTE[0x2A82] = 0x01; //Set Clk2xDiv
XBYTE[0x2A83] = 0x00; //Clk1x Out delay
XBYTE[0x2023] = 0x00; //Clk1x Input delay
XBYTE[0x2022] = 0x00; //Clk2x Input delay
//////////////////////////////////////////////////////////////////////
tmp0 = DSMode&0x0F;
tmp1 = DSMode>>4;
if(((SrcHsize>>tmp0)<DstHsize) || (((SrcVsize)>>tmp1)<(DstVsize+12)) ||
(((OprMode!=0) || (DSMode!=0)) && (DstHsize>456)))
{
status = L2K_ERROR_PARAMETER;
// PRINT_CDSP(" L2_DoCDSP: Parameter Error\n");
}
else
{
//store the parameters for raw/A/B frame buffer
tmp03 = XBYTE[0x2103];
tmp0E = XBYTE[0x270E];
tmp12 = XBYTE[0x2712];
tmp49 = XBYTE[0x2749];
tmp53 = XBYTE[0x2753];
tmp54 = XBYTE[0x2754];
tmp55 = XBYTE[0x2755];
tmp56 = XBYTE[0x2756];
tmp57 = XBYTE[0x2757];
tmp58 = XBYTE[0x2758];
tmp60 = XBYTE[0x2760];
tmp61 = XBYTE[0x2761];
tmp62 = XBYTE[0x2762];
tmp63 = XBYTE[0x2763];
tmp64 = XBYTE[0x2764];
tmp65 = XBYTE[0x2765];
tmp66 = XBYTE[0x2766];
tmp67 = XBYTE[0x2767];
tmp68 = XBYTE[0x2768];
tmp69 = XBYTE[0x2769];
tmp6A = XBYTE[0x276A];
tmp6B = XBYTE[0x276B];
tmp6C = XBYTE[0x276C];
tmp6D = XBYTE[0x276D];
tmp6E = XBYTE[0x276E];
tmpF0 = XBYTE[0x27F0];
tmpF1 = XBYTE[0x27F1];
tmpF2 = XBYTE[0x27F2];
tmpF3 = XBYTE[0x27F3];
tmpF4 = XBYTE[0x27F4];
tmpF5 = XBYTE[0x27F5];
tmpF6 = XBYTE[0x27F6];
tmpF7 = XBYTE[0x27F7];
tmpF8 = XBYTE[0x27F8];
tmpF9 = XBYTE[0x27F9];
tmpFA = XBYTE[0x27FA];
tmpFB = XBYTE[0x27FB];
tmpFC = XBYTE[0x27FC];
tmpFD = XBYTE[0x27FD];
XBYTE[0x2105] = 0x01; //horizontal mirror enable
//set operation mode
XBYTE[0x27FD] &= 0xFE;
XBYTE[0x27FC] = DSMode; //set down sample mode
XBYTE[0x2749] = 0x01; //ccdsrcidx=1
XBYTE[0x270E] = 0x01; //imgtype=YUV422,NC
XBYTE[0x2712] = 0x01; //set doCDSP
//raw frame buffer
//set the start address
XBYTE[0x2768] = M_LoByteOfDword(SrcAddr);
XBYTE[0x2769] = M_MidLoByteOfDword(SrcAddr);
XBYTE[0x276A] = M_MidHiByteOfDword(SrcAddr);
//set the vertical size
XBYTE[0x276D] = M_LoByteOfWord(SrcVsize);
XBYTE[0x276E] = M_HiByteOfWord(SrcVsize);
//set the horizontal width
XBYTE[0x27F4] = M_LoByteOfWord(SrcHsize);
XBYTE[0x27F5] = M_HiByteOfWord(SrcHsize);
//A frame buffer
//set the start address
XBYTE[0x2753] = M_LoByteOfDword(SrcAddr);
XBYTE[0x2754] = M_MidLoByteOfDword(SrcAddr);
XBYTE[0x2755] = M_MidHiByteOfDword(SrcAddr);
//set the vertical size
XBYTE[0x2762] = M_LoByteOfWord(SrcVsize);
XBYTE[0x2763] = M_HiByteOfWord(SrcVsize);
//set the horizontal width
XBYTE[0x27F0] = M_LoByteOfWord(SrcHsize);
XBYTE[0x27F1] = M_HiByteOfWord(SrcHsize);
//B frame buffer
//set the start address
XBYTE[0x2756] = M_LoByteOfDword(DstAddr);
XBYTE[0x2757] = M_MidLoByteOfDword(DstAddr);
XBYTE[0x2758] = M_MidHiByteOfDword(DstAddr);
//set the vertical size
XBYTE[0x2766] = M_LoByteOfWord(DstVsize);
XBYTE[0x2767] = M_HiByteOfWord(DstVsize);
//set the horizontal width
XBYTE[0x27F2] = M_LoByteOfWord(DstHsize);
XBYTE[0x27F3] = M_HiByteOfWord(DstHsize);
if(DstHsize<=456) //one time complete
{
XBYTE[0x2103] = 0x1C; //hvalidshift
XBYTE[0x276B] = M_LoByteOfWord(SrcHsize); //rfbhsize
XBYTE[0x276C] = M_HiByteOfWord(SrcHsize); //rfbhsize
XBYTE[0x27FA] = 0x00; //rfbhoff
XBYTE[0x27FB] = 0x00; //rfbhoff
XBYTE[0x2760] = M_LoByteOfWord(SrcHsize); //afbhsize
XBYTE[0x2761] = M_HiByteOfWord(SrcHsize); //afbhsize
XBYTE[0x27F6] = 0x00; //afbhoff
XBYTE[0x27F7] = 0x00; //afbhoff
XBYTE[0x2764] = M_LoByteOfWord(DstHsize); //bfbhsize
XBYTE[0x2765] = M_HiByteOfWord(DstHsize); //bfbhsize
XBYTE[0x27F8] = 0x00; //bfbhoff
XBYTE[0x27F9] = 0x00; //bfbhoff
XBYTE[0x2000] = 0x00; //set to idle mode
XBYTE[0x2000] = 0x02; //set to dsc mode
XBYTE[0x27A1] = 0x10; //start CDSP
// PRINT_CDSP(" L2_DoCDSP: Wait capture done(one time complete)\n");
do
{
CapStatus = XBYTE[0x27B0]&0x02;
} while(CapStatus!=0x02); // polling until capture done
}
else //more than one time complete
{
//caputure an sub-image (first)
XBYTE[0x2103] = 0x1C; //hvalidshift
XBYTE[0x276B] = 0xC8; //rfbhsize (456)
XBYTE[0x276C] = 0x01; //rfbhsize (456)
XBYTE[0x27FA] = 0x00; //rfbhoff (0)
XBYTE[0x27FB] = 0x00; //rfbhoff (0)
XBYTE[0x2760] = 0xC8; //afbhsize (456)
XBYTE[0x2761] = 0x01; //afbhsize (456)
XBYTE[0x27F6] = 0x00; //afbhoff (0)
XBYTE[0x27F7] = 0x00; //afbhoff (0)
XBYTE[0x2764] = 0xC0; //bfbhsize (448)
XBYTE[0x2765] = 0x01; //bfbhsize (448)
XBYTE[0x27F8] = 0x00; //bfbhoff (0)
XBYTE[0x27F9] = 0x00; //bfbhoff (0)
XBYTE[0x2000] = 0x00; //set to idle mode
XBYTE[0x2000] = 0x02; //set to dsc mode
XBYTE[0x27A1] = 0x10; //start CDSP
// PRINT_CDSP(" L2_DoCDSP: Wait capture done (1)\n");
do
{
CapStatus = XBYTE[0x27B0]&0x02;
} while(CapStatus!=0x02); // polling until capture done
CapCount = 2;
SrcHoff = 440;
DstHoff = 448;
//caputure an sub-image (middle)
while((DstHsize-DstHoff)>448)
{
XBYTE[0x2103] = 0x24; //hvalidshift
XBYTE[0x276B] = 0xC8; //rfbhsize (456)
XBYTE[0x276C] = 0x01; //rfbhsize (456)
XBYTE[0x27FA] = M_LoByteOfWord(SrcHoff); //rfbhoff
XBYTE[0x27FB] = M_HiByteOfWord(SrcHoff); //rfbhoff
XBYTE[0x2760] = 0xC8; //afbhsize (456)
XBYTE[0x2761] = 0x01; //afbhsize (456)
XBYTE[0x27F6] = M_LoByteOfWord(SrcHoff); //afbhoff
XBYTE[0x27F7] = M_HiByteOfWord(SrcHoff); //afbhoff
XBYTE[0x2764] = 0xB8; //bfbhsize (440)
XBYTE[0x2765] = 0x01; //bfbhsize (440)
XBYTE[0x27F8] = M_LoByteOfWord(DstHoff); //bfbhoff
XBYTE[0x27F9] = M_HiByteOfWord(DstHoff); //bfbhoff
XBYTE[0x2000] = 0x00; //set to idle mode
XBYTE[0x2000] = 0x02; //set to dsc mode
XBYTE[0x27A1] = 0x10; //start CDSP
// PRINT_CDSP(" L2_DoCDSP: Wait capture done (%bu)\n", CapCount);
do
{
CapStatus = XBYTE[0x27B0]&0x02;
} while(CapStatus!=0x02); // polling until capture done
CapCount++;
SrcHoff += 440;
DstHoff += 440;
}
//caputure an sub-image (last)
XBYTE[0x27FD] |= 0x08; //set frcimglast
XBYTE[0x2103] = 0x24; //hvalidshift
LastDstHsize = DstHsize-DstHoff; //the last destination horizontal size
LastSrcHsize = LastDstHsize+8; //the last source horizontal size
XBYTE[0x276B] = M_LoByteOfWord(LastSrcHsize); //rfbhsize
XBYTE[0x276C] = M_HiByteOfWord(LastSrcHsize); //rfbhsize
XBYTE[0x27FA] = M_LoByteOfWord(SrcHoff); //rfbhoff
XBYTE[0x27FB] = M_HiByteOfWord(SrcHoff); //rfbhoff
XBYTE[0x2760] = M_LoByteOfWord(LastSrcHsize); //afbhsize
XBYTE[0x2761] = M_HiByteOfWord(LastSrcHsize); //afbhsize
XBYTE[0x27F6] = M_LoByteOfWord(SrcHoff); //afbhoff
XBYTE[0x27F7] = M_HiByteOfWord(SrcHoff); //afbhoff
XBYTE[0x2764] = M_LoByteOfWord(LastDstHsize); //bfbhsize
XBYTE[0x2765] = M_HiByteOfWord(LastDstHsize); //bfbhsize
XBYTE[0x27F8] = M_LoByteOfWord(DstHoff); //bfbhoff
XBYTE[0x27F9] = M_HiByteOfWord(DstHoff); //bfbhoff
XBYTE[0x2000] = 0x00; //set to idle mode
XBYTE[0x2000] = 0x02; //set to dsc mode
XBYTE[0x27A1] = 0x10; //start CDSP
// PRINT_CDSP(" L2_DoCDSP: Wait capture done (%bu)\n", CapCount);
do
{
CapStatus = XBYTE[0x27B0]&0x02;
} while(CapStatus!=0x02); // polling until capture done
}
if(OprMode==0) XBYTE[0x2000] = 0x00; //set to idle mode
XBYTE[0x2105] = 0x00; //horizontal mirror disable
//restore the parameters for raw/A/B frame buffer
XBYTE[0x2103] = tmp03;
XBYTE[0x270E] = tmp0E;
XBYTE[0x2712] = tmp12;
XBYTE[0x2749] = tmp49;
XBYTE[0x2753] = tmp53;
XBYTE[0x2754] = tmp54;
XBYTE[0x2755] = tmp55;
XBYTE[0x2756] = tmp56;
XBYTE[0x2757] = tmp57;
XBYTE[0x2758] = tmp58;
XBYTE[0x2760] = tmp60;
XBYTE[0x2761] = tmp61;
XBYTE[0x2762] = tmp62;
XBYTE[0x2763] = tmp63;
XBYTE[0x2764] = tmp64;
XBYTE[0x2765] = tmp65;
XBYTE[0x2766] = tmp66;
XBYTE[0x2767] = tmp67;
XBYTE[0x2768] = tmp68;
XBYTE[0x2769] = tmp69;
XBYTE[0x276A] = tmp6A;
XBYTE[0x276B] = tmp6B;
XBYTE[0x276C] = tmp6C;
XBYTE[0x276D] = tmp6D;
XBYTE[0x276E] = tmp6E;
XBYTE[0x27F0] = tmpF0;
XBYTE[0x27F1] = tmpF1;
XBYTE[0x27F2] = tmpF2;
XBYTE[0x27F3] = tmpF3;
XBYTE[0x27F4] = tmpF4;
XBYTE[0x27F5] = tmpF5;
XBYTE[0x27F6] = tmpF6;
XBYTE[0x27F7] = tmpF7;
XBYTE[0x27F8] = tmpF8;
XBYTE[0x27F9] = tmpF9;
XBYTE[0x27FA] = tmpFA;
XBYTE[0x27FB] = tmpFB;
XBYTE[0x27FC] = tmpFC;
XBYTE[0x27FD] = tmpFD;
status = L2K_SUCCESS;
}
//Turn back CCDTG , add by ygliu///////////////////////////////////////
XBYTE[0x2080] = tgen; //Enablt TG PLL
XBYTE[0x2A81] = clk1xdiv; //Set Clk1xDiv
XBYTE[0x2A82] = clk2xdiv; //Set Clk2xDiv
XBYTE[0x2A83] = phase1;
XBYTE[0x2023] = phase2;
XBYTE[0x2022] = phase3;
//////////////////////////////////////////////////////////////////////
// return
PRINT_L2(" L2_DoCDSP: Exit\n");
return(status);
}
#ifdef TestModeEn
//-----------------------------------------------------------------------------
//L2_TestCDSP
//-----------------------------------------------------------------------------
/*
routine description:
CDSP module test.
arguments:
TestLevel: the level of test
0: all test
1: register read/write test
2: SRAM test
return value:
0x00 - success
0x01 - general error
0x02 - parameter error
others - error
*/
UCHAR L3_TestCDSPSRAM(UCHAR SramNum, UCHAR PageNum, UCHAR ByteNum, UCHAR Mask) USING_0
{
USHORT tmp;
UCHAR status;
status = L2K_SUCCESS;
//body
PRINT_L2(" L3_TestCDSPSRAM: Enter\n");
//test SRAM
XBYTE[0x2101] = SramNum;
//page0, byte0
XBYTE[0x2102] = (PageNum<<4)|ByteNum;
// test SRAM enable
XBYTE[0x20E0] = 0x02;
//test read/write sequence data (write)
for(tmp=0; tmp<256; tmp++)
XBYTE[0x2100+tmp] = tmp;
for(tmp=0; tmp<256 ; tmp++)
if(XBYTE[0x2100+tmp]!=(UCHAR)tmp&Mask)
status = 1;
//test 0x00->0xFF
for(tmp=0; tmp<256; tmp++)
XBYTE[0x2100+tmp] = 0xFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -