📄 cam_module.c
字号:
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 + -