UVC框架下USB摄像头驱动之设置属性

1. 在视频驱动程序中设置属性主要涉及3个ioctl :

VIDIOC_QUERYCTRL
VIDIOC_G_CTRL
VIDIOC_S_CTRL

2. 硬件上怎么设置属性呢?

2.1 UVC规划定义了那些属性:定义在uvc_ctrl.c里面的数组


static struct uvc_control_info uvc_ctrls[] = {{.entity		= UVC_GUID_UVC_PROCESSING, //属于哪一个entity .selector	= UVC_PU_BRIGHTNESS_CONTROL,//用于亮度.index		= 0,// 对应Processing Unit Descriptor 的bmControls[0].size		= 2,//数据长度2个字节.flags		= UVC_CTRL_FLAG_SET_CUR| UVC_CTRL_FLAG_GET_RANGE| UVC_CTRL_FLAG_RESTORE,},
}

2.2 设备支持哪些属性呢

这需要具体去看设备描述符,比如 Processing Unit Descriptor 的bmControls值为7f 14
可知BIT0 为1 表示支持BRIGHTNESS

在代码中

uvc_ctrl_init_device(dev) 

对于每一个entity(IT,PU,SU,OT等)

list_for_each_entry(entity, &dev->entities, list) 

分别提取对应的控制集(bmControls)以及控制的大小(bControlSize)

if (UVC_ENTITY_TYPE(entity) == UVC_VC_EXTENSION_UNIT) {bmControls = entity->extension.bmControls;bControlSize = entity->extension.bControlSize;} else if (UVC_ENTITY_TYPE(entity) == UVC_VC_PROCESSING_UNIT) {bmControls = entity->processing.bmControls;bControlSize = entity->processing.bControlSize;

计算bmControls 里面1 的个数 也就是支持的属性个数

		ncontrols = memweight(bmControls, bControlSize);

为每一个属性分配一个struct uvc_control

entity->controls = kcalloc(ncontrols, sizeof(*ctrl),GFP_KERNEL);

设置这些struct uvc_control

ctrl = entity->controls;for (i = 0; i < bControlSize * 8; ++i) {if (uvc_test_bit(bmControls, i) == 0)continue;ctrl->entity = entity;ctrl->index = i;uvc_ctrl_init_ctrl(dev, ctrl);ctrl++;}

2.3 怎么去操控这些属性呢

参考

uvc_ioctl_queryctrl
---->uvc_query_v4l2_ctrl(chain, qc);
------>uvc_find_control

关于结构体 uvc_control_mapping 用来更加细致的描述 属性


struct uvc_control_mapping {struct list_head list;struct list_head ev_subs;__u32 id; __u8 name[32];__u8 entity[16];__u8 selector;__u8 size;__u8 offset;enum v4l2_ctrl_type v4l2_type;__u32 data_type;struct uvc_menu_info *menu_info;__u32 menu_count;__u32 master_id;__s32 master_manual;__u32 slave_ids[2];__s32 (*get) (struct uvc_control_mapping *mapping, __u8 query,const __u8 *data);void (*set) (struct uvc_control_mapping *mapping, __s32 value,__u8 *data);
};

例如

{.id		= V4L2_CID_BRIGHTNESS,  // APP根据ID来找到对应的属性.name		= "Brightness",.entity		= UVC_GUID_UVC_PROCESSING,  // 属于哪了个entity(比如PU).selector	= PU_BRIGHTNESS_CONTROL,    // 用于亮度.size		= 16,                       // 数据占多少位.offset		= 0,                        // 从哪位开始.v4l2_type	= V4L2_CTRL_TYPE_INTEGER,   // 属性类别.data_type	= UVC_CTRL_DATA_TYPE_SIGNED,// 数据类型},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Crash Course Computer Science1

Hello world, Im Carrie Anne, and welcome to Crash Course Computer Science! Hello world&#xff01;我是 Carrie Anne&#xff0c;欢迎收看计算机科学速成课&#xff01; Over the course of this series, were going to go from bits, bytes, transistors and logic gat…

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

Python模块和包全解析,一篇文章就够!

目录 1. 创建模块 2. 导入模块 3. 使用模块中的函数和变量 4. 什么是包&#xff1f; 5. 导入包和模块 5.1 相对导入&#xff08;Relative Import&#xff09; 5.2 绝对导入&#xff08;Absolute Import&#xff09; 6. 使用包中的模块 7. 包的初始化和清理 8. 常见的…

代码随想录算法训练营第二十三天 | 77. 组合

回溯 77. 组合 题目链接&#xff1a;https://leetcode.cn/problems/combinations/ 文章讲解&#xff1a;https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ti4y1L7cv/ class Solution { private:vector<…

打卡学习kubernetes——了解五种控制器类型

目录 1 Deployment控制器 2 StatefulSet控制器 3 DaemonSet控制器 4 Job控制器 5 CronJob控制器 1 Deployment控制器 Deployment为Pod和Replica Set&#xff08;下一代Replication Controller&#xff09;提供声明式更新。 Deployment运行无状态应用&#xff0c;一般情况…

圈子社交系统-多人语音-交友-陪玩-活动报名-商城-二手论坛-源码交付,支持二开!

圈子小程序适用于多种场景&#xff0c;涵盖了各个领域的社交需求。以下是一些常见的适用场景&#xff1a; 兴趣社区&#xff1a; 用户可以加入自己感兴趣的圈子&#xff0c;与志同道合的人一起讨论交流&#xff0c;分享经验和知识。 行业交流&#xff1a; 各个行业可以建立自…

五、自然语言的学习之路

NLP学习笔记系列&#xff0c;欢迎收藏交流&#xff1a; 零、自然语言处理开篇-CSDN博客 一、NLP中的文本分类-CSDN博客 二、NLP中的序列标注&#xff08;分词、主体识别&#xff09;-CSDN博客 三、NLP中的句子关系判断-CSDN博客 四、自然语言中的生成式任务-CSDN博客 0、算…

反射整理学习

目录 1、反射介绍 2、反射API 2.1 获取类对应的字节码的对象&#xff08;三种&#xff09; 2.2 常用方法 3、反射的应用 3.1 创建 : 测试物料类 3.2 获取类对象 3.3 获取成员变量 3.4 通过字节码对象获取类的成员方法 3.5 通过字节码对象获取类的构造方法 4、创建对象…

突发想法2:浏览器的缓存有什么作用?为什么有了缓存,一开始较快,缓存多了打开某些网站会变慢?

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、问题二、解决1、为什么第一次打开时那么慢&#xff…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

由世界第一个AI软件工程师Devin引发的热潮背后----程序员到底会不会被代替?AI发展至如今是否初衷已变?

目录 一.Devin的登场是突破也是导火索 二.Devin的"逆天"能力 1、端到端构建和部署程序 2、自主查找并修复bug 3、训练和微调自己的AI模型 4、修复开源库 5、成熟的生产库也能做贡献 6、学习能力 三.Devin的出现甚至整个AI领域的进步,编程还有未来吗? 1.业…

接上一篇:分布式调用链追踪系统设计

所以必须得记录父子关系&#xff1a; A---->B 是 B---->C 的父调用 A---->D 是 D---->E 的父调用 A---->D 还是 D---->F 的父调用 如何记录呢&#xff1f;需要给每个调用分配一个ID (称为 SpanID)&#xff0c;并且把这个 ID 传递给子调用&#xff0c; 子…

c++ 常用函数 集锦 整理中

c 常用函数集锦 目录 1、string和wstring之间转换 1、string和wstring之间转换 std::string convertWStringToString(std::wstring wstr) {std::string str;if (!wstr.empty()){std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;str converter.to_b…

对文本数据进行关键词提取,可以采用哪些算法?具体实现流程是什么样的?

The question 1: 对文本数据进行关键词提取&#xff0c;可以采用哪些算法&#xff1f;具体实现流程是什么样的&#xff1f; 一、常见的关键词提取算法&#xff1a; TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;: TF-IDF是一种统计方法&#xf…

mysql日志分析工具

我们使用命令去查看慢sql是一个比较麻烦的过程&#xff0c;这个时候&#xff0c;我们就用到了mysql日志分析工具mysqldumpslow使用当前命令时确保开启了慢sql日志 点击 简单使用 通过mysqldumpslow --help来查询命令的使用方法 mysqldumpslow 是一个用于分析慢查询日志的工具…

什么是多路复用

多路复用是一种技术&#xff0c;允许多个输入或输出流共享一个单一的通信信道或计算资源。通过多路复用&#xff0c;多个数据流可以同时在同一个通道上传输&#xff0c;提高了通信效率和资源利用率。 在计算机网络中&#xff0c;多路复用常用于实现同时传输多个数据流&#xf…

人工智能入门之旅:从基础知识到实战应用(六)

一、人工智能学习之路总结 人工智能学习的关键点与挑战可以总结如下: 关键点: 理论基础: 理解机器学习、深度学习等人工智能的基本原理和算法是学习的基础,包括线性代数、概率统计、微积分等数学知识,以及神经网络、卷积神经网络、循环神经网络等模型的原理。 实践项目:…

mac切换本地node版本

1.首先安装n模块&#xff1a; sudo npm install -g n2.升级node.js到最新稳定版 // 升级到最新版本 sudo n latest// 升级到稳定版本 sudo n stable// 升级到具体版本号 sudo n xx.xx// 最新稳定版本 sudo n lts3.切换使用版本 sudo n 7.10.04.删除指定版本 sudo n rm 7.10.05.…

2024.3.14

成员函数版本实现算术运算符的重载 全局函数版本实现算术运算符的重载 #include <iostream> using namespace std; class Number//定义一个数字类 {//因为a和b是私有成员&#xff0c;全局进行访问需要要friend进行声明friend const Number operator*(const Number &…

软件设计师16--段页式存储

软件设计师16--段页式存储 考点1&#xff1a;页式存储存储管理 - 页式存储组织存储管理 - 页面置换算法例题&#xff1a; 考点2&#xff1a;段式存储存储管理 - 段式存储组织例题&#xff1a; 考点1&#xff1a;页式存储 存储管理 - 页式存储组织 页式存储&#xff1a;将程序…