Linux V4L2驱动调用video_register_device返回EINVAL无效参数问题排查
问题原因
你使用的Raspbian 11对应5.10版本内核,该版本的V4L2子系统增加了更多参数合法性检查,当前代码存在三处问题触发了EINVAL错误:
struct video_device的vfl_dir字段未初始化,5.10内核注册视频设备时会强制校验该字段的合法性struct v4l2_capability的device_caps和version字段未按要求填充- 注册失败后的资源释放顺序错误,可能引发次生异常
修复步骤
- 在初始化video_device的代码块中添加vfl_dir配置,指定设备为视频捕获类型:
ar->vdev.ioctl_ops = &ar_ioctl_ops; ar->vdev.release = video_device_release_empty; // 新增配置行 ar->vdev.vfl_dir = VFL_DIR_RX; video_set_drvdata(&ar->vdev, ar);
- 补全ar_querycap函数中v4l2_capability的未填字段:
strlcpy(vcap->bus_info, "Mark test BUS", sizeof(vcap->bus_info)); // 新增两行配置 vcap->version = KERNEL_VERSION(0, 0, 1); vcap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE; vcap->capabilities = vcap->device_caps | V4L2_CAP_DEVICE_CAPS;
- 修正错误的资源释放顺序,先卸载视频设备再卸载V4L2设备:
out_dev: video_unregister_device(&ar->vdev); v4l2_device_unregister(&ar->v4l2_dev);
验证
修改后重新编译模块,执行insmod加载即可正常注册设备,可通过ls /dev/video*查看生成的设备节点。
内容的提问来源于stack exchange,提问作者somebody4
相关产品推荐
相关产品推荐

