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

📄 camera.c

📁 是一个手机功能的模拟程序
💻 C
字号:
/*
  *********************************camera.c***************************************
 
  
  */
#include "camera.h"
#include "chiplib.h"
#include "hal.h"
#include "topc.h"
#include "r2d_i.h"

PREVIEWINFO prvinfo;
JPEGINFO pJpeginfo;
//unsigned long jpg_buf[1024*20];
unsigned char jpg_buf[1024*20*4];

CAMCONFIG pCamConfig;

extern T_R2D_FRAMEBUFFER* r2d_g_framebuffer;


CAMU8 FLAG;

void	S1D13716_Parameter_Initial(void)
{
	pCamConfig.m_nCurAction = CAMERA_MODE;		//表明处于camera模式状态
	
	pCamConfig.m_nCurLCD = MAINLCD;
}

/*******************************************************************************
 * Function:     Windows_Set 
 * Parameters:   none
 * Returns:      none
 * Description:  用于设置overlay和main窗口
 ******************************************************************************/
void Overlay_Windows_Update(CAMU8 x_start, CAMU8 y_start, CAMU8 x_width, CAMU8 y_height/*,  CAMU8 *Overlay_b*/)
{
	UINT32  *pPmemory_Words_Pointer;
	CAMU32 main_addr;
	CAMU32 overlay_addr;
	main_addr=GetStartAddress(cl_MAIN_WINDOW);
	overlay_addr=GetStartAddress(cl_OVERLAY_WINDOW);

        pPmemory_Words_Pointer = r2d_g_framebuffer->p_memory_words + 64*y_start;	

	halWriteData(4, overlay_addr+x_width*y_start*2, pPmemory_Words_Pointer, 128*16*4);
	halWriteDisplay16(overlay_addr+128*16*2, 0x0001, 128*96);
	clStartOneFrameTransfer();
}

void Enter_Camera_Mode(CAMU8 mode)
{
	pCamConfig.m_nCurAction = CAMERA_MODE;
	switch(mode)
	{
		case MAINLCD:
			pCamConfig.m_nCurLCD = MAINLCD;
			break;

		case SUBLCD:
			pCamConfig.m_nCurLCD = SUBLCD;
			break;
	}
}

void Exit_Camera_Mode(void)
{
	pCamConfig.m_nCurAction = BYPSS_MODE;
}

void CamPreview_On(void)
{
	previewStart();
/*zhq, 2004/08/17, modified for we use 5 times scale size rather than 3. */
	prvinfo.XStart=(640-5*128)/2;
	prvinfo.YStart=(480-5*96)/2;
	prvinfo.Width=128*5;
	prvinfo.Height=96*5;
	prvinfo.ScaleRate=5;
	previewZoom(&prvinfo);	

	MI_dbgPrintf("camera preview on");
}


void CamPreview_Off(void)
{
	previewStop();
	MI_dbgPrintf("camera preview off");
}

Boolean Camera_OnCapture(void)
{
       Boolean retjpg;  
       memset(jpg_buf, 0, 1024*80);
       jpegInit(&pJpeginfo);
/*zhq, 2004/08/17, modified for we use 5 times scale mode rather than 3. */
	pJpeginfo.m_pBuf=(UInt8 *)jpg_buf;
	pJpeginfo.m_BufSize=1024*80;
	pJpeginfo.m_fMotionJPEG=FALSE;
	pJpeginfo.m_FrameCount=1;
	pJpeginfo.m_MemEnc=FALSE;
	pJpeginfo.m_fSOE=FALSE;
	pJpeginfo.m_Width=128*5;
	pJpeginfo.m_Height=96*5;
	pJpeginfo.m_XStart=(640-128*5)/2;
	pJpeginfo.m_RWidth=128*5;
	pJpeginfo.m_YStart=(480-96*5)/2;
	pJpeginfo.m_RHeight=96*5;
	pJpeginfo.m_fAFAP=TRUE;
	pJpeginfo.m_fWrAlways=TRUE;
	pJpeginfo.m_HScaleRate=5;
	pJpeginfo.m_fIndScale=FALSE;
	pJpeginfo.m_VScaleRate=5;
	pJpeginfo.m_ScaleMode=0x01;
	pJpeginfo.m_YUVFmt=YUVFmt422;
	pJpeginfo.m_Delay=0;	        

	MI_dbgPrintf("jpegEncode Start");
	retjpg=jpegEncode(&pJpeginfo);
	MI_dbgPrintf("jpegEncode End:%d",retjpg);
	
	//halWriteReg8(REG022A_YOFFSET0, 0);
	retjpg=jpegGetLastError();
	MI_dbgPrintf("jpegEncode Error:%d",retjpg);
	
	previewStop();
	MI_dbgPrintf("camera preview stop");
#ifdef CAMERA_INTERRUPT_ENABLE                           
       // wait_ARM_cycles(convert_nanosec_to_cycles(100000000)); 
#else
	halDelayUS(1000000);
#endif
        return retjpg;	
}

int  Camera_GetPicSize(void)
{
     MI_dbgPrintf("Capture picture size = %d", pJpeginfo.m_EncSize);
	
     return pJpeginfo.m_EncSize;
}

#if 0
void Camera_GetPic(UInt8* p)
{

int i;
     MI_dbgPrintf("Camera_GetPic");

        p = pJpeginfo.m_pBuf;

    for(i = 0; i<10; i++)
   {
	  MI_dbgPrintf("Capture picture data = %x", p[i]);
   }
}
#else
unsigned char *Camera_GetPic(void)
{
    
	return pJpeginfo.m_pBuf;
}
#endif

Camera_DisplayJPG(CAMU16 *jpg_buf, int size/*, int jpgtype*/)
{
       Boolean retjpg;   

       jpegInit(&pJpeginfo);
		
	pJpeginfo.m_pBuf=(UInt8 *)jpg_buf;
	pJpeginfo.m_EncSize=size;
	pJpeginfo.m_BufSize=1024*80;
	pJpeginfo.m_fMotionJPEG=FALSE;
	pJpeginfo.m_FrameCount=1;
	pJpeginfo.m_MemEnc=FALSE;
	pJpeginfo.m_fSOE=FALSE;
	pJpeginfo.m_Width=0;
	pJpeginfo.m_Height=0;
	pJpeginfo.m_DesiredHeight=96;
	pJpeginfo.m_DesiredWidth=128;
	pJpeginfo.m_XStart=0;
	pJpeginfo.m_RWidth=128;
	pJpeginfo.m_YStart=0;
	pJpeginfo.m_RHeight=96;
	pJpeginfo.m_fAFAP=FALSE;
	pJpeginfo.m_fWrAlways=TRUE;
	pJpeginfo.m_HScaleRate=1;
	pJpeginfo.m_fIndScale=FALSE;
	pJpeginfo.m_VScaleRate=1;
	pJpeginfo.m_ScaleMode=0x01;
	pJpeginfo.m_YUVFmt=YUVFmt422;
	pJpeginfo.m_fFastCpu=TRUE;
	pJpeginfo.m_fScale=TRUE;
	
	MI_dbgPrintf("jpegDecode Start");
	retjpg=jpegDecode(&pJpeginfo);
	MI_dbgPrintf("jpegDecode End:%d",retjpg);
	retjpg=jpegGetLastError();	
	MI_dbgPrintf("jpegDecode Error:%d",retjpg);
	//clStartOneFrameTransfer();

}
void S1D13716_Initial(void)
{
	halAcquireController();
	halInitController( fINIT_NORMAL );	
	if( MODEL == 1 )
	{

	}
	else if( MODEL == 5 )
	{
		SetSwivelViewMode(cl_MAIN_WINDOW, 180);
	}
}

void S1D13716_Power_Mode(CAMU8 mode)
{
	switch(mode)
	{
		case POWER_ON:
			PowerSaveMode(FALSE);
			break;

		case POWER_OFF:
			PowerSaveMode(TRUE);
			break;

		default:
			break;			
	}
}

void Select_LcdPort(CAMU8 port)
{
	switch(port)
	{
		case MAINLCD_PORT:
			halWriteReg8(REG004C_DISPSETTING, 0x41);		// select the mainlcd-port
			break;

		case SUBLCD_PORT:
			halWriteReg8(REG004C_DISPSETTING, 0x42);		// select the sublcd-port		
			break;
			
		default:
			break;
	}
}

⌨️ 快捷键说明

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