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

📄 camapi.c

📁 用于需要Camera驱动场合的驱动的原代码.如手机,监控设备等
💻 C
📖 第 1 页 / 共 3 页
字号:
		
    switch(sCamCtrlParam.eCurPreviewMode)
    {
         case  SINGLE_SHOT:
          	 	
		     u16IntFlag = CLC346_IMAGE_CAPTURE_DONE;u16WaitTime= 5000;   // 1s?		     
		     u16CamFunction= CLC346_STILL_CAPTURE;	
                  break;   
	   case  OSD_SHOT:
	   	     u16IntFlag = CLC346_IMAGE_CAPTURE_DONE;u16WaitTime= 5000;   // 1s?
	   	     u16CamFunction= CLC346_OSD_CAPTURE;
                  break; 
	  case   CONTINUOUS_SHOT:	
       	     CamMultiShotImageCount(sCamCtrlParam.sCShotSetting.eCaptureCounts );	 
          	     CamFrameSamplingInterval(sCamCtrlParam.sCShotSetting.eImageSamplingRate,TRUE);
		     CamOSDMode(0, 0,0);		 
		     u16IntFlag = CLC346_IMAGE_CAPTURE_DONE|CLC346_MULTI_CAPTURE_DONE; u16WaitTime = 0xffff;
		     u16CamFunction= CLC346_CONTINUOUS_CAPTURE;	 
		     break;	 
        case   MOVIE_SHOT:
		     CamStopMovieCapture(FALSE);	
		     CamFrameSamplingInterval(sCamCtrlParam.sMShotSetting.eImageSamplingRate, TRUE);
		     CamOSDMode(0,0,0);		 
		     u16IntFlag = CLC346_MOVIE_CAPTURE_DONE; u16WaitTime = 0xffff;
	 	     u16CamFunction= CLC346_MOVIE_CAPTURE;
		     break;	 
         default: return CAM_CTRL_OPERATION_FAILED;
                
    }
    eCamCtrlState =CAMCTRL_STATE_ON_CAPTURE;
    CamWatchDogTimer(u16WaitTime,ON);
    CamInterruptMask(~(u16IntFlag | CLC346_WATCHDOG_FIRE)); 
    if(u16CamFunction==BMP_SHOT) DoCameraOperation(0x03);  
    else if(u16CamFunction) DoCameraOperation(u16CamFunction&0x0fff); 			
    return  CAM_CTRL_ERR_NONE;
	
}

CAM_CTRL_ERR_ENUM CamCtrl_StopMovieCapture()
{
      
     if((eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
	  &&(sCamCtrlParam.eCurPreviewMode == MOVIE_SHOT))	
     	{
		CamStopMovieCapture(TRUE);      		
 		return  CAM_CTRL_ERR_NONE;
     	}	
	 return CAM_CTRL_INVALID_STATE; 
}

CAM_CTRL_ERR_ENUM CamCtrl_GetCaptureImgInfo(CAM_IMAGE_INFO_STRUCT *psImageInfo,UINT8 u8ImageNum)
{
	 UINT16 u16Low,u16High;  

	if(eCamCtrlState != CAMCTRL_STATE_CAPTURE_END)	
	  	return CAM_CTRL_INVALID_STATE;
	if(u8ImageNum>=sCamCtrlParam.sCShotSetting.eCaptureCounts)
		return CAM_CTRL_INVALID_PARAMS;
	if(sCamCtrlParam.eCurPreviewMode ==CONTINUOUS_SHOT)
	{
	 		CamSetStillImageNumber(u8ImageNum+1);
			WaitTime_us(10);
	}	
	u16High    =    CamJpegFileSizeUpper();
      	u16Low    =    CamJpegFileSizeLower();
	sCamCtrlParam.u32CurImgSize = ((UINT32)u16High <<16|u16Low)*4;
	sCamCtrlParam.u32RemainSize =sCamCtrlParam.u32CurImgSize;
	psImageInfo->u16ImageHeight = sCamCtrlParam.u16JPEGTargetY;
	psImageInfo->u16ImageWidth = sCamCtrlParam.u16JPEGTargetX;    
	psImageInfo->u32ImageSize = sCamCtrlParam.u32CurImgSize;
      return CAM_CTRL_ERR_NONE;

}

CAM_CTRL_ERR_ENUM CamCtrl_UpLoadImage(UINT16 *pDataBuf , UINT32 u32InBufLen,UINT32 *pu32OutBytes)
{
	
	UINT32 u32Offset,u32ReadSize;

	*pu32OutBytes =0;
	if(eCamCtrlState != CAMCTRL_STATE_CAPTURE_END)	
	  	return CAM_CTRL_INVALID_STATE;
	if(pDataBuf ==NULL)
		return CAM_CTRL_INVALID_PARAMS;
	if(sCamCtrlParam.u32RemainSize<=0) 
		return CAM_CTRL_OPERATION_FAILED;
	
	u32Offset =(sCamCtrlParam.u32CurImgSize-sCamCtrlParam.u32RemainSize)/2;
	CamUpperSRAMStartAddress((u32Offset>>16)&0xffff);
	CamLowerSRAMStartAddress(u32Offset&0xffff);
	if(sCamCtrlParam.eCurPreviewMode ==MOVIE_SHOT)	
		CamMovieSave();
	else
		CamStillImageSave(); 
	if(sCamCtrlParam.u32RemainSize<=u32InBufLen)
		u32ReadSize=	sCamCtrlParam.u32RemainSize;
	else
		u32ReadSize=	 u32InBufLen;
	CamReadSram(pDataBuf,u32ReadSize);  	

	*pu32OutBytes=	u32ReadSize;
	sCamCtrlParam.u32RemainSize =sCamCtrlParam.u32RemainSize -u32ReadSize;
		
	CamPreview_Off();	
	
	return CAM_CTRL_ERR_NONE;

}

static BOOL CheckJpegWidthHeight(UINT16 *pBuf, UINT32 len ,UINT16* Height, UINT16* Width )
{	
	UINT32 i;
	
	if (pBuf[0]!=0xd8ff)
		return FALSE;
	i=0;
	do
	{
		if (pBuf[i]==0xc0ff)
		{
			*Width = ((pBuf[i+3]&0xff00))+((pBuf[i+4]&0xff));
			*Height = ((pBuf[i+2]&0xff00))+((pBuf[i+3]&0xff));
			return TRUE;
		}
		else
			i++;
	}while (i<len);
	
	return  FALSE;
}

CAM_CTRL_ERR_ENUM CamCtrl_DownLoadImage(UINT16 *pu16DataBuf,UINT32 u32Len,UINT32 u32Offset,BOOL bIsMovie)
{

	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))	
			return CAM_CTRL_INVALID_STATE;  
	CamUpperSRAMStartAddress(((u32Offset/2)>>16)&0xffff);
	CamLowerSRAMStartAddress((u32Offset/2)&0xffff);
	if(bIsMovie == TRUE)
		CamCaptureMovieDisplay();
	else
		CamStillImageDownload();
	CamWriteSram(pu16DataBuf,u32Len);
	CamPreview_Off();
	return CAM_CTRL_ERR_NONE;	
}

CAM_CTRL_ERR_ENUM CamCtrl_DisplayPhoto(IMAGE_VIEWBOX_STRUCT sViewWindow,IMAGE_VIEWBOX_STRUCT sLCDWindow)
{

	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))	
			return CAM_CTRL_INVALID_STATE;  
	CamOSDMode(0, 0, 0);  
	CamUpperSRAMStartAddress(0x0000);
	CamLowerSRAMStartAddress(0x0000);  
	MainLCDDisplayRegion(sLCDWindow.u16Startx,
		                            sLCDWindow.u16Starty, 
		                            sLCDWindow.u16Startx+ sLCDWindow.u16Width-1 , 
		                            sLCDWindow.u16Starty+sLCDWindow.u16Height-1);
	SetViewWindowSize(sViewWindow.u16Startx,
					     sViewWindow.u16Starty,
					     sViewWindow.u16Width,
					     sViewWindow.u16Height,
					     sLCDWindow.u16Width ,
					     sLCDWindow.u16Height);

	
	eCamCtrlState =CAMCTRL_STATE_ON_DECODE;
	CamWatchDogTimer(0x4000,ON);
	CamInterruptMask(~(CLC346_IMAGE_DECODE_DONE | CLC346_WATCHDOG_FIRE)); 
	DoCameraOperation(CLC346_DO_STILL_DECODE);  
	return CAM_CTRL_ERR_NONE;		
	
}


CAM_CTRL_ERR_ENUM CamCtrl_StartMoviePlay2(IMAGE_VIEWBOX_STRUCT sViewWindow,IMAGE_VIEWBOX_STRUCT sLCDWindow)
{
	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
	   ||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))			     
		 return  CAM_CTRL_INVALID_STATE;
	
	CamUpperSRAMStartAddress(0x0000);
	CamLowerSRAMStartAddress(0x0000);  
	CamPreview_Off();
	MainLCDDisplayRegion(sLCDWindow.u16Startx,
		                            sLCDWindow.u16Starty, 
		                            sLCDWindow.u16Startx+ sLCDWindow.u16Width-1 , 
		                            sLCDWindow.u16Starty+sLCDWindow.u16Height-1);
	SetViewWindowSize(sViewWindow.u16Startx,
					     sViewWindow.u16Starty,
					     sViewWindow.u16Width,
					     sViewWindow.u16Height,
					     sLCDWindow.u16Width,
					     sLCDWindow.u16Height);	
	
	CamMovieReplayInterval(0x80f);
	eCamCtrlState =CAMCTRL_STATE_ON_DECODE;
	CamWatchDogTimer(0xffff,ON);
	CamInterruptMask(~(CLC346_MOVIE_DECODE_DONE | CLC346_WATCHDOG_FIRE)); 
	DoCameraOperation(CLC346_DO_MOVIE_DECODE);  	
		return  CAM_CTRL_OPERATION_FAILED;
	  
}

CAM_CTRL_ERR_ENUM CamCtrl_StartMoviePlay()
{
	UINT16 lcdsx,lcdsy,lcdwidth,lcdheight;
	 if((eCamCtrlState != CAMCTRL_STATE_CAPTURE_END)
	     && (eCamCtrlState != CAMCTRL_STATE_DECODE_END)
	    )
	 	 return  CAM_CTRL_INVALID_STATE;
	
	CamUpperSRAMStartAddress(0x0000);
	CamLowerSRAMStartAddress(0x0000);  
	CamPreview_Off();

	if((sCamCtrlParam.u16JPEGTargetX<=sCamCtrlParam.u16LCDWinWX)
	    &&( sCamCtrlParam.u16JPEGTargetY<= sCamCtrlParam.u16LCDWinWY))
	{

		lcdsx =  sCamCtrlParam.u16LCDWinSX + (sCamCtrlParam.u16LCDWinWX-sCamCtrlParam.u16JPEGTargetX)/2 ;
		lcdsy =  sCamCtrlParam.u16LCDWinSY + (sCamCtrlParam.u16LCDWinWY-sCamCtrlParam.u16JPEGTargetY)/2 ;
		lcdwidth = sCamCtrlParam.u16JPEGTargetX;
		lcdheight = sCamCtrlParam.u16JPEGTargetY;

	}
	else
	{
		lcdsx =  sCamCtrlParam.u16LCDWinSX;
		lcdsy =  sCamCtrlParam.u16LCDWinSY;
		lcdwidth = sCamCtrlParam.u16LCDWinWX;		
		lcdheight =sCamCtrlParam.u16LCDWinWY;	

	}
		
	MainLCDDisplayRegion(lcdsx ,
		                            lcdsy, 
		                            lcdsx+lcdwidth-1, 
		                            lcdsy+lcdheight-1);

	
	SetViewWindowSize(0,0,sCamCtrlParam.u16JPEGTargetX,
		                        sCamCtrlParam.u16JPEGTargetY,lcdwidth,lcdheight);
	
	CamMovieReplayInterval(0x80f);
	eCamCtrlState =CAMCTRL_STATE_ON_DECODE;
	CamWatchDogTimer(0xffff,ON);
	CamInterruptMask(~(CLC346_MOVIE_DECODE_DONE | CLC346_WATCHDOG_FIRE)); 
	DoCameraOperation(CLC346_DO_MOVIE_DECODE);  	
		return  CAM_CTRL_OPERATION_FAILED;


	
}

CAM_CTRL_ERR_ENUM CamCtrl_StopMoviePlay()
{
	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	   ||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED))	
		return CAM_CTRL_INVALID_STATE;  
      CamPreview_Off();
	eCamCtrlState = CAMCTRL_STATE_DECODE_END;	  
      return  CAM_CTRL_ERR_NONE;
}


CAM_CTRL_ERR_ENUM CamCtrl_UpDateLCDRectangle(UINT16 u16Startx, UINT16 u16Starty,UINT16 u16Endx, UINT16 u16Endy, UINT16*pData)
{
	UINT16 u16AddrLow,u16AddrHigh,u16StartxN,u16StartyN,u16WY,u16WX,i;
	UINT32 u32OSDAddr,u32StartAddr;
	UINT16 *pBuf;
	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	    ||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED)
	    ||(eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
	     ||(eCamCtrlState == CAMCTRL_STATE_ON_DECODE))	
		return CAM_CTRL_INVALID_STATE; 

	 if(eCamCtrlState !=CAMCTRL_STATE_ON_PREVIEW)
	 {

		CamLCDLockAddress(TRUE);
      		CamLCDUpdateRectangle(u16Startx,u16Starty,u16Endx,u16Endy, pData, sCamCtrlParam.u16LCDWidth); 
		CamLCDLockAddress(FALSE);

	 }
	else // in preview mode ,do not allow update across the client window and non client window at same time  
	{
		if( (u16Startx>=sCamCtrlParam.u16LCDWinSX)
	   		&&(u16Starty>=sCamCtrlParam.u16LCDWinSY)
	   		&&(u16Endx<= sCamCtrlParam.u16LCDWinSX+  sCamCtrlParam.u16LCDWinWX-1)
	   		&&(u16Endy<= sCamCtrlParam.u16LCDWinSY+  sCamCtrlParam.u16LCDWinWY-1)
	 	 )		 // update the client area when preview
		{

			u16StartxN = u16Startx- sCamCtrlParam.u16LCDWinSX;
			u16StartyN =	u16Starty- sCamCtrlParam.u16LCDWinSY; 
			u16WY = u16Endy - u16Starty +1;
			u16WX  = u16Endx - u16Startx +1;
			CamPreview_Off();	
			u16AddrLow  = CamGetLowerOSDAddress();
			u16AddrHigh =  CamGetUpperOSDAddress();
			u32OSDAddr =   (u16AddrHigh<<16)| u16AddrLow ;
			u32StartAddr =  u32OSDAddr +  u16StartyN *sCamCtrlParam.u16LCDWinWX +  u16StartxN ;
			pBuf = pData+ u16Starty*sCamCtrlParam.u16LCDWidth+u16Startx ;
			for(i=0;i< u16WY;i++)
			{
			 	CamStillImageDownload();
				CamLowerSRAMStartAddress(u32StartAddr&0xffff);
				CamUpperSRAMStartAddress((u32StartAddr>>16)&0xffff);
				CamWriteSram(pBuf,u16WX*2);
				u32StartAddr+= sCamCtrlParam.u16LCDWinWX ; // updata to next line , same x pos
				pBuf+= sCamCtrlParam.u16LCDWidth;          //updata data buf
				CamPreview_Off();
	
			}			
		//	CamChromaKey(sCamCtrlParam.sOSDOption.u16ChromaKeyValue);  
		//	CamOSDMode(sCamCtrlParam.sOSDOption.eOSDMode, sCamCtrlParam.sOSDOption.eOSDParameter,0);
			CamUpperSRAMStartAddress(0);
			CamLowerSRAMStartAddress(0);
		//	WaitTime_us(1000);	
     			CamPreview_On();
								
		}
		else // update the non  client area when update
             {
			CamLCDControlFlag(1,0);
			if(!WaitCamOperationDone(0, 1000, CLC346_LCD_FREE,FALSE))
			{				
				CamLCDControlFlag(0,0);
				CamPreview_On();
				return CAM_CTRL_OPERATION_FAILED;
			}	
		
			CamLCDLockAddress(TRUE);
     			CamLCDUpdateRectangle(u16Startx,u16Starty,u16Endx,u16Endy, pData, sCamCtrlParam.u16LCDWidth); 
			CamLCDControlFlag(0,0);
			CamPreview_On();
			CamLCDLockAddress(FALSE);
             }		
                

	 }
	 return CAM_CTRL_ERR_NONE;

}


CAM_CTRL_ERR_ENUM CamCtrl_StopCurOperation()
{
	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	   	||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED))	
		return CAM_CTRL_INVALID_STATE; 

	CamPreview_Off();
	if(eCamCtrlState == CAMCTRL_STATE_ON_PREVIEW)
		eCamCtrlState =CAMCTRL_STATE_OFF_PREVIEW;
	else if(eCamCtrlState == CAMCTRL_STATE_ON_CAPTURE)
		eCamCtrlState =CAMCTRL_STATE_CAPTURE_END;
	else if (eCamCtrlState == CAMCTRL_STATE_ON_DECODE)
		eCamCtrlState =CAMCTRL_STATE_DECODE_END;	
	 return CAM_CTRL_ERR_NONE;
}


CAM_CTRL_ERR_ENUM CamCtrl_QueryStates(CAM_CTRL_STATE_ENUM *pState)
{

	UINT16 event;
	if((eCamCtrlState == CAMCTRL_STATE_UNINITIALIZED)
	   	||(eCamCtrlState == CAMCTRL_STATE_INITIALIZED))	
		return CAM_CTRL_INVALID_STATE; 

	if(sCamCtrlParam.bIntEnable == FALSE)
	{
		event = CamCommandStatus();		
		if(event != 0)
		{
			CamInterruptMask(0xffff);
			CamWatchDogTimer(0,OFF);    // disable watch dog 
			if(event & CLC346_WATCHDOG_FIRE) 
				eCamCtrlState = CAMCTRL_STATE_ERROR;
			if(event & CLC346_IMAGE_CAPTURE_DONE)
				eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
			else if(event & CLC346_MULTI_CAPTURE_DONE)
				eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
			else if(event & CLC346_MOVIE_CAPTURE_DONE)
				eCamCtrlState = CAMCTRL_STATE_CAPTURE_END;
			else if (event & CLC346_IMAGE_DECODE_DONE)
				eCamCtrlState = CAMCTRL_STATE_DECODE_END;
			else if (event & CLC346_MOVIE_DECODE_DONE)
				eCamCtrlState = CAMCTRL_STATE_DECODE_END;
			else
				eCamCtrlState = CAMCTRL_STATE_ERROR;
			CamCommandStatus();
		}
		
		
	}
	*pState = eCamCtrlState;
	return CAM_CTRL_ERR_NONE;

}




⌨️ 快捷键说明

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