Linux 获取v4l2中布尔控件的值

Linux 获取v4l2中布尔控件的值,linux,linux-device-driver,v4l2,Linux,Linux Device Driver,V4l2,我正在试着调整照相机的亮度。在设置亮度之前,我试图检查亮度是否处于自动模式。我们可以通过检查volatile标志来实现,但我运行的内核版本2.6.32没有此功能。因此,另一个选项是检查V4L2\u CID\u AUTOBRIGHTNESS,我正在这样做,但它返回了EINVAL 我使用以下代码获取值: struct v4l2_control control; control.id = V4L2_CID_BRIGHTNESS; // This is working fine //con

我正在试着调整照相机的亮度。在设置亮度之前,我试图检查亮度是否处于自动模式。我们可以通过检查volatile标志来实现,但我运行的内核版本2.6.32没有此功能。因此,另一个选项是检查V4L2\u CID\u AUTOBRIGHTNESS,我正在这样做,但它返回了EINVAL

我使用以下代码获取值:

struct v4l2_control control;

control.id = V4L2_CID_BRIGHTNESS;       // This is working fine
//control.id = V4L2_CID_AUTOBRIGHTNESS; // This is giving EINVAL in ioctl


if (-1 == ioctl(camDesc, VIDIOC_G_CTRL, &control))
   cerr << "VIDIOC_G_CTRL" << "   ::  " << errno << endl ;
else
   cout << "Successfully got property. Value :: " << control.value << endl;
struct v4l2\u控件;
control.id=V4L2\u CID\u亮度;//这很好用
//control.id=V4L2\u CID\u AUTOBRIGHTNESS;//这是在ioctl中给EINVAL的
if(-1==ioctl(camDesc、VIDIOC\u G\u CTRL和control))

cerr在V4L2中,IOCTL集主要在实际传感器一侧实现(或未实现)。这一次也不例外。因此,这里有两个潜在的问题:a)实际传感器的驱动程序没有实现特定的IOCTL,b)IOCTL只是设置一个属性,尽管我认为您仍然可以读取最后一个设置值。

一些属性(用户控件)可以被禁用,因此如果我们使用v4l2\u控件直接更改该值,,那么它可能会给出一些错误

最好的方法是,使用queryctrl检查适当的标志,然后设置实际值

struct v4l2_queryctrl queryctrl;
queryctrl.id = V4L2_CID_BRIGHTNESS;  // V4L2_CID_AUTOBRIGHTNESS i.e. any user ctrl

if (-1 == ioctl(camDesc, VIDIOC_QUERYCTRL, &queryctrl))
{
   if (errno != EINVAL)
      exit(EXIT_FAILURE);
   else
   {
      cerr << "ERROR :: Unable to set property (NOT SUPPORTED)\n";
      exit(EXIT_FAILURE);
    }
}
else if (queryctrl.flags & V4L2_CTRL_FLAG_DISABLED)
{
   cout << "ERROR :: Unable to set property (DISABLED).\n";
   exit(EXIT_FAILURE);
}
else
{
  struct v4l2_control control;
  control.id = queryctrl.id;
  control.value = eValue;      // Any value

  if (-1 == ioctl(camDesc, VIDIOC_S_CTRL, &control))
     exit(EXIT_FAILURE);
  cout << "Successfully set property." << endl;

}
struct v4l2\u queryctrl queryctrl;
queryctrl.id=V4L2\u CID\u亮度;//V4L2\u CID\u自动权限,即任何用户ctrl
if(-1==ioctl(camDesc、VIDIOC\u QUERYCTRL和QUERYCTRL))
{
如果(错误号!=EINVAL)
退出(退出失败);
其他的
{

cerr感谢您的回复。您在第(b)点中提到,IOCTL仅用于设置属性,但您也可以使用IOCTL获取属性。它由请求的值控制。在我的例子中,如果您将传递VIDIOC_G_CTRL,则您将获取属性,如果是VIDIOC_S_CTRL,则您将获取属性。是的,因为属性通常缓存在内部结构中(有些司机可能不是这样)。