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

📄 cam_module.c

📁 手机摄像头带jpeg压缩芯片PAP1302有关C语言代码,含ISP
💻 C
📖 第 1 页 / 共 5 页
字号:
	pap1302_reg_read(0x80);										/* one read cycle to wake up pap1302 */

	read_data=pap1302_reg_read(0xE6);
	read_data &= 0xFFDF;
	pap1302_reg_write(0xE6,read_data);						/* turn on clock pad */

	read_data &= 0xFFEF;
	pap1302_reg_write(0xE6,read_data);						/* enable internal Vcore regulator */

	pap1302_reg_write(0xE2,0x0000);//0x8000						/* disable all interrupt source */
	pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);	/* clear all interrupt flag */
        
	for (i=0;i<50000;i++) {};
	pap1302_init_sensor();
	pap1302_init_isp();
}	/* init_pap1302() */

kal_bool enable_ae_awb(kal_uint8 ae_enable, kal_uint8 awb_enable)
{
	kal_uint16 int_reg,read_int;
	kal_uint16 read_data;
	volatile kal_uint32 timeout_count=0;
	
	if ((ae_enable==KAL_FALSE)&&(awb_enable==KAL_FALSE))
		return KAL_TRUE;	

	
	if (ae_enable==KAL_TRUE)
	{
		read_data=pap1302_reg_read(0xb3);//save 0x88
    	read_data &= 0x03FF;
    	if(read_data>=400)
     	{
      		pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
      		read_int=pap1302_reg_read(0xE2);//save 0xE2
      		pap1302_reg_write(0xE2,0x0008);//enable Vsync Falling Int
     		while (!pap1302_READY) {};
      	  	  pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
      		pap1302_reg_write(0xE2,read_int);//resotre 0xE2	
     	}	
		pas302_reg_write(0x13,0x00F5);     /* disable AE/AGC */
		pas302_reg_write(0x3B,0x00c2);//disable Night_mode
	}
        
        int_reg=pap1302_reg_read(0xE2);

	if (ae_awb_occupy_i2c==KAL_FALSE&&(awb_enable==KAL_TRUE))
	{
		pap1302_reg_write(0xE2,0x0080);//0x9000
		pap1302_reg_write((kal_uint8)pap1302_INTERRUPT_FLAG_ADDR,0);
	}

	if (awb_enable==KAL_TRUE)
	{
		read_data=pap1302_reg_read(0x88);
		pap1302_reg_write(0x88,(read_data|0x100));		/* enable AWB */
	}
        

	if (ae_awb_occupy_i2c==KAL_FALSE&&(awb_enable==KAL_TRUE))
	{
		while (!pap1302_READY)
		{
			timeout_count++;
			if (timeout_count>0x400000)
				return KAL_FALSE;
		};
		pap1302_reg_write((kal_uint8)pap1302_INTERRUPT_FLAG_ADDR,0);
		ae_awb_occupy_i2c=KAL_TRUE;
	}
	pap1302_reg_write(0xE2,int_reg);
	return KAL_TRUE;
}	/* enable_ae_awb() */

kal_bool disable_ae_awb(kal_bool ae_disable, kal_bool awb_disable)
{
	kal_uint16 int_reg,read_int;
	kal_uint16 read_data,read_data1;
	volatile kal_uint32 timeout_count=0;
    
    
	if ((ae_disable==KAL_FALSE)&&(awb_disable==KAL_FALSE))
		return KAL_TRUE;

	

	if (ae_disable==KAL_TRUE)
	{
		//read_data=pap1302_reg_read(0x82);
		//pap1302_reg_write(0x82,(read_data&0xEFFF));		/* disable AE */
		
		read_data=pap1302_reg_read(0xb3);//save 0x88
    	read_data &= 0x03FF;
    	if(read_data>=400)
     	{
      		pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
      		read_int=pap1302_reg_read(0xE2);//save 0xE2
      		pap1302_reg_write(0xE2,0x0008);//enable Vsync Falling Int
     		while (!pap1302_READY) {};
      	  	  pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
      		pap1302_reg_write(0xE2,read_int);//resotre 0xE2	
     	}
				
		pas302_reg_write(0x13,0x00F0);// disable AE/AGC------------(i^2C)
		pas302_reg_write(0x3B,0x0002);//disable Night_mode-------------(i^2C)
		
	}
	
	int_reg=pap1302_reg_read(0xE2);

	if (ae_awb_occupy_i2c==KAL_TRUE&&(awb_disable==KAL_TRUE))
	{
		pap1302_reg_write(0xE2,0x0040);//0x8800;						/* enable AE/AWB I2C release interrupt */
		pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
	}
	
	if (awb_disable==KAL_TRUE)
	{
		read_data1=pap1302_reg_read(0x88);
		pap1302_reg_write(0x88,(read_data1&0xFEFF));		/* disable AWB */
	}

	if (ae_awb_occupy_i2c==KAL_TRUE&&(awb_disable==KAL_TRUE))
	{
		while (!pap1302_READY)
		{
			timeout_count++;
			if (timeout_count>0x400000)
				return KAL_FALSE;
		};				/* wait AE/AWB I2C release interrupt */
		pap1302_reg_write((kal_uint8)pap1302_INTERRUPT_FLAG_ADDR,0);
		ae_awb_occupy_i2c=KAL_FALSE;
	}
	pap1302_reg_write(0xE2,int_reg);

	return KAL_TRUE;
}	/* disable_ae_awb() */



/*************************************************************************
* FUNCTION
*	check_pap1302_status
*
* DESCRIPTION
*	This function will check does the status of pap1302 to detemine if the
*  external camera mdoule is ready for preview or not.
*
* PARAMETERS
*
* RETURNS
*  KAL_FALSE : if external camera module does not ready yet.
*  KAL_TRUE  : if external camera module is ready.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint8 check_pap1302_status(void)
{
   kal_uint16 i;
   kal_uint16 read_data;

    
	pap1302_set_buffer_address(0x0000);
	pap1302_set_buffer_read_address(0x0000);
	pap1302_mem_read_write();
	for (i=0;i<0x100;i++)
  		pap1302_WRITE_DATA(i);       
     
	pap1302_set_buffer_address(0x0000);
	pap1302_set_buffer_read_address(0x0000);
	pap1302_mem_read_write();
	for (i=0;i<0x100;i++)
	{
		read_data=pap1302_READ_DATA;		
		if (read_data!=i)
         return KAL_FALSE;
	}
	return KAL_TRUE;
}

/*************************************************************************
* FUNCTION
*	check_pap1302_preview_ready
*
* DESCRIPTION
*	This function will check if the external camera module get one complete
*  frame or not.
*
* PARAMETERS
*
* RETURNS
*  KAL_FALSE : no frame is ready for reading
*  KAL_TRUE  : one frame is get from external camera module.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint8 check_pap1302_preview_ready(void)
{
   kal_uint16 read_data,read_data1;
    //read_data1=pap1302_reg_read(0xE4);//R_GPO
    //if (read_data1 & 0x01)
    //	pap1302_reg_write(0xE4,read_data1&0xfe);//toggle GPO_0 for oscillloscope
    //else
    //	pap1302_reg_write(0xE4,read_data1|0x01);//toggle GPO_0 for oscillloscope

	if (pap1302_READY)
	{
   	read_data=pap1302_reg_read(pap1302_INTERRUPT_FLAG_ADDR);
  		pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);	/* clear interrupt status */

		if (video_clip_mode==KAL_TRUE)
		{ 				  
	      if (read_data & 0x4000)//0x2000,Vsync Rise Int	flag
	      {     
		   	video_clip_drop_frame++;
		   	if (((digital_zoom_factor==pap1302_DIGITAL_ZOOM_4X)&&(video_clip_drop_frame==1))||
		   		 ((digital_zoom_factor!=pap1302_DIGITAL_ZOOM_4X)&&(video_clip_drop_frame==1)))
		   	{
				
				while (!pap1302_READY) {};
                pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
				
				
				pap1302_reg_write(0x40,0x1);//set preview mode
				 
				//enable Vsync_Falling
   		        pap1302_reg_write(0xE2,0x0008);//enable Vsync Falling Int
   		        while (!pap1302_READY) {};
                pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
   		        
   		        //return interrupt
   		        pap1302_reg_write(0xE2,0x4000);//enable Vsync Rise Int				
				
		      pap1302_get_image();
			      video_clip_drop_frame=0;
			      preview_frame_count=0; //fixed low frame rate flash problem->preview(video clip false skip 4 frame)
	   	   return KAL_TRUE;
			}
		}
		}
		else//video_clip_mode==KAL_FALSE
		{
		   if (read_data & 0x4000)//0x2000
		   {
			if (digital_zoom_flag!=0)
				{
					digital_zoom_flag|=0x80;
				pap1302_set_para(pap1302_SET_DIGITAL_ZOOM_CMD,digital_zoom_flag);
				}

				//read_data=pap1302_reg_read(0x82);
				//if (!(read_data & 0x1000))
					//enable_ae_awb(KAL_TRUE,KAL_FALSE);

	   	if (preview_frame_count>=4)
	   	{
	   		  //read_data1=pap1302_reg_read(0xE4);//R_GPO
              //pap1302_reg_write(0xE4,read_data1&0xfb);//toggle GPO_2 for oscillloscope
              read_data=pap1302_reg_read(0xb3);//寄存器0xb3存当前采样图片的线数和帧数
              read_data &= 0x03FF;
              if(read_data>=485)//如果线数大于等于485线,则OK
                pap1302_get_image();
		      else //如果线数小于485线,则
		       {
		       	pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
		        //enable Vsync_Falling
   		        pap1302_reg_write(0xE2,0x0008);//enable Vsync Falling Int
		        while (!pap1302_READY) {};
                pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);
                pap1302_delay(0x1000); 
                pap1302_get_image();
                 //return interrupt
   		        pap1302_reg_write(0xE2,0x4000);//enable Vsync Rise Int	
		       }
              //read_data1=pap1302_reg_read(0xE4);//R_GPO
              //pap1302_reg_write(0xE4,read_data1|0x04);//toggle GPO_2 for oscillloscope
	   	   return KAL_TRUE;
	   	}
	   	else//如果preview_frame_count<4,继续
	   	{
	   		preview_frame_count++;
	   		return KAL_FALSE;
	   	}
      }
	     }//video_clip_mode==KAL_FALSE END
	}
	return KAL_FALSE;
}	/* check_pap1302_preview_ready() */


/*************************************************************************
* FUNCTION
*	check_pap1302_capture_ready
*
* DESCRIPTION
*	This function will check if the external camera module capture and encode
*  a frame or not.
*
* PARAMETERS
*
* RETURNS
*	KAL_FALSE : the external camera module is still capturing.
*  KAL_TRUE  : the captured jpeg file has been read back.
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_uint32 check_pap1302_capture_ready(void)
{
   kal_uint16 read_data,read_data1;
   kal_uint32 jpeg_file_size;
   static kal_uint8 capture_check_count=0;
   
   
	if (pap1302_READY)
	{
		capture_check_count=0;
	        read_data=pap1302_reg_read(pap1302_INTERRUPT_FLAG_ADDR);
   	        if (read_data &0x1000)// JPEG ENCODE OK?
                {	     
	         pap1302_reg_write(pap1302_INTERRUPT_FLAG_ADDR,0);

	          if (burst_capture_mode==KAL_TRUE)//如果是连续JPEG encode(多张) 
	           {
	      	   current_captured_number++;
	           if (current_captured_number==pap1302_config_data.snapshot_number)
	      	    {
			      pap1302_reg_write(0xE2,0);								/* disable all interrupt */
			      

					read_data=pap1302_reg_read(0xE5);
					pap1302_reg_write(0xE5,(read_data&0xFFFE));		/* disable JPEG codec clock */

					read_data=pap1302_reg_read(0x81);					/* disable jpeg encode */
					pap1302_reg_write(0x81,(read_data&0xFFEF));
					pap1302_reg_write(0xC1,0);//N-shot mode disable
					jpeg_file_size=pap1302_get_burst_jpeg_file();
					if (pap1302_capture_ptr->captured_picture==pap1302_config_data.snapshot_number)
						burst_capture_mode=KAL_FALSE;
					return (jpeg_file_size);
	      	  }
	   	 }
	        else//burst=false如果是单张JPEG encode(一张)
	          {
	      	  //add by boy on 04/14 ==> solve (1) 128*160 with add-frame encode error  & (2) 128*160 with add-frame encode then 160*120 encode fail at the first shot
		pap1302_reg_write(0xE3,0);	
	         pap1302_reg_write(0xE2,0);								/* disable all interrupt */
                          
			   read_data=pap1302_reg_read(0xE5);
			   pap1302_reg_write(0xE5,(read_data&0xFFFE));		/* disable JPEG codec clock */
               
                    //read_data1=pap1302_reg_read(0xE4);//R_GPO
       				//pap1302_reg_write(0xE4,read_data1|0x04);//toggle GPO_2 for oscillloscope
       				//pap1302_delay(0x2000);                   
			   		jpeg_file_size=pap1302_get_jpeg_file();
			   		//pap1302_reg_write(0xE4,read_data1&0xfb);//toggle GPO_2 for oscillloscope

			   read_data=pap1302_reg_read(0x81);						/* disable jpeg encode */
			   pap1302_reg_write(0x81,(read_data&0xFFEF));
				    
				    pap1302_reg_write(0x8c, 0x000e);//R_Sensor_Is_YUV = 1
				    
				if (video_clip_mode==KAL_FALSE)
				{
				   if (jpeg_file_size==NULL_JPEG_FILE)
				   {
		      	   capture_retry_count++;
		      	   pap1302_capture_frame(&pap1302_config_data);
		      	   return(NULL_JPEG_FILE);
		                   }
		                else//jpeg not 0
		                   {
					   capture_retry_count=0;					   
					   return(jpeg_file_size);
		                   }
		                }
		              else//video_clip_mode==KAL_TURE
		   	      {
					//pap1302_reg_write(0xC0,0x10);
					//pap1302_reg_write(0xE3,0);

⌨️ 快捷键说明

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