/* the function of sensor set fps */ static HI_VOID cmos_fps_set(HI_U8 u8Fps, AE_SENSOR_DEFAULT_S *pstAeSnsDft) { switch(u8Fps) { case 30: gu32FullLinesStd = 750; pstAeSnsDft->u32MaxIntTime = 748; pstAeSnsDft->u32LinesPer500ms = 750 * 30 / 2; sensor_write_register(0x300C, 0xCE4); break; case 25: gu32FullLinesStd = 750; pstAeSnsDft->u32MaxIntTime = 748; pstAeSnsDft->u32LinesPer500ms = 750 * 25 / 2; sensor_write_register(0x300C, 0xF78); break; default: break; } if(1 == gu8SensorMode) { pstAeSnsDft->u32MaxIntTime = 675; } pstAeSnsDft->u32FullLinesStd = gu32FullLinesStd; return; }
/* Set fps base */ static __inline void cmos_fps_set( cmos_inttime_ptr_t p_inttime, const HI_U8 fps ) { #ifdef DUAL_PORT switch(fps) { default: // Change the frame rate via changing the vertical blanking p_inttime->full_lines_std = (1125 * 60) / fps; sensor_write_register(0xb6, 0x09); // These modes are configured via vertical blanking, thus 'lines_per_500ms' stays fixed p_inttime->lines_per_500ms = 1125 * 30; break; case 50: // Change the frame rate via changing the horizontal blanking p_inttime->full_lines_std = 1125; sensor_write_register(0xb6, 0x40); p_inttime->lines_per_500ms = 1125 * 25; break; case 25: // Change the frame rate via changing both vertical and horizontal blanking p_inttime->full_lines_std = 1125 * 2; sensor_write_register(0xb6, 0x40); p_inttime->lines_per_500ms = 1125 * 25; break; } #else // the default framerate p_inttime->full_lines_std = (1125 * 30) / fps; sensor_write_register(0xb6, 0x09); p_inttime->lines_per_500ms = 1125 * fps / 2; #endif }
/* * This function applies the new gains to the ISP registers. */ static __inline void cmos_gains_update(cmos_gains_const_ptr_t p_gains) { // HI_U16 data16; HI_U16 lut_val; /* analog gain */ { assert(p_gains->again_db <= 80); lut_val = analog_gain_lut_get_value(p_gains->again_db); sensor_write_register(APGC_ADDR, lut_val & 0xFF); sensor_write_register(APGC_ADDR + 1, (lut_val & 0x0300) >> 8); } /* digital gain. * digital_gain = DPGC * 0.3 db. * DPCG = [00h, 3Ch]; * digital_gain = [0db, 18db]. */ { assert(p_gains->dgain_db <= 0x3C); sensor_write_register(DPGC_ADDR, p_gains->dgain_db); } //printf("gain = %d, %d, ", p_gains->again_db, p_gains->dgain_db); return; }
/* Set fps base */ static __inline void cmos_fps_set( cmos_inttime_ptr_t p_inttime, const HI_U8 fps ) { switch(fps) { case 30: // Change the frame rate via changing the vertical blanking p_inttime->full_lines_std = 1125; sensor_write_register(VMAX_ADDR, 0x65); sensor_write_register(VMAX_ADDR+1, 0x04); p_inttime->lines_per_500ms = 1125 * 30 / 2; break; case 25: // Change the frame rate via changing the vertical blanking p_inttime->full_lines_std = 1350; sensor_write_register(VMAX_ADDR, 0x46); sensor_write_register(VMAX_ADDR+1, 0x05); p_inttime->lines_per_500ms = 1350 * 25 / 2; break; default: break; } }
/* * This function applies the new integration time to the ISP registers. */ static __inline void cmos_inttime_update(cmos_inttime_ptr_t p_inttime) { HI_U16 eshort = p_inttime->exposure_ashort; HI_U16 elong = p_inttime->exposure_ashort;//? sensor_write_register(EXPOSURE_SHORT_ADDR, eshort); sensor_write_register(EXPOSURE_LONG_ADDR, elong); }
static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) { HI_U32 u32Tmp = u32Again + u32Dgain; switch(gu8SensorMode) { default: case 0: /* linear mode */ if( u32Tmp > 0x1E0) { u32Tmp = 0x1E0; } #if CMOS_IMX236_ISP_WRITE_SENSOR_ENABLE cmos_init_regs_info(); g_stSnsRegsInfo.astI2cData[3].u32Data = (u32Tmp & 0xff); g_stSnsRegsInfo.astI2cData[4].u32Data = ((u32Tmp & 0x100)>>8); HI_MPI_ISP_SnsRegsCfg(&g_stSnsRegsInfo); #else sensor_write_register(PGC_ADDR, u32Tmp & 0xff); sensor_write_register(PGC_ADDR + 1, (u32Tmp & 0x100) >> 8); #endif break; case 1: //WDR mode #if CMOS_IMX236_ISP_WRITE_SENSOR_ENABLE cmos_init_regs_info(); if(u32Dgain <= 120) { g_stSnsRegsInfo.astI2cData[6].u32Data = (u32Dgain & 0xff); } else { g_stSnsRegsInfo.astI2cData[6].u32Data = 0x78; } HI_MPI_ISP_SnsRegsCfg(&g_stSnsRegsInfo); #else if(u32Dgain <= 120) { sensor_write_register(PGC_ADDR, u32Dgain); } else { sensor_write_register(PGC_ADDR, 0x78); } #endif break; } return; }
HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) { if (bEnable) /* setup for ISP pixel calibration mode */ { /* Sensor must be programmed for slow frame rate (5 fps and below)*/ /* change frame rate to 5 fps by setting 1 frame length = 750 * 30 / 5 */ sensor_write_register(VMAX_ADDR, 0x5E); sensor_write_register(VMAX_ADDR + 1, 0x1A); /* max Exposure time */ sensor_write_register(EXPOSURE_ADDR, 0x00); sensor_write_register(EXPOSURE_ADDR + 1, 0x00); /* Analog and Digital gains both must be programmed for their minimum values */ sensor_write_register(PGC_ADDR, 0x00); sensor_write_register(PGC_ADDR + 1, 0x00); } else /* setup for ISP 'normal mode' */ { sensor_write_register(VMAX_ADDR, 0x65); sensor_write_register(VMAX_ADDR + 1, 0x04); } return; }
HI_VOID cmos_set_pixel_detect(HI_BOOL bEnable) { if (bEnable) /* setup for ISP pixel calibration mode */ { sensor_write_register(0x300C, 0x4D58); //5fps sensor_write_register(0x3012, 0x118); //max exposure lines sensor_write_register(0x30B0, 0x1300); //AG, Context A sensor_write_register(0x305E, 0x0020); //DG, Context A } else /* setup for ISP 'normal mode' */ { sensor_write_register(0x300C, 0xCE4); //30fps } return; }
/* * This function applies the new vert blanking porch to the ISP registers. */ static __inline void cmos_vblanking_update(cmos_inttime_const_ptr_t p_inttime) { HI_U16 vmax = p_inttime->full_lines; sensor_write_register(VMAX_ADDR, (vmax&0x00ff)); sensor_write_register(VMAX_ADDR+1, ((vmax&0xff00) >> 8)); return; }
static HI_VOID cmos_slow_framerate_set(HI_U16 u16FullLines, AE_SENSOR_DEFAULT_S *pstAeSnsDft) { sensor_write_register(0x300A, u16FullLines); pstAeSnsDft->u32MaxIntTime = u16FullLines - 2; return; }
static HI_VOID cmos_gains_update(HI_U32 u32Again, HI_U32 u32Dgain) { #if CMOS_M034_ISP_WRITE_SENSOR_ENABLE cmos_init_regs_info(); switch(u32Again) { case 0: g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1300; break; case 1: g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1310; break; case 2: g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1320; break; case 3: g_stSnsRegsInfo.astI2cData[1].u32Data = 0x1330; break; } g_stSnsRegsInfo.astI2cData[2].u32Data = u32Dgain; HI_MPI_ISP_SnsRegsCfg(&g_stSnsRegsInfo); #else switch(u32Again) { case 0: sensor_write_register(0x30B0, 0x1300); break; case 1: sensor_write_register(0x30B0, 0x1310); break; case 2: sensor_write_register(0x30B0, 0x1320); break; case 3: sensor_write_register(0x30B0, 0x1330); break; } sensor_write_register(0x305E, u32Dgain); #endif return; }
/* * This function applies the new integration time to the ISP registers. */ static __inline void cmos_inttime_update(cmos_inttime_ptr_t p_inttime) { HI_U32 eshort = p_inttime->exposure_ashort; HI_U32 exp_frames = eshort / p_inttime->full_lines_std; eshort = eshort - exp_frames * p_inttime->full_lines_std; eshort = p_inttime->full_lines_std - eshort; sensor_write_register(0x7c13, (eshort&0xffff)); //SUB Start lines sensor_write_register(0x7c14, (eshort&0xffff)); //SUB End lines,only one sub pulse . /* sensor_write_register(0x7D03, 0x4); //Primary field counter enable,bit[2] sensor_write_register(0x7C7C, ((exp_frames+1)&0x1fff)); //SGMASK_NUM,bit[12~0] sensor_write_register(0x7C7D, ((exp_frames+1)&0x1fff)); //SUBCKMASK_NUM,bit[12~0] sensor_write_register(0x7C7B, 0xA); //SUBCK_MASK_SKIP1,bit[1] */ }
/* * This function applies the new integration time to the ISP registers. */ static __inline void cmos_inttime_update(cmos_inttime_ptr_t p_inttime) { HI_U16 exp_time; exp_time = p_inttime->full_lines - p_inttime->exposure_ashort; sensor_write_register(EXPOSURE_ADDR, exp_time & 0xFF); sensor_write_register(EXPOSURE_ADDR + 1, (exp_time & 0xFF00) >> 8); }
/* while isp notify ae to update sensor regs, ae call these funcs. */ static HI_VOID cmos_inttime_update(HI_U32 u32IntTime) { #if CMOS_M034_ISP_WRITE_SENSOR_ENABLE cmos_init_regs_info(); g_stSnsRegsInfo.astI2cData[0].u32Data = u32IntTime; #else sensor_write_register(0x3012, u32IntTime); #endif return; }
HI_VOID cmos_set_wdr_mode(HI_U8 u8Mode) { switch(u8Mode) { //720P30 linear case 0: gu8SensorMode = 0; printf("linear mode\n"); /* program sensor to linear mode */ sensor_prog(sensor_rom_30_lin); /* Enable DCG */ sensor_write_register(0x3100, 0x001E); /* Enable 1.25x analog gain */ sensor_write_register(0x3EE4, 0xD308); break; //720P30 wdr case 1: gu8SensorMode = 1; printf("wdr mode\n"); /* program sensor to wdr mode */ sensor_prog(sensor_rom_30_wdr); /* Disable DCG */ sensor_write_register(0x3100, 0x001A); /* Disable 1.25x analog gain */ sensor_write_register(0x3EE4, 0xD208); break; default: printf("NOT support this mode!\n"); return; break; } return; }
/* * This function applies the new vert blanking porch to the ISP registers. */ static __inline void cmos_vblanking_update(cmos_inttime_const_ptr_t p_inttime) { HI_U16 vmax = p_inttime->full_lines; static HI_U16 last_vblanking_lines = 0xFFFF; if(vmax != last_vblanking_lines) { sensor_write_register(VMAX_ADDR, (vmax&0x00ff)); sensor_write_register(VMAX_ADDR+1, ((vmax&0xff00) >> 8)); last_vblanking_lines = vmax; }else
static void setup_sensor(int isp_mode) { if(0 == isp_mode) /* setup for ISP 'normal mode' */ { sensor_write_register(VMAX_ADDR, 0x65); sensor_write_register(VMAX_ADDR + 1, 0x04); } else if(1 == isp_mode) /* setup for ISP pixel calibration mode */ { //TODO: finish this. /* Sensor must be programmed for slow frame rate (5 fps and below)*/ /* change frame rate to 3 fps by setting 1 frame length = 1125 * (30/3) */ sensor_write_register(VMAX_ADDR, 0xF2); sensor_write_register(VMAX_ADDR + 1, 0x2B); /* Analog and Digital gains both must be programmed for their minimum values */ sensor_write_register(PGC_ADDR, 0x00); // sensor_write_register(APGC_ADDR + 1, 0x00); // sensor_write_register(DPGC_ADDR, 0x00); } }
/* * This function applies the new gains to the ISP registers. */ static __inline HI_U16 cmos_gains_update(cmos_gains_const_ptr_t p_gains) { HI_U16 data16; HI_U16 lut_val; /* analog gain * analog gain = PGC * 0.3 db. * APGC = [0,80]; * analog gain = [0db, 24db]. */ { if(p_gains->again_db <= 80); { sensor_write_register(PGC_ADDR, p_gains->again_db); } } /* digital gain. * digital_gain = DPGC * 0.3 db. * DPCG = [51h, 8Ch]; * digital_gain = [0db, 18db]. */ if(p_gains->again_db==80) { { if(p_gains->dgain_db <= 0x3C); { lut_val = digital_gain_lut_get_value(p_gains->dgain_db); } sensor_write_register(PGC_ADDR, lut_val); } } }
void sensor_prog(int* rom) { int i = 0; while (1) { int lookup = rom[i++]; int addr = (lookup >> 16) & 0xFFFF; int data = lookup & 0xFFFF; if (addr == 0xFFFE) { delay_ms(data); } else if (addr == 0xFFFF) { return; } else { sensor_write_register(addr, data); } } }
static HI_VOID cmos_slow_framerate_set(HI_U16 u16FullLines, AE_SENSOR_DEFAULT_S *pstAeSnsDft) { HI_U16 u16Vmax = u16FullLines; HI_U16 u16Current; u16Current = sensor_read_register(VMAX_ADDR+2); sensor_write_register(VMAX_ADDR, (u16Vmax&0x00ff)); sensor_write_register(VMAX_ADDR+1, ((u16Vmax&0xff00) >> 8)); //sensor_write_register(VMAX_ADDR+2,(((u16Vmax & 0x10000) >> 16)+(u16Current&0xFE))); pstAeSnsDft->u32MaxIntTime = u16Vmax - 2; gu32FullLines = u16Vmax; return; }
/* * This function applies the new gains to the ISP registers. */ static __inline HI_U16 cmos_gains_update2(cmos_gains_const_ptr_t p_gains) { HI_U16 data16; // HI_U16 out_offset; // HI_U32 data32; HI_U16 lut_val; { lut_val = analog_gain_lut_get_value(p_gains->again); sensor_write_register(COL_BUF_GAIN_EVEN_EAST_ADDR, lut_val); sensor_write_register(COL_BUF_GAIN_EVEN_WEST_ADDR, lut_val); sensor_write_register(COL_BUF_GAIN_ODD_EAST_ADDR, lut_val); sensor_write_register(COL_BUF_GAIN_ODD_WEST_ADDR, lut_val); // Update the ext status //apical_ext_exposure_status_analog_gain_status_write(lut_val); } { data16 = p_gains->dgain_fine; // digital_gain_fine data - set bit15 data16 = data16 | 0x8000; sensor_write_register(DP_FINE_GAIN_FACTOR_E_ADDR, data16); sensor_write_register(DP_FINE_GAIN_FACTOR_O_ADDR, data16); // Update the ext status //apical_ext_exposure_status_fine_digital_gain_status_write(data16); } { HI_U8 data_lut = p_gains->dgain + 4; if (data_lut > 15) data_lut = 15; data16 = (data_lut << 4) | data_lut; // digital_gain_coarse data - set bit15 // digital_gain_coarse data - set bit8 data16 = data16 | 0x8100; sensor_write_register(DP_COARSE_ADDR, data16); // Update the ext status //apical_ext_exposure_status_coarse_digital_gain_status_write(data16); } return cmos_gains_dpga_update(p_gains); }
/* * This function applies the digital gain * input and output offset and correction */ static __inline void cmos_gains_update(cmos_gains_const_ptr_t p_gains) { switch (p_gains->again_db) { case 0: sensor_write_register(0xC001, 0x0); break; case 3: sensor_write_register(0xC001, 0x1); break; case 6: sensor_write_register(0xC001, 0x2); break; case 9: sensor_write_register(0xC001, 0x3); break; case 12: sensor_write_register(0xC001, 0x4); break; case 15: sensor_write_register(0xC001, 0x5); break; case 18: sensor_write_register(0xC001, 0x6); break; default: break; } //set the dgain sensor_write_register(0xC002, (p_gains->dgain_db & 0x3ff)); //printf("again = %d,dgain = %d\n",p_gains->again_db,p_gains->dgain_db); }
static void setup_sensor(int isp_mode) { if(0 == isp_mode) /* setup for ISP 'normal mode' */ { sensor_write_register(VMAX_ADDR, 0x48); sensor_write_register(VMAX_ADDR + 1, 0x06); } else if(1 == isp_mode) /* setup for ISP pixel calibration mode */ { /* Sensor must be programmed for slow frame rate (5 fps and below)*/ sensor_write_register(VMAX_ADDR, 0x5E); sensor_write_register(VMAX_ADDR + 1, 0x1A); /* Analog and Digital gains both must be programmed for their minimum values */ sensor_write_register(APGC_ADDR, 0x00); sensor_write_register(APGC_ADDR + 1, 0x00); sensor_write_register(DPGC_ADDR, 0x00); } }
static void setup_sensor(int isp_mode) { return; if(0 == isp_mode) /* setup for ISP 'normal mode' */ { sensor_write_register(0x00A5,0x0000); } else if(1 == isp_mode) /* setup for ISP pixel calibration mode */ { //set the gain to 0 sensor_write_register(0x0020,0x0080); sensor_write_register(0x0021,0x0080); sensor_write_register(0x00A1,0x0400); sensor_write_register(0x00A2,0x0002); sensor_write_register(0x00A5,0x0005); } }
void sensor_init() { // sequence according to "Flow Power-on to Operation Start(Sensor Master Mode) sensor_write_register(0x200,0x45); sensor_write_register(0x201,0x00); sensor_write_register(0x202,0x00); sensor_write_register(0x203,0x08); sensor_write_register(0x204,0x12); sensor_write_register(0x205,0x00); sensor_write_register(0x206,0x00); sensor_write_register(0x207,0xB8); sensor_write_register(0x208,0x08); sensor_write_register(0x209,0x48); sensor_write_register(0x20A,0x06); sensor_write_register(0x20B,0x00); sensor_write_register(0x20C,0x00); sensor_write_register(0x20D,0x00); sensor_write_register(0x20E,0x00); sensor_write_register(0x20F,0x00); sensor_write_register(0x210,0x00); sensor_write_register(0x211,0x00); sensor_write_register(0x212,0x00); sensor_write_register(0x213,0x00); sensor_write_register(0x214,0x00); sensor_write_register(0x215,0x00); sensor_write_register(0x216,0x00); sensor_write_register(0x217,0x0D); sensor_write_register(0x218,0x00); sensor_write_register(0x219,0xE0); sensor_write_register(0x21A,0x00); sensor_write_register(0x21B,0x00); sensor_write_register(0x21C,0x0F); sensor_write_register(0x21D,0x00); sensor_write_register(0x21E,0x00); sensor_write_register(0x21F,0xF0); sensor_write_register(0x220,0x00); sensor_write_register(0x221,0x13); sensor_write_register(0x222,0x5C); sensor_write_register(0x223,0x00); sensor_write_register(0x224,0x00); sensor_write_register(0x225,0x47); sensor_write_register(0x226,0x00); sensor_write_register(0x227,0xD6); sensor_write_register(0x228,0x00); sensor_write_register(0x229,0x00); sensor_write_register(0x22A,0x00); sensor_write_register(0x22B,0x10); sensor_write_register(0x22C,0x00); sensor_write_register(0x22D,0x88); sensor_write_register(0x22E,0x06); sensor_write_register(0x22F,0x06); sensor_write_register(0x230,0x24); sensor_write_register(0x231,0x04); sensor_write_register(0x232,0x86); sensor_write_register(0x233,0x01); sensor_write_register(0x234,0x00); sensor_write_register(0x235,0x00); sensor_write_register(0x236,0x00); sensor_write_register(0x237,0x00); sensor_write_register(0x238,0x40); sensor_write_register(0x239,0x00); sensor_write_register(0x23A,0x00); sensor_write_register(0x23B,0xC0); sensor_write_register(0x23C,0x00); sensor_write_register(0x23D,0x00); sensor_write_register(0x23E,0xB8); sensor_write_register(0x23F,0x08); sensor_write_register(0x240,0x40); sensor_write_register(0x241,0x00); sensor_write_register(0x242,0xC0); sensor_write_register(0x243,0x16); sensor_write_register(0x244,0x00); sensor_write_register(0x245,0x00); sensor_write_register(0x246,0x00); sensor_write_register(0x247,0x00); sensor_write_register(0x248,0x00); sensor_write_register(0x249,0x00); sensor_write_register(0x24A,0x00); sensor_write_register(0x24B,0x00); sensor_write_register(0x24C,0x00); sensor_write_register(0x24D,0x00); sensor_write_register(0x24E,0x00); sensor_write_register(0x24F,0x00); sensor_write_register(0x250,0x00); sensor_write_register(0x251,0x00); sensor_write_register(0x252,0x00); sensor_write_register(0x253,0x00); sensor_write_register(0x254,0x00); sensor_write_register(0x255,0x00); sensor_write_register(0x256,0x00); sensor_write_register(0x257,0x00); sensor_write_register(0x258,0x00); sensor_write_register(0x259,0x00); sensor_write_register(0x25A,0x00); sensor_write_register(0x25B,0x20); sensor_write_register(0x25C,0x80); sensor_write_register(0x25D,0x00); sensor_write_register(0x25E,0xFF); sensor_write_register(0x25F,0x02); sensor_write_register(0x260,0x00); sensor_write_register(0x261,0x00); sensor_write_register(0x262,0x00); sensor_write_register(0x263,0x00); sensor_write_register(0x264,0x00); sensor_write_register(0x265,0x00); sensor_write_register(0x266,0x00); sensor_write_register(0x267,0x00); sensor_write_register(0x268,0x01); sensor_write_register(0x269,0x00); sensor_write_register(0x26A,0x01); sensor_write_register(0x26B,0x09); sensor_write_register(0x26C,0xA0); sensor_write_register(0x26D,0x20); sensor_write_register(0x26E,0x00); sensor_write_register(0x26F,0x00); sensor_write_register(0x270,0x80); sensor_write_register(0x271,0x00); sensor_write_register(0x272,0x00); sensor_write_register(0x273,0xB1); sensor_write_register(0x274,0x01); sensor_write_register(0x275,0x70); sensor_write_register(0x276,0x60); sensor_write_register(0x277,0x00); sensor_write_register(0x278,0x00); sensor_write_register(0x279,0x00); sensor_write_register(0x27A,0x00); sensor_write_register(0x27B,0x00); sensor_write_register(0x27C,0x00); sensor_write_register(0x27D,0x00); sensor_write_register(0x27E,0x00); sensor_write_register(0x27F,0x00); sensor_write_register(0x280,0x00); sensor_write_register(0x281,0x00); sensor_write_register(0x282,0x00); sensor_write_register(0x283,0x00); sensor_write_register(0x284,0x82); sensor_write_register(0x285,0x00); sensor_write_register(0x286,0x02); sensor_write_register(0x287,0x00); sensor_write_register(0x288,0x2C); sensor_write_register(0x289,0x2C); sensor_write_register(0x28A,0x00); sensor_write_register(0x28B,0x00); sensor_write_register(0x28C,0xF2); sensor_write_register(0x28D,0x19); sensor_write_register(0x28E,0x00); sensor_write_register(0x28F,0x05); sensor_write_register(0x290,0x20); sensor_write_register(0x291,0x00); sensor_write_register(0x292,0x00); sensor_write_register(0x293,0x40); sensor_write_register(0x294,0x00); sensor_write_register(0x295,0x00); sensor_write_register(0x296,0x30); sensor_write_register(0x297,0x00); sensor_write_register(0x298,0x00); sensor_write_register(0x299,0x00); sensor_write_register(0x29A,0x18); sensor_write_register(0x29B,0x00); sensor_write_register(0x29C,0x00); sensor_write_register(0x29D,0x00); sensor_write_register(0x29E,0x00); sensor_write_register(0x29F,0x00); sensor_write_register(0x2A0,0x00); sensor_write_register(0x2A1,0x00); sensor_write_register(0x2A2,0x00); sensor_write_register(0x2A3,0x02); sensor_write_register(0x2A4,0x04); sensor_write_register(0x2A5,0x0F); sensor_write_register(0x2A6,0x00); sensor_write_register(0x2A7,0x01); sensor_write_register(0x2A8,0x48); sensor_write_register(0x2A9,0x05); sensor_write_register(0x2AA,0x00); sensor_write_register(0x2AB,0x00); sensor_write_register(0x2AC,0x00); sensor_write_register(0x2AD,0xFF); sensor_write_register(0x2AE,0x01); sensor_write_register(0x2AF,0xFF); sensor_write_register(0x2B0,0x02); sensor_write_register(0x2B1,0x7F); sensor_write_register(0x2B2,0x03); sensor_write_register(0x2B3,0xBF); sensor_write_register(0x2B4,0x03); sensor_write_register(0x2B5,0x00); sensor_write_register(0x2B6,0x00); sensor_write_register(0x2B7,0x0A); sensor_write_register(0x2B8,0x00); sensor_write_register(0x2B9,0x00); sensor_write_register(0x2BA,0x00); sensor_write_register(0x2BB,0x00); sensor_write_register(0x2BC,0x00); sensor_write_register(0x2BD,0x00); sensor_write_register(0x2BE,0x00); sensor_write_register(0x2BF,0x00); sensor_write_register(0x2C0,0x00); sensor_write_register(0x2C1,0x00); sensor_write_register(0x2C2,0x00); sensor_write_register(0x2C3,0x00); sensor_write_register(0x2C4,0x00); sensor_write_register(0x2C5,0x00); sensor_write_register(0x2C6,0x00); sensor_write_register(0x2C7,0x00); sensor_write_register(0x2C8,0x00); sensor_write_register(0x2C9,0x00); sensor_write_register(0x2CA,0x00); sensor_write_register(0x2CB,0x00); sensor_write_register(0x2CC,0x00); sensor_write_register(0x2CD,0x00); sensor_write_register(0x2CE,0x00); sensor_write_register(0x2CF,0x00); sensor_write_register(0x2D0,0x00); sensor_write_register(0x2D1,0x00); sensor_write_register(0x2D2,0x00); sensor_write_register(0x2D3,0x10); sensor_write_register(0x2D4,0x00); sensor_write_register(0x2D5,0x10); sensor_write_register(0x2D6,0x40); sensor_write_register(0x2D7,0x20); sensor_write_register(0x2D8,0x66); sensor_write_register(0x2D9,0x0E); sensor_write_register(0x2DA,0x01); sensor_write_register(0x2DB,0x06); sensor_write_register(0x2DC,0x06); sensor_write_register(0x2DD,0x0C); sensor_write_register(0x2DE,0x10); sensor_write_register(0x2DF,0x00); sensor_write_register(0x2E0,0x7C); sensor_write_register(0x2E1,0x00); sensor_write_register(0x2E2,0x00); sensor_write_register(0x2E3,0xFF); sensor_write_register(0x2E4,0xFF); sensor_write_register(0x2E5,0xFF); sensor_write_register(0x2E6,0xFF); sensor_write_register(0x2E7,0xFF); sensor_write_register(0x2E8,0xFF); sensor_write_register(0x2E9,0x00); sensor_write_register(0x2EA,0xC9); sensor_write_register(0x2EB,0x00); sensor_write_register(0x2EC,0x00); sensor_write_register(0x2ED,0x00); sensor_write_register(0x2EE,0x12); sensor_write_register(0x2EF,0x01); sensor_write_register(0x2F0,0x00); sensor_write_register(0x2F1,0x00); sensor_write_register(0x2F2,0x00); sensor_write_register(0x2F3,0x00); sensor_write_register(0x2F4,0x00); sensor_write_register(0x2F5,0x00); sensor_write_register(0x2F6,0x00); sensor_write_register(0x2F7,0x00); sensor_write_register(0x2F8,0x00); sensor_write_register(0x2F9,0x00); sensor_write_register(0x2FA,0x00); sensor_write_register(0x2FB,0x00); sensor_write_register(0x2FC,0x00); sensor_write_register(0x2FD,0x00); sensor_write_register(0x2FE,0x00); sensor_write_register(0x300,0x01); sensor_write_register(0x301,0x50); sensor_write_register(0x302,0x1C); sensor_write_register(0x303,0x01); sensor_write_register(0x304,0x20); sensor_write_register(0x305,0x01); sensor_write_register(0x306,0x93); sensor_write_register(0x307,0xD0); sensor_write_register(0x308,0x09); sensor_write_register(0x309,0xE3); sensor_write_register(0x30A,0xB1); sensor_write_register(0x30B,0x1F); sensor_write_register(0x30C,0xC5); sensor_write_register(0x30D,0x31); sensor_write_register(0x30E,0x21); sensor_write_register(0x30F,0x2B); sensor_write_register(0x310,0x02); sensor_write_register(0x311,0x59); sensor_write_register(0x312,0x15); sensor_write_register(0x313,0x59); sensor_write_register(0x314,0x15); sensor_write_register(0x315,0x71); sensor_write_register(0x316,0x1D); sensor_write_register(0x317,0x59); sensor_write_register(0x318,0x15); sensor_write_register(0x319,0x00); sensor_write_register(0x31A,0x00); sensor_write_register(0x31B,0x00); sensor_write_register(0x31C,0x00); sensor_write_register(0x31D,0x00); sensor_write_register(0x31E,0x00); sensor_write_register(0x31F,0x9C); sensor_write_register(0x320,0xF0); sensor_write_register(0x321,0x09); sensor_write_register(0x322,0x01); sensor_write_register(0x323,0xB0); sensor_write_register(0x324,0x22); sensor_write_register(0x325,0xC5); sensor_write_register(0x326,0x31); sensor_write_register(0x327,0x21); sensor_write_register(0x328,0x01); sensor_write_register(0x329,0x30); sensor_write_register(0x32A,0x21); sensor_write_register(0x32B,0xC5); sensor_write_register(0x32C,0x31); sensor_write_register(0x32D,0x21); sensor_write_register(0x32E,0x2C); sensor_write_register(0x32F,0x62); sensor_write_register(0x330,0x1C); sensor_write_register(0x331,0x01); sensor_write_register(0x332,0xF0); sensor_write_register(0x333,0x00); sensor_write_register(0x334,0x00); sensor_write_register(0x335,0x40); sensor_write_register(0x336,0x01); sensor_write_register(0x337,0xC5); sensor_write_register(0x338,0x11); sensor_write_register(0x339,0x00); sensor_write_register(0x33A,0xC5); sensor_write_register(0x33B,0x11); sensor_write_register(0x33C,0x00); sensor_write_register(0x33D,0x01); sensor_write_register(0x33E,0x90); sensor_write_register(0x33F,0x03); sensor_write_register(0x340,0x02); sensor_write_register(0x341,0x10); sensor_write_register(0x342,0x00); sensor_write_register(0x343,0x91); sensor_write_register(0x344,0x20); sensor_write_register(0x345,0x09); sensor_write_register(0x346,0x2F); sensor_write_register(0x347,0x10); sensor_write_register(0x348,0x00); sensor_write_register(0x349,0x01); sensor_write_register(0x34A,0x00); sensor_write_register(0x34B,0x35); sensor_write_register(0x34C,0x00); sensor_write_register(0x34D,0x3F); sensor_write_register(0x34E,0x00); sensor_write_register(0x34F,0x3F); sensor_write_register(0x350,0x00); sensor_write_register(0x351,0xAD); sensor_write_register(0x352,0x00); sensor_write_register(0x353,0xAD); sensor_write_register(0x354,0x00); sensor_write_register(0x355,0x01); sensor_write_register(0x356,0x00); sensor_write_register(0x357,0x46); sensor_write_register(0x358,0x00); sensor_write_register(0x359,0x12); sensor_write_register(0x35A,0x00); sensor_write_register(0x35B,0xC5); sensor_write_register(0x35C,0x01); sensor_write_register(0x35D,0x11); sensor_write_register(0x35E,0x00); sensor_write_register(0x35F,0x97); sensor_write_register(0x360,0x00); sensor_write_register(0x361,0x02); sensor_write_register(0x362,0x00); sensor_write_register(0x363,0xC4); sensor_write_register(0x364,0x01); sensor_write_register(0x365,0x02); sensor_write_register(0x366,0x00); sensor_write_register(0x367,0x01); sensor_write_register(0x368,0x00); sensor_write_register(0x369,0x44); sensor_write_register(0x36A,0x00); sensor_write_register(0x36B,0x3A); sensor_write_register(0x36C,0x00); sensor_write_register(0x36D,0xA0); sensor_write_register(0x36E,0x00); sensor_write_register(0x36F,0x9D); sensor_write_register(0x370,0x00); sensor_write_register(0x371,0x01); sensor_write_register(0x372,0x00); sensor_write_register(0x373,0x3A); sensor_write_register(0x374,0x00); sensor_write_register(0x375,0x03); sensor_write_register(0x376,0x00); sensor_write_register(0x377,0x01); sensor_write_register(0x378,0x00); sensor_write_register(0x379,0x3C); sensor_write_register(0x37A,0x00); sensor_write_register(0x37B,0x3A); sensor_write_register(0x37C,0x00); sensor_write_register(0x37D,0x9F); sensor_write_register(0x37E,0x00); sensor_write_register(0x37F,0x9D); sensor_write_register(0x380,0x00); sensor_write_register(0x381,0x01); sensor_write_register(0x382,0x00); sensor_write_register(0x383,0x9D); sensor_write_register(0x384,0x00); sensor_write_register(0x385,0x0B); sensor_write_register(0x386,0x00); sensor_write_register(0x387,0x16); sensor_write_register(0x388,0x00); sensor_write_register(0x389,0x21); sensor_write_register(0x38A,0x00); sensor_write_register(0x38B,0x00); sensor_write_register(0x38C,0x00); sensor_write_register(0x38D,0x00); sensor_write_register(0x38E,0x00); sensor_write_register(0x38F,0x00); sensor_write_register(0x390,0x00); sensor_write_register(0x391,0x00); sensor_write_register(0x392,0x00); sensor_write_register(0x393,0x00); sensor_write_register(0x394,0x00); sensor_write_register(0x395,0x00); sensor_write_register(0x396,0x00); sensor_write_register(0x397,0x00); sensor_write_register(0x398,0x9E); sensor_write_register(0x399,0x00); sensor_write_register(0x39A,0xA7); sensor_write_register(0x39B,0x00); sensor_write_register(0x39C,0x07); sensor_write_register(0x39D,0x00); sensor_write_register(0x39E,0x11); sensor_write_register(0x39F,0x00); sensor_write_register(0x3A0,0x00); sensor_write_register(0x3A1,0x00); sensor_write_register(0x3A2,0x00); sensor_write_register(0x3A3,0x00); sensor_write_register(0x3A4,0x00); sensor_write_register(0x3A5,0x00); sensor_write_register(0x3A6,0x00); sensor_write_register(0x3A7,0x00); sensor_write_register(0x3A8,0x00); sensor_write_register(0x3A9,0x00); sensor_write_register(0x3AA,0x00); sensor_write_register(0x3AB,0x00); sensor_write_register(0x3AC,0x1B); sensor_write_register(0x3AD,0x00); sensor_write_register(0x3AE,0x08); sensor_write_register(0x3AF,0x00); sensor_write_register(0x3B0,0x1B); sensor_write_register(0x3B1,0x00); sensor_write_register(0x3B2,0x08); sensor_write_register(0x3B3,0x00); sensor_write_register(0x3B4,0x11); sensor_write_register(0x3B5,0x00); sensor_write_register(0x3B6,0xA7); sensor_write_register(0x3B7,0x00); sensor_write_register(0x3B8,0xA7); sensor_write_register(0x3B9,0x00); sensor_write_register(0x3BA,0x11); sensor_write_register(0x3BB,0x00); sensor_write_register(0x3BC,0x11); sensor_write_register(0x3BD,0x00); sensor_write_register(0x3BE,0xA7); sensor_write_register(0x3BF,0x00); sensor_write_register(0x3C0,0xA9); sensor_write_register(0x3C1,0x00); sensor_write_register(0x3C2,0xAB); sensor_write_register(0x3C3,0x00); sensor_write_register(0x3C4,0x16); sensor_write_register(0x3C5,0x00); sensor_write_register(0x3C6,0x1B); sensor_write_register(0x3C7,0x00); sensor_write_register(0x3C8,0x9E); sensor_write_register(0x3C9,0xB0); sensor_write_register(0x3CA,0x0A); sensor_write_register(0x3CB,0x07); sensor_write_register(0x3CC,0xB0); sensor_write_register(0x3CD,0x01); sensor_write_register(0x3CE,0x46); sensor_write_register(0x3CF,0x00); sensor_write_register(0x3D0,0x92); sensor_write_register(0x3D1,0x80); sensor_write_register(0x3D2,0x0B); sensor_write_register(0x3D3,0x81); sensor_write_register(0x3D4,0x01); sensor_write_register(0x3D5,0x17); sensor_write_register(0x3D6,0x02); sensor_write_register(0x3D7,0x1B); sensor_write_register(0x3D8,0x02); sensor_write_register(0x3D9,0x00); sensor_write_register(0x3DA,0x00); sensor_write_register(0x3DB,0x00); sensor_write_register(0x3DC,0x00); sensor_write_register(0x3DD,0x53); sensor_write_register(0x3DE,0x00); sensor_write_register(0x3DF,0x91); sensor_write_register(0x3E0,0x00); sensor_write_register(0x3E1,0xBC); sensor_write_register(0x3E2,0x00); sensor_write_register(0x3E3,0x80); sensor_write_register(0x3E4,0x01); sensor_write_register(0x3E5,0x00); sensor_write_register(0x3E6,0x00); sensor_write_register(0x3E7,0x00); sensor_write_register(0x3E8,0x00); sensor_write_register(0x3E9,0x00); sensor_write_register(0x3EA,0x00); sensor_write_register(0x3EB,0x00); sensor_write_register(0x3EC,0x00); // standby cancel //sensor_write_register(0x200, 0x54); sensor_write_register(0x200, 0x44); // waiting for internal regular stabilization usleep(200000); // master mode start sensor_write_register(0x22D, 0x08); // XVS,XHS output start sensor_write_register(0x229, 0xC0); // waiting for image stabilization usleep(200000); printf("-------Sony IMX036 Sensor Initial OK!-------\n"); }
void sensor_init() { sensor_write_register(0x200, 0x01); //Standby usleep(200000); // chip_id = 0x2 sensor_write_register(0x205, 0x01); //12bit sensor_write_register(0x206, 0x00); //Drive mode:All-pix scan mode(720p mode) sensor_write_register(0x207, 0x10); //Window mode:720p mode sensor_write_register(0x209, 0x02); //30fps mode sensor_write_register(0x20A, 0xF0); //black level /*linear & WDR mode is different*/ sensor_write_register(0x20C, 0x00); sensor_write_register(0x20F, 0x01); sensor_write_register(0x210, 0x39); sensor_write_register(0x212, 0x50); sensor_write_register(0x217, 0x01); sensor_write_register(0x218, 0xF0); sensor_write_register(0x219, 0x02); sensor_write_register(0x21A, 0x00); sensor_write_register(0x21B, 0xC0);//different from imx104 sensor_write_register(0x21C, 0x19); sensor_write_register(0x21D, 0xFF); sensor_write_register(0x21E, 0x01); sensor_write_register(0x236, 0x14); //VB size sensor_write_register(0x238, 0x00); //cropping postion(Vertical position) sensor_write_register(0x239, 0x00); sensor_write_register(0x23A, 0x19); //cropping size(Vertical direction) sensor_write_register(0x23B, 0x04); sensor_write_register(0x23C, 0x00); //cropping postion(horizontal position) sensor_write_register(0x23D, 0x00); sensor_write_register(0x23E, 0x1C); //cropping size(horizontal direction) sensor_write_register(0x23F, 0x05); sensor_write_register(0x244, 0x01); //Parallel CMOS SDR output sensor_write_register(0x254, 0x63); sensor_write_register(0x25B, 0x00); //CLK 37.125MHz sensor_write_register(0x25D, 0x00); //CLK 37.125MHz sensor_write_register(0x25F, 0x10); //invalid sensor_write_register(0x2BF, 0x1F); /*linear & WDR mode is different*/ sensor_write_register(0x265, 0x20); sensor_write_register(0x286, 0x01); sensor_write_register(0x2CF, 0xD1); sensor_write_register(0x2D0, 0x1B); sensor_write_register(0x2D2, 0x5F); sensor_write_register(0x2D3, 0x00); // chip_id = 0x3 sensor_write_register(0x312, 0x00); sensor_write_register(0x31D, 0x07); sensor_write_register(0x323, 0x07); sensor_write_register(0x326, 0xDF); sensor_write_register(0x347, 0x87); // chip_id = 0x4 sensor_write_register(0x403, 0xCD); sensor_write_register(0x407, 0x4B); sensor_write_register(0x409, 0xE9); sensor_write_register(0x413, 0x1B); sensor_write_register(0x415, 0xED); sensor_write_register(0x416, 0x01); sensor_write_register(0x418, 0x09); sensor_write_register(0x41A, 0x19); sensor_write_register(0x41B, 0xA1); sensor_write_register(0x41C, 0x11); sensor_write_register(0x427, 0x00); sensor_write_register(0x428, 0x05); sensor_write_register(0x429, 0xEC); sensor_write_register(0x42A, 0x40); sensor_write_register(0x42B, 0x11); sensor_write_register(0x42D, 0x22); sensor_write_register(0x42E, 0x00); sensor_write_register(0x42F, 0x05); sensor_write_register(0x431, 0xEC); sensor_write_register(0x432, 0x40); sensor_write_register(0x433, 0x11); sensor_write_register(0x435, 0x23); sensor_write_register(0x436, 0xB0); sensor_write_register(0x437, 0x04); sensor_write_register(0x439, 0x24); sensor_write_register(0x43A, 0x30); sensor_write_register(0x43B, 0x04); sensor_write_register(0x43C, 0xED); sensor_write_register(0x43D, 0xC0); sensor_write_register(0x43E, 0x10); sensor_write_register(0x440, 0x44); sensor_write_register(0x441, 0xA0); sensor_write_register(0x442, 0x04); sensor_write_register(0x443, 0x0D); sensor_write_register(0x444, 0x31); sensor_write_register(0x445, 0x11); sensor_write_register(0x447, 0xEC); sensor_write_register(0x448, 0xD0); sensor_write_register(0x449, 0x1D); sensor_write_register(0x455, 0x03); sensor_write_register(0x456, 0x54); sensor_write_register(0x457, 0x60); sensor_write_register(0x458, 0x1F); sensor_write_register(0x45A, 0xA9); sensor_write_register(0x45B, 0x50); sensor_write_register(0x45C, 0x0A); sensor_write_register(0x45D, 0x25); sensor_write_register(0x45E, 0x11); sensor_write_register(0x45F, 0x12); sensor_write_register(0x461, 0x9B); sensor_write_register(0x466, 0xD0); sensor_write_register(0x467, 0x08); sensor_write_register(0x46A, 0x20); sensor_write_register(0x46B, 0x0A); sensor_write_register(0x46E, 0x20); sensor_write_register(0x46F, 0x0A); sensor_write_register(0x472, 0x20); sensor_write_register(0x473, 0x0A); sensor_write_register(0x475, 0xEC); sensor_write_register(0x47D, 0xA5); sensor_write_register(0x47E, 0x20); sensor_write_register(0x47F, 0x0A); sensor_write_register(0x481, 0xEF); sensor_write_register(0x482, 0xC0); sensor_write_register(0x483, 0x0E); sensor_write_register(0x485, 0xF6); sensor_write_register(0x48A, 0x60); sensor_write_register(0x48B, 0x1F); sensor_write_register(0x48D, 0xBB); sensor_write_register(0x48E, 0x90); sensor_write_register(0x48F, 0x0D); sensor_write_register(0x490, 0x39); sensor_write_register(0x491, 0xC1); sensor_write_register(0x492, 0x1D); sensor_write_register(0x494, 0xC9); sensor_write_register(0x495, 0x70); sensor_write_register(0x496, 0x0E); sensor_write_register(0x497, 0x47); sensor_write_register(0x498, 0xA1); sensor_write_register(0x499, 0x1E); sensor_write_register(0x49B, 0xC5); sensor_write_register(0x49C, 0xB0); sensor_write_register(0x49D, 0x0E); sensor_write_register(0x49E, 0x43); sensor_write_register(0x49F, 0xE1); sensor_write_register(0x4A0, 0x1E); sensor_write_register(0x4A2, 0xBB); sensor_write_register(0x4A3, 0x10); sensor_write_register(0x4A4, 0x0C); sensor_write_register(0x4A6, 0xB3); sensor_write_register(0x4A7, 0x30); sensor_write_register(0x4A8, 0x0A); sensor_write_register(0x4A9, 0x29); sensor_write_register(0x4AA, 0x91); sensor_write_register(0x4AB, 0x11); sensor_write_register(0x4AD, 0xB4); sensor_write_register(0x4AE, 0x40); sensor_write_register(0x4AF, 0x0A); sensor_write_register(0x4B0, 0x2A); sensor_write_register(0x4B1, 0xA1); sensor_write_register(0x4B2, 0x11); sensor_write_register(0x4B4, 0xAB); sensor_write_register(0x4B5, 0xB0); sensor_write_register(0x4B6, 0x0B); sensor_write_register(0x4B7, 0x21); sensor_write_register(0x4B8, 0x11); sensor_write_register(0x4B9, 0x13); sensor_write_register(0x4BB, 0xAC); sensor_write_register(0x4BC, 0xC0); sensor_write_register(0x4BD, 0x0B); sensor_write_register(0x4BE, 0x22); sensor_write_register(0x4BF, 0x21); sensor_write_register(0x4C0, 0x13); sensor_write_register(0x4C2, 0xAD); sensor_write_register(0x4C3, 0x10); sensor_write_register(0x4C4, 0x0B); sensor_write_register(0x4C5, 0x23); sensor_write_register(0x4C6, 0x71); sensor_write_register(0x4C7, 0x12); sensor_write_register(0x4C9, 0xB5); sensor_write_register(0x4CA, 0x90); sensor_write_register(0x4CB, 0x0B); sensor_write_register(0x4CC, 0x2B); sensor_write_register(0x4CD, 0xF1); sensor_write_register(0x4CE, 0x12); sensor_write_register(0x4D0, 0xBB); sensor_write_register(0x4D1, 0x10); sensor_write_register(0x4D2, 0x0C); sensor_write_register(0x4D4, 0xE7); sensor_write_register(0x4D5, 0x90); sensor_write_register(0x4D6, 0x0E); sensor_write_register(0x4D8, 0x45); sensor_write_register(0x4D9, 0x11); sensor_write_register(0x4DA, 0x1F); sensor_write_register(0x4EB, 0xA4); sensor_write_register(0x4EC, 0x60); sensor_write_register(0x4ED, 0x1F); /*linear & WDR mode is different*/ sensor_write_register(0x461, 0x9B); sensor_write_register(0x466, 0xD0); sensor_write_register(0x467, 0x08); usleep(200000); sensor_write_register(0x200, 0x00); //release standy usleep(200000); sensor_write_register(0x202, 0x00); //Master mose start usleep(200000); sensor_write_register(0x249, 0x0A); //XVS & XHS output usleep(200000); printf("-------Sony IMX138 Sensor Initial OK!-------\n"); }
void sensor_init() { #ifdef HI_FPGA int framerate = 23; #else int framerate = 30; #endif // PCA_9543 Init general_i2c_write(pca9543_i2c_addr, 0x1, 0x1); usleep(1000); sensor_write_register(0x0D,1);//RESET_REG usleep(1000); sensor_write_register(0x0D,0);//RESET_REG usleep(600000); //demo setup sensor_write_register(0x08, 0x0000); //(7) SHUTTER_WIDTH_HI sensor_write_register(0x09, 0x00E6); //(8) INTEG_TIME_REG sensor_write_register(0x0C, 0x0613); //(7) SHUTTER_DELAY_REG sensor_write_register(0x2B, 0x0008); //(3) GREEN1_GAIN_REG sensor_write_register(0x2C, 0x0008); //(3) BLUE_GAIN_REG sensor_write_register(0x2D, 0x0008); //(3) RED_GAIN_REG sensor_write_register(0x2E, 0x0008); //(3) GREEN2_GAIN_REG // set 72 meg sensor_write_register(0x05,0x0600);// HORZ_BLANK_REG (HB)=1536 sensor_write_register(0x10,0x0051);// PLL_CONTROL; POWER UP PLL switch ( framerate ) { case 4 : // 14MHz PixClk 1080p@5fps == 4.6Hz sensor_write_register(0x11, 0x1801); // PLL_CONFIG_1: m=24, n=1 sensor_write_register(0x12, 0x0013); // PLL_CONFIG_2: p1=16, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*24/2/20=14 break; case 5 : // 16MHz PixClk 1080p@6fps == 5.2Hz sensor_write_register(0x11, 0x1801); // PLL_CONFIG_1: m=24, n=1 sensor_write_register(0x12, 0x0011); // PLL_CONFIG_2: p1=16, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*24/2/18=16 break; case 12 : // 36MHz PixClk 1080p@12fps sensor_write_register(0x11, 0x1801); // PLL_CONFIG_1: m=24, n=1 sensor_write_register(0x12, 0x0007); // PLL_CONFIG_2: p1=7, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*24/2/8=36 break; case 15 : // 48MHz PixClk 1080p@15fps sensor_write_register(0x11, 0x1801); // PLL_CONFIG_1: m=24, n=1 sensor_write_register(0x12, 0x0005); // PLL_CONFIG_2: p1=3, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*24/2/6=48 break; case 23 : // 72MHz PixClk 1080p@23fps sensor_write_register(0x11, 0x1801); // PLL_CONFIG_1: m=24, n=1 sensor_write_register(0x12, 0x0003); // PLL_CONFIG_2: p1=3, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*24/2/4=72 break; case 30 : // 96MHz PixClk 1080p@31fps sensor_write_register(0x11, 0x1001); // PLL_CONFIG_1: m=16, n=1 sensor_write_register(0x12, 0x0001); // PLL_CONFIG_2: p1=1, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*16/2/2=96 break; default: // 72MHz PixClk 1080p@23fps sensor_write_register(0x11, 0x1801); // PLL_CONFIG_1: m=24, n=1 sensor_write_register(0x12, 0x0003); // PLL_CONFIG_2: p1=3, p2=0 -> our=24Mhz*m/(n+1)/(p1+1) = 24*24/2/4=72 } usleep(1000); // Wait 1ms for VCO to lock sensor_write_register(0x10, 0x0053); // PLL_CONTROL; USE PLL usleep(200*1000); sensor_write_register(0x05, 0x01C2); //(1) HORZ_BLANK_REG sensor_write_register(0x07, 0x1F8E - 4); //Enable Parallel Fifo Data usleep(200*1000); // set geometry #if 0 sensor_write_register(0x01, 0x0020); // ROW_WINDOW_START_REG sensor_write_register(0x02, 0x0018); // COL_WINDOW_START_REG #else // remove dark rows sensor_write_register(0x01, 0x0036); // ROW_WINDOW_START_REG sensor_write_register(0x02, 0x0010); // COL_WINDOW_START_REG #endif sensor_write_register(0x03, 0x05FF); // ROW_WINDOW_SIZE_REG=1536 sensor_write_register(0x04, 0x07FF); // COL_WINDOW_SIZE_REG=2048 sensor_write_register(0x22, 0x0000); // ROW_MODE, ROW_SKIP=0. ROW_BIN=0 sensor_write_register(0x23, 0x0000); // COL_MODE, COL_SKIP=0, COL_BIN=0 sensor_write_register(0x08, 0x0000); //(1) SHUTTER_WIDTH_HI sensor_write_register(0x09, 0x0296); //(1) INTEG_TIME_REG sensor_write_register(0x0C, 0x0000); //(1) SHUTTER_DELAY_REG sensor_write_register(0x1e, 0x4406); // Continuous LV mode // sensor_write_register(0x1e, 0x4806); // XOR LV mode // sensor_write_register(0x1e, 0x4006); // Default LV mode sensor_write_register(0x06, 0x09); // Vertical blanking sensor_write_register(0x09, 0x0469); //(1) INTEG_TIME_REG printf("Aptina MT9P031 sensor 3M fr(%d) init success!\n", framerate); }
void sensor_init() { //[720p30] #if 0 sensor_write_register(0x301A, 0x0001); // RESET_REGISTER sensor_write_register(0x301A, 0x10D8); // RESET_REGISTER delay_ms(200); //DELAY= 200 sensor_write_register(0x3088, 0x8000); // SEQ_CTRL_PORT sensor_write_register(0x3086, 0x0225); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x5050); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2D26); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0828); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0D17); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0926); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0028); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0526); // SEQ_DATA_PORT sensor_write_register(0x3086, 0xA728); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0725); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x8080); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2917); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0525); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0040); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2702); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1616); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2706); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1736); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x26A6); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1703); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x26A4); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x171F); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2805); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2620); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2804); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2520); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2027); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0017); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1E25); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0020); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2117); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1028); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x051B); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1703); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2706); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1703); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1741); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2660); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x17AE); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2500); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x9027); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0026); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1828); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x002E); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2A28); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x081E); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0831); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1440); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x4014); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2020); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1410); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1034); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1400); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1014); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0020); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1400); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x4013); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1802); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1470); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x7004); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1470); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x7003); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1470); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x7017); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2002); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1400); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2002); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1400); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x5004); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1400); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2004); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x1400); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x5022); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0314); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0020); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0314); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x0050); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2C2C); // SEQ_DATA_PORT sensor_write_register(0x3086, 0x2C2C); // SEQ_DATA_PORT sensor_write_register(0x309E, 0x0000); // ERS_PROG_START_ADDR delay_ms(200); //DELAY= 200 sensor_write_register(0x30E4, 0x6372); // ADC_BITS_6_7 sensor_write_register(0x30E2, 0x7253); // ADC_BITS_4_5 sensor_write_register(0x30E0, 0x5470); // ADC_BITS_2_3 sensor_write_register(0x30E6, 0xC4CC); // ADC_CONFIG1 sensor_write_register(0x30E8, 0x8050); // ADC_CONFIG2 sensor_write_register(0x3082, 0x0029); // OPERATION_MODE_CTRL sensor_write_register(0x30B0, 0x1300); // DIGITAL_TEST sensor_write_register(0x30D4, 0xE007); // COLUMN_CORRECTION sensor_write_register(0x301A, 0x10DC); // RESET_REGISTER sensor_write_register(0x301A, 0x10D8); // RESET_REGISTER sensor_write_register(0x3044, 0x0400); // DARK_CONTROL sensor_write_register(0x3EDA, 0x0F03); // DAC_LD_14_15 sensor_write_register(0x3ED8, 0x01EF); // DAC_LD_12_13 sensor_write_register(0x3012, 0x02A0); // COARSE_INTEGRATION_TIME sensor_write_register(0x3032, 0x0000); // DIGITAL_BINNING sensor_write_register(0x3002, 0x003e); // Y_ADDR_START sensor_write_register(0x3004, 0x0004); // X_ADDR_START sensor_write_register(0x3006, 0x030d); // Y_ADDR_END sensor_write_register(0x3008, 0x0503); // X_ADDR_END sensor_write_register(0x300A, 0x02EE); // FRAME_LENGTH_LINES sensor_write_register(0x300C, 0x0CE4); // LINE_LENGTH_PCK sensor_write_register(0x301A, 0x10D8); // RESET_REGISTER sensor_write_register(0x31D0, 0x0001); // HDR_COMP //Load = PLL Enabled 27Mhz to 74.25Mhz sensor_write_register(0x302C, 0x0002); // VT_SYS_CLK_DIV sensor_write_register(0x302A, 0x0004); // VT_PIX_CLK_DIV sensor_write_register(0x302E, 0x0002); // PRE_PLL_CLK_DIV sensor_write_register(0x3030, 0x002C); // PLL_MULTIPLIER sensor_write_register(0x30B0, 0x0000); // DIGITAL_TEST delay_ms(100); //DELAY= 100 #endif sensor_write_register( 0x301A, 0x0001 ); // RESET_REGISTER delay_ms(200); //ms sensor_write_register( 0x301A, 0x10D8 ); // RESET_REGISTER delay_ms(200); //ms //Linear Mode Setup //AR0130 Rev1 Linear sequencer load 8-2-2011 sensor_write_register( 0x3088, 0x8000 );// SEQ_CTRL_PORT sensor_write_register( 0x3086, 0x0225 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x5050 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2D26 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0828 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0D17 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0926 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0028 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0526 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0xA728 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0725 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x8080 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2917 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0525 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0040 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2702 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1616 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2706 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1736 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x26A6 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1703 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x26A4 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x171F );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2805 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2620 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2804 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2520 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2027 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0017 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1E25 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0020 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2117 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1028 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x051B );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1703 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2706 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1703 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1747 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2660 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x17AE );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2500 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x9027 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0026 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1828 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x002E );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2A28 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x081E );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0831 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1440 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x4014 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2020 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1410 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1034 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1014 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0020 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x4013 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1802 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1470 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x7004 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1470 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x7003 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1470 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x7017 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2002 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2002 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x5004 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2004 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x1400 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x5022 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0314 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0020 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0314 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x0050 );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2C2C );// SEQ_DATA_PORT sensor_write_register( 0x3086, 0x2C2C );// SEQ_DATA_PORT sensor_write_register( 0x309E, 0x0000 );// DCDS_PROG_START_ADDR sensor_write_register( 0x30E4, 0x6372 );// ADC_BITS_6_7 sensor_write_register( 0x30E2, 0x7253 );// ADC_BITS_4_5 sensor_write_register( 0x30E0, 0x5470 );// ADC_BITS_2_3 sensor_write_register( 0x30E6, 0xC4CC );// ADC_CONFIG1 sensor_write_register( 0x30E8, 0x8050 );// ADC_CONFIG2 delay_ms(200); //ms sensor_write_register( 0x3082, 0x0029 ); // OPERATION_MODE_CTRL //AR0130 Rev1 Optimized settings sensor_write_register( 0x301E, 0x00C8); // DATA_PEDESTAL sensor_write_register( 0x3EDA, 0x0F03); // DAC_LD_14_15 sensor_write_register( 0x3EDE, 0xC005); // DAC_LD_18_19 sensor_write_register( 0x3ED8, 0x09EF); // DAC_LD_12_13 sensor_write_register( 0x3EE2, 0xA46B); // DAC_LD_22_23 sensor_write_register( 0x3EE0, 0x047D); // DAC_LD_20_21 sensor_write_register( 0x3EDC, 0x0070); // DAC_LD_16_17 sensor_write_register( 0x3044, 0x0404); // DARK_CONTROL sensor_write_register( 0x3EE6, 0x8303); // DAC_LD_26_27 sensor_write_register( 0x3EE4, 0xD208); // DAC_LD_24_25 sensor_write_register( 0x3ED6, 0x00BD); // DAC_LD_10_11 sensor_write_register( 0x30B0, 0x1300); // DIGITAL_TEST sensor_write_register( 0x30D4, 0xE007); // COLUMN_CORRECTION sensor_write_register( 0x301A, 0x10DC); // RESET_REGISTER delay_ms(500 );//ms sensor_write_register( 0x301A, 0x10D8); // RESET_REGISTER delay_ms(500); //ms sensor_write_register( 0x3044, 0x0400); // DARK_CONTROL sensor_write_register( 0x3012, 0x02A0); // COARSE_INTEGRATION_TIME //720p 30fps Setup sensor_write_register( 0x3032, 0x0000); // DIGITAL_BINNING sensor_write_register( 0x3002, 0x0002); // Y_ADDR_START sensor_write_register( 0x3004, 0x0000); // X_ADDR_START sensor_write_register( 0x3006, 0x02D1);//Row End (A) = 721 sensor_write_register( 0x3008, 0x04FF);//Column End (A) = 1279 sensor_write_register( 0x300A, 0x02EA);//Frame Lines (A) = 746 sensor_write_register( 0x300C, 0x08ba); sensor_write_register( 0x3012, 0x0133);//Coarse_IT_Time (A) = 307 sensor_write_register( 0x306e, 0x9211);//Coarse_IT_Time (A) = 307 //Enable Parallel Mode sensor_write_register( 0x301A, 0x10D8); // RESET_REGISTER sensor_write_register( 0x31D0, 0x0001); // HDR_COMP //PLL Enabled 27Mhz to 50Mhz sensor_write_register( 0x302A, 0x0009 );//VT_PIX_CLK_DIV = 9 sensor_write_register( 0x302C, 0x0001 );//VT_SYS_CLK_DIV = 1 sensor_write_register( 0x302E, 0x0003 );//PRE_PLL_CLK_DIV = 3 sensor_write_register( 0x3030, 0x0032 );//PLL_MULTIPLIER = 50 sensor_write_register( 0x30B0, 0x1300 ); // DIGITAL_TEST delay_ms(100); //ms sensor_write_register( 0x301A, 0x10DC ); // RESET_REGISTER sensor_write_register( 0x301A, 0x10DC ); // RESET_REGISTER //exposure sensor_write_register( 0x3012, 0x0671 ); // COARSE_INTEGRATION_TIME sensor_write_register( 0x30B0, 0x1330 ); // DIGITAL_TEST sensor_write_register( 0x3056, 0x003B ); // GREEN1_GAIN sensor_write_register( 0x305C, 0x003B ); // GREEN2_GAIN sensor_write_register( 0x305A, 0x003B ); // RED_GAIN sensor_write_register( 0x3058, 0x003B ); // BLUE_GAIN //High Conversion gain sensor_write_register( 0x3100, 0x0004 ); // AE_CTRL_REG //LOAD= Disable Embedded Data and Stats sensor_write_register(0x3064, 0x1802); // SMIA_TEST, EMBEDDED_STATS_EN, 0x0000 sensor_write_register(0x3064, 0x1802); // SMIA_TEST, EMBEDDED_DATA, 0x0000 sensor_write_register(0x30BA, 0x0008); //20120502 sensor_write_register(0x3EE4, 0xD308); //the default value former is 0xd208 sensor_write_register(0x301A, 0x10DC); // RESET_REGISTER delay_ms(200); //DELAY= 200 printf("Aptina AR0130 sensor 720P30fps init success!\n"); }
void sensor_init() { // sequence according to "Flow Power-on to Operation Start(Sensor Master Mode) // chip_id = 0x2 sensor_write_register(0x200, 0x55); sensor_write_register(0x201, 0x70); sensor_write_register(0x203, 0x08); sensor_write_register(0x204, 0x0D); sensor_write_register(0x207, 0x98); sensor_write_register(0x209, 0x65); sensor_write_register(0x20A, 0x04); sensor_write_register(0x21F, 0xF0); sensor_write_register(0x225, 0x47); sensor_write_register(0x25E, 0xFF); sensor_write_register(0x25F, 0x02); sensor_write_register(0x273, 0xB1); sensor_write_register(0x274, 0x01); sensor_write_register(0x276, 0x60); sensor_write_register(0x29D, 0x00); sensor_write_register(0x2D4, 0x00); sensor_write_register(0x2D6, 0x40); sensor_write_register(0x2D8, 0x66); sensor_write_register(0x2D9, 0x0E); sensor_write_register(0x2DB, 0x06); sensor_write_register(0x2DC, 0x06); sensor_write_register(0x2DD, 0x0C); sensor_write_register(0x2E0, 0x7C); // chip_id = 0x3 sensor_write_register(0x302, 0x3F); sensor_write_register(0x304, 0xF0); sensor_write_register(0x305, 0x00); sensor_write_register(0x306, 0xF0); sensor_write_register(0x307, 0xA0); sensor_write_register(0x308, 0x10); sensor_write_register(0x309, 0x10); sensor_write_register(0x30A, 0x24); sensor_write_register(0x30B, 0x42); sensor_write_register(0x30C, 0xFA); sensor_write_register(0x30D, 0x43); sensor_write_register(0x30E, 0x43); sensor_write_register(0x30F, 0x46); sensor_write_register(0x310, 0x04); sensor_write_register(0x311, 0x41); sensor_write_register(0x312, 0x35); sensor_write_register(0x313, 0x41); sensor_write_register(0x314, 0x35); sensor_write_register(0x315, 0x51); sensor_write_register(0x316, 0x49); sensor_write_register(0x317, 0x41); sensor_write_register(0x318, 0x35); sensor_write_register(0x319, 0x00); sensor_write_register(0x31B, 0x00); sensor_write_register(0x31F, 0x09); sensor_write_register(0x320, 0xC1); sensor_write_register(0x321, 0x10); sensor_write_register(0x323, 0x60); sensor_write_register(0x324, 0x44); sensor_write_register(0x325, 0xFA); sensor_write_register(0x326, 0x43); sensor_write_register(0x327, 0x43); sensor_write_register(0x329, 0x40); sensor_write_register(0x32A, 0x43); sensor_write_register(0x32B, 0xFA); sensor_write_register(0x32C, 0x43); sensor_write_register(0x32D, 0x43); sensor_write_register(0x32E, 0x4A); sensor_write_register(0x32F, 0xB4); sensor_write_register(0x330, 0x3F); sensor_write_register(0x332, 0xD0); sensor_write_register(0x335, 0x10); sensor_write_register(0x337, 0xFA); sensor_write_register(0x338, 0x13); sensor_write_register(0x33A, 0xFA); sensor_write_register(0x33B, 0x13); sensor_write_register(0x33E, 0xC0); sensor_write_register(0x33F, 0x02); sensor_write_register(0x343, 0xEE); sensor_write_register(0x344, 0xF0); sensor_write_register(0x345, 0x0E); sensor_write_register(0x346, 0x21); sensor_write_register(0x34B, 0x28); sensor_write_register(0x34D, 0x31); sensor_write_register(0x34F, 0x31); sensor_write_register(0x351, 0x16); sensor_write_register(0x352, 0x01); sensor_write_register(0x353, 0x16); sensor_write_register(0x354, 0x01); sensor_write_register(0x357, 0x36); sensor_write_register(0x359, 0x0F); sensor_write_register(0x35B, 0xFA); sensor_write_register(0x35C, 0x03); sensor_write_register(0x35D, 0x0E); sensor_write_register(0x35F, 0xF1); sensor_write_register(0x363, 0xF9); sensor_write_register(0x364, 0x03); sensor_write_register(0x369, 0x34); sensor_write_register(0x36B, 0x2D); sensor_write_register(0x36D, 0xFB); sensor_write_register(0x36F, 0xF6); sensor_write_register(0x373, 0x2D); sensor_write_register(0x379, 0x2F); sensor_write_register(0x37B, 0x2D); sensor_write_register(0x37D, 0xF8); sensor_write_register(0x37F, 0xF6); sensor_write_register(0x383, 0xF6); sensor_write_register(0x398, 0xF7); sensor_write_register(0x39A, 0x0B); sensor_write_register(0x39B, 0x01); sensor_write_register(0x39C, 0x06); sensor_write_register(0x39E, 0x0E); sensor_write_register(0x3AC, 0x16); sensor_write_register(0x3AE, 0x07); sensor_write_register(0x3B0, 0x16); sensor_write_register(0x3B2, 0x07); sensor_write_register(0x3B4, 0x0E); sensor_write_register(0x3B6, 0x0B); sensor_write_register(0x3B7, 0x01); sensor_write_register(0x3B8, 0x0B); sensor_write_register(0x3B9, 0x01); sensor_write_register(0x3BA, 0x0E); sensor_write_register(0x3BC, 0x0E); sensor_write_register(0x3BE, 0x0B); sensor_write_register(0x3BF, 0x01); sensor_write_register(0x3C0, 0x0F); sensor_write_register(0x3C1, 0x01); sensor_write_register(0x3C2, 0x13); sensor_write_register(0x3C3, 0x01); sensor_write_register(0x3C4, 0x12); sensor_write_register(0x3C6, 0x16); sensor_write_register(0x3C8, 0xF7); sensor_write_register(0x3C9, 0x30); sensor_write_register(0x3CA, 0x11); sensor_write_register(0x3CB, 0x06); sensor_write_register(0x3CC, 0x60); sensor_write_register(0x3CE, 0x36); sensor_write_register(0x3D0, 0xEF); sensor_write_register(0x3D1, 0x60); sensor_write_register(0x3D2, 0x13); sensor_write_register(0x3D3, 0xFB); sensor_write_register(0x3D4, 0x03); sensor_write_register(0x3D5, 0x24); sensor_write_register(0x3D6, 0x04); sensor_write_register(0x3D7, 0x28); sensor_write_register(0x3D8, 0x04); sensor_write_register(0x3DD, 0x3F); sensor_write_register(0x3DF, 0xEE); sensor_write_register(0x3E1, 0x3F); sensor_write_register(0x3E2, 0x01); sensor_write_register(0x3E3, 0xFA); sensor_write_register(0x3E4, 0x03); // standby cancel sensor_write_register(0x200, 0x54); // waiting for internal regular stabilization usleep(200000); // master mode start sensor_write_register(0x22D, 0x08); // XVS,XHS output start sensor_write_register(0x229, 0xC0); // waiting for image stabilization usleep(200000); printf("-------Sony IMX036 Sensor Initial OK!-------\n"); }
/* * This function applies the new integration time to the ISP registers. */ static __inline void cmos_inttime_update(cmos_inttime_ptr_t p_inttime) { HI_U16 exp_time,current; ISP_I2C_DATA_S stI2cData; static HI_U32 _last_exposure_time = 0xFFFFFFFF; if(_last_exposure_time == p_inttime->exposure_ashort) { return; }else { _last_exposure_time = p_inttime->exposure_ashort; } switch(gu8SensorMode) { default: case 0: //linear mode exp_time = p_inttime->full_lines - p_inttime->exposure_ashort; current = sensor_read_register(EXPOSURE_ADDR+2); #if CMOS_IMX236_ISP_WRITE_SENSOR_ENABLE stI2cData.bDelayCfg = HI_FALSE; stI2cData.u8DevAddr = sensor_i2c_addr; stI2cData.u32AddrByteNum = sensor_addr_byte; stI2cData.u32DataByteNum = sensor_data_byte; stI2cData.u32RegAddr = 0x3020; stI2cData.u32Data = (exp_time & 0xFF); HI_MPI_ISP_I2cWrite(&stI2cData); stI2cData.u32RegAddr = 0x3020+1; stI2cData.u32Data = ((exp_time & 0xFF00) >> 8); HI_MPI_ISP_I2cWrite(&stI2cData); stI2cData.u32RegAddr = 0x3020+2; stI2cData.u32Data = ((((exp_time & 0x10000) >> 16)+(current&0xFE)) ); HI_MPI_ISP_I2cWrite(&stI2cData); #else sensor_write_register(EXPOSURE_ADDR, exp_time & 0xFF); sensor_write_register(EXPOSURE_ADDR + 1, (exp_time & 0xFF00) >> 8); current = sensor_read_register(EXPOSURE_ADDR+2); sensor_write_register(EXPOSURE_ADDR+2, (((exp_time & 0x10000) >> 16)+(current&0xFE)) ); #endif break; case 1: //WDR mode //short exposure if (p_inttime->exposure_ashort < p_inttime->min_lines_target) { p_inttime->exposure_ashort = p_inttime->min_lines_target; } if (p_inttime->exposure_ashort > p_inttime->max_lines_target) { p_inttime->exposure_ashort = p_inttime->max_lines_target; } exp_time = p_inttime->full_lines - p_inttime->exposure_ashort; current = sensor_read_register(EXPOSURE_ADDR+2); #if CMOS_IMX236_ISP_WRITE_SENSOR_ENABLE stI2cData.bDelayCfg = HI_FALSE; stI2cData.u8DevAddr = sensor_i2c_addr; stI2cData.u32AddrByteNum = sensor_addr_byte; stI2cData.u32DataByteNum = sensor_data_byte; stI2cData.u32RegAddr = 0x3020; stI2cData.u32Data = exp_time & 0xFF; HI_MPI_ISP_I2cWrite(&stI2cData); stI2cData.u32RegAddr = 0x3020+1; stI2cData.u32Data = ((exp_time & 0xFF00) >> 8); HI_MPI_ISP_I2cWrite(&stI2cData); stI2cData.u32RegAddr = 0x3020+2; stI2cData.u32Data = (((exp_time & 0x10000) >> 16)+(current&0xFE)); HI_MPI_ISP_I2cWrite(&stI2cData); //long exposure exp_time = p_inttime->full_lines - (p_inttime->exposure_ashort << 4); stI2cData.u32RegAddr = 0x3023; stI2cData.u32Data = (exp_time & 0xFF); HI_MPI_ISP_I2cWrite(&stI2cData); stI2cData.u32RegAddr = 0x3023+1; stI2cData.u32Data = ( (exp_time & 0xFF00) >> 8); HI_MPI_ISP_I2cWrite(&stI2cData); current = sensor_read_register(LONG_EXPOSURE_ADDR+2); stI2cData.u32RegAddr = 0x3023+2; stI2cData.u32Data = (((exp_time & 0x10000) >> 16)+(current&0xFE)); HI_MPI_ISP_I2cWrite(&stI2cData); #else sensor_write_register(EXPOSURE_ADDR, exp_time & 0xFF); sensor_write_register(EXPOSURE_ADDR+1, (exp_time & 0xFF00) >> 8); current = sensor_read_register(EXPOSURE_ADDR+2); sensor_write_register(EXPOSURE_ADDR+2, (((exp_time & 0x10000) >> 16)+(current&0xFE)) ); //long exposure exp_time = p_inttime->full_lines - (p_inttime->exposure_ashort << 4); sensor_write_register(LONG_EXPOSURE_ADDR, exp_time & 0xFF); sensor_write_register(LONG_EXPOSURE_ADDR+1, (exp_time & 0xFF00) >> 8); //current = sensor_read_register(LONG_EXPOSURE_ADDR+2); sensor_write_register(LONG_EXPOSURE_ADDR+2, (((exp_time & 0x10000) >> 16)+(current&0xFE)) ); #endif break; } }