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

📄 ext_camera.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
{
	kal_uint16 i;

	ext_camera_state=EXT_CAMERA_POWER_OFF_STATE;
	if (camera_sleep_mode_handler==0xFF)
		camera_sleep_mode_handler = L1SM_GetHandle();
	cam_module_func_config();
	if(kal_query_systemInit()==KAL_FALSE)
	{
		get_NFI_bus();
		ext_cam_func->cam_module_cmd_mapping();
		free_NFI_bus();
	}
	else	// System in initialization stage
		ext_cam_func->cam_module_cmd_mapping();
		
	video_clip_mode=KAL_FALSE;
	for (i=0;i<0x100;i++)
		ext_cam_reg_setting[i]=0;
}	/* ext_camera_init() */

/*************************************************************************
* FUNCTION
*	ext_camera_power_on
*
* DESCRIPTION
*	This function turn the power of external camera module on.
*
* PARAMETERS
*	None
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void ext_camera_power_on(void)
{
	if (ext_camera_state==EXT_CAMERA_POWER_OFF_STATE)
	{
		lcd_power_up();
#if (defined(CAMERA_MODULE_WITH_LCD))
	#ifdef DUAL_LCD
		if ((main_lcd_operation_state!=LCD_STANDBY_STATE)||
			 (sub_lcd_operation_state!=LCD_STANDBY_STATE))
			ASSERT(0);
			main_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
			sub_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
	#else
		if (main_lcd_operation_state!=LCD_STANDBY_STATE)
			ASSERT(0);
			main_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
	#endif
#endif		
		get_NFI_bus();
		ext_cam_func->cam_module_power_on();
		free_NFI_bus();
		ext_camera_state=EXT_CAMERA_INITIAL_STATE;
		lcd_power_down();
	}
	else if (ext_camera_state!=EXT_CAMERA_INITIAL_STATE)
		ASSERT(0);
}	/* ext_camera_power_on() */

/*************************************************************************
* FUNCTION
*	ext_camera_reset_status
*
* DESCRIPTION
*	This function check if the external camera module power on procedure is
*  complete or not.
*
* PARAMETERS
*	None
* RETURNS
*	1 : external camera mdoule power is on
*  0 : external camera module is initializing.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint8 ext_camera_reset_status(void)
{
	kal_uint16 i;
	kal_uint16 data;

	lcd_power_up();
	get_NFI_bus();
	if (ext_cam_func->cam_module_reset_status())
	{
		ext_camera_state=EXT_CAMERA_STANDBY_STATE;
		if (engineering_mode_setting==KAL_TRUE)
		{
			for (i=0;i<0x100;i++)
			{
				if (ext_cam_reg_setting[((kal_uint8)i)]==1)
				{
					do
					{
						ext_cam_func->cam_module_write_para(i,ext_cam_reg_value[((kal_uint8) i)]);
						data=ext_cam_func->cam_module_read_para(i);
					} while (data!=ext_cam_reg_value[((kal_uint8)i)]);
				}
			}
		}
		free_NFI_bus();
		lcd_power_down();
		return KAL_TRUE;
	}
	free_NFI_bus();
	lcd_power_down();
	return KAL_FALSE;
}	/* ext_camera_reset_status() */

#if (defined(CAMERA_MODULE_WITH_LCD))
void wait_lcd_update(void)
{
#ifdef DUAL_LCD
	while ((main_lcd_operation_state==LCD_CAMERA_ACTIVE_UPDATE_STATE)||
			 (sub_lcd_operation_state==LCD_CAMERA_ACTIVE_UPDATE_STATE))
#else
	while (main_lcd_operation_state==LCD_CAMERA_ACTIVE_UPDATE_STATE)
#endif
	{
		kal_sleep_task(1);
	}
}
#endif
/*************************************************************************
* FUNCTION
*	ext_camera_ready_check
*
* DESCRIPTION
*	This function check if the external camera module power on procedure is
*  complete or not.
*
* PARAMETERS
*	None
* RETURNS
*	1 : external camera mdoule power is on
*  0 : external camera module is initializing.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint32 ext_camera_ready_check(void)
{
	kal_uint32 jpeg_file_size;

	get_NFI_bus();
#ifndef CAMERA_MODULE_WITH_LCD
	if (ext_camera_state==EXT_CAMERA_PREVIEW_STATE)
	{
		if (ext_cam_func->cam_module_preview_ready_check())
		{
#ifndef DUAL_LCD
			if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
#else
			if ((main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)||
		 		(sub_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE))
#endif	/* DUAL_LCD */
			{
				if (ext_camera_lcd==MAIN_LCD)
				{
						main_lcd_fb_update_para.module_id=LCD_UPDATE_MODULE_EXT_CAMERA;
						lcd_fb_update((lcd_frame_update_struct *) &main_lcd_fb_update_para);
						kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
					}
				#ifdef DUAL_LCD
					else if (ext_camera_lcd==SUB_LCD)
					{
						sub_lcd_fb_update_para.module_id=LCD_UPDATE_MODULE_EXT_CAMERA;
						lcd_fb_update((lcd_frame_update_struct *) &sub_lcd_fb_update_para);
						kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
				}
			#endif
			}
#ifndef DUAL_LCD
			else if (main_lcd_operation_state==LCD_CAMERA_UPDATE_STATE)
#else
			else if ((main_lcd_operation_state==LCD_CAMERA_UPDATE_STATE)||
		 				(sub_lcd_operation_state==LCD_CAMERA_UPDATE_STATE))
#endif	/* DUAL_LCD */
			{
				lcd_fb_update((lcd_frame_update_struct *) &ext_camera_preview_lcd_data);
			}
			else
				ASSERT(0);
			free_NFI_bus();
			return (0);
		}
		else
		{
#ifndef DUAL_LCD
			if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
#else
			if ((main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)||
		 		(sub_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE))
#endif	/* DUAL_LCD */
			{
				if (ext_camera_lcd==MAIN_LCD)
				{
					main_lcd_fb_update_para.module_id=LCD_UPDATE_MODULE_EXT_CAMERA;
					lcd_fb_update((lcd_frame_update_struct *) &main_lcd_fb_update_para);
					kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
				}
			#ifdef DUAL_LCD
				else if (ext_camera_lcd==SUB_LCD)
				{
					sub_lcd_fb_update_para.module_id=LCD_UPDATE_MODULE_EXT_CAMERA;
					lcd_fb_update((lcd_frame_update_struct *) &sub_lcd_fb_update_para);
					kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
				}
			#endif
			}
		}
		free_NFI_bus();
		return (0xFFFFFFFF);
	}
	else if (ext_camera_state==EXT_CAMERA_CAPTURE_STATE)
	{
		jpeg_file_size=ext_cam_func->cam_module_capture_ready_check();
		if (jpeg_file_size!=NULL_JPEG_FILE)
		{
			if ((ext_camera_config_data.snapshot_number!=1)&&
				 (ext_camera_config_data.captured_picture!=burst_snapshot_number))
			{
				ext_camera_config_data.snapshot_number=burst_snapshot_number-ext_camera_config_data.captured_picture;
				ext_camera_config_data.jpeg_buffer_ptr=(kal_uint8 *) (((kal_uint32)ext_camera_config_data.jpeg_buffer_ptr)+jpeg_file_size);
				ext_camera_config_data.image_buffer_size=ext_camera_config_data.image_buffer_size-jpeg_file_size;
				ext_camera_config_data.total_file_size+=jpeg_file_size;
				ext_cam_func->cam_module_capture(&ext_camera_config_data);
				free_NFI_bus();
				return (NULL_JPEG_FILE);
			}
			else
			{
				L1SM_SleepEnable(camera_sleep_mode_handler);
				ext_camera_state=EXT_CAMERA_STANDBY_STATE;
				ext_camera_config_data.total_file_size+=jpeg_file_size;
      	   if (ext_camera_lcd==MAIN_LCD)
		         main_lcd_operation_state=LCD_STANDBY_STATE;
         #ifdef DUAL_LCD
         	else if (ext_camera_lcd==SUB_LCD)
		         sub_lcd_operation_state=LCD_STANDBY_STATE;
         #endif
         	free_NFI_bus();
				return (ext_camera_config_data.total_file_size);
			}
		}
		else
		{
			free_NFI_bus();
			return (NULL_JPEG_FILE);
	}
	}
	else
		ASSERT(0);

#else

	if ((ext_camera_state==EXT_CAMERA_PREVIEW_STATE) || (ext_camera_state==EXT_CAMERA_VIDEO_RECORD_STATE))
	{
		if (ext_cam_func->cam_module_preview_ready_check())
		{
#ifndef DUAL_LCD
			if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
#else
			if ((main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)||
		 		(sub_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE))
#endif	/* DUAL_LCD */
			{
				wait_lcd_update();
				
				if (ext_camera_state==EXT_CAMERA_PREVIEW_STATE)
				{
   				ext_camera_osd_buffer_data.lcd_id=ext_camera_preview_lcd_data.lcd_id;
   				ext_camera_osd_buffer_data.lcm_start_x=ext_camera_preview_lcd_data.lcm_start_x;
   				ext_camera_osd_buffer_data.lcm_start_y=ext_camera_preview_lcd_data.lcm_start_y;
   				ext_camera_osd_buffer_data.lcm_end_x=ext_camera_preview_lcd_data.lcm_end_x;
   				ext_camera_osd_buffer_data.lcm_end_y=ext_camera_preview_lcd_data.lcm_end_y;
   				ext_camera_osd_buffer_data.dest_buffer_address=(kal_uint32)ext_camera_config_data.image_buffer_ptr;
   				ext_camera_osd_buffer_data.dest_buffer_size=ext_camera_config_data.image_buffer_size;
   				ext_camera_osd_buffer_data.force_update=0;
   
   				if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
   				{
   					lcd_fb_update_to_memory(&ext_camera_lcd_menu_data);
   					ext_cam_func->cam_module_write_lcdfb(&ext_camera_osd_buffer_data);
   					kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
   					
   				}
   				#ifdef DUAL_LCD
   					else if (sub_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
   
   					{
   						lcd_fb_update_to_memory(&ext_camera_lcd_menu_data);
   						ext_cam_func->cam_module_write_lcdfb(&ext_camera_osd_buffer_data);
   						kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
   					}
   				#endif
				
			   }
			   else if (ext_camera_state==EXT_CAMERA_VIDEO_RECORD_STATE)
			   {
   				ext_camera_osd_buffer_data.lcm_start_x=main_lcd_fb_update_para.lcm_start_x;
   				ext_camera_osd_buffer_data.lcm_start_y=main_lcd_fb_update_para.lcm_start_y;
   				ext_camera_osd_buffer_data.lcm_end_x=main_lcd_fb_update_para.lcm_end_x;
   				ext_camera_osd_buffer_data.lcm_end_y=main_lcd_fb_update_para.lcm_end_y;
   				ext_camera_osd_buffer_data.dest_buffer_address=(kal_uint32)ext_camera_config_data.image_buffer_ptr;
   				ext_camera_osd_buffer_data.dest_buffer_size=ext_camera_config_data.image_buffer_size;
   				ext_camera_osd_buffer_data.force_update=1;
   				
   				ext_camera_lcd_menu_data.roi_width=main_lcd_fb_update_para.lcm_end_x-main_lcd_fb_update_para.lcm_start_x+1;
   				ext_camera_lcd_menu_data.roi_height=main_lcd_fb_update_para.lcm_end_y-main_lcd_fb_update_para.lcm_start_y+1;
   				ext_camera_lcd_menu_data.roi_offset_x=main_lcd_fb_update_para.roi_offset_x;
   				ext_camera_lcd_menu_data.roi_offset_y=main_lcd_fb_update_para.roi_offset_y;
      				
   				if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
   				{
   					lcd_fb_update_to_memory(&ext_camera_lcd_menu_data);
   					ext_cam_func->cam_module_write_lcdfb(&ext_camera_osd_buffer_data);
   					kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
   					
   					ext_camera_osd_buffer_data.lcd_id=ext_camera_preview_lcd_data.lcd_id;
   					ext_camera_osd_buffer_data.lcm_start_x=ext_camera_preview_lcd_data.lcm_start_x;
   					ext_camera_osd_buffer_data.lcm_start_y=ext_camera_preview_lcd_data.lcm_start_y;
   					ext_camera_osd_buffer_data.lcm_end_x=ext_camera_preview_lcd_data.lcm_end_x;
   					ext_camera_osd_buffer_data.lcm_end_y=ext_camera_preview_lcd_data.lcm_end_y;
   					ext_camera_osd_buffer_data.dest_buffer_address=(kal_uint32)ext_camera_config_data.image_buffer_ptr;
      				ext_camera_osd_buffer_data.dest_buffer_size=ext_camera_config_data.image_buffer_size;
      				ext_camera_osd_buffer_data.force_update=0;
      				
      				ext_camera_lcd_menu_data.roi_width=ext_camera_preview_lcd_data.lcm_end_x-ext_camera_preview_lcd_data.lcm_start_x+1;
      				ext_camera_lcd_menu_data.roi_height=ext_camera_preview_lcd_data.lcm_end_y-ext_camera_preview_lcd_data.lcm_start_y+1;
      				ext_camera_lcd_menu_data.roi_offset_x=ext_camera_preview_lcd_data.roi_offset_x;
      				ext_camera_lcd_menu_data.roi_offset_y=ext_camera_preview_lcd_data.roi_offset_y;
      				
      				lcd_fb_update_to_memory(&ext_camera_lcd_menu_data);
   					ext_cam_func->cam_module_write_lcdfb(&ext_camera_osd_buffer_data);
   				}
   			}
			}
			free_NFI_bus();
			return (0);
		}
		free_NFI_bus();
		return (0xFFFFFFFF);
	}
	else if (ext_camera_state==EXT_CAMERA_CAPTURE_STATE)
	{
		jpeg_file_size=ext_cam_func->cam_module_capture_ready_check();
		if (jpeg_file_size!=NULL_JPEG_FILE)
		{
			
				L1SM_SleepEnable(camera_sleep_mode_handler);
				ext_camera_state=EXT_CAMERA_STANDBY_STATE;
				ext_camera_config_data.total_file_size+=jpeg_file_size;

	         main_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
         #ifdef DUAL_LCD
	         sub_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
         #endif
         	free_NFI_bus();
				return (ext_camera_config_data.total_file_size);
		}
		else
		{
			free_NFI_bus();
			return (NULL_JPEG_FILE);
	}
	}
	else
		ASSERT(0);
#endif	/* CAMERA_MODULE_WITH_LCD */
	free_NFI_bus();
}	/* ext_camera_ready_check() */

⌨️ 快捷键说明

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