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

📄 high_api.c

📁 VC0558 BackEnd IC Program
💻 C
📖 第 1 页 / 共 5 页
字号:
/*************************************************************************/
/*                                                                       			*/
/* FILE NAME                                      VERSION                	*/
/*                                                                       			*/
/* highapi.c                                	  1.2                    		*/
/*                                                                       			*/
/* DESCRIPTION                                                           	*/
/*                                                                       			*/
/*     Vimicro558 User's API		                                 		*/
/*									 				*/
/* The last modification date:  08-05-2004                             */
/* REMARKS:  Created initial version 1.5                                */
/*                                                                       			*/
/*                Copyright (C) 2004 Vimicro CO.,LTD     		*/
/*************************************************************************/
/****************************************************************************
This source code has been made available to you by VIMICRO on an
AS-IS basis. Anyone receiving this source code is licensed under VIMICRO
copyrights to use it in any way he or she deems fit, including copying it,
modifying it, compiling it, and redistributing it either with or without
modifications. Any person who transfers this source code or any derivative
work must include the VIMICRO copyright notice and this paragraph in
the transferred software.
****************************************************************************/

 
#include "vregdef.h"
#include "v558Api.h"
#include "vjpeg.h"
#include "vlcd.h"
#include "vipp.h"

#include "vctrl.h"
#include "visp.h"
#include "high_api.h"
#include "vexif.h"
#include "yuv2bmp.h"

UINT8 const HAPI_VERSION[5]={4,11,30,0,1};	
UINT8 g_558_WorkStatus=STATE558_OFF;
US558_PREVIEW_PARA  g_Preview_Para;
UINT8 *g_pBUF;
UINT32 g_Length;

UINT8 *g_VideoBUF;
UINT32 g_VideoLength;

USER558_CallBack gUSER_CallBack;
UINT8 g_VideoIndex=0; 
UINT32 g_CaptureSize;
//-------FOR multishot--------------------------------
UINT8* g_MutiShot_pFRAME;
UINT8* g_MutiShot_pTHUMB;
UINT8 g_MutiShot_OneFrame=0;
UINT16 g_Thumb_X;
UINT16 g_Thumb_Y;
UINT8 g_VideoStop=0;
UINT8 g_FrameEnd=0;
//--------------------------------------------------
US558_VIDEO_STATUS VideoFrame;

#define ZOOMPIXEL 8
/////////////////////////////////////////
extern V558_PANELINFO Panel_Info;
extern V558_PANELINFO SlavePanel_Info;
extern V558_SENSORINFO SensorInfo;
extern V558_IPPINFO IppInfo;
extern V558_JPEGINFO JpegInfo;
extern V558_CTRL_INFO CtrlInfo;
//////////////////////////////////////////
extern void V558HighLowConverse(UINT8 *BmpBuf, UINT16 length);
extern  US558_PREVIEW_PARA  g_Preview_Para;

extern void V558SetExpInit(void);
extern void V558_SetVal_By(UINT16 uVal);
extern void V558_SetCmd_By(UINT16 uVal);
extern void V558_SetData_By(UINT16 uCmd, UINT8* pData, UINT32 uSize);
extern UINT8 V558_YuvToRawFormat(UINT8* pOut,UINT8* pIn,UINT8 rawFormat,UINT8 yuvFormat,V558_SIZE size,UINT8 rate) ;

extern void V558PanelEnterBypass(void);
//////////////////////////////////////////////////////////////
void DrvGetSnrReg(UINT8 uAddress,UINT32* puValue)
{


	UINT8 uByteNum = 0;
	UINT8 uState = 0;
	UINT8 uValue = 0;
	UINT8 uValue1 = 0;
	UINT16 Count=0xfff;

	V558_SetReg((UINT16)V558_REG_SIF_SNRADDR, uAddress);
	V558_SetReg((UINT16)V558_REG_SIF_SNRACSCTR, 0x2);
	while(Count--)
	{
		V558_GetReg((UINT16)V558_REG_SIF_BUS_STATE, &uState);


		if((uState&0x2) == 0x2)
		{
			break;
		}
	}

	V558_GetReg(V558_REG_SIF_IIC_BYTE, &uByteNum);
	uByteNum &= 0x3;

	switch(uByteNum)
	{
	case 2:
		V558_GetReg((UINT16)V558_REG_SIF_SNRRDDATAH, &uValue);
		V558_GetReg((UINT16)V558_REG_SIF_SNRRDDATAM, &uValue1);
		*puValue = uValue1 + uValue*0x100;
		break;
	default:
		V558_GetReg((UINT16)V558_REG_SIF_SNRRDDATAH, &uValue);
		*puValue = uValue;
		break;
	}

}

void DrvSetSnrReg(UINT8 uAddress,UINT32 uValue)
{
	UINT8 uByteNum = 0;
	UINT8 uState = 0;
	UINT16 Count=0xfff;
	V558_GetReg(V558_REG_SIF_IIC_BYTE, &uByteNum);
	uByteNum &= 0x3;

	V558_SetReg((UINT16)V558_REG_SIF_SNRADDR, uAddress);
	switch(uByteNum)
	{
	case 2:
		V558_SetReg((UINT16)V558_REG_SIF_SNRWRDATAH, (UINT8)(uValue>>8));
		V558_SetReg((UINT16)V558_REG_SIF_SNRWRDATAM, (UINT8)uValue);
		break;
	default:
		V558_SetReg((UINT16)V558_REG_SIF_SNRWRDATAH, (UINT8)uValue);
		break;
	}
	while(Count--)
	{
		V558_GetReg((UINT16)V558_REG_SIF_BUS_STATE, &uState);
		if((uState&0x2) == 0x2)
		{
			break;
		}
	}
	V558_SetReg((UINT16)V558_REG_SIF_SNRACSCTR, 0x1);
}
/////////////////////////////////////////////////////////////////
UINT16 Find_common_divisor(UINT16 x,UINT16 y)
{
       UINT16 Temp,i;
	if(x>y) Temp=y;
	else Temp=x;
	for(i=Temp;i>0;i--)
	{
		if((x%i==0)&&(y%i==0))
		{
			return i;
		}
	}
	return 0;
}

UINT16 FindMaxRatio(UINT16 Width,UINT16 Height) //640*480 
{
	UINT16 ratio=1;
       while(1)
       	{
       	 	if((ratio*Width>640)||(ratio*Height>480))
       	 		break;
       	 	ratio++;
       	}
       return (ratio-1);
}
UINT8 FindSameRatio(UINT16 Width1,UINT16 Height1,UINT16 Width2,UINT16 Height2)
{
UINT16 divisor1,divisor2;
      divisor1=Find_common_divisor(Width1,Height1);
      divisor2=Find_common_divisor(Width2,Height2);
      if(((Width1/divisor1)==(Width2/divisor2))&&((Height1/divisor1)==(Height2/divisor2)))
      		return TRUE;
      else
      		return FALSE;
}
void V558_ChangePanelCs(UINT8 Mode)
{
	UINT16 LC;

	LC=V558_LcdGetIFControl();
	if(Mode)
		V558_LcdSetIFControl(LC|0x10);		//sub panel
	else
		V558_LcdSetIFControl(LC&0xffef);

}

void ChangIppDisplay(UINT16 Width,UINT16 Height)
{
V558_LAYER_PROPERTY proty;
UINT16 MaxDiv,W,H,Ratio=1;
	V558_SIZE size;
	V558_POINT pt;
	
	size.cx=g_Preview_Para.Source_W;
	size.cy=g_Preview_Para.Source_H;
	pt.x=g_Preview_Para.Source_OffsetW;
	pt.y=g_Preview_Para.Source_OffsetH;
	
if(!FindSameRatio(g_Preview_Para.Source_W, g_Preview_Para.Source_H, Width,Height))
		{
			MaxDiv=Find_common_divisor(g_Preview_Para.Source_W,g_Preview_Para.Source_H);
			W=g_Preview_Para.Source_W/MaxDiv;
			H=g_Preview_Para.Source_H/MaxDiv;
			while(1)
				{
					if((W*Ratio>=Width)&&(H*Ratio>=Height))
						break;
					Ratio++;
				}
			
			proty.Size.cx = W*Ratio;
			proty.Size.cy = H*Ratio;
			while(proty.Size.cx%16)
				{
					proty.Size.cx+=W;
					proty.Size.cy+=H;
				}
			
			proty.DisRect.left = (W*Ratio- Width)/2;
			if(proty.DisRect.left %2)		
				proty.DisRect.left --;
			proty.DisRect.top =  (H*Ratio-Height)/2;
			proty.DisRect.width =g_Preview_Para.Display_W;
			proty.DisRect.height =g_Preview_Para.Display_H;

			proty.DisPoint.x = g_Preview_Para.Display_OffsetW;
			proty.DisPoint.y = g_Preview_Para.Display_OffsetH;			
		}
		else
		{
			proty.Size.cx = Width;
			proty.Size.cy = Height;
			proty.DisRect.left = 0;
			proty.DisRect.top = 0;
			proty.DisRect.width = g_Preview_Para.Display_W;
			proty.DisRect.height =g_Preview_Para.Display_H;
			proty.DisPoint.x = g_Preview_Para.Display_OffsetW;
			proty.DisPoint.y = g_Preview_Para.Display_OffsetH;

		}
			V558_SifDisableSyncGen();	
			V558_IppSetSizerCapture(pt, size, g_Preview_Para.Capture_W);
			V558_IppSetDisplay( proty.Size.cx);
       		V558_LcdSetALProperty(&proty);			     		
			V558_SifEnableSyncGen();	
}
/********************************************************************************
Description: 
	Initialize 558(global parameters, LCD panel, Sensor module)
 
Note:
      This function should be called before V558 can work

Remarks:    
      State:Valid

*********************************************************************************/
void USER558_Init(void)
{
	g_Preview_Para.Capture_W=128;
        g_Preview_Para.Capture_H=160;

	g_558_WorkStatus=STATE558_Initial;
	g_Preview_Para.Lcd_Gamma=0;

	V558_LcdInitContext();
	V558_IppInitContext();
	V558_SifInitContext();
	V558_JpegInitContext();
	V558_LcdSetPanelInfo(&Panel_Info);
	#if TwoPanel
	V558_LcdSetSlavePanelInfo(&SlavePanel_Info);
	#endif
	V558_SifSetSensorInfo(&SensorInfo);
	V558_IppSetInfo(&IppInfo);
	V558_JpegSetInfo(&JpegInfo);
	
	V558_CtrlOpen();	
	V558_LcdOpen();
	V558_SifOpen();
	V558_IppOpen();

	V558_LbufOpen();
	V558_JbufOpen();
	V558_JpegOpen();
	
	V558_SifDisableSyncGen();

//	USER558_SetPreviewParameter(128,160,0,0);
//       USER558_SetCaptureParameter(128,160);	
//       USER558_SetCaptureQuaility(2); 			//angela 1117
	g_558_WorkStatus=STATE558_Initial;
	
}
/********************************************************************************
Description: 
	Open the 558 camera function

Note:
       This function must used before view finder mode start

Remarks:    
        State:Valid
*********************************************************************************/
void USER558_CamOpen(void)  
{	

	V558_CtrlSetModClkOn(V558_MOD_CLK_SIF);
	V558_CtrlSetModClkOn(V558_MOD_CLK_ISP);
	V558_CtrlSetModClkOn(V558_MOD_CLK_IPP);
	V558_CtrlSetModClkOn(V558_MOD_CLK_LB);
	V558_CtrlSetModClkOn(V558_MOD_CLK_JPG);	

	V558_Delay(20);		
	V558_LbufOpen();
	V558_JbufOpen();
	V558_JpegOpen();

	V558_SifSetSnrState(V558_SNR_POWON);
	V558_Delay(20);
	
 //   V558_SifOpen();
	g_558_WorkStatus=STATE558_CamOpen;
	V558_Delay(20);
}
/********************************************************************************
Description: 
	Close the 558 camera function

Remarks:    
	State:Valid
*********************************************************************************/
void USER558_CamClose(void)
{
	V558_SifSetSnrState(V558_SNR_POWOFF);
	V558_CtrlSetModClkOff(V558_MOD_CLK_SIF);
	V558_CtrlSetModClkOff(V558_MOD_CLK_ISP);
	V558_CtrlSetModClkOff(V558_MOD_CLK_IPP);
	V558_CtrlSetModClkOff(V558_MOD_CLK_JPG);
	g_558_WorkStatus=STATE558_CamClose;	
}

/*********************************************************************************
Description: 
	This function only for test.
	Test read/write V558's registers right or not

Note:
	If return 0, read/write register right, otherwise error.

Remarks:    
	State:Valid
*********************************************************************************/
UINT8 Test_RW_Register(void)
{
     UINT8 tmp;
     V558_GetReg(V558_REG_HCTRL_CHIPCTRL, &tmp);
     if(tmp!=0x58) return 1;
       V558_GetReg(V558_REG_HCTRL_CHIPCTRL+1, &tmp);
     if(tmp!=0x05) return 2;
     V558_SetReg(V558_REG_IPP_SIZWD, 120);
     V558_GetReg(V558_REG_IPP_SIZWD, &tmp);
     if(tmp!=120) return 3;
     V558_SetReg(V558_REG_IPP_SIZHT, 160);
     V558_GetReg(V558_REG_IPP_SIZHT, &tmp);
     if(tmp!=160) return 4;
     V558_SetReg(V558_REG_BIU_OP_MODE, 0xaa);
     V558_GetReg(V558_REG_BIU_OP_MODE, &tmp);
     if(tmp!=0xaa) return 5;
      V558_SetReg(V558_REG_IPP_SIZWD+1, 1);
     V558_GetReg(V558_REG_IPP_SIZWD+1, &tmp);
     if(tmp!=1) return 6;
     return 0;
}
/*********************************************************************************
Description: 
	This function is the interrupt process routine for 558
	Users should add this function to the related interrupt handler,timer or put it in the mainloop.

Remarks:    
	State:Checking
*********************************************************************************/
void USER558_CtrlIntHandle(void)
{
	V558_CtrlIntHandle();
}
/********************************************************************************
Description: 
  	Set 558 PLL
  
Parameters:
  	fbdiv: [bit0-bit5] 1-63;
  	plldiv: [bit0-bit3][bit4-bit7];

Note:
	OUT_CLK=IN_CLK*fbdiv/(plldiv[7:4]+plldiv[3:0]+2);
	And the out clock's duty ratio is: (plldiv[7:4]+1): (plldiv[3:0]+1);

Remarks:    
        For example, if 558 input clock(from CPU) is 12M;
        When fbdiv = 0x0c, plldiv = 0x0a then OUT_CLK=12*0x0c/(0x0a+2)=12M;
	When fbdiv = 0x08 plldiv = 0x04 then OUT_CLK=12*0x08/(0x04+2)= 16M;
	When fbdiv = 0x08 plldiv = 0x02 then OUT_CLK=12*0x08/(0x02+2)= 24M.
	65M<fbdiv*inclk<130M;

*********************************************************************************/
UINT8 g_fbdiv,g_plldiv;
UINT8 g_halffbdiv,g_halfplldiv;
void USER558_Set558CLK(UINT8 fbdiv, UINT8 plldiv)
{
       g_fbdiv=fbdiv;
       g_plldiv=plldiv; 
 	g_halffbdiv=fbdiv;
	g_halfplldiv=plldiv;      
	V558_SetReg(V558_REG_HCTRL_CLKCTRL2,fbdiv);
	V558_SetReg(V558_REG_HCTRL_CLKCTRL3,plldiv);
	V558_SetReg(V558_REG_HCTRL_CLKOFF,0x00);
	V558_SetReg(V558_REG_HCTRL_CLKCTRL0,0x00);
	V558_SetReg(V558_REG_HCTRL_RSTCTRL2,0x80);	
	V558_SetReg((UINT16)V558_REG_BIU_SEL_PORT,0x1);
}
/********************************************************************************
Description: 
  	Set the PLL parameter, 558 will work with these PLL parameter when display JPEG. 
  
Parameters:
	Please refer to USER558_Set558CLK();
	
Note:
	This API should be call when the lcd's write speed is low(for example, the LCD is 8 bits).

*********************************************************************************/
void USER558_SetLowCLK(UINT8 fbdiv, UINT8 plldiv)
{
	g_halffbdiv=fbdiv;
	g_halfplldiv=plldiv;
}


/********************************************************************************

	Description:
		set Interrupt parameter

	Parameters:
		LeverOrEdge: Trigger type, 0 for edge trigger and 1 for level trigger;
		HighOrLow:  Edge active fall or rise, Level active low or high;
			    1 for high active,0 for low active;
		Width: hexadecimal number.how many clk width of interrupt trigger.

	Note:
	       This function must be used before use 558 function related to interrupt
		
	Remarks:
		state: checking

*********************************************************************************/
void USER558_Set558Interrupt(UINT8 LeverOrEdge,UINT8 HighOrLow, UINT8 Width)
{
	UINT8 Temp=0;
	if(LeverOrEdge)		
	{
		Temp|=1;
		if(!HighOrLow)		
			Temp|=0x02;
		else					
			Temp&=0xfd;
	}
	else
	{
		Temp&=0xfe;
		if(!HighOrLow)		
			Temp|=0x04;
		else					//high
			Temp&=0xfb;
	}
	if(Width)
		Width--;
	Width<<=3;
	Temp|=Width;
	V558_SetReg((UINT16)V558_REG_HCTRL_INTCTRL,Temp);
}
/********************************************************************************

⌨️ 快捷键说明

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