Ejemplo n.º 1
0
void CameraSetCodecRegister(UINT32 width, UINT32 height, int Format)        // set codec register
{    
    MODULE_DESCRIPTOR value;
    BYTE    Out422_Co, Cpt_CoDMA_RGBFMT;
    UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;    
    
    RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetCodecRegister  Width=%d  Height=%d  Format=%d\n"),width,height,Format));
    ModuleGetFormat(value);
    
    switch(Format)
    {
    case OUTPUT_CODEC_YCBCR422:
        Out422_Co = 2;        // we don't support Non-interleave 4:2:2
        Cpt_CoDMA_RGBFMT = 0;
        CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
        MainBurstSizeY /= 2;
        RemainedBurstSizeY /= 2;
        MainBurstSizeC = MainBurstSizeY/2;
        RemainedBurstSizeC = RemainedBurstSizeY/2;        
        //CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);        
        break;
    case OUTPUT_CODEC_RGB16:
        Out422_Co = 3;
        Cpt_CoDMA_RGBFMT = 0;    
        CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);        
        MainBurstSizeC = 0;
        RemainedBurstSizeC = 0;
        break;
    case OUTPUT_CODEC_RGB24:
        Out422_Co = 3;
        Cpt_CoDMA_RGBFMT = 2;        
        CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);    
        MainBurstSizeC = 0;
        RemainedBurstSizeC = 0;            
        break;
    case OUTPUT_CODEC_YCBCR420:
    default:
        Out422_Co = 0;
        Cpt_CoDMA_RGBFMT = 0;
        CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
        CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);            
        break;
    }    
    
    s6410CAM->CICOTRGFMT= (Out422_Co<<29)|(width<<16)|(height);
    s6410CAM->CICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4)|(0);
    s6410CAM->CICOSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_CoDMA_RGBFMT<<11)|(0<<10);    
    
    CameraSetScaler(width,height,CODEC_PATH);

    s6410CAM->CICOTAREA=width*height;
    
    //s6410CAM->CIIMGCPT ;
    RETAILMSG(CAM_INOUT,(TEXT("------------------SetCodecRegister\n")));
}
Ejemplo n.º 2
0
void CameraSetPreviewRegister(UINT32 width, UINT32 height, int Format)     // set preview register
{
    MODULE_DESCRIPTOR value;
    BYTE   Out422_Pr, Cpt_PrDMA_RGBFMT;
    UINT32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC;        
        
    RETAILMSG(CAM_INOUT,(TEXT("++++++++++++++++++SetPreviewRegister\n")));
    ModuleGetFormat(value);
    
    switch(Format)
    {
    case OUTPUT_CODEC_YCBCR422:
        Out422_Pr = 2;        // we don't support Non-interleave 4:2:2
        Cpt_PrDMA_RGBFMT = 0;
        CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);
        CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);        
        break;
    case OUTPUT_CODEC_RGB16:
        Out422_Pr = 3;
        Cpt_PrDMA_RGBFMT = 0;    
        CalculateBurstSize(width*2, &MainBurstSizeY, &RemainedBurstSizeY);        
        MainBurstSizeC = 0;
        RemainedBurstSizeC = 0;
        break;
    case OUTPUT_CODEC_RGB24:
        Out422_Pr = 3;
        Cpt_PrDMA_RGBFMT = 2;        
        CalculateBurstSize(width*4, &MainBurstSizeY, &RemainedBurstSizeY);    
        MainBurstSizeC = 0;
        RemainedBurstSizeC = 0;            
        break;
    case OUTPUT_CODEC_YCBCR420:
    default:
        Out422_Pr = 0;
        Cpt_PrDMA_RGBFMT = 0;
        CalculateBurstSize(width, &MainBurstSizeY, &RemainedBurstSizeY);
        CalculateBurstSize(width/2, &MainBurstSizeC, &RemainedBurstSizeC);            
        break;
    }    
    
    s6410CAM->CIPRTRGFMT= (Out422_Pr<<29)|(width<<16)|(height);
    s6410CAM->CIPRCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4);
    s6410CAM->CIPRSCCTRL=(1<<28)|(1<<27)|(0<<26)|(0<<25)|(3<<13)|(Cpt_PrDMA_RGBFMT<<11)|(0<<10);    
    
    CameraSetScaler(width,height,PREVIEW_PATH);
    
    s6410CAM->CIPRTAREA= width*height;    
    
    s6410CAM->CICPTSEQ = 0xFFFFFFFF;
    s6410CAM->CIMSCTRL = 0;    
    s6410CAM->CIPRSCOSY = 0;
    s6410CAM->CIPRSCOSCB = 0;
    s6410CAM->CIPRSCOSCR = 0;
    
    RETAILMSG(CAM_INOUT,(TEXT("------------------SetPreviewRegister\n")));
}
Ejemplo n.º 3
0
/* Description of Parameters
CoDstWidth: Destination Width of Codec Path
CoDstHeight: Destination Height of Codec Path
PrDstWidth: Destination Width of Preview Path
PrDstHeight: Destination Height of Preview Path
WinHorOffset: Size of Window Offset for Horizontal Direction
WinVerOffset: Size of Window Offset for Vertical Direction
CoFrameBuffer: Start Address for Codec DMA
PrFrameBuffer: Start Address for Previe DMA
*/
void CamInit(U32 CoDstWidth, U32 CoDstHeight, U32 PrDstWidth, U32 PrDstHeight, 
			U32 WinHorOffset, U32 WinVerOffset,  U32 CoFrameBuffer, U32 PrFrameBuffer)
{
	U32 WinOfsEn;
	U32 divisor, multiplier;
	U32 MainBurstSizeY, RemainedBurstSizeY, MainBurstSizeC, RemainedBurstSizeC, MainBurstSizeRGB, RemainedBurstSizeRGB;
	U32 H_Shift, V_Shift, PreHorRatio, PreVerRatio, MainHorRatio, MainVerRatio;
	U32 SrcWidth, SrcHeight;
	U32 ScaleUp_H_Co, ScaleUp_V_Co, ScaleUp_H_Pr, ScaleUp_V_Pr;

	//constant for calculating codec dma address
	if(CAM_CODEC_OUTPUT)
		divisor=2; //CCIR-422
	else
		divisor=4; //CCIR-420
		
	//constant for calculating preview dma address
	if(CAM_PVIEW_OUTPUT)
		multiplier=4;
	else
		multiplier=2;
	
	if(WinHorOffset==0 && WinVerOffset==0)
		WinOfsEn=0;
	else
		WinOfsEn=1;

	SrcWidth=CAM_SRC_HSIZE-WinHorOffset*2;
	SrcHeight=CAM_SRC_VSIZE-WinVerOffset*2;

	if(SrcWidth>=CoDstWidth) ScaleUp_H_Co=0; //down
	else ScaleUp_H_Co=1;		//up

	if(SrcHeight>=CoDstHeight) ScaleUp_V_Co=0;
	else ScaleUp_V_Co=1;		

	if(SrcWidth>=PrDstWidth) ScaleUp_H_Pr=0; //down
	else ScaleUp_H_Pr=1;		//up

	if(SrcHeight>=PrDstHeight) ScaleUp_V_Pr=0;   // edited 040225
	else ScaleUp_V_Pr=1;		

	////////////////// common control setting
	rCIGCTRL |= (1<<26)|(0<<27); // inverse PCLK, test pattern

	//rCIGCTRL |= (0<<26)|(0<<27); // don't inverse PCLK, test pattern
	//---
	rCIWDOFST = (1<<30)|(0xf<<12); // clear overflow 
	rCIWDOFST = 0;	
	rCIWDOFST=(WinOfsEn<<31)|(WinHorOffset<<16)|(WinVerOffset);
	rCISRCFMT=(CAM_ITU601<<31)|(0<<30)|(0<<29)|(CAM_SRC_HSIZE<<16)|(CAM_ORDER_YCBYCR<<14)|(CAM_SRC_VSIZE);

	//rCISRCFMT=(CAM_ITU601<<31)|(1<<30)|(0<<29)|(CAM_SRC_HSIZE<<16)|(CAM_ORDER_YCBYCR<<14)|(CAM_SRC_VSIZE);
	//---

	////////////////// codec port setting
	if (CAM_CODEC_4PP)
	{
		rCICOYSA1=CoFrameBuffer;
		rCICOYSA2=rCICOYSA1+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor;
		rCICOYSA3=rCICOYSA2+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor;
		rCICOYSA4=rCICOYSA3+CoDstWidth*CoDstHeight+2*CoDstWidth*CoDstHeight/divisor;
		
		rCICOCBSA1=rCICOYSA1+CoDstWidth*CoDstHeight;
		rCICOCBSA2=rCICOYSA2+CoDstWidth*CoDstHeight;
		rCICOCBSA3=rCICOYSA3+CoDstWidth*CoDstHeight;
		rCICOCBSA4=rCICOYSA4+CoDstWidth*CoDstHeight;

		rCICOCRSA1=rCICOCBSA1+CoDstWidth*CoDstHeight/divisor;
		rCICOCRSA2=rCICOCBSA2+CoDstWidth*CoDstHeight/divisor;
		rCICOCRSA3=rCICOCBSA3+CoDstWidth*CoDstHeight/divisor;
		rCICOCRSA4=rCICOCBSA4+CoDstWidth*CoDstHeight/divisor;
	}
	else
	{
		rCICOYSA1=CoFrameBuffer;
		rCICOYSA2=rCICOYSA1;
		rCICOYSA3=rCICOYSA1;
		rCICOYSA4=rCICOYSA1;
		
		rCICOCBSA1=rCICOYSA1+CoDstWidth*CoDstHeight;
		rCICOCBSA2=rCICOCBSA1;
		rCICOCBSA3=rCICOCBSA1;
		rCICOCBSA4=rCICOCBSA1;
		
		rCICOCRSA1=rCICOCBSA1+CoDstWidth*CoDstHeight/divisor;
		rCICOCRSA2=rCICOCRSA1;
		rCICOCRSA3=rCICOCRSA1;
		rCICOCRSA4=rCICOCRSA1;
	}
	rCICOTRGFMT=(CAM_CODEC_IN_422<<31)|(CAM_CODEC_OUTPUT<<30)|(CoDstWidth<<16)|(CAM_FLIP_180<<14)|(CoDstHeight);

	CalculateBurstSize(CoDstWidth, &MainBurstSizeY, &RemainedBurstSizeY);
	CalculateBurstSize(CoDstWidth/2, &MainBurstSizeC, &RemainedBurstSizeC);
	rCICOCTRL=(MainBurstSizeY<<19)|(RemainedBurstSizeY<<14)|(MainBurstSizeC<<9)|(RemainedBurstSizeC<<4);

	CalculatePrescalerRatioShift(SrcWidth, CoDstWidth, &PreHorRatio, &H_Shift);
	CalculatePrescalerRatioShift(SrcHeight, CoDstHeight, &PreVerRatio, &V_Shift);
	MainHorRatio=(SrcWidth<<8)/(CoDstWidth<<H_Shift);
	MainVerRatio=(SrcHeight<<8)/(CoDstHeight<<V_Shift);
    			
	rCICOSCPRERATIO=((10-H_Shift-V_Shift)<<28)|(PreHorRatio<<16)|(PreVerRatio);
	rCICOSCPREDST=((SrcWidth/PreHorRatio)<<16)|(SrcHeight/PreVerRatio); 
	rCICOSCCTRL=(CAM_SCALER_BYPASS_OFF<<31)|(ScaleUp_H_Co<<30)|(ScaleUp_V_Co<<29)|(MainHorRatio<<16)|(MainVerRatio);

	rCICOTAREA=CoDstWidth*CoDstHeight;

	///////////////// preview port setting
	if (CAM_PVIEW_4PP) // codec view mode
	{
		rCIPRCLRSA1=PrFrameBuffer;
		rCIPRCLRSA2=rCIPRCLRSA1+PrDstWidth*PrDstHeight*multiplier;
		rCIPRCLRSA3=rCIPRCLRSA2+PrDstWidth*PrDstHeight*multiplier;
		rCIPRCLRSA4=rCIPRCLRSA3+PrDstWidth*PrDstHeight*multiplier;
	}	
	else // direct preview mode
	{
		rCIPRCLRSA1 = (U32)LCD_BUFFER;
		rCIPRCLRSA2 = (U32)LCD_BUFFER;
		rCIPRCLRSA3 = (U32)LCD_BUFFER;
		rCIPRCLRSA4 = (U32)LCD_BUFFER;
	}	

	rCIPRTRGFMT=(PrDstWidth<<16)|(CAM_FLIP_180<<14)|(PrDstHeight);

	if (CAM_PVIEW_OUTPUT==CAM_RGB24B)
		CalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);
	else // RGB16B
		CalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);
   	rCIPRCTRL=(MainBurstSizeRGB<<19)|(RemainedBurstSizeRGB<<14);

	CalculatePrescalerRatioShift(SrcWidth, PrDstWidth, &PreHorRatio, &H_Shift);
	CalculatePrescalerRatioShift(SrcHeight, PrDstHeight, &PreVerRatio, &V_Shift);
	MainHorRatio=(SrcWidth<<8)/(PrDstWidth<<H_Shift);
	MainVerRatio=(SrcHeight<<8)/(PrDstHeight<<V_Shift);
	rCIPRSCPRERATIO=((10-H_Shift-V_Shift)<<28)|(PreHorRatio<<16)|(PreVerRatio);		 
	rCIPRSCPREDST=((SrcWidth/PreHorRatio)<<16)|(SrcHeight/PreVerRatio);
	rCIPRSCCTRL=(1<<31)|(CAM_PVIEW_OUTPUT<<30)|(ScaleUp_H_Pr<<29)|(ScaleUp_V_Pr<<28)|(MainHorRatio<<16)|(MainVerRatio);
    
	rCIPRTAREA= PrDstWidth*PrDstHeight;
}