imx6q camera驱动添加自己的ioctl

来源:互联网 发布:电脑主题壁纸软件 编辑:程序博客网 时间:2024/06/16 11:04
1 例如我们要添加一个自己的IOCTL,函数如下
static int ioctl_s_mytest(struct v4l2_int_device *s,int para)
{
        ............
        return 0;
}


1.1 在v42-int-device.h添加如下代码:
* IOCTL command numbers. */
enum v4l2_int_ioctl_num {
        /*
         *
         * "Proper" V4L ioctls, as in struct video_device.
         *
         */
        vidioc_int_enum_fmt_cap_num = 1,
        .........
        
        vidioc_int_s_input_mytest,        /* 这里添加自己的ioctl num */


        vidioc_int_priv_start_num = 2000,
};
V4L2_INT_WRAPPER_1(s_mytest, int, *);/* 这里添加自己的ioctl */


1.2 在video decoder 的驱动中(例如adv7180.c\ov5640.c等等)添加自己的ioctl函数,例如
static int ioctl_s_mytest(struct v4l2_int_device *s,int para)
{
        ............
        return 0;
}
这个函数的参数个数和类型可以根据自己的功能自行定义,目前imx6q的原始代码只有一个参数和两个参数的,如果需要更多参数的函数,
需要参考V4L2_INT_WRAPPER_1的宏定义,自己定义。V4L2_INT_WRAPPER_1宏定义在v42-int-device.h中


在video decoder 的驱动中添加
static struct v4l2_int_ioctl_desc xxx_ioctl_desc[] = {


        {vidioc_int_dev_init_num, (v4l2_int_ioctl_func*)ioctl_dev_init},
        ......


        {vidioc_int_s_mytest, (v4l2_int_ioctl_func*)ioctl_s_mytest},


}






1.3 include\uapi\linux\videodev2.h中添加自己的ioctl的宏定义,这个宏定义定义在自己的头文件中也可以,只要没有重复就可以。


#define VIDIOC_MY_TEST        _IOWR('V', 103, int)


1.4 在mxc_v4l2_capture.c 添加
static long mxc_v4l_do_ioctl(struct file *file,  unsigned int ioctlnr, void *arg)
{
        
        case  VIDIOC_MY_TEST:                
        {
                int *para= arg;
         
                vidioc_int_s_mytest(cam->sensor, *(unsigned int *)arg);                
                break;
        }


}


在应用程序中调用的例子
        int fd_capture_v4l ;
        int para = 3 ;
        fd_capture_v4l = open("/dev/video0", O_RDWR, 0);
        .......
        if (ioctl(fd_capture_v4l, VIDIOC_MY_TEST, &para) < 0)
        {
                 
                return -1;
        }
        ........
        close(fd_capture_v4l);
        
        


2 video decoder 的驱动与mxc_v4l2_capture的匹配
  imx6q 有两个capture,如果板上有两个video decoder ,是通过dts中的csi_id来匹配的
  在v4l2_cap_0、v4l2_cap_1中定义的有csi_id,
  在例如ov564x、adv7180等的dts中也有csi_id的定义,我们只要修改这个csi_id的数值,就可以确定video decoder和哪个capture匹配。