Ack, I will add more explanation into the code.
On 09/19/2018 12:11 PM, Tomasz Figa wrote:
> Hi Bingbu,
>
> On Mon, Sep 17, 2018 at 2:53 PM <bingbu....@intel.com> wrote:
> [snip]
>> +static int imx319_update_digital_gain(struct imx319 *imx319, u32 d_gain)
>> +{
>> + int ret;
>> +
>> + ret = imx319_write_reg(imx319, IMX319_REG_DPGA_USE_GLOBAL_GAIN, 1,
>> 1);
>> + if (ret)
>> + return ret;
>> +
>> + /* Digital gain = (d_gain & 0xFF00) + (d_gain & 0xFF)/256 times */
> What's the unit here?
>
> Is the equation above really correct? The range, besides ~0, would be
> from 256.0 to 65280 + 255/256, which sounds strange.
>
>> + return imx319_write_reg(imx319, IMX319_REG_DIG_GAIN_GLOBAL, 2,
>> d_gain);
>> +}
>> +
>> +static int imx319_set_ctrl(struct v4l2_ctrl *ctrl)
>> +{
>> + struct imx319 *imx319 = container_of(ctrl->handler,
>> + struct imx319, ctrl_handler);
>> + struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
>> + s64 max;
>> + int ret;
>> +
>> + /* Propagate change of current control to all related controls */
>> + switch (ctrl->id) {
>> + case V4L2_CID_VBLANK:
>> + /* Update max exposure while meeting expected vblanking */
>> + max = imx319->cur_mode->height + ctrl->val - 18;
>> + __v4l2_ctrl_modify_range(imx319->exposure,
>> + imx319->exposure->minimum,
>> + max, imx319->exposure->step, max);
>> + break;
>> + }
>> +
>> + /*
>> + * Applying V4L2 control value only happens
>> + * when power is up for streaming
>> + */
>> + if (pm_runtime_get_if_in_use(&client->dev) == 0)
> nit: if (!pm_runtime_get_if_in_use(&client->dev)
>
>> + return 0;
>> +
> [snip]
>> +/* Initialize control handlers */
>> +static int imx319_init_controls(struct imx319 *imx319)
>> +{
>> + struct i2c_client *client = v4l2_get_subdevdata(&imx319->sd);
>> + struct v4l2_ctrl_handler *ctrl_hdlr;
>> + s64 exposure_max;
>> + s64 vblank_def;
>> + s64 vblank_min;
>> + s64 hblank;
>> + s64 pixel_rate;
>> + const struct imx319_mode *mode;
>> + int ret;
>> +
>> + ctrl_hdlr = &imx319->ctrl_handler;
>> + ret = v4l2_ctrl_handler_init(ctrl_hdlr, 10);
>> + if (ret)
>> + return ret;
>> +
>> + ctrl_hdlr->lock = &imx319->mutex;
>> + imx319->link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
>> &imx319_ctrl_ops,
>> + V4L2_CID_LINK_FREQ, 0, 0,
>> +
>> imx319->pdata->link_freqs);
>> + if (imx319->link_freq)
>> + imx319->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
>> +
>> + /* pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
>> + pixel_rate = (imx319->link_def_freq * 2 * 4) / 10;
>> + /* By default, PIXEL_RATE is read only */
>> + imx319->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> + V4L2_CID_PIXEL_RATE,
>> pixel_rate,
>> + pixel_rate, 1, pixel_rate);
>> +
>> + /* Initialze vblank/hblank/exposure parameters based on current mode
>> */
>> + mode = imx319->cur_mode;
>> + vblank_def = mode->fll_def - mode->height;
>> + vblank_min = mode->fll_min - mode->height;
>> + imx319->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> + V4L2_CID_VBLANK, vblank_min,
>> + IMX319_FLL_MAX - mode->height,
>> + 1, vblank_def);
>> +
>> + hblank = mode->llp - mode->width;
>> + imx319->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> + V4L2_CID_HBLANK, hblank, hblank,
>> + 1, hblank);
>> + if (imx319->hblank)
>> + imx319->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
>> +
>> + exposure_max = mode->fll_def - 18;
>> + imx319->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> + V4L2_CID_EXPOSURE,
>> + IMX319_EXPOSURE_MIN,
>> exposure_max,
>> + IMX319_EXPOSURE_STEP,
>> + IMX319_EXPOSURE_DEFAULT);
> Please explain how to interpret the exposure value in a comment.
>
>> +
>> + imx319->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> + V4L2_CID_HFLIP, 0, 1, 1, 0);
>> + imx319->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> + V4L2_CID_VFLIP, 0, 1, 1, 0);
>> +
>> + v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops,
>> V4L2_CID_ANALOGUE_GAIN,
>> + IMX319_ANA_GAIN_MIN, IMX319_ANA_GAIN_MAX,
>> + IMX319_ANA_GAIN_STEP, IMX319_ANA_GAIN_DEFAULT);
> Please explain how the gain value and in what units is calculated in a
> comment.
>
>> +
>> + /* Digital gain */
>> + v4l2_ctrl_new_std(ctrl_hdlr, &imx319_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
>> + IMX319_DGTL_GAIN_MIN, IMX319_DGTL_GAIN_MAX,
>> + IMX319_DGTL_GAIN_STEP, IMX319_DGTL_GAIN_DEFAULT);
>> +
> Please explain how the gain value and in what units is calculated in
> the comment.
>
> Best regards,
> Tomasz
>