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

相关文章

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D