概括
我目前正在尝试v4l2_ctrl_handler_setup
在 Linux 内核驱动程序中调用后将自定义 V4L2 控件添加到 V4L2 设备。但是似乎没有添加控件(运行时不显示v4l2-ctl --list-ctrls
)。下面通常是我试图采取的方法。
static int add_custom_v4l2_ctrls(struct tegracam_device *tc_dev)
{
struct camera_common_data *s_data = tc_dev->s_data;
struct v4l2_ctrl_handler *ctrl_handler = s_data->ctrl_handler;
struct v4l2_ctrl *ctrl;
int err = 0;
static struct v4l2_ctrl_config my_control = {
.ops = &my_custom_ctrl_ops,
.id = TEGRA_CAMERA_CID_BASE+150,
.name = "My control",
.type = V4L2_CTRL_TYPE_INTEGER,
.flags = V4L2_CTRL_FLAG_SLIDER,
.min = 0,
.max = 1,
.def = 0,
.step = 1,
};
// Increment number of controls
tc_dev->numctrls++;
s_data->numctrls++;
ctrl = v4l2_ctrl_new_custom(ctrl_handler, &my_control, NULL);
if(ctrl == NULL) {
dev_err(tc_dev->dev, "Failed to init ctrl");
return -EIO;
}
// err = v4l2_ctrl_handler_setup(ctrl_handler);
if(err) {
printk("FAILED");
}
return 0;
}
此代码片段在有效调用v4l2_ctrl_handler_setup
and之后运行v4l2_async_register_subdev
。
问题
注册设备后是否可以添加自定义 V4L2 控件?如果是这样,我的方法有什么问题导致控件不显示?
更多信息
该驱动程序是使用 NVIDIA 的 Tegracam V2 框架实现的,该框架抽象了 V4L2 设置代码,包括添加控件,目前它不公开添加自定义 V4L2 控件的能力,这是这种方法背后的原因。