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

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期