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

📄 ext_camera.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
	#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);

		do
		{
			kal_sleep_task(1);
			if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
			{
				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);
				}
			}
			get_NFI_bus();
			jpeg_file_size=ext_cam_func->cam_module_capture_ready_check();
			free_NFI_bus();
		}	while (jpeg_file_size==NULL_JPEG_FILE);
		kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
		lcd_power_down();
		video_clip_mode=KAL_FALSE;
		return jpeg_file_size;
	}
	else
		return NULL_JPEG_FILE;

#else		
		ext_camera_capture((ext_camera_para_struct *)&ext_cam_para);
		do
		{
			if (main_lcd_operation_state==LCD_CAMERA_CMD_QUEUE_STATE)
			{
				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);
				}
			}

			kal_sleep_task(1);
			get_NFI_bus();
			jpeg_file_size=ext_cam_func->cam_module_capture_ready_check();
			free_NFI_bus();
		}	while (jpeg_file_size==NULL_JPEG_FILE);
		return jpeg_file_size;
#endif
}	/* ext_camera_video_clip() */

kal_uint32 ext_camera_sticker_capture(ext_camera_para_struct *ext_cam_para, lcd_frame_update_to_mem_struct *lcd_para)
{
	kal_uint32 jpeg_file_size;

#ifndef CAMERA_MODULE_WITH_LCD
	if (ext_cam_func->cam_module_jpeg_encode!=NULL)
	{
		lcd_power_up();
	/* for testing */
		lcd_para->fb_update_mode=LCD_SW_TRIGGER_MODE;
		lcd_para->block_mode=LCD_WM_CONT_MODE;
		lcd_para->hw_update_layer=0;
	#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
	#endif
		get_NFI_bus();
		while (!ext_cam_func->cam_module_preview_ready_check()) {};	/* wait until one picture is get from external camera */
		free_NFI_bus();

	   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
		lcd_fb_update_to_memory(lcd_para);
		lcd_power_up();

		ext_cam_para->image_buffer_ptr=(kal_uint16 *) lcd_para->dest_buffer_address;

		ext_cam_para->image_width=lcd_para->roi_width;
		ext_cam_para->image_height=lcd_para->roi_height;
		ext_cam_para->buffer_width=lcd_para->roi_width;

		get_NFI_bus();
		ext_cam_func->cam_module_jpeg_encode(ext_cam_para,KAL_FALSE);
		free_NFI_bus();

		do
		{
			get_NFI_bus();
			jpeg_file_size=ext_cam_func->cam_module_capture_ready_check();
			free_NFI_bus();
		}	while (jpeg_file_size==NULL_JPEG_FILE);

		lcd_power_down();
		L1SM_SleepEnable(camera_sleep_mode_handler);
		ext_camera_state=EXT_CAMERA_STANDBY_STATE;
		return jpeg_file_size;
	}
	else
		return NULL_JPEG_FILE;

#else		
		/* update sticker */
		wait_lcd_update();
		ext_camera_osd_buffer_data.lcm_start_x=lcd_para->roi_offset_x;
		ext_camera_osd_buffer_data.lcm_start_y=lcd_para->roi_offset_y;
		ext_camera_osd_buffer_data.lcm_end_x=lcd_para->roi_offset_x+lcd_para->roi_width-1;
		ext_camera_osd_buffer_data.lcm_end_y=lcd_para->roi_offset_y+lcd_para->roi_height-1;
		ext_camera_osd_buffer_data.dest_buffer_address=lcd_para->dest_buffer_address;
		ext_camera_osd_buffer_data.dest_buffer_size=lcd_para->dest_buffer_size;
		ext_camera_osd_buffer_data.force_update=0;
		lcd_fb_update_to_memory(lcd_para);
		get_NFI_bus();
		ext_cam_func->cam_module_write_lcdfb(&ext_camera_osd_buffer_data);
		free_NFI_bus();

		ext_camera_config_data.burst_capture_ptr=ext_cam_para->burst_capture_ptr;
		ext_camera_config_data.image_width=ext_cam_para->image_width;
		ext_camera_config_data.image_height=ext_cam_para->image_height;
		ext_camera_config_data.jpeg_compression_ratio=ext_cam_para->jpeg_compression_ratio;
		ext_camera_config_data.snapshot_number=ext_cam_para->snapshot_number;
		ext_camera_config_data.jpeg_buffer_ptr=ext_cam_para->jpeg_buffer_ptr;
		ext_camera_config_data.image_buffer_size=ext_cam_para->image_buffer_size;
		ext_camera_config_data.total_file_size=0;
		ext_camera_config_data.captured_picture=0;
		ext_camera_config_data.sticker_capture=1;
		ext_camera_config_data.continue_capture = ext_cam_para->continue_capture;

		get_NFI_bus();
		ext_cam_func->cam_module_capture(&ext_camera_config_data);
		free_NFI_bus();
		ext_camera_state=EXT_CAMERA_CAPTURE_STATE;
		//ext_camera_capture(ext_cam_para);
		do
		{
			get_NFI_bus();
			jpeg_file_size=ext_cam_func->cam_module_capture_ready_check();
			free_NFI_bus();
		}	while (jpeg_file_size==NULL_JPEG_FILE);
      main_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
   #ifdef DUAL_LCD
      sub_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
   #endif
		ext_camera_state = EXT_CAMERA_STANDBY_STATE;
		return jpeg_file_size;
#endif
}	/* ext_camera_sticker_capture() */

void ext_camera_set_parameter(kal_uint8 cmd, kal_uint8 para)
{
	lcd_power_up();
	get_NFI_bus();
	ext_cam_func->cam_module_set_para(cmd,para);
	free_NFI_bus();
	lcd_power_down();
}	/* ext_camera_set_parameter() */

kal_bool write_ext_camera(kal_uint16 cmd, kal_uint16 para)
{
//	kal_uint8 current_lcd_state;
	engineering_mode_setting=KAL_TRUE;
	ext_cam_reg_setting[((kal_uint8)cmd)]=1;
	ext_cam_reg_value[((kal_uint8)cmd)]=para;
	return KAL_TRUE;

#if 0
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
}

kal_bool read_ext_camera(kal_uint16 cmd, kal_uint16 *para)
{
	kal_uint8 current_lcd_state;

	current_lcd_state=main_lcd_operation_state;
	lcd_power_up();
	main_lcd_operation_state=LCD_CAMERA_UPDATE_STATE;	/* temp state to prevent lcd interface power down */

	if (ext_camera_state==EXT_CAMERA_POWER_OFF_STATE)
	{
		get_NFI_bus();
		ext_cam_func->cam_module_power_on();
		free_NFI_bus();
		ext_camera_state=EXT_CAMERA_INITIAL_STATE;
	}
	while (ext_camera_reset_status()!=KAL_TRUE) {};	/* wait until external camera ready */

	if (ext_cam_func->cam_module_read_para!=NULL)
	{
		get_NFI_bus();
		*para=ext_cam_func->cam_module_read_para(cmd);
		free_NFI_bus();
		main_lcd_operation_state=current_lcd_state;
		lcd_power_down();
		ext_camera_power_off();
	   return KAL_TRUE;
   }
	else
	{
		main_lcd_operation_state=current_lcd_state;
		lcd_power_down();
		ext_camera_power_off();
		return KAL_FALSE;
	}
}

void ext_camera_set_osd_buffer(kal_uint32 osd_addr, kal_uint32 osd_size)
{
#ifdef CAMERA_MODULE_WITH_LCD
	ext_camera_lcd_menu_data.dest_buffer_address=osd_addr;
	ext_camera_lcd_menu_data.dest_buffer_size=osd_size;
	ext_camera_osd_buffer_data.dest_buffer_address=osd_addr;
	ext_camera_osd_buffer_data.dest_buffer_size=osd_size;
#endif
}

void ext_camera_update_backend_lcd_buffer(lcd_frame_update_struct *ext_camera_osd_data)
{
#ifdef CAMERA_MODULE_WITH_LCD
	kal_uint32 save_irq_mask;

	if (ext_camera_osd_data->lcd_id==MAIN_LCD)
	{
		if ((main_lcd_operation_state!=LCD_CAMERA_ACTIVE_STATE)&&
			 (main_lcd_operation_state!=LCD_CAMERA_UPDATE_STATE))
		{
			ASSERT(0);
		}
	}
#if (defined(DUAL_LCD))
	else if (ext_camera_osd_data->lcd_id==SUB_LCD)
	{
		if ((sub_lcd_operation_state!=LCD_CAMERA_ACTIVE_STATE)&&
			 (sub_lcd_operation_state!=LCD_CAMERA_UPDATE_STATE))
		{
			ASSERT(0);
		}
	}
#endif

	save_irq_mask=SaveAndSetIRQMask();
	if (ext_camera_osd_data->lcd_id==MAIN_LCD)
		main_lcd_operation_state=LCD_CAMERA_ACTIVE_UPDATE_STATE;
#ifdef DUAL_LCD
	else if (ext_camera_osd_data->lcd_id==SUB_LCD)
		sub_lcd_operation_state=LCD_CAMERA_ACTIVE_UPDATE_STATE;
#endif
	RestoreIRQMask(save_irq_mask);

	ext_camera_lcd_menu_data.fb_update_mode=ext_camera_osd_data->fb_update_mode;
	ext_camera_lcd_menu_data.block_mode=LCD_WM_CONT_MODE;
	ext_camera_lcd_menu_data.roi_offset_x=ext_camera_osd_data->roi_offset_x;
	ext_camera_lcd_menu_data.roi_offset_y=ext_camera_osd_data->roi_offset_y;
	ext_camera_lcd_menu_data.roi_width=ext_camera_osd_data->lcm_end_x-ext_camera_osd_data->lcm_start_x+1;
	ext_camera_lcd_menu_data.roi_height=ext_camera_osd_data->lcm_end_y-ext_camera_osd_data->lcm_start_y+1;
	ext_camera_lcd_menu_data.update_layer=ext_camera_osd_data->update_layer;

	ext_camera_osd_buffer_data.lcd_id=ext_camera_osd_data->lcd_id;
	ext_camera_osd_buffer_data.lcm_start_x=ext_camera_osd_data->lcm_start_x;
	ext_camera_osd_buffer_data.lcm_start_y=ext_camera_osd_data->lcm_start_y;
	ext_camera_osd_buffer_data.lcm_end_x=ext_camera_osd_data->lcm_end_x;
	ext_camera_osd_buffer_data.lcm_end_y=ext_camera_osd_data->lcm_end_y;
	ext_camera_osd_buffer_data.force_update=1;
	
	ext_camera_osd_buffer_data.dest_buffer_address=ext_camera_lcd_menu_data.dest_buffer_address;

	lcd_fb_update_to_memory(&ext_camera_lcd_menu_data);
	get_NFI_bus();
	ext_cam_func->cam_module_write_lcdfb(&ext_camera_osd_buffer_data);
	free_NFI_bus();

	save_irq_mask=SaveAndSetIRQMask();

	main_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
#ifdef DUAL_LCD
	sub_lcd_operation_state=LCD_CAMERA_ACTIVE_STATE;
#endif
	RestoreIRQMask(save_irq_mask);

	kal_set_eg_events(lcd_event_id,LCD_CMD_COMPLETE_EVENT,KAL_OR);
#endif
}

void ext_camera_start_video_encode(ext_camera_retrieve_video_struct *ext_camera_retrieve_video_para)
{
#ifdef CAMERA_MODULE_WITH_LCD
   get_NFI_bus();
   ext_cam_func->cam_module_start_video_encode(ext_camera_retrieve_video_para);
   free_NFI_bus();
#endif
}

void ext_camera_retrieve_video_data(ext_camera_retrieve_video_struct *ext_camera_retrieve_video_para)
{
#ifdef CAMERA_MODULE_WITH_LCD
   get_NFI_bus();
   ext_cam_func->cam_module_retrieve_video_data(ext_camera_retrieve_video_para);
   free_NFI_bus();
#endif
}

void ext_camera_pause_video_encode(ext_camera_retrieve_video_struct *ext_camera_retrieve_video_para)
{
#ifdef CAMERA_MODULE_WITH_LCD
   get_NFI_bus();
   ext_cam_func->cam_module_pause_video_encode(ext_camera_retrieve_video_para);
   free_NFI_bus();
#endif
}

void ext_camera_resume_video_encode(void)
{
#ifdef CAMERA_MODULE_WITH_LCD
   get_NFI_bus();
   ext_cam_func->cam_module_resume_video_encode();
   free_NFI_bus();
#endif   
}

void ext_camera_stop_video_encode(ext_camera_retrieve_video_struct *ext_camera_retrieve_video_para)
{
#ifdef CAMERA_MODULE_WITH_LCD
   get_NFI_bus();
   ext_cam_func->cam_module_stop_video_encode(ext_camera_retrieve_video_para);
   free_NFI_bus();
#endif
}

#endif /* CAMERA_MODULE */

⌨️ 快捷键说明

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