UVC系列4-定制Android kernel UVC部分支持相对和绝对参数

2024-06-01 06:18

本文主要是介绍UVC系列4-定制Android kernel UVC部分支持相对和绝对参数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、添加参数

在熟悉了android uvc控制参数和UVC协议之后,现在可以着手定制android UVC协议了,添加相对控制参数。

1.1 添加相对控制pan和tilt

第一步,添加相对控制pan和tilt修改的文件是:drivers\media\usb\uvc\uvc_ctrl.c
uvc_control_info uvc_ctrls[]结构体中添加:

{.entity     = UVC_GUID_UVC_CAMERA,.selector  	= UVC_CT_PANTILT_RELATIVE_CONTROL,.index      = 12,.size       = 4,.flags     	= UVC_CTRL_FLAG_SET_CUR|UVC_CTRL_FLAG_GET_RANGE|UVC_CTRL_FLAG_AUTO_UPDATE,
}

在结构体uvc_control_mapping uvc_ctrl_mappings[]中添加:

{.id = V4L2_CID_PAN_RELATIVE,.name = "Pan (Relative)",.entity = UVC_GUID_UVC_CAMERA,.selector = UVC_CT_PANTILT_RELATIVE_CONTROL,.size = 16,.offset = 0,.v4l2_type = V4L2_CTRL_TYPE_INTEGER,.data_type = UVC_CTRL_DATA_TYPE_SIGNED,.get = uvc_ctrl_get_rel_speed,.set = uvc_ctrl_set_rel_speed,
},
{.id = V4L2_CID_TILT_RELATIVE,.name= "Tilt (Relative)",.entity= UVC_GUID_UVC_CAMERA,.selector= UVC_CT_PANTILT_RELATIVE_CONTROL,.size= 16,.offset= 16,.v4l2_type= V4L2_CTRL_TYPE_INTEGER,.data_type= UVC_CTRL_DATA_TYPE_SIGNED,.get= uvc_ctrl_get_rel_speed,.set= uvc_ctrl_set_rel_speed,
}

1.2 添加pan和tilt的速度控制

其中uvc_ctrl_get_rel_speeduvc_ctrl_set_rel_speed映射到的方法对应UVC协议里面的速度控制,在uvc_ctrl.c文件中也要添加这两个方法的实现,与zoom对应的控制方法类似,具体实现方法是:

static __s32 uvc_ctrl_get_rel_speed(structuvc_control_mapping *mapping,__u8query, const __u8 *data)
{intfirst = mapping->offset / 8;__s8rel = (__s8)data[first];switch (query) {case UVC_GET_CUR:return (rel == 0) ? 0 : (rel > 0 ?data[first+1]:-data[first+1]);case UVC_GET_MIN:return -data[first+1];case UVC_GET_MAX:case UVC_GET_RES:case UVC_GET_DEF:default:return data[first+1];
}
}
static void uvc_ctrl_set_rel_speed(structuvc_control_mapping *mapping,__s32 value, __u8 *data)
{intfirst = mapping->offset / 8;data[first] = value == 0 ? 0 : (value > 0)? 1 : 0xff;data[first+1] = min_t(int, abs(value), 0xff);
}

可以看到这里的赋值也是与UVC协议对应的。另外针对绝对控制,目前在结构体uvc_control_mappinguvc_ctrl_mappings[]中的定义是:

{.id             = V4L2_CID_PAN_ABSOLUTE,.name               = "Pan (Absolute)",.entity               = UVC_GUID_UVC_CAMERA,.selector  = UVC_CT_PANTILT_ABSOLUTE_CONTROL,.size          = 32,.offset              = 0,.v4l2_type        = V4L2_CTRL_TYPE_INTEGER,.data_type       = UVC_CTRL_DATA_TYPE_UNSIGNED,
},
{.id             = V4L2_CID_TILT_ABSOLUTE,.name               = "Tilt (Absolute)",.entity               = UVC_GUID_UVC_CAMERA,.selector  = UVC_CT_PANTILT_ABSOLUTE_CONTROL,.size          = 32,.offset              = 32,.v4l2_type        = V4L2_CTRL_TYPE_INTEGER,.data_type       = UVC_CTRL_DATA_TYPE_UNSIGNED,
}

可以看看这两个控制参数的data_type是UVC_CTRL_DATA_TYPE_UNSIGNED,而UVC协议里面定义的是:

1.3 修改参数类型

Value的类型是signed number,此时我们需要将UNSIGNED改为signed,将这个data_type统一改成signed,即UVC_CTRL_DATA_TYPE_SIGNED
下一步uvc_control_mapping uvc_ctrl_mappings[]中添加速度控制的参数,如下:

{.id             = V4L2_CID_PAN_SPEED,.name               = "Pan (Speed)",.entity               = UVC_GUID_UVC_CAMERA,.selector  = UVC_CT_PANTILT_RELATIVE_CONTROL,.size          = 16,.offset              = 0,.v4l2_type        = V4L2_CTRL_TYPE_INTEGER,.data_type       = UVC_CTRL_DATA_TYPE_SIGNED,.get          = uvc_ctrl_get_rel_speed,.set           = uvc_ctrl_set_rel_speed,
},
{.id             = V4L2_CID_TILT_SPEED,.name               = "Tilt (Speed)",.entity               = UVC_GUID_UVC_CAMERA,.selector  = UVC_CT_PANTILT_RELATIVE_CONTROL,.size          =16,.offset              = 16,.v4l2_type        = V4L2_CTRL_TYPE_INTEGER,.data_type       = UVC_CTRL_DATA_TYPE_SIGNED,.get          = uvc_ctrl_get_rel_speed,.set           = uvc_ctrl_set_rel_speed,
}

针对相对控制的两个参数id V4L2_CID_PAN_RELATIVEV4L2_CID_PAN_RELATIVE,两个控制速度的参数V4L2_CID_PAN_SPEEDV4L2_CID_TILT_SPEED需要定义,修改两个文件,第一个文件位置位于drivers\media\v4l2-core\v4l2-ctrls.c文件中,const char *v4l2_ctrl_get_name中添加:

caseV4L2_CID_PAN_RELATIVE:      return"Pan, Relative";
caseV4L2_CID_TILT_RELATIVE:     return"Tilt, Relative";
caseV4L2_CID_PAN_SPEED:         return"Pan, Speed";
caseV4L2_CID_TILT_SPEED:        return"Tilt, Speed";

第二个文件位于include/uapi/linux/v4l2-controls.h,添加定义:

#define V4L2_CID_PAN_RELATIVE                   (V4L2_CID_CAMERA_CLASS_BASE+4)
#define V4L2_CID_TILT_RELATIVE                  (V4L2_CID_CAMERA_CLASS_BASE+5)
#define V4L2_CID_PAN_SPEED                      (V4L2_CID_CAMERA_CLASS_BASE+32)
#define V4L2_CID_TILT_SPEED                     (V4L2_CID_CAMERA_CLASS_BASE+33)

1.4 xml文件修改

另外还有两个xml说明文件,需要添加这两个控制的说明,分别是:

Documentation/DocBook/media/v4l/controls.xml
Documentation/DocBook/media/v4l/compat.xml
具体修改网址可以参考:
https://patchwork.kernel.org/patch/4836491/

至此,android UVC kernel部分定制完毕,下一步就是打通app到底层kernel的通道,将这些代码合入完毕之后,开始编译kernel代码,并刷机重启。

微信公众号:Android部落格

这篇关于UVC系列4-定制Android kernel UVC部分支持相对和绝对参数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1020209

相关文章

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四