全志 v4l2 VIDIOC_S_CTRL 报错Inappropriate ioctl for device

本文详细分析了一个热成像UVC摄像头在使用v4l2VIDIOC_S_CTRL时遇到的报错问题,通过对比内核与应用程序中VIDIOC_S_CTRL的定义差异,发现全志修改了v4l2_control结构体,最终通过调整应用程序头文件解决了该问题。

最近,有个热成像的uvc摄像头,在v4l2 ioctlv4l2 VIDIOC_S_CTRL报错

v4l2 VIDIOC_S_CTRL 报错
错误信息:
    iioctl(fd, VIDIOC_S_CTRL, &ctrl) == -1)
    报错: Inappropriate ioctl for device

跟踪内核代码:linux-3.4/drivers/media/video/uvc/uvc_v4l2.c
函数: uvc_v4l2_do_ioctl()

     default:
         uvc_trace(UVC_TRACE_IOCTL, "Unknown ioctl 0x%08x\n", cmd);
         return -ENOTTY;
     }
没找到命令? 奇怪了,
根据信息 uvcvideo: Unknown ioctl 0xc008561c
难度VIDIOC_S_CTRL的值不为0xc008561c,在内核打印VIDIOC_S_CTRL的值为:c00c561c
说明VIDIOC_S_CTRL的定义在应用程序头文件和内核不一样
内核查找VIDIOC_S_CTRL定义
include/linux/videodev2.h:2497:#define VIDIOC_S_CTRL            _IOWR('V', 28, struct v4l2_control)

应用程序定义
libc/usr/include/linux/videodev2.h:1874:#define VIDIOC_S_CTRL         _IOWR('V', 28, struct v4l2_control)

看似应该是一样,差别应该在_IOWR和struct v4l2_control的定义,
继续查找struct v4l2_control定义
内核:
1147 /*
1148  *  C O N T R O L S
1149  */
1150 struct v4l2_control {
1151     __u32            id;
1152     __s32            value;
1153     __u32                user_pt;   /* Add user pointer by raymonxiu */
1154 };

应用程序
libc/usr/include/linux/videodev2.h
/*
 *      C O N T R O L S
 */
struct v4l2_control {
        __u32                id;
        __s32                value;
};
终于明白了,全志修改了v4l2_control定义

[问题解决]
    在libc/usr/include/linux/videodev2.h头文件修改
struct v4l2_control {
        __u32                id;
        __s32                value;
};

struct v4l2_control {
    __u32            id;
    __s32            value;
    __u32                user_pt;   /* Add user pointer by raymonxiu */
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值