This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

omap3isp raw driver

Other Parts Discussed in Thread: DM3730

Hi, i am trying to implement camera driver to dm3730 on beagleboard,  i have FPGA connected to camera interface and i sumulate PCLK, HS, VS and DATA signals. i wrote my driver as follows:

 

/*
 * drivers/media/video/mt9t111.c
 *
 * mt9t111 sensor driver
 *
 * Copyright (C) 2009 Leopard Imaging
 *
 * This file is licensed under the terms of the GNU General Public License
 * version 2. This program is licensed "as is" without any warranty of any
 * kind, whether express or implied.
 */

#include <linux/init.h>
#include <linux/mm.h>
#include <linux/delay.h>
#include <media/v4l2-int-device.h>
#include <linux/platform_device.h>

#include <../drivers/media/video/omap34xxcam.h>
#include <../drivers/media/video/isp/ispreg.h>

#define MODULE_NAME            "camera"

#define WIDTH        640
#define HEIGHT        480
#define FPS            30
#define PCLK        40000000
#define PCLK_MIN    6000000
#define PCLK_MAX    60000000

#define RAWCAM_BIGGEST_FRAME_BYTE_SIZE    PAGE_ALIGN(2048 * 1536 * 4)

struct rawcam_platform_data {
    char *master;
    int (*power_set)(struct v4l2_int_device *s, enum v4l2_power on);
    int (*ifparm)(struct v4l2_ifparm *p);
    int (*priv_data_set)(void *);
    /* Interface control params */
    bool clk_polarity;
    bool hs_polarity;
    bool vs_polarity;
};

struct rawcam_sensor {
    const struct rawcam_platform_data *pdata;
    struct v4l2_int_device *v4l2_int_device;
    struct v4l2_pix_format pix;
    struct v4l2_fract timeperframe;
};

static struct isp_interface_config rawcam_if_config = {
        .ccdc_par_ser        = ISP_PARLL,
        .dataline_shift        = 0x0,
        .hsvs_syncdetect    = ISPCTRL_SYNC_DETECT_VSRISE,
        .strobe            = 0x0,
        .prestrobe        = 0x0,
        .shutter        = 0x0,
        .wenlog         = ISPCCDC_CFG_WENLOG,
        .wait_hs_vs        = 2,
        .u.par.par_bridge    = 0x1,
        .u.par.par_clk_pol    = 0x1,
};

static struct v4l2_ifparm rawcam_ifparm_s = { .if_type = V4L2_IF_TYPE_RAW, .u = { .raw = { .frame_start_on_rising_vs = 1,
        .bt_sync_correct = 0,
        .swap = 0,
        .latch_clk_inv = 0,
        .nobt_hs_inv = 0, /* active high */
        .nobt_vs_inv = 0, /* active high */
        .clock_min = PCLK_MIN,
        .clock_max = PCLK_MAX, }, }, };

static struct omap34xxcam_hw_config rawcam_hwc = { .dev_index = 0,
        .dev_minor = 0,
        .dev_type = OMAP34XXCAM_SLAVE_SENSOR,
        .u.sensor.sensor_isp = 1,
        .u.sensor.capture_mem = RAWCAM_BIGGEST_FRAME_BYTE_SIZE * 2,
        .u.sensor.ival_default = { 1, FPS }, };

static int rawcam_ifparm(struct v4l2_ifparm *p) {

    if (p == NULL)
        return -EINVAL;

    *p = rawcam_ifparm_s;
    return 0;
}

static int rawcam_set_prv_data(void *priv) {

    struct omap34xxcam_hw_config *hwc = priv;

    if (priv == NULL)
        return -EINVAL;

    hwc->u.sensor = rawcam_hwc.u.sensor;
    hwc->dev_index = rawcam_hwc.dev_index;
    hwc->dev_minor = rawcam_hwc.dev_minor;
    hwc->dev_type = rawcam_hwc.dev_type;

    return 0;
}

static int rawcam_power_set(struct v4l2_int_device *s, enum v4l2_power power) {

    struct omap34xxcam_videodev *vdev = s->u.slave->master->priv;

    switch (power) {
    case V4L2_POWER_OFF:
    case V4L2_POWER_STANDBY:
        break;
    case V4L2_POWER_ON:
        isp_configure_interface(vdev->cam->isp, &rawcam_if_config);
        break;
    default:
        return -ENODEV;
        break;
    }
    return 0;
}

struct rawcam_platform_data rawcam_pdata = {
        .master = "omap34xxcam",
        .power_set = rawcam_power_set,
        .priv_data_set = rawcam_set_prv_data,
        .ifparm = rawcam_ifparm,
        /* Some interface dependent params */
        .clk_polarity = 0, /* data clocked out on falling edge */
        .hs_polarity = 1, /* 0 - Active low, 1- Active high */
        .vs_polarity = 1, /* 0 - Active low, 1- Active high */
};

static struct rawcam_sensor rawcam;

const static struct v4l2_fmtdesc rawcam_format = { .description = "YUV 422 ", .pixelformat = V4L2_PIX_FMT_YUYV, };
const struct v4l2_fract rawcam_frameinterval = { .numerator = 1, .denominator = FPS };

static int ioctl_enum_framesizes(struct v4l2_int_device *s, struct v4l2_frmsizeenum *frms) {

    if (frms->pixel_format != rawcam_format.pixelformat || frms->index > 0) {
        return -EINVAL;
    } else {

        frms->type = V4L2_FRMSIZE_TYPE_DISCRETE;
        frms->discrete.width = WIDTH;
        frms->discrete.height = HEIGHT;
    }

    return 0;
}

static int ioctl_enum_frameintervals(struct v4l2_int_device *s, struct v4l2_frmivalenum *frmi) {

    if (frmi->pixel_format != rawcam_format.pixelformat || frmi->index > 0) {
        return -EINVAL;
    } else {

        frmi->type = V4L2_FRMSIZE_TYPE_DISCRETE;
        frmi->discrete.numerator = rawcam_frameinterval.numerator;
        frmi->discrete.denominator = rawcam_frameinterval.denominator;

    }
    return 0;
}

static int ioctl_init(struct v4l2_int_device *s) {
    return 0;
}

static int ioctl_dev_exit(struct v4l2_int_device *s) {
    return 0;
}

static int ioctl_dev_init(struct v4l2_int_device *s) {
    return 0;
}

static int ioctl_s_power(struct v4l2_int_device *s, enum v4l2_power on) {
    return 0;
}

static int ioctl_g_priv(struct v4l2_int_device *s, void *p) {
    struct rawcam_sensor *sensor = s->priv;
    return sensor->pdata->priv_data_set(p);
}

static int ioctl_s_parm(struct v4l2_int_device *s, struct v4l2_streamparm *a) {
    return 0;
}

static int ioctl_g_parm(struct v4l2_int_device *s, struct v4l2_streamparm *a) {
    struct rawcam_sensor *sensor = s->priv;
    struct v4l2_captureparm *cparm = &a->parm.capture;

    if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
        return -EINVAL;

    memset(a, 0, sizeof(*a));
    a->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

    cparm->capability = V4L2_CAP_TIMEPERFRAME;
    cparm->timeperframe = sensor->timeperframe;
    return 0;
}

static int ioctl_g_fmt_cap(struct v4l2_int_device *s, struct v4l2_format *f) {
    struct rawcam_sensor *sensor = s->priv;
    f->fmt.pix = sensor->pix;
    return 0;
}

static int ioctl_try_fmt_cap(struct v4l2_int_device *s, struct v4l2_format *f) {
    struct v4l2_pix_format *pix = &f->fmt.pix;
    struct rawcam_sensor *sensor = s->priv;
    struct v4l2_pix_format *pix2 = &sensor->pix;
    pix->width = WIDTH;
    pix->height = HEIGHT;
    pix->pixelformat = V4L2_PIX_FMT_YUYV;
    pix->bytesperline = pix->width * 2;
    pix->colorspace = V4L2_COLORSPACE_JPEG;
    pix->field = V4L2_FIELD_NONE;
    pix->sizeimage = pix->bytesperline * pix->height;
    pix->priv = 0;
    *pix2 = *pix;
    return 0;
}

static int ioctl_s_fmt_cap(struct v4l2_int_device *s, struct v4l2_format *f) {
    struct rawcam_sensor *sensor = s->priv;
    struct v4l2_pix_format *pix = &f->fmt.pix;
    int rval;

    rval = ioctl_try_fmt_cap(s, f);
    if (!rval)
        sensor->pix = *pix;

    return 0;
}

static int ioctl_enum_fmt_cap(struct v4l2_int_device *s, struct v4l2_fmtdesc *fmt) {
    int index = fmt->index;
    enum v4l2_buf_type type = fmt->type;

    memset(fmt, 0, sizeof(*fmt));
    fmt->index = index;
    fmt->type = type;

    switch (fmt->type) {
    case V4L2_BUF_TYPE_VIDEO_CAPTURE:
        if (index > 0)
            return -EINVAL;
        break;
    default:
        return -EINVAL;
    }

    fmt->flags = 0;
    strlcpy(fmt->description, rawcam_format.description, sizeof(fmt->description));
    fmt->pixelformat = rawcam_format.pixelformat;

    return 0;
}

static int ioctl_s_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc) {
    return 0;
}

static int ioctl_g_ctrl(struct v4l2_int_device *s, struct v4l2_control *vc) {
    return 0;
}

static int ioctl_queryctrl(struct v4l2_int_device *s, struct v4l2_queryctrl *qc) {
    return 0;
}

static int ioctl_s_routing(struct v4l2_int_device *s, struct v4l2_routing *route) {
    return 0;
}

static int ioctl_g_ifparm(struct v4l2_int_device *s, struct v4l2_ifparm *p) {

    struct rawcam_sensor *sensor = s->priv;
    int rval;

    if (p == NULL)
        return -EINVAL;

    if (NULL == sensor->pdata->ifparm)
        return -EINVAL;

    rval = sensor->pdata->ifparm(p);

    p->u.ycbcr.clock_curr = PCLK;

    return 0;
}

static struct v4l2_int_ioctl_desc rawcam_ioctl_desc[] = { { .num = vidioc_int_enum_framesizes_num, .func = (v4l2_int_ioctl_func *) ioctl_enum_framesizes },
        { .num = vidioc_int_enum_frameintervals_num, .func = (v4l2_int_ioctl_func *) ioctl_enum_frameintervals },
        { .num = vidioc_int_dev_init_num, .func = (v4l2_int_ioctl_func *) ioctl_dev_init },
        { .num = vidioc_int_dev_exit_num, .func = (v4l2_int_ioctl_func *) ioctl_dev_exit },
        { .num = vidioc_int_s_power_num, .func = (v4l2_int_ioctl_func *) ioctl_s_power },
        { .num = vidioc_int_g_priv_num, .func = (v4l2_int_ioctl_func *) ioctl_g_priv },
        { .num = vidioc_int_g_ifparm_num, .func = (v4l2_int_ioctl_func *) ioctl_g_ifparm },
        { .num = vidioc_int_init_num, .func = (v4l2_int_ioctl_func *) ioctl_init },
        { .num = vidioc_int_enum_fmt_cap_num, .func = (v4l2_int_ioctl_func *) ioctl_enum_fmt_cap },
        { .num = vidioc_int_try_fmt_cap_num, .func = (v4l2_int_ioctl_func *) ioctl_try_fmt_cap },
        { .num = vidioc_int_g_fmt_cap_num, .func = (v4l2_int_ioctl_func *) ioctl_g_fmt_cap },
        { .num = vidioc_int_s_fmt_cap_num, .func = (v4l2_int_ioctl_func *) ioctl_s_fmt_cap },
        { .num = vidioc_int_g_parm_num, .func = (v4l2_int_ioctl_func *) ioctl_g_parm },
        { .num = vidioc_int_s_parm_num, .func = (v4l2_int_ioctl_func *) ioctl_s_parm },
        { .num = vidioc_int_queryctrl_num, .func = (v4l2_int_ioctl_func *) ioctl_queryctrl },
        { .num = vidioc_int_g_ctrl_num, .func = (v4l2_int_ioctl_func *) ioctl_g_ctrl },
        { .num = vidioc_int_s_ctrl_num, .func = (v4l2_int_ioctl_func *) ioctl_s_ctrl },
        { .num = vidioc_int_s_video_routing_num, .func = (v4l2_int_ioctl_func *) ioctl_s_routing }, };

static struct v4l2_int_slave rawcam_slave = { .ioctls = rawcam_ioctl_desc, .num_ioctls = ARRAY_SIZE(rawcam_ioctl_desc), };

static struct v4l2_int_device rawcam_int_device = { .module = THIS_MODULE, .name = "rawcam", .priv = &rawcam, .type = v4l2_int_type_slave, .u = { .slave =
        &rawcam_slave, }, };

static int __init rawcam_init(void) {
    struct rawcam_sensor *sensor = &rawcam;
    int err = 0;

    sensor->pdata = &rawcam_pdata;
    sensor->v4l2_int_device = &rawcam_int_device;
    sensor->pix.width = 640;
    sensor->pix.height = 480;
    sensor->pix.pixelformat = V4L2_PIX_FMT_YUYV;

    err = v4l2_int_device_register(sensor->v4l2_int_device);
    printk(KERN_INFO MODULE_NAME ": driver registration complete\n");

    return err;
}
module_init(rawcam_init);

static void __exit rawcam_cleanup(void)
{    struct rawcam_sensor *sensor = &rawcam;
    sensor->v4l2_int_device = &rawcam_int_device;
    v4l2_int_device_unregister(sensor->v4l2_int_device);
}
module_exit(rawcam_cleanup);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("raw camera sensor driver");

when i insert module everything is ok, there is new video0 device in dev. When i try to test it, hangs on

 

while (count-- > 0) {
        for (;;) {
            fd_set fds;
            struct timeval tv;
            int r;

            FD_ZERO(&fds);
            FD_SET(fd, &fds);


            /* Timeout. */
            tv.tv_sec = 2;
            tv.tv_usec = 0;

            r = select(fd + 1, &fds, NULL, NULL, &tv);

            if (-1 == r) {
                if (EINTR == errno)
                    continue;

                errno_exit("select");
            }



            if (0 == r) {
                fprintf(stderr, "select timeout\n");
                exit(EXIT_FAILURE);
            }

            if (read_frame())
                break;

            /* EAGAIN - continue select loop. */
        }

 

it gives me select timeout :( when i try to skip select part, it hangs on DQBUF ioctl, when i start v4l2-test it gives me:

 

     CUnit - A unit testing framework for C - Version 2.1-2
     http://cunit.sourceforge.net/


Suite: VIDIOC_QUERYCAP
  Test: VIDIOC_QUERYCAP ...passed
  Test: VIDIOC_CROPCAP ...passed
  Test: VIDIOC_CROPCAP with different inputs ...passed
  Test: VIDIOC_G_SLICED_VBI_CAP ...passed
  Test: VIDIOC_G_SLICED_VBI_CAP with invalid types ...passed
Suite: VIDIOC_ENUM* ioctl calls
  Test: VIDIOC_ENUMAUDIO ...passed
  Test: VIDIOC_ENUMAUDIO, index=S32_MAX ...passed
  Test: VIDIOC_ENUMAUDIO, index=S32_MAX+1 ...passed
  Test: VIDIOC_ENUMAUDIO, index=U32_MAX ...passed
  Test: VIDIOC_ENUMAUDOUT ...passed
  Test: VIDIOC_ENUMAUDOUT, index=S32_MAX ...passed
  Test: VIDIOC_ENUMAUDOUT, index=S32_MAX+1 ...passed
  Test: VIDIOC_ENUMAUDOUT, index=U32_MAX ...passed
  Test: VIDIOC_ENUM_FMT ...passed
  Test: VIDIOC_ENUM_FMT, index=S32_MAX ...passed
  Test: VIDIOC_ENUM_FMT, index=S32_MAX+1 ...FAILED
    1. test_VIDIOC_ENUM_FMT.c:167  - CU_ASSERT_EQUAL(ret_enum,-1)
    2. test_VIDIOC_ENUM_FMT.c:174  - CU_ASSERT_EQUAL(memcmp(&format, &format2, sizeof(format)),0)
  Test: VIDIOC_ENUM_FMT, index=U32_MAX ...FAILED
    1. test_VIDIOC_ENUM_FMT.c:193  - CU_ASSERT_EQUAL(ret_enum,-1)
    2. test_VIDIOC_ENUM_FMT.c:200  - CU_ASSERT_EQUAL(memcmp(&format, &format2, sizeof(format)),0)
  Test: VIDIOC_ENUM_FMT, invalid type ...passed
  Test: VIDIOC_ENUMINPUT ...passed
  Test: VIDIOC_ENUMINPUT, index=S32_MAX ...passed
  Test: VIDIOC_ENUMINPUT, index=S32_MAX+1 ...passed
  Test: VIDIOC_ENUMINPUT, index=U32_MAX ...passed
  Test: VIDIOC_ENUMOUTPUT ...passed
  Test: VIDIOC_ENUMOUTPUT, index=S32_MAX ...passed
  Test: VIDIOC_ENUMOUTPUT, index=S32_MAX+1 ...passed
  Test: VIDIOC_ENUMOUTPUT, index=U32_MAX ...passed
  Test: VIDIOC_ENUMSTD ...passed
  Test: VIDIOC_ENUMSTD, index=S32_MAX ...passed
  Test: VIDIOC_ENUMSTD, index=S32_MAX+1 ...passed
  Test: VIDIOC_ENUMSTD, index=U32_MAX ...passed
  Test: VIDIOC_QUERYCTRL ...FAILED
    1. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    2. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    3. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    4. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    5. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    6. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    7. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    8. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    9. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    10. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    11. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    12. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    13. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    14. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    15. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    16. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    17. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    18. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    19. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    20. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    21. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    22. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    23. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    24. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    25. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    26. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    27. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    28. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    29. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    30. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    31. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    32. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    33. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    34. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    35. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    36. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    37. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    38. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    39. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    40. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    41. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    42. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    43. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    44. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    45. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    46. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    47. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    48. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    49. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    50. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    51. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    52. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    53. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    54. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    55. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    56. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    57. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    58. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    59. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    60. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    61. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    62. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    63. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    64. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    65. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    66. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    67. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    68. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    69. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    70. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    71. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    72. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    73. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    74. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    75. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    76. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
    77. test_VIDIOC_QUERYCTRL.c:102  - 0 < strlen( (char*)queryctrl.name )
    78. test_VIDIOC_QUERYCTRL.c:105  - valid_control_type(queryctrl.type)
  Test: VIDIOC_QUERYCTRL, id=V4L2_CID_BASE-1 ...FAILED
    1. test_VIDIOC_QUERYCTRL.c:223  - CU_ASSERT_EQUAL(ret_query,-1)
    2. test_VIDIOC_QUERYCTRL.c:228  - CU_ASSERT_EQUAL(memcmp(&queryctrl, &queryctrl2, sizeof(queryctrl)),0)
  Test: VIDIOC_QUERYCTRL, id=V4L2_CID_LASTP1 ...FAILED
    1. test_VIDIOC_QUERYCTRL.c:245  - CU_ASSERT_EQUAL(ret_query,-1)
    2. test_VIDIOC_QUERYCTRL.c:250  - CU_ASSERT_EQUAL(memcmp(&queryctrl, &queryctrl2, sizeof(queryctrl)),0)
  Test: VIDIOC_QUERYCTRL, id=V4L2_CID_LASTP1+1 ...FAILED
    1. test_VIDIOC_QUERYCTRL.c:267  - CU_ASSERT_EQUAL(ret_query,-1)
    2. test_VIDIOC_QUERYCTRL.c:272  - CU_ASSERT_EQUAL(memcmp(&queryctrl, &queryctrl2, sizeof(queryctrl)),0)
  Test: VIDIOC_QUERYCTRL with V4L2_CTRL_FLAG_NEXT_CTRL ...FAILED
    1. test_VIDIOC_QUERYCTRL.c:353  - queryctrl.id < V4L2_CID_LASTP1
    2. test_VIDIOC_QUERYCTRL.c:394  - CU_ASSERT_EQUAL(memcmp(count_controls1, count_controls2, sizeof(count_controls1)),0)
  Test: VIDIOC_QUERYCTRL, enumerate private controls ...

and hangs,

during v4l2-test kernel have oops error:

[ 2084.642791] Restoring csi2 context
[ 2084.642852] Saving csi2 context
[ 2084.648162] camera: driver registration complete
[ 2110.169616] Restoring csi2 context
[ 3767.029937] omap3isp omap3isp: __isp_disable_modules: can't stop ccdc
[ 3767.036437] Unable to handle kernel NULL pointer dereference at virtual address 00000024
[ 3767.061279] pgd = c0004000
[ 3767.063995] [00000024] *pgd=00000000
[ 3767.067596] Internal error: Oops: 17 [#1] PREEMPT
[ 3767.072326] last sysfs file: /sys/devices/virtual/video4linux/video0/index
[ 3767.079223] Modules linked in: camera
[ 3767.082916] CPU: 0    Not tainted  (2.6.32 #44)
[ 3767.087493] PC is at isp_buf_init+0x20/0x7c
[ 3767.091674] LR is at isp_buf_init+0x8/0x7c
[ 3767.095794] pc : [<c0370e80>]    lr : [<c0370e68>]    psr: a0000113
[ 3767.095794] sp : dc0efdb0  ip : c06ed838  fp : c0639730
[ 3767.107330] r10: dea69608  r9 : dea694f4  r8 : dea695bc
[ 3767.112579] r7 : dea69000  r6 : dea69a70  r5 : 00000000  r4 : dea69000
[ 3767.119140] r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : dea69000
[ 3767.125701] Flags: NzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[ 3767.132873] Control: 10c5387d  Table: 9cd3c019  DAC: 00000015
[ 3767.138641] Process capture (pid: 978, stack limit = 0xdc0ee2f0)
[ 3767.144683] Stack: (0xdc0efdb0 to 0xdc0f0000)
[ 3767.149047] fda0:                                     00030a8e 00000001 dea69a70 c0371570
[ 3767.157257] fdc0: 00000000 dea69000 c0639730 de614f78 db8dbf00 db5a8f70 00000001 de789f70
[ 3767.165496] fde0: de66bda8 c037383c c0639730 de538800 de614f78 c0381a94 dc11be00 de614f78
[ 3767.173706] fe00: 00000008 dcee6ea0 db5a8f70 c0364d9c 00000000 de614f78 00000008 c00eef84
[ 3767.181915] fe20: 00000000 00000000 00000000 de614f78 00000000 de75ff40 de75ff40 de75ff48
[ 3767.190155] fe40: 000000a0 c00eba08 00000001 00000000 0000000c c006fb88 00000002 dcff4b78
[ 3767.198364] fe60: 00000002 dc0ee000 dc0efee8 c0071800 00000002 dcff4b78 de66bda8 dc0ee000
[ 3767.206573] fe80: 00000002 dc0ee000 dc0efee8 dc0eff68 000000a0 c0071cf8 c003e0c4 dc0dfb84
[ 3767.214813] fea0: 00000009 c008116c dc0effb0 dc0dfae4 dc0effb0 c003e0c4 00000000 dc0effb0
[ 3767.223022] fec0: 00000036 c003e0c4 dc0ee000 40025000 be8deaf4 c0040164 00000001 00000001
[ 3767.231231] fee0: 00000001 de614f78 00000009 00000000 00000000 00000000 00000000 40025000
[ 3767.239471] ff00: be8deaf4 c0364ca4 de614f78 be8deb08 c0445611 c00fb5f4 dcee6ea0 de614f78
[ 3767.247680] ff20: 00000003 c00fbcd4 c0297034 00000000 00000002 dcaf1ea0 dcb77f70 00000002
[ 3767.255889] ff40: 00000000 dcb77f70 dcaf1ea0 0000000c dc0ee000 00000964 0000a068 c00ee320
[ 3767.264129] ff60: 00000000 00000000 00000003 be8deb08 c0445611 de614f78 c003e0c4 dc0ee000
[ 3767.272338] ff80: 40025000 c00fbd50 00000003 00009fb8 00000000 000088cc 00000036 c003e0c4
[ 3767.280548] ffa0: dc0ee000 40025000 be8deaf4 c003df8c fffffe00 c0445611 be8deb08 c0445611
[ 3767.288787] ffc0: 00009fb8 00000000 000088cc 00000036 00000000 00000000 40025000 be8deaf4
[ 3767.296997] ffe0: 00000000 be8dead8 00008a04 400f5aec 60000010 00000003 aaaaaaaa aaaaaaaa
[ 3767.305236] [<c0370e80>] (isp_buf_init+0x20/0x7c) from [<c0371570>] (__isp_disable_modules+0x1f0/0x208)
[ 3767.314666] [<c0371570>] (__isp_disable_modules+0x1f0/0x208) from [<c037383c>] (isp_stop+0x40/0x64)
[ 3767.323760] [<c037383c>] (isp_stop+0x40/0x64) from [<c0381a94>] (omap34xxcam_release+0x34/0xf8)
[ 3767.332519] [<c0381a94>] (omap34xxcam_release+0x34/0xf8) from [<c0364d9c>] (v4l2_release+0x2c/0x3c)
[ 3767.341613] [<c0364d9c>] (v4l2_release+0x2c/0x3c) from [<c00eef84>] (__fput+0x104/0x1f4)
[ 3767.349761] [<c00eef84>] (__fput+0x104/0x1f4) from [<c00eba08>] (filp_close+0x70/0x7c)
[ 3767.357727] [<c00eba08>] (filp_close+0x70/0x7c) from [<c006fb88>] (put_files_struct+0x80/0xd4)
[ 3767.366394] [<c006fb88>] (put_files_struct+0x80/0xd4) from [<c0071800>] (do_exit+0x250/0x6a0)
[ 3767.374969] [<c0071800>] (do_exit+0x250/0x6a0) from [<c0071cf8>] (do_group_exit+0xa8/0xd4)
[ 3767.383270] [<c0071cf8>] (do_group_exit+0xa8/0xd4) from [<c008116c>] (get_signal_to_deliver+0x400/0x458)
[ 3767.392791] [<c008116c>] (get_signal_to_deliver+0x400/0x458) from [<c0040164>] (do_notify_resume+0x74/0x620)
[ 3767.402679] [<c0040164>] (do_notify_resume+0x74/0x620) from [<c003df8c>] (work_pending+0x1c/0x20)
[ 3767.411590] Code: e59020c0 e1a04000 e58033d0 e58033d4 (e5923024)
[ 3767.795532] ---[ end trace 183fb2dea75d41ef ]---
[ 3767.800201] Fixing recursive fault but reboot is needed!

 

i need capture frames in 8bit YUV mode

 

any suggestions?