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

📄 camapi.c

📁 用于需要Camera驱动场合的驱动的原代码.如手机,监控设备等
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "portab_new.h"
#include "346reg.h"
#include "camconfig.h"
#include "camapi.h"
#include "globlapi.h"
#include "uhapi.h"
#include "devgpio.h"
#include "idevapi.h"



typedef enum 
{
  CLC346_BMP_CAPTURE		= 0x0001,
  CLC346_PREVIEW_ON			= 0x0002,
  CLC346_STILL_CAPTURE		= 0x0004,
  CLC346_CONTINUOUS_CAPTURE	= 0x0008,
  CLC346_MOVIE_CAPTURE		= 0x0010,
  CLC346_DO_STILL_DECODE	= 0x0020,
  CLC346_DO_MOVIE_DECODE	= 0x0040,
  CLC346_DO_STILL_UPLOAD	= 0x0080,
  CLC346_DO_MOVIE_UPLOAD	= 0x0100,
  CLC346_DO_STILL_DOWNLOAD	= 0x0200,
  CLC346_DO_MOVIE_DOWNLOAD	= 0x0400,
  CLC346_OSD_CAPTURE		= 0x0800,
  CLC346_RESERVED0			= 0x1000,
  CLC346_JPEGTOBMP			= 0x2000,
  CLC346_RESERVED1			= 0x4000,
  CLC346_BMPTOJPEG			= 0x8000
} CLC346_CAMFUNCTION_ENUM;

typedef enum
{
  CLC346_LCD_FREE			 = 0x0001,
  CLC346_IMAGE_CAPTURE_DONE  = 0x0002,
  CLC346_IMAGE_CAPTURE_STATE = 0x0004,
  CLC346_MULTI_CAPTURE_DONE  = 0x0008,
  CLC346_LCD_UPDATE_DONE     = 0x0010,
  CLC346_RESERVED            = 0x0020,
  CLC346_WATCHDOG_FIRE       = 0x0040,
  CLC346_IMAGE_TRANS_DONE    = 0x0080,
  CLC346_IMAGE_TRANS_STATE   = 0x0100,
  CLC346_MOVIE_CAPTURE_DONE  = 0x0200,
  CLC346_MOVIE_CAPTURE_STATE = 0x0400,
  CLC346_IMAGE_DECODE_DONE   = 0x0800,
  CLC346_IMAGE_DECODE_STATE  = 0x1000,
  CLC346_MOVIE_DECODE_DONE   = 0x2000,
  CLC346_MOVIE_DECODE_STATE  = 0x4000,
  CLC346_BMPSAVE_DONE        = 0x8000
} CLC346_INTERRUPT_ENUM;


typedef enum 
{
	BMP_SHOT,  		
	SINGLE_SHOT, 		
	SPLIT_SHOT,			
	CONTINUOUS_SHOT,		
	TIMER_SHOT,			
	SPEED_CONT_SHOT,
	MOVIE_SHOT,
	OSD_SHOT
}CAM_PREVIEW_MODE_ENUM;


typedef enum 
{
	IMAGE_ROTAION_NORMAL=0,
	IMAGE_ROTAION_90,
	IMAGE_ROTAION_180,
	IMAGE_ROTAION_270,
	IMAGE_ROTAION_HFLIP,
	IMAGE_ROTAION_VFLIP,
	IMAGE_ROTAION_UNDEFINED
}CAM_IMAGE_ROTAION_ENUM;


typedef	struct
{
	UINT16	u16ZoomMin;
	UINT16	u16ZoomMax;
	UINT16	u16ZoomStepSize;
	UINT16	u16ZoomCurStep;
} IMAGE_ZOOM_SETTING_STRUCT;


typedef	struct
{
	UINT16	u16Parameter;
	UINT16	u16ImgEffectMode;
	BOOL	bGray;
	BOOL	bHalfColorKey;
	BOOL	bHalfImageVal;
	UINT16	u16R_KeyValue;
	UINT16	u16G_KeyValue;
	UINT16	u16B_KeyValue;
} IMAGE_EFFECT_SETTING_STRUCT; 	

typedef enum
{
	MAIN_LCD,
	SUB_LCD,
	MAIN_SUB
}CUR_DISP_LCD_ENUM;

typedef struct 
{
    CAM_IMAGE_RESOLUTION_ENUM  eJPEGResolution;
    CAM_IMAGE_RESOLUTION_ENUM  eImageType;	
    CAM_PREVIEW_MODE_ENUM        eCurPreviewMode;
    CUR_DISP_LCD_ENUM                 eCurLCD;   

    UINT8              u8SensorBright;	
	
    UINT16		u16JPEGTargetX;		
    UINT16		u16JPEGTargetY;		
    UINT16		u16JPEGSX;			
    UINT16		u16JPEGSY;			
    UINT16		u16JPEGWX;		
    UINT16		u16JPEGWY;

    UINT16           u16LCDWinSX;
    UINT16           u16LCDWinSY;
    UINT16           u16LCDWinWX;
    UINT16           u16LCDWinWY;

    UINT16           u16SubLCDWinSX;
    UINT16           u16SubLCDWinSY;
    UINT16           u16SubLCDWinWX;
    UINT16           u16SubLCDWinWY;

    UINT16		u16ViewTargetX;		
    UINT16		u16ViewTargetY;		
    UINT16		u16ViewSX;			
    UINT16		u16ViewSY;			
    UINT16		u16ViewWX;		
    UINT16		u16ViewWY;   

    UINT16            u16LCDHeight;
    UINT16            u16LCDWidth;	
    UINT32            u32CurImgSize;
    UINT32            u32RemainSize;			
    UINT16            u16ImageQuality;	
    BOOL               bIntEnable;      
	
    CAM_OSD_OPTION_STRUCT   sOSDOption;	
    CAM_CONTINUOUSSHOT_SETTING_STRUCT sCShotSetting;
    CAM_MOVIESHOT_SETTING_STRUCT  sMShotSetting;
    IMAGE_ZOOM_SETTING_STRUCT   sZoomSetting;
    CAM_IMAGE_ROTAION_ENUM        eCurRotation;	
    IMAGE_EFFECT_SETTING_STRUCT  sImageEffect;	
  
}CAMCTRL_PARAM_STRUCT;
static CAMCTRL_PARAM_STRUCT  sCamCtrlParam;
static CAM_CTRL_STATE_ENUM   eCamCtrlState = CAMCTRL_STATE_UNINITIALIZED;
static void (*pCallBackFunc)(CAMCTRL_OPERATION_EVENT_ENUM Mode, void *Param);
 
void CamCtrlIntHandle(void)
{
	UINT16  interrupt;
	uhGPIODisableInterrupt(CLC346_INT_PIN);
	CamInterruptMask(0xffff);
	CamWatchDogTimer(0,OFF);    // disable watch dog 
	interrupt = CamCommandStatus();
	switch(interrupt)
	{
//case	CLC346_LCD_FREE:		//Bit[0]
//		break;
		case	CLC346_IMAGE_CAPTURE_DONE:		//Bit[1]
		            	eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
			      break;
			
//		case	CLC346_IMAGE_CAPTURE_STATE:		//Bit[2]
//				break;
			
		case	CLC346_MULTI_CAPTURE_DONE:		//Bit[3]
		             eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
			       break;
			
//		case	CLC346_LCD_UPDATE_DONE:		//Bit[4]
			
//			break;
					
//		case	CLC346_RESERVED:		//Bit[5]
			
//			break;
			
		case	CLC346_WATCHDOG_FIRE:		//Bit[6]
				 eCamCtrlState = CAMCTRL_STATE_ERROR;
				break;
			
//		case	CLC346_IMAGE_TRANS_DONE:		//Bit[7]
			
//			break;
			
//		case	CLC346_IMAGE_TRANS_STATE:		//Bit[8]
			
//			break;
			
		case	CLC346_MOVIE_CAPTURE_DONE:		//Bit[9]
		       eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
			break;
			
//		case	CLC346_MOVIE_CAPTURE_STATE:		//Bit[10]
			
//			break;
			
		case	CLC346_IMAGE_DECODE_DONE:		//Bit[11]
			eCamCtrlState = CAMCTRL_STATE_DECODE_END;
			break;
			
//		case	CLC346_IMAGE_DECODE_STATE:		//Bit[12]
		
//			break;
			
		case	CLC346_MOVIE_DECODE_DONE:		//Bit[13]
			
			eCamCtrlState = CAMCTRL_STATE_DECODE_END;
			break;
			
//		case	CLC346_MOVIE_DECODE_STATE:		//Bit[14]
		
//			break;
			
//		case	CLC346_BMPSAVE_DONE:		//Bit[15]
			
//			break;
	}
	if(pCallBackFunc != NULL)    pCallBackFunc(CAMCTRL_EVENT_OPERATION_COMPLETE,NULL);
	uhGPIOClearPendingInterrupt(CLC346_INT_PIN);
	uhGPIOEnableInterrupt(CLC346_INT_PIN);
}


void InstallCamIntHandle()
{
   UHERR GPIOStatus; 
   GPIO_HANDLE_TYPE t;
   
   GPIO_INIT_PARAM_TYPE InitParam = {CLC346_INT_PIN , IN_MODE, NEGATIVE_POLARITY, ASYNCHRONOUS, 
  	                                                 EDGE_TRIGGER, CamCtrlIntHandle, DEFAULT_STATE, ISR_HANDLER_CONTEXT}; 
 
 										 
   GPIOStatus = uhGPIOSetConfig(&t,InitParam);
  //  uhGPIOEnableInterrupt(CLC346_INT_PIN);     //we enable it after open 
  
}

static void SetViewResolution(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{
      UINT16   u16LCDSX,u16LCDSY,u16LCD_ENDX,u16LCD_ENDY;
     
	sCamCtrlParam.u16ViewWY								=	
		sCamCtrlParam.u16JPEGWY;
	sCamCtrlParam.u16ViewWX								=	
		sCamCtrlParam.u16ViewWY*sCamCtrlParam.u16LCDWinWX/sCamCtrlParam.u16LCDWinWY;	
	sCamCtrlParam.u16ViewSX								=	
		((SENSOR_WIDTH - sCamCtrlParam.u16ViewWX)/2)/4*4;
	sCamCtrlParam.u16ViewSY								=	
		((SENSOR_HEIGTH - sCamCtrlParam.u16ViewWY)/2)/4*4;
	sCamCtrlParam.u16ViewWX								=	
		(SENSOR_WIDTH-sCamCtrlParam.u16ViewSX*2);
	sCamCtrlParam.u16ViewWY								=	
		(SENSOR_HEIGTH-sCamCtrlParam.u16ViewSY*2);
	sCamCtrlParam.u16ViewTargetX							=	sCamCtrlParam.u16LCDWinWX;
	sCamCtrlParam.u16ViewTargetY							=	sCamCtrlParam.u16LCDWinWY;
	
	SetViewWindowSize(
		sCamCtrlParam.u16ViewSX, sCamCtrlParam.u16ViewSY, 
		sCamCtrlParam.u16ViewWX, sCamCtrlParam.u16ViewWY, 
		sCamCtrlParam.u16ViewTargetX, sCamCtrlParam.u16ViewTargetY);

	u16LCDSX						=	sCamCtrlParam.u16LCDWinSX;
	u16LCDSY						=	sCamCtrlParam.u16LCDWinSY;
      u16LCD_ENDX  					=	sCamCtrlParam.u16LCDWinSX+sCamCtrlParam.u16LCDWinWX-1;
	u16LCD_ENDY						=	sCamCtrlParam.u16LCDWinSY+sCamCtrlParam.u16LCDWinWY-1;
	MainLCDDisplayRegion(
		u16LCDSX, u16LCDSY, 
		u16LCD_ENDX, u16LCD_ENDY);

}


static void SetSubViewResolution(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{

}

static void SetJPEGResolution(CAM_IMAGE_RESOLUTION_ENUM  eResolution)
{
   
	switch(eResolution)
	{
		case IMAGE_RES_VGA:
#ifdef CLC346_CHINA_ONLY			
			sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH;
			sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;

#endif	
#ifdef CLC346_COMMON
			sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH/2;
			sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
#endif			
			sCamCtrlParam.sZoomSetting.u16ZoomStepSize	= 
				(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
	//		sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;	
			sCamCtrlParam.u16JPEGTargetX							=	SENSOR_WIDTH;
			sCamCtrlParam.u16JPEGTargetY							=	SENSOR_HEIGTH;
		break;
		case IMAGE_RES_QVGA:
			sCamCtrlParam.sZoomSetting.u16ZoomMin = SENSOR_HEIGTH/2;
			sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
			sCamCtrlParam.sZoomSetting.u16ZoomStepSize	= 
				(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
//			sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;	
			sCamCtrlParam.u16JPEGTargetX							=	SENSOR_WIDTH/2;
			sCamCtrlParam.u16JPEGTargetY							=	SENSOR_HEIGTH/2;
		break;
		case IMAGE_RES_QQVGA:
			sCamCtrlParam.sZoomSetting.u16ZoomMin =  SENSOR_HEIGTH/4;
			sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
			sCamCtrlParam.sZoomSetting.u16ZoomStepSize	= 
				(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
//			sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;	
			sCamCtrlParam.u16JPEGTargetX							=	SENSOR_WIDTH/4;
			sCamCtrlParam.u16JPEGTargetY							=	SENSOR_HEIGTH/4;
		break;
		case IMAGE_RES_MOVIE:
		case IMAGE_RES_OSD:
		case IMAGE_RES_CLDC:
			sCamCtrlParam.sZoomSetting.u16ZoomMin = sCamCtrlParam.u16LCDWinWY;
			sCamCtrlParam.sZoomSetting.u16ZoomMax = SENSOR_HEIGTH;
			sCamCtrlParam.sZoomSetting.u16ZoomStepSize	= 
				(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomMin)/ZOOM_STEP;
//			sCamCtrlParam.sZoomSetting.u16ZoomCurStep = ZOOM_STEP/2;	
			sCamCtrlParam.u16JPEGTargetX							=	sCamCtrlParam.u16LCDWinWX;
			sCamCtrlParam.u16JPEGTargetY							=	sCamCtrlParam.u16LCDWinWY;
		break;
		default: return;
	}

	sCamCtrlParam.u16JPEGWY								=	
		(sCamCtrlParam.sZoomSetting.u16ZoomMax-sCamCtrlParam.sZoomSetting.u16ZoomStepSize*sCamCtrlParam.sZoomSetting.u16ZoomCurStep);
	sCamCtrlParam.u16JPEGWX								=	
		sCamCtrlParam.u16JPEGWY*SENSOR_WIDTH/SENSOR_HEIGTH;
	sCamCtrlParam.u16JPEGSX								=	
		((SENSOR_WIDTH - sCamCtrlParam.u16JPEGWX)/2)/4*4;
	sCamCtrlParam.u16JPEGSY								=	
		((SENSOR_HEIGTH - sCamCtrlParam.u16JPEGWY)/2)/4*4;
	sCamCtrlParam.u16JPEGWX								=	
		(SENSOR_WIDTH-sCamCtrlParam.u16JPEGSX*2);
	sCamCtrlParam.u16JPEGWY								=	
		(SENSOR_HEIGTH-sCamCtrlParam.u16JPEGSY*2);
	SetJPEGWindowSize(
		sCamCtrlParam.u16JPEGSX, sCamCtrlParam.u16JPEGSY, 
		sCamCtrlParam.u16JPEGWX, sCamCtrlParam.u16JPEGWY, 
		sCamCtrlParam.u16JPEGTargetX, sCamCtrlParam.u16JPEGTargetY);
}


static void OnPreView(CAM_IMAGE_RESOLUTION_ENUM eResolution)
{

	CamPreview_Off(); 
	CamFrameSamplingInterval(sCamCtrlParam.sCShotSetting.eImageSamplingRate,FALSE);		 
	SetJPEGResolution(eResolution);
	if(sCamCtrlParam.eCurLCD == MAIN_LCD )	
		SetViewResolution(eResolution);
	else
		SetSubViewResolution(eResolution);	 
	CamPreview_On();
 
}

void WaitTime_us(UINT32 time)
{
      UINT32 i;
      for(i=0;i<time;i++);
}

static void SetNormalMode()
{
     uhGPIOWrite (CLC346_MODE_CONTROL, LOW_STATE);
	
}
static void SetBypassMode()
{

     uhGPIOWrite (CLC346_MODE_CONTROL, HIGH_STATE);        

}


 /*mSecond at 19.68MHz*/
static BOOL WaitCamOperationDone(UINT16 u16CamFunction, UINT16 u16time, UINT16 u16IntFlag,BOOL bIntWanted)
{
      UINT16  u16Status; 
	BOOL  ret;  
	if((sCamCtrlParam.bIntEnable == TRUE) && ( bIntWanted == FALSE))
		uhGPIODisableInterrupt(CLC346_INT_PIN);
	CamWatchDogTimer(u16time,ON);
	CamInterruptMask(~(u16IntFlag | CLC346_WATCHDOG_FIRE)); 
	if(u16CamFunction==BMP_SHOT) DoCameraOperation(0x03);   // WHY BMP is special ?
	else if(u16CamFunction) DoCameraOperation(u16CamFunction&0x0fff); // WHY and ?

	if(( bIntWanted == TRUE)&&(sCamCtrlParam.bIntEnable == TRUE))   // if we want to used interrupt and int is enabled
		return TRUE;     
	
	u16Status = 0;	
	while(u16Status==0)
	{
	
        	u16Status =CamCommandStatus();    
             if(u16Status & CLC346_WATCHDOG_FIRE ) // timer out?

⌨️ 快捷键说明

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