📄 ov2640.c
字号:
ov2640_write_reg(0x6d, 0x00); ov2640_write_reg(0x3d, 0x38); ov2640_write_reg(0xff, 0x00); ov2640_write_reg(0xe5, 0x7f); ov2640_write_reg(0xf9, 0xc0); ov2640_write_reg(0x41, 0x24); ov2640_write_reg(0x44, 0x06); ov2640_write_reg(0xe0, 0x14); ov2640_write_reg(0x76, 0xff); ov2640_write_reg(0x33, 0xa0); ov2640_write_reg(0x42, 0x20); ov2640_write_reg(0x43, 0x18); ov2640_write_reg(0x4c, 0x00); ov2640_write_reg(0x87, 0xd0); ov2640_write_reg(0x88, 0x3f); ov2640_write_reg(0xd7, 0x03); ov2640_write_reg(0xd9, 0x10); ov2640_write_reg(0xd3, 0x82); ov2640_write_reg(0xc8, 0x08); ov2640_write_reg(0xc9, 0x80); ov2640_write_reg(0x7c, 0x00); ov2640_write_reg(0x7d, 0x00); ov2640_write_reg(0x7c, 0x03); ov2640_write_reg(0x7d, 0x48); ov2640_write_reg(0x7d, 0x48); ov2640_write_reg(0x7c, 0x08); ov2640_write_reg(0x7d, 0x20); ov2640_write_reg(0x7d, 0x10); ov2640_write_reg(0x7d, 0x0e); ov2640_write_reg(0x90, 0x00); ov2640_write_reg(0x91, 0x0e); ov2640_write_reg(0x91, 0x1a); ov2640_write_reg(0x91, 0x31); ov2640_write_reg(0x91, 0x5a); ov2640_write_reg(0x91, 0x69); ov2640_write_reg(0x91, 0x75); ov2640_write_reg(0x91, 0x7e); ov2640_write_reg(0x91, 0x88); ov2640_write_reg(0x91, 0x8f); ov2640_write_reg(0x91, 0x96); ov2640_write_reg(0x91, 0xa3); ov2640_write_reg(0x91, 0xaf); ov2640_write_reg(0x91, 0xc4); ov2640_write_reg(0x91, 0xd7); ov2640_write_reg(0x91, 0xe8); ov2640_write_reg(0x91, 0x20); ov2640_write_reg(0x92, 0x00); ov2640_write_reg(0x93, 0x06); ov2640_write_reg(0x93, 0xe3); ov2640_write_reg(0x93, 0x03); ov2640_write_reg(0x93, 0x03); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x02); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x93, 0x00); ov2640_write_reg(0x96, 0x00); ov2640_write_reg(0x97, 0x08); ov2640_write_reg(0x97, 0x19); ov2640_write_reg(0x97, 0x02); ov2640_write_reg(0x97, 0x0c); ov2640_write_reg(0x97, 0x24); ov2640_write_reg(0x97, 0x30); ov2640_write_reg(0x97, 0x28); ov2640_write_reg(0x97, 0x26); ov2640_write_reg(0x97, 0x02); ov2640_write_reg(0x97, 0x98); ov2640_write_reg(0x97, 0x80); ov2640_write_reg(0x97, 0x00); ov2640_write_reg(0x97, 0x00); ov2640_write_reg(0xa4, 0x00); ov2640_write_reg(0xa8, 0x00); ov2640_write_reg(0xc5, 0x11); ov2640_write_reg(0xc6, 0x51); ov2640_write_reg(0xbf, 0x80); ov2640_write_reg(0xc7, 0x10); ov2640_write_reg(0xb6, 0x66); ov2640_write_reg(0xb8, 0xa5); ov2640_write_reg(0xb7, 0x64); ov2640_write_reg(0xb9, 0x7c); ov2640_write_reg(0xb3, 0xaf); ov2640_write_reg(0xb4, 0x97); ov2640_write_reg(0xb5, 0xff); ov2640_write_reg(0xb0, 0xc5); ov2640_write_reg(0xb1, 0x94); ov2640_write_reg(0xb2, 0x0f); ov2640_write_reg(0xc4, 0x5c); ov2640_write_reg(0xa6, 0x00); ov2640_write_reg(0xa7, 0x20); ov2640_write_reg(0xa7, 0xd8); ov2640_write_reg(0xa7, 0x1b); ov2640_write_reg(0xa7, 0x31); ov2640_write_reg(0xa7, 0x00); ov2640_write_reg(0xa7, 0x18); ov2640_write_reg(0xa7, 0x20); ov2640_write_reg(0xa7, 0xd8); ov2640_write_reg(0xa7, 0x19); ov2640_write_reg(0xa7, 0x31); ov2640_write_reg(0xa7, 0x00); ov2640_write_reg(0xa7, 0x18); ov2640_write_reg(0xa7, 0x20); ov2640_write_reg(0xa7, 0xd8); ov2640_write_reg(0xa7, 0x19); ov2640_write_reg(0xa7, 0x31); ov2640_write_reg(0xa7, 0x00); ov2640_write_reg(0xa7, 0x18); ov2640_write_reg(0xc0, 0x64); ov2640_write_reg(0xc1, 0x4b); ov2640_write_reg(0x86, 0x1d); ov2640_write_reg(0x50, 0x00); ov2640_write_reg(0x51, 0xc8); ov2640_write_reg(0x52, 0x96); ov2640_write_reg(0x53, 0x00); ov2640_write_reg(0x54, 0x00); ov2640_write_reg(0x55, 0x00); ov2640_write_reg(0x57, 0x00); ov2640_write_reg(0x5a, 0xc8); ov2640_write_reg(0x5b, 0x96); ov2640_write_reg(0x5c, 0x00); ov2640_write_reg(0xc3, 0xef); ov2640_write_reg(0x7f, 0x00); ov2640_write_reg(0xda, 0x01); ov2640_write_reg(0xe5, 0x1f); ov2640_write_reg(0xe1, 0x67); ov2640_write_reg(0xe0, 0x00); ov2640_write_reg(0xdd, 0x7f); ov2640_write_reg(0x05, 0x00); return 0;}/*! * ov2640 sensor interface Initialization * @param param sensor_interface * * @param width u32 * @param height u32 * @return None */static void ov2640_interface(sensor_interface * param, u32 width, u32 height){ param->Vsync_pol = 0x0; param->clk_mode = 0x0; //gated param->pixclk_pol = 0x0; param->data_width = 0x1; param->data_pol = 0x0; param->ext_vsync = 0x0; param->Vsync_pol = 0x0; param->Hsync_pol = 0x0; param->width = width - 1; param->height = height - 1; param->pixel_fmt = IPU_PIX_FMT_UYVY; param->mclk = 27000000;}/*! * ov2640 sensor set color configuration * * @param bright int * @param saturation int * @param red int * @param green int * @param blue int * @return None */static void ov2640_set_color(int bright, int saturation, int red, int green, int blue){}/*! * ov2640 sensor get color configuration * * @param bright int * * @param saturation int * * @param red int * * @param green int * * @param blue int * * @return None */static void ov2640_get_color(int *bright, int *saturation, int *red, int *green, int *blue){}/*! * ov2640 sensor set AE measurement window mode configuration * * @param ae_mode int * @return None */static void ov2640_set_ae_mode(int ae_mode){}/*! * ov2640 sensor get AE measurement window mode configuration * * @param ae_mode int * * @return None */static void ov2640_get_ae_mode(int *ae_mode){}/*! * ov2640 sensor enable/disable AE * * @param active int * @return None */static void ov2640_set_ae(int active){}/*! * ov2640 sensor enable/disable auto white balance * * @param active int * @return None */static void ov2640_set_awb(int active){}/*! * ov2640 sensor set the flicker control * * @param control int * @return None */static void ov2640_flicker_control(int control){}/*! * ov2640 Get mode&flicker control parameters * * @return None */static void ov2640_get_control_params(int *ae, int *awb, int *flicker){}extern cam_data *g_cam;static sensor_interface *ov2640_config(int *frame_rate, int high_quality){ u32 out_width, out_height; if (high_quality) { out_width = 1600; out_height = 1120; g_cam->crop_bounds.left = 0; g_cam->crop_bounds.width = 1600; g_cam->crop_bounds.top = 0; g_cam->crop_bounds.height = 1120; g_cam->crop_current = g_cam->crop_defrect = g_cam->crop_bounds; g_cam->streamparm.parm.capture.capturemode = 1; } else { out_width = 800; out_height = 600; g_cam->crop_bounds.left = 0; g_cam->crop_bounds.width = 800; g_cam->crop_bounds.top = 0; g_cam->crop_bounds.height = 600; g_cam->crop_current = g_cam->crop_defrect = g_cam->crop_bounds; g_cam->streamparm.parm.capture.capturemode = 0; } ov2640_interface(interface_param, out_width, out_height); set_mclk_rate(&interface_param->mclk); if (high_quality) { ov2640_init_1600_1120(); } else { ov2640_init_800_600(); } return interface_param;}/*! * ov2640 Reset function * * @return None */static sensor_interface *ov2640_reset(void){ return ov2640_config(&reset_frame_rate, V4L2_MODE_HIGHQUALITY);}/*! * ov2640 get_status function * * @return int */static int ov2640_get_status(void){ int retval = 0; if (!interface_param) return -ENODEV; retval = ov2640_write_reg(0xff, 1); return retval;}struct camera_sensor camera_sensor_if = { .set_color = ov2640_set_color, .get_color = ov2640_get_color, .set_ae_mode = ov2640_set_ae_mode, .get_ae_mode = ov2640_get_ae_mode, .set_ae = ov2640_set_ae, .set_awb = ov2640_set_awb, .flicker_control = ov2640_flicker_control, .get_control_params = ov2640_get_control_params, .config = ov2640_config, .reset = ov2640_reset, .get_status = ov2640_get_status,};extern void gpio_sensor_active(void);/*! * ov2640 init function * * @return Error code indicating success or failure */static __init int ov2640_init(void){ u8 err; PMIC_STATUS ret; t_regulator_voltage voltage;#ifdef CONFIG_MACH_MX27_MDK27V1 /*AVDD--2.8v */ voltage.vcam = VCAM_2_8V; if ((ret = pmic_power_regulator_set_voltage(REGU_VCAM, voltage)) < 0) { printk(KERN_ERR "%s:vmmc1 set voltage error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:vcam set voltage ok\n", __func__); } if ((ret = pmic_power_regulator_on(REGU_VCAM)) < 0) { printk(KERN_ERR "%s:vcam power on error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:vcam power on ok\n", __func__); }#else /*AVDD--2.8v */ voltage.vmmc1 = VMMC1_2_8V; if ((ret = pmic_power_regulator_set_voltage(REGU_VMMC1, voltage)) < 0) { printk(KERN_ERR "%s:vmmc1 set voltage error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:vmmc1 set voltage ok\n", __func__); } if ((ret = pmic_power_regulator_on(REGU_VMMC1)) < 0) { printk(KERN_ERR "%s:vmmc1 power on error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:vmmc1 power on ok\n", __func__); }#endif /*DVDD--1.3v */ voltage.vvib = VVIB_1_3V; if ((ret = pmic_power_regulator_set_voltage(REGU_VVIB, voltage)) < 0) { printk(KERN_ERR "%s:VVIB set voltage error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:VVIB set voltage ok\n", __func__); } if ((ret = pmic_power_regulator_on(REGU_VVIB)) < 0) { printk(KERN_ERR "%s:VVIB power regulator on error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:VVIB power on ok\n", __func__); } /*1V8_SW2A for I2C */ voltage.sw2a = SW2A_1_8V; if ((ret = pmic_power_regulator_set_voltage(SW_SW2A, voltage)) < 0) { printk(KERN_ERR "%s:SW2A set voltage error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s: SW2A power on\n", __func__); } if ((ret = pmic_power_regulator_set_voltage(SW_SW2B, voltage)) < 0) { printk(KERN_ERR "%s:SW2B set voltage error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:SW2B set voltage ok\n", __func__); } if (pmic_power_set_regen_assig(REGU_GPO3, 1) < 0) { printk(KERN_ERR "%s:set_regen_assig error\n", __func__); return -1; } else { printk(KERN_INFO "%s:set_regen_assig ok\n", __func__); } if ((ret = pmic_power_regulator_on(REGU_GPO3)) < 0) { printk(KERN_ERR "%s:REGU_GPO3 power on error:%d\n", __func__, ret); return -1; } else { printk(KERN_INFO "%s:REGU_GPO3 power on ok\n", __func__); } gpio_sensor_active(); err = i2c_add_driver(&ov2640_i2c_driver); return err;}extern void gpio_sensor_inactive(void);/*! * OV2640 cleanup function * * @return Error code indicating success or failure */static void __exit ov2640_clean(void){ i2c_del_driver(&ov2640_i2c_driver); gpio_sensor_inactive();}module_init(ov2640_init);module_exit(ov2640_clean);/* Exported symbols for modules. */EXPORT_SYMBOL(camera_sensor_if);MODULE_AUTHOR("Freescale Semiconductor, Inc.");MODULE_DESCRIPTION("OV2640 Camera Driver");MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -