Hi Laurent,
> Hi Daniel,
>
> On Thursday 26 May 2011 10:57:39 Daniel Lundborg wrote:
> >
> > Hello,
> >
> > I am developing a camera sensor driver for the Aptina MT9V034. I am
only
> > using it in snapshot mode and I can successfully trigger the sensor
and
> > receive pictures using the latest omap3isp driver from
> > git://linuxtv.org/pinchartl/media.git branch omap3isp-next-sensors
with
> > kernel 2.6.38.
> >
> > I configure the sensor with media-ctl:
> >
> > media-ctl -r -l '"mt9v034 3-0048":0->"OMAP3 ISP CCDC":0[1], "OMAP3
ISP
> > CCDC":1->"OMAP3 ISP CCDC output":0[1]'
> >
> > media-ctl -f '"mt9v034 3-0048":0[SGRBG10 752x480], "OMAP3 ISP
> > CCDC":1[SGRBG10 752x480]'
> >
> > And take pictures with yavta:
> >
> > ./yavta -f SGRBG10 -s 752x480 -n 6 --capture=6 -F /dev/video2
> >
> > My trouble is that I am always receiving whiter pictures when I wait
a
> > moment before triggering the sensor to take a picture. If I take
several
> > pictures in a row with for instance 20 ms between them, they all
look
> > ok. But if I wait for 100 ms the picture will get much whiter.
> >
> > I have turned off auto exposure and auto gain in the sensor and the
> > LED_OUT signal always have the same length (in this case 8 msec).
>
> I assume you've measured it with a scope ?
>
> Try disabling black level calibration and row noise correction as
well. Please
> also double-check that AEC and AGC are disabled. I've had a similar
issue with
> an MT9V032 sensor, where a bug in the driver enabled AEC/AGC instead
of
> disabling them.
The register on 0xaf (MT9V034_AGC_AEC_ENABLE) is set to 0 and is 0 when
I read from it.
bit 0 - AEC enable context A, bit 1 - AGC enable context A, bit 8 - AEC
enable context B, bit 9 - AGC enable context B
The register on 0x47 (MT9V034_BL_CALIB_CTRL) is set to 0 and is 0 when I
read from it.
bit 0 - (1 = override with programmed values, 0 = normal operation), bit
7:5 - Frames to average over
The register on 0x70 (MT9V034_ROW_NOISE_CORR_CONTROL) is set to 0 and is
0 when I read from it.
bit 0 - enable noise correction context A , bit 1 - Use black level avg
context A, bit 8 - enable noise correction context B, bit 9 - Use black
level avg context B
I measure the signals with a scope and the LED_OUT signal is always 8
msec when triggered.
Code from my mt9v034.c:
#define MT9V034_CHIP_CONTROL_SNAPSHOT_MODE (3 << 3)
#define MT9V034_CHIP_CONTROL_DOUT_ENABLE (1 << 7)
#define MT9V034_CHIP_CONTROL_SEQUENTIAL (1 << 8)
#define MT9V034_CHIP_CONTROL_RESERVED (1 << 9)
static int mt9v034_power_on(struct mt9v034 *mt9v034)
{
if (mt9v034->pdata->set_clock) {
mt9v034->pdata->set_clock(&mt9v034->subdev, 24000000);
}
msleep(1);
mt9v034->pdata->configure(&mt9v034->subdev);
msleep(1);
mt9v034->pdata->reset();
usleep_range(1000, 2000);
mt9v034_configure(&mt9v034->subdev);
}
static int mt9v034_configure(struct v4l2_subdev *subdev)
{
struct i2c_client *client = v4l2_get_subdevdata(subdev);
struct mt9v034 *mt9v034 = to_mt9v034(subdev);
int ret;
ret = mt9v034_set_chip_control(mt9v034, MT9V034_CHIP_CONTROL_RESERVED,
0); // Clear bit 9 for normal operation
if (ret < 0)
return ret;
v4l2_ctrl_handler_setup(&mt9v034->ctrls);
ret = mt9v034_write(client, MT9V034_AEC_AGC_ENABLE_A_B,
mt9v034->aec_agc); // Set AEC (Automatic Exposure Control) and AGC
(Automatic Gain Control)
if (ret < 0)
return ret;
ret = mt9v034_write(client,
MT9V034_COARSE_TOTAL_SHUTTER_WIDTH_CONTEXT_A, 243); // Set "Total
shutter width" register so exposure time is set
if (ret < 0)
return ret;
ret = mt9v034_write(client, MT9V034_ANALOG_GAIN_CONTEXT_A, 16); //
Set "Analog gain" register so gain is set
if (ret < 0)
return ret;
msleep(1);
ret = mt9v034_write(client, MT9V034_BL_CALIB_CTRL, 0); //
Disable black calibration
if (ret < 0)
return ret;
ret = mt9v034_write(client, MT9V034_ROW_NOISE_CORR_CONTROL, 0);
// Disable row noise correction
if (ret < 0)
return ret;
msleep(20);
ret = mt9v034_set_chip_control(mt9v034, MT9V034_CHIP_CONTROL_RESERVED,
MT9V034_CHIP_CONTROL_SNAPSHOT_MODE); // Clear bit 9 for normal
operation and set to snapshot mode
if (ret < 0)
return ret;
return 0;
}
And from my board-overo.c file:
void overo_camera_configure(struct v4l2_subdev *subdev)
{
struct isp_device *isp =
v4l2_dev_to_isp_device(subdev->v4l2_dev);
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL,
~0x9a1b63ff, 0x98036000); // Set CAM_GLOBAL_RESET pin as output, enable
shutter, set DIVC = 216
isp_reg_clr(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_SHUT_DELAY,
0x01ffffff); // Set no shutter delay
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_SHUT_LENGTH,
0x01ffffff, 0x000003e8); // Set shutter signal length to 1000 (=> 1000 *
1/216MHz * 216 = 1 ms)
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_GRESET_LENGTH,
0x01ffffff, 0x000003e8); // Set CAM_GLOBAL_RESET signal length to 1000
(=> 1000 * 1/216MHz * 216 = 1 ms)
}
static void overo_camera_take_picture(struct v4l2_subdev *subdev)
{
struct isp_device *isp =
v4l2_dev_to_isp_device(subdev->v4l2_dev);
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 0,
0x00e00000); // Enable shutter (SHUTEN bit = 1)
isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_MAIN, ISP_TCTRL_CTRL, 0,
0x20000000); // Start generation of CAM_GLOBAL_RESET signal (GRESETEN
bit = 1)
}
static void overo_camera_set_clock(struct v4l2_subdev *subdev, unsigned
int rate)
{
struct isp_device *isp =
v4l2_dev_to_isp_device(subdev->v4l2_dev);
isp->platform_cb.set_xclk(isp, rate, OVERO_CAMERA_XCLK);
}
static void overo_camera_reset(void)
{
DPRINT("overo_camera_reset");
gpio_set_value(OVERO_GPIO_CAM_RESET, 0);
msleep(1);
gpio_set_value(OVERO_GPIO_CAM_RESET, 1);
}
>
> Do you have a light source connected to the LED_OUT signal ? If so,
can you
> try disabling it and using a constant light source ?
No I'm not using the LED_OUT signal other than measuring the exposure
time at this point.
>
> > Why would the pictures become whiter if I wait a moment before
taking a
> > picture?
> >
> > If I set the sensor in streaming mode all pictures look like they
> > should.
> >
> > Could there be something with the H3A auto white balance or auto
exposure?
>
> The OMAP3 ISP isn't able to apply any H3A algorithm to the images by
itself.
> The H3A hardware support only computes statistics, and a userspace
application
> then needs to compute parameters (such as exposure time and gains)
based on
> the statistics, and apply them to the hardware. As yavta doesn't
include H3A
> algorithms, the differences in picture brightness can only come from
the
> sensor.
>
> --
> Regards,
>
> Laurent Pinchart
Regards,
Daniel Lundborg
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html