On Tue, 21 Jun 2011 17:12:21 +0800 "He, Yong M" <yong.m...@intel.com> wrote:
> > From: Yong He <yong.m...@intel.com> > Subject: [PATCH] MRST Tablet camera driver ver-0.952, fix 9891 > > Hi Kristen, > > Please help to review the patch. Thanks a lot! > The patching sequence is > > linux-2.6.37-camera-debug-printk-ov9740.patch (already in) > linux-2.6.37-camera-debug-printk-ov5640.patch > linux-2.6.37-camera-ov5640-ov9740-version-0.95_to_0.951.patch > then > linux-2.6.37-camera-ov5640-ov9740-version-0.951_to_0.952.patch Hi Yong, I just had a question about your locking, below. > > ---- > Bug 9891<https://bugzilla.otcshare.org/show_bug.cgi?id=9891> - Bad picture > quality of front camera caused by incorrect exposure settings > > Resolution: > 1, save auto-exposure & gain settings when doing preview. > 2, Switch from preview to capture mode (larger resolution) > 3, calculate new exposure settings according to the new resolution. > > Signed-off-by: Yong He <yong.m...@intel.com> > Index: linux-2.6.37/drivers/staging/mrstci/mrstov9740/mrstov9740.c > =================================================================== > --- linux-2.6.37/drivers/staging/mrstci/mrstov9740/mrstov9740.c > (revision 109) > +++ linux-2.6.37/drivers/staging/mrstci/mrstov9740/mrstov9740.c (working > copy) > @@ -48,7 +48,7 @@ > #include "ci_sensor_common.h" > #include "ov9740.h" > -#define DRIVER_VERSION "0.941" > +#define DRIVER_VERSION "0.952" > #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt > #define DBG_entering pr_debug("%s entering", __func__); > @@ -124,7 +124,46 @@ > #define N_RES (ARRAY_SIZE(ov9740_res)) > +struct ov9740_exp_info_1_t { > + uint16_t ho; > + uint16_t vo; > + uint16_t gain16; > + uint32_t shutter16; > +}; > + > +struct ov9740_exp_info_2_t { > + uint8_t iso; > + uint8_t lightfreq; > +}; > + > /* > + * 2 -- VGA index in the array ov9740_res[], > + * which is the default resolution setting > + */ > +#define RESOLUTION_INDEX_VGA 2 > + > +static struct __ov9740_status_ { > + /* lock */ > + spinlock_t state_lock; > + > + /* sw status*/ > + int cur_res_i; > + > + /* hw status*/ > + int hflip, vflip; > + > + /* exposure status */ > + struct ov9740_exp_info_1_t snapshot; > + struct ov9740_exp_info_1_t preview; > + struct ov9740_exp_info_2_t expo; > +} ov9740_status = { > + .state_lock = __SPIN_LOCK_UNLOCKED(), > + .cur_res_i = RESOLUTION_INDEX_VGA, > + .hflip = 0, > + .vflip = 0, > +}; > + > +/* > * I2C Read & Write stuff > */ > static int ov9740_read(struct i2c_client *c, u16 reg, u8 *value) > @@ -221,6 +260,43 @@ > */ > return ret; > } > + > +static int ov9740_set_aec_agc(struct i2c_client *c, int on) > +{ > + int ret = 0; > + struct v4l2_subdev *sd = i2c_get_clientdata(c); > + dev_dbg(sd->v4l2_dev->dev, "ov9740_set_aec_agc: (%d)", on); > + > + if (on) > + ret = ov9740_write(c, 0x3503, 0x00); > + else > + ret = ov9740_write(c, 0x3503, 0x03); > + > + return ret; > +} > + > +static int ov9740_hw_init(struct i2c_client *c) > +{ > + int ret; > + unsigned long flags; > + DBG_entering; > + > + spin_lock_irqsave(&ov9740_status.state_lock, flags); > + ov9740_status.cur_res_i = RESOLUTION_INDEX_VGA; > + spin_unlock_irqrestore(&ov9740_status.state_lock, flags); > + > + /* Set registers into default config value */ > + ret = ov9740_write_array(c, ov9740_def); > + ret += ov9740_write_array(c, ov9740_reg_vga); > + ov9740_write(c, 0x0100, 0x00); > + ov9740_set_data_pin_in(c); > + ret += ov9740_set_aec_agc(c, 1); > + msleep(100); > + > + DBG_leaving; > + return ret; > +} > + > /* > * Sensor specific helper function > */ > @@ -282,21 +358,10 @@ > info->cie_profile = 0; > memcpy(info->name, "ov9740", 7); > - // > - // added > - // ret = ov9740_write(c, OV9740_SYS, 0x80); > /* Set registers into default config value */ > - ret = ov9740_write_array(c, ov9740_def); > - ret += ov9740_write_array(c, ov9740_reg_vga); > + ret = ov9740_hw_init(c); > - /* added by wen to stop sensor from streaming */ > - // ov9740_write(c, 0x3086, 0x0f); > - // commented out in workshop > - // > -/// ov9740_set_data_pin_in(c); > - ssleep(1); > - > - DBG_leaving; > + DBG_leaving; > return ret; > } > @@ -420,8 +485,8 @@ > return index; > } > - > -static uint8_t find_OV9740_TIMING_index(int res) { > +static uint8_t find_ov9740_res_index(int res) > +{ > uint8_t index; > switch (res) { > @@ -444,11 +509,273 @@ > return index; > } > -static int previous_res = 2;//SENSOR_RES_VGA; > +struct ov9740_setting_tbl_t { > + uint32_t sysclk; > + uint16_t REG_034cw; > + uint16_t REG_034ew; > + uint16_t REG_0342w; > + uint16_t REG_0340w; > + > + uint16_t REG_3a08w; > + uint16_t REG_3a0aw; > + uint8_t REG_3a0e; > + uint8_t REG_3a0d; > +} __attribute__((packed)); > + > +const struct ov9740_setting_tbl_t const ov9740_setting_ext[8] = { > + /*1280x720*/ > + {3792, 0x0500, 0x02d0, 0x0662, 0x0307, 0x0074, 0x0060, 0x06, 0x08}, > + /*800x600*/ > + {3792, 0x0320, 0x0258, 0x0662, 0x0307, 0x0074, 0x0060, 0x06, 0x08}, > + /*640x480*/ > + {7583, 0x0280, 0x01e0, 0x0662, 0x0307, 0x00e8, 0x00c1, 0x03, 0x04}, > + /*320x240*/ > + {7583, 0x0140, 0x00f0, 0x0662, 0x0307, 0x00e8, 0x00c1, 0x03, 0x04}, > +}; > + > +static int ov9740_set_b_filter(struct v4l2_subdev *sd, uint8_t idx) > +{ > + uint16_t val; > + int ret = 0; > + struct i2c_client *c = v4l2_get_subdevdata(sd); > + > + /*50hz*/ > + val = ((ov9740_setting_ext[idx].REG_3a08w>>8)&0x03); > + ret += ov9740_write(c, 0x3a08, val); > + val = ov9740_setting_ext[idx].REG_3a08w&0xFF; > + ret += ov9740_write(c, 0x3a09, val); > + > + /*60hz*/ > + val = ((ov9740_setting_ext[idx].REG_3a0aw>>8)&0x03); > + ret += ov9740_write(c, 0x3a0a, val); > + val = ov9740_setting_ext[idx].REG_3a0aw&0xFF; > + ret += ov9740_write(c, 0x3a0b, val); > + > + val = ((ov9740_setting_ext[idx].REG_3a0e)); > + ret += ov9740_write(c, 0x3a0e, val); > + val = ov9740_setting_ext[idx].REG_3a0d; > + ret += ov9740_write(c, 0x3a0d, val); > + > + /* Set Gain Limit */ > + ret += ov9740_write(c, 0x3a18, 0x01); > + ret += ov9740_write(c, 0x3a19, 0xfc); > + > + dev_dbg(sd->v4l2_dev->dev, > + "ov9740_set_b_filter: ov9740_setting_ext[%d]." > + "REG_3a08w <- 0x%x", idx, > + ov9740_setting_ext[idx].REG_3a08w); > + dev_dbg(sd->v4l2_dev->dev, > + "ov9740_set_b_filter: ov9740_setting_ext[%d]." > + "REG_3a0aw <- 0x%x", idx, > + ov9740_setting_ext[idx].REG_3a0aw); > + > + return ret; > +} > + > +static int ov9740_save_expo_val(struct v4l2_subdev *sd) are the accesses to ov9740_status in the below save/restore routines safe from race conditions? Does your caller need to hold a lock prior to calling these routines? > +{ > + uint8_t val; > + uint32_t shutter16; > + uint16_t gain16; > + int ret = 0; > + struct i2c_client *c = v4l2_get_subdevdata(sd); > + > + /*Shutter*/ > + ret += ov9740_read(c, 0x0202, &val); > + shutter16 = val&0x0F; > + shutter16 <<= 8; > + ret += ov9740_read(c, 0x0203, &val); > + shutter16 += val; > + > + /*Gain*/ > + ret += ov9740_read(c, 0x0204, &val); > + gain16 = val&0x03; > + gain16 <<= 8; > + ret += ov9740_read(c, 0x0205, &val); > + gain16 += val; > + > + ov9740_status.preview.gain16 = gain16; > + ov9740_status.preview.shutter16 = shutter16; > + > + /*lightfreq*/ > + ret += ov9740_read(c, 0x3C0C, &val); > + if ((val&0x01) == 1) > + ov9740_status.expo.lightfreq = 50; > + else > + ov9740_status.expo.lightfreq = 60; > + > + dev_dbg(sd->v4l2_dev->dev, "ov9740_save_expo_val: " > + "ov9740_status.preview.gain16 -> 0x%x", > + ov9740_status.preview.gain16); > + dev_dbg(sd->v4l2_dev->dev, "ov9740_save_expo_val: " > + "ov9740_status.preview.shutter16 -> 0x%x", > + ov9740_status.preview.shutter16); > + dev_dbg(sd->v4l2_dev->dev, "ov9740_save_expo_val: " > + "ov9740_status.expo.lightfreq -> 0x%x", > + ov9740_status.expo.lightfreq); > + > + return ret; > +} > + > +static long long local_do_div(long long x, long long y) > +{ > + unsigned long mod; > + mod = do_div(x, y); > + return x; > +} > + > +static int ov9740_restore_gain(struct v4l2_subdev *sd) > +{ > + struct i2c_client *c = v4l2_get_subdevdata(sd); > + uint16_t val; > + int ret = 0; > + > + val = ov9740_status.snapshot.gain16&0xFF; > + ret += ov9740_write(c, 0x0205, val); > + val = (ov9740_status.snapshot.gain16>>8); > + ret += ov9740_write(c, 0x0204, val); > + dev_dbg(sd->v4l2_dev->dev, "ov9740_set_gain: ov9740_status.snapshot" > + ".gain16 <- 0x%x", ov9740_status.snapshot.gain16); > + > + return ret; > +} > + > +static int ov9740_restore_expo(struct v4l2_subdev *sd, > + uint8_t pre_idx, uint8_t cap_idx) > +{ > + uint64_t x, y; > + uint64_t exposure; > + uint32_t bandwidth; > + uint32_t frmbandlinesmax; > + uint32_t shutter, frmshuttermax; > + uint16_t gain16, maxgain16; > + uint16_t val; > + struct i2c_client *c = v4l2_get_subdevdata(sd); > + int ret = 0; > + > + if (ov9740_status.preview.gain16 < 16) > + return -1; > + > + if (ov9740_status.preview.shutter16 < 16) > + return -1; > + > + if (ov9740_status.expo.lightfreq < 1) > + return -1; > + > + x = ov9740_setting_ext[pre_idx].REG_0342w; > + x *= ov9740_status.preview.gain16; > + x *= (ov9740_status.preview.shutter16/16); > + > + y = ov9740_setting_ext[cap_idx].REG_0342w; > + dev_dbg(sd->v4l2_dev->dev, > + "ov9740_restore_expo: x = 0x%Lx, y = 0x%Lx", x, > y); > + dev_dbg(sd->v4l2_dev->dev, > + "ov9740_status.preview.gain16 = 0x%x," > + "ov9740_status.preview.shutter16 = 0x%x", > + ov9740_status.preview.gain16, > + ov9740_status.preview.shutter16); > + > + x = (x*ov9740_setting_ext[cap_idx].sysclk + 8)>>4; > + y = (y*ov9740_setting_ext[pre_idx].sysclk + 8)>>4; > + > + dev_dbg(sd->v4l2_dev->dev, > + "ov9740_restore_expo: x2 = 0x%Lx, y2 = 0x%Lx", x, y); > + exposure = do_div(x, y); > + exposure = x; > + dev_dbg(sd->v4l2_dev->dev, > + "ov9740_restore_expo: exposure = 0x%Lx", exposure); > + > + maxgain16 = 0x01fc; /* 32x */ > + ret += ov9740_write(c, 0x3a18, 0x01); > + ret += ov9740_write(c, 0x3a19, 0xfc); > + > + if (ov9740_status.expo.lightfreq == 60) { > + bandwidth = ov9740_setting_ext[cap_idx].REG_3a0aw; > + frmbandlinesmax = > + > bandwidth*ov9740_setting_ext[cap_idx].REG_3a0d; > + } else { > + bandwidth = ov9740_setting_ext[cap_idx].REG_3a08w; > + frmbandlinesmax = > + > bandwidth*ov9740_setting_ext[cap_idx].REG_3a0e; > + } > + > + if (exposure < 16) { > + /* smaller than 1 line*/ > + shutter = 1; > + gain16 = 16; > + } else if (exposure < (bandwidth*16)) { > + /* smaller than 1 banding*/ > + gain16 = 16; > + shutter = ((exposure+8)>>4); > + } else { > + if (exposure < (frmbandlinesmax*16)) { > + /* smaller than 1 frame*/ > + x = exposure; > + y = (bandwidth*16); > + shutter = (uint32_t)local_do_div(x, y); > + shutter *= bandwidth; > + > + x = exposure+shutter/2; > + y = shutter; > + gain16 = (uint16_t)local_do_div(x, y); > + } else { > + /* larger than 1 frame*/ > + shutter = frmbandlinesmax; > + x = exposure+shutter/2; > + y = shutter; > + gain16 = (uint16_t)local_do_div(x, y); > + if (gain16 > maxgain16) { > + /* larger than maxim gain & frame*/ > + x = exposure + > + > ((uint32_t)maxgain16)*(bandwidth-1); > + y = maxgain16*bandwidth; > + shutter = (uint32_t)local_do_div(x, y); > + shutter *= bandwidth; > + x = exposure; > + y = shutter; > + gain16 = (uint32_t)local_do_div(x, y); > + } > + } > + } > + > + ov9740_status.snapshot.shutter16 = shutter*16; > + ov9740_status.snapshot.gain16 = gain16; > + > + frmshuttermax = ov9740_setting_ext[cap_idx].REG_0340w-1; > + > + if (frmshuttermax <= shutter) { > + if (shutter > 2*frmshuttermax) { > + frmshuttermax *= 2; > + shutter = frmshuttermax-4; > + } else { > + frmshuttermax = shutter+4; > + } > + val = frmshuttermax&0xFF; > + ret += ov9740_write(c, 0x0341, val); > + val = frmshuttermax>>8; > + ret += ov9740_write(c, 0x0340, val); > + } > + > + val = (ov9740_status.snapshot.shutter16&0xFF); > + ret += ov9740_write(c, 0x0203, val); > + val = ((ov9740_status.snapshot.shutter16>>8)&0xFF); > + ret += ov9740_write(c, 0x0202, val); > + > + dev_dbg(sd->v4l2_dev->dev, "ov9740_restore_expo: " > + "frmshuttermax <- 0x%x", > + frmshuttermax); > + dev_dbg(sd->v4l2_dev->dev, "ov9740_restore_expo: " > + "ov9740_status.preview.shutter16 <- 0x%x", > + ov9740_status.snapshot.shutter16); > + > + return ret; > +} > + > static int ov9740_set_fmt(struct v4l2_subdev *sd, > struct v4l2_mbus_framefmt *fmt) > { > + unsigned long flags; > struct i2c_client *client = v4l2_get_subdevdata(sd); > struct ci_sensor_config *info = to_sensor_config(sd); > int ret = 0; > @@ -470,17 +797,26 @@ > if (res_index->regs) { > uint8_t target_res_index; > - target_res_index = find_OV9740_TIMING_index(res_index->res); > + target_res_index = find_ov9740_res_index(res_index->res); > + spin_lock_irqsave(&ov9740_status.state_lock, flags); > - if (previous_res != target_res_index) { > + if (ov9740_status.cur_res_i != target_res_index) { > + int previous_res_i = ov9740_status.cur_res_i; > + ov9740_status.cur_res_i = target_res_index; > + spin_unlock_irqrestore( > + &ov9740_status.state_lock, > flags); > dev_dbg(sd->v4l2_dev->dev, > "changing res from index-%d to index-%d > (%dx%d)", > - previous_res, target_res_index, width, > height); > - dev_dbg(sd->v4l2_dev->dev, "Set Resolution > Configs"); > + previous_res_i, target_res_index, width, > height); > ret += ov9740_write_array(client, res_index->regs); > - previous_res = target_res_index; > + ov9740_restore_gain(sd); > + ov9740_restore_expo(sd, > + previous_res_i, > target_res_index); > + ov9740_set_b_filter(sd, target_res_index); > } > else { > + spin_unlock_irqrestore( > + &ov9740_status.state_lock, > flags); > dev_dbg(sd->v4l2_dev->dev, > "same res index-%d (%dx%d)", > target_res_index, width, height); > @@ -813,9 +1149,12 @@ > dev_dbg(sd->v4l2_dev->dev, > "set stream on, sleep 300 ms for sensor > adjusting...\n"); > ov9740_write(client, 0x0100, 0x01); > + ov9740_set_aec_agc(client, 1); > msleep(300); > } > } else { > + ov9740_set_aec_agc(client, 0); > + ov9740_save_expo_val(sd); > ov9740_write(client, 0x0100, 0x00); > } > @@ -894,16 +1233,17 @@ > target_fps = param->parm.capture.timeperframe.denominator / > param->parm.capture.timeperframe.numerator; > - if (ov9740_res[previous_res].used) { > + if (ov9740_res[ov9740_status.cur_res_i].used) { > for (fps_i = 0; fps_i < OV9740_N_FPS; fps_i++) { > - if (target_fps == > ov9740_res[previous_res].fps[fps_i]) { > + if (target_fps == > ov9740_res[ov9740_status.cur_res_i].fps[fps_i]) { > // found the target fps > u8 val; > dev_dbg(sd->v4l2_dev->dev, "set sensor FPS > to %d\n", target_fps); > ov9740_read(client, 0x0100, &val); > if (val == 0x01) ov9740_s_stream(sd, 0); > - target_vts = > (ov9740_vts_setting[previous_res] * ov9740_res[previous_res].fps[0]) / > target_fps; > + target_vts = > (ov9740_vts_setting[ov9740_status.cur_res_i] * > + > ov9740_res[ov9740_status.cur_res_i].fps[0]) / target_fps; > ov9740_write(client, 0x0340, > (target_vts>>8)&0xff); > ov9740_write(client, 0x0341, > target_vts&0xff); > @@ -921,7 +1261,7 @@ > } else { > dev_dbg(sd->v4l2_dev->dev, > "Warning!! current_res (%d) is not > used??\n", > - previous_res); > + ov9740_status.cur_res_i); > } > DBG_leaving; > Index: linux-2.6.37/drivers/staging/mrstci/mrstov9740/ov9740.h > =================================================================== > --- linux-2.6.37/drivers/staging/mrstci/mrstov9740/ov9740.h (revision > 109) > +++ linux-2.6.37/drivers/staging/mrstci/mrstov9740/ov9740.h (working copy) > @@ -67,7 +67,7 @@ > {0x0348 , 0x05}, > {0x0349 , 0x0c}, > {0x034a , 0x02}, > - {0x034b , 0xd8}, > + {0x034b , 0xd9}, > {0x034c , 0x05}, > {0x034d , 0x00}, > {0x034e , 0x02}, > @@ -358,15 +358,10 @@ > {0x5848 , 0x02}, > {0x5849 , 0xcc}, > - // Start streaming > - {0x0100 , 0x01}, // start streaming > - > {0xffff, 0xff}, > }; > static struct regval_list ov9740_reg_720p[] = { > - //OV9740 DVP 1280*720 15FPS > - > -// {0x0101 , 0x01}, > + /*OV9740 DVP 1280*720 15FPS*/ > {0x3104 , 0x20}, > {0x0305 , 0x03}, > {0x0307 , 0x5b}, > @@ -384,7 +379,7 @@ > {0x0348 , 0x05}, > {0x0349 , 0x0c}, > {0x034a , 0x02}, > - {0x034b , 0xd8}, > + {0x034b , 0xd9}, > {0x034c , 0x05}, > {0x034d , 0x00}, > {0x034e , 0x02}, > @@ -404,27 +399,24 @@ > {0x381a , 0x00}, > {0x5001 , 0xff}, > {0x5003 , 0xff}, > - {0x501e , 0x05}, // Scale X input > - {0x501f , 0x00}, // Scale X input > - {0x5020 , 0x02}, // Scale Y input > - {0x5021 , 0xd0}, // Scale Y input > + {0x501e , 0x05}, /* Scale X input*/ > + {0x501f , 0x00}, /* Scale X input*/ > + {0x5020 , 0x02}, /* Scale Y input*/ > + {0x5021 , 0xd0}, /* Scale Y input*/ > {0x530d , 0x06}, > - {0x0100 , 0x01}, > {0xffff, 0xff}, > }; > static struct regval_list ov9740_reg_svga[] = { > - //OV9740 DVP 800x600 15FPS > - > -// {0x0101 , 0x01}, // Orientation > + /*OV9740 DVP 800x600 15FPS*/ > {0x3104 , 0x20}, > {0x0305 , 0x03}, > {0x0307 , 0x5b}, > {0x0303 , 0x01}, > {0x0301 , 0x0a}, > {0x3010 , 0x01}, > - {0x300e , 0x12}, // Timing setting > + {0x300e , 0x12}, /* Timing setting*/ > {0x0340 , 0x03}, > {0x0341 , 0x07}, > {0x0342 , 0x06}, > @@ -436,7 +428,7 @@ > {0x0348 , 0x04}, > {0x0349 , 0x67}, > {0x034a , 0x02}, > - {0x034b , 0xd8}, > + {0x034b , 0xd9}, > {0x034c , 0x03}, > {0x034d , 0x20}, > {0x034e , 0x02}, > @@ -455,28 +447,25 @@ > {0x4608 , 0x02}, > {0x4609 , 0x70}, > {0x5001 , 0xff}, > - {0x5003 , 0xff}, // Scaling > - {0x501e , 0x03}, // Scale X input > - {0x501f , 0xc0}, // Scale X input > - {0x5020 , 0x02}, // Scale Y input > - {0x5021 , 0xd0}, // Scale Y input > + {0x5003 , 0xff}, /* Scaling*/ > + {0x501e , 0x03}, /* Scale X input*/ > + {0x501f , 0xc0}, /* Scale X input*/ > + {0x5020 , 0x02}, /* Scale Y input*/ > + {0x5021 , 0xd0}, /* Scale Y input*/ > {0x530d , 0x06}, > - {0x0100 , 0x01}, > {0xffff, 0xff}, > }; > static struct regval_list ov9740_reg_vga[] = { > - //OV9740 DVP 640x480 30FPS > - > -// {0x0101 , 0x01}, // Orientation > + /*OV9740 DVP 640x480 30FPS*/ > {0x3104 , 0x20}, > {0x0305 , 0x03}, > {0x0307 , 0x5b}, > {0x0303 , 0x01}, > {0x0301 , 0x0a}, > {0x3010 , 0x01}, > - {0x300e , 0x12}, // Timing setting > + {0x300e , 0x12}, /* Timing setting*/ > {0x0340 , 0x03}, > {0x0341 , 0x07}, > {0x0342 , 0x06}, > @@ -488,7 +477,7 @@ > {0x0348 , 0x04}, > {0x0349 , 0x67}, > {0x034a , 0x02}, > - {0x034b , 0xd8}, > + {0x034b , 0xd9}, > {0x034c , 0x02}, > {0x034d , 0x80}, > {0x034e , 0x01}, > @@ -503,29 +492,25 @@ > {0x4608 , 0x02}, > {0x4609 , 0x70}, > {0x5001 , 0xff}, > - {0x5003 , 0xff}, // Scaling > - {0x501e , 0x03}, // Scale X input > - {0x501f , 0xc0}, // Scale X input > - {0x5020 , 0x02}, // Scale Y input > - {0x5021 , 0xd0}, // Scale Y input > + {0x5003 , 0xff}, /* Scaling*/ > + {0x501e , 0x03}, /* Scale X input*/ > + {0x501f , 0xc0}, /* Scale X input*/ > + {0x5020 , 0x02}, /* Scale Y input*/ > + {0x5021 , 0xd0}, /* Scale Y input*/ > {0x530d , 0x06}, > - {0x0100 , 0x01}, > - > {0xffff, 0xff}, > }; > static struct regval_list ov9740_reg_qvga[] = { > - //OV9740 DVP 320x240 30FPS > - > -// {0x0101 , 0x01}, // Orientation > + /*OV9740 DVP 320x240 30FPS*/ > {0x3104 , 0x20}, > {0x0305 , 0x03}, > {0x0307 , 0x5b}, > {0x0303 , 0x01}, > {0x0301 , 0x0a}, > {0x3010 , 0x01}, > - {0x300e , 0x12}, // Timing setting > + {0x300e , 0x12}, /* Timing setting*/ > {0x0340 , 0x03}, > {0x0341 , 0x07}, > {0x0342 , 0x06}, > @@ -537,7 +522,7 @@ > {0x0348 , 0x04}, > {0x0349 , 0x67}, > {0x034a , 0x02}, > - {0x034b , 0xd8}, > + {0x034b , 0xd9}, > {0x034c , 0x01}, > {0x034d , 0x40}, > {0x034e , 0x00}, > @@ -552,25 +537,24 @@ > {0x4608 , 0x02}, > {0x4609 , 0x70}, > {0x5001 , 0xff}, > - {0x5003 , 0xff}, // Scaling > - {0x501e , 0x03}, // Scale X input > - {0x501f , 0xc0}, // Scale X input > - {0x5020 , 0x02}, // Scale Y input > - {0x5021 , 0xd0}, // Scale Y input > + {0x5003 , 0xff}, /* Scaling*/ > + {0x501e , 0x03}, /* Scale X input*/ > + {0x501f , 0xc0}, /* Scale X input*/ > + {0x5020 , 0x02}, /* Scale Y input*/ > + {0x5021 , 0xd0}, /* Scale Y input*/ > {0x530d , 0x06}, > - {0x0100 , 0x01}, > {0xffff, 0xff}, > }; > static u32 ov9740_vts_setting[] = { > - // 1280x720 > + /* 1280x720*/ > 0x307, > - // 800x600 > + /* 800x600*/ > 0x307, > - // 640x480 > + /* 640x480*/ > 0x307, > - // 320x240 > + /* 320x240*/ > 0x307, > }; > > > Best Regards, > > Yong He > Software Engineer, PCSD SW Solutions, > Intel Asia-Pacific R&D Ltd. > Phone (+86) 21-61166334 > Lab (+86) 21-61167881 > _______________________________________________ MeeGo-kernel mailing list MeeGo-kernel@lists.meego.com http://lists.meego.com/listinfo/meego-kernel