rp_rv1126开发板UVC XU扩展协议功能验证

enum XuCmd {
CMD_TOOLS_CTRL_1 = 0x01, //RK工具通信指令,如loader切换功能
CMD_GET_CAMERA_VERSION , //获取摄像头版本
CMD_SET_CAMERA_IP, //获取网络IP
//CMD_START_CAMERA, //启动摄像头
CMD_SHUTDOWN_CAMERA, //关闭摄像头
CMD_RESET_CAMERA, //重启摄像头
CMD_SET_MOTOR_RATE = 0x06, //摄像头舵机/电机控制预留接口
CMD_SET_MOTOR_BY_STEPS = 0x07, //摄像头舵机/电机控制预留接口
CMD_SET_MOTOR_BY_USER = 0x08, //摄像头舵机/电机控制预留接口
CMD_STOP_MOTOR_BY_USER = 0x09, //摄像头舵机/电机控制预留接口
CMD_SET_EPTZ = 0x0a, //EPTZ功能使能控制
CMD_SET_H265 = 0x0b, //H265切换
CMD_MAX_NUM = CMD_SET_H265,
};

以上是厂商预留的控制命令。其中CMD_TOOLS_CTRL_1、CMD_GET_CAMERA_VERSION、
CMD_SET_CAMERA_IP、CMD_SET_EPTZ有进行相关处理,其余目前暂无功能。
SDK默认XU扩展指令只开启3条,我们需要修改到16个,可以参考下面补丁修改kernel进行适配。
kernel/drivers/usb/gadget/function/f_uvc.c

@@ -1002,7 +1002,7 @@ static struct usb_function_instance *uvc_alloc_inst(void)
struct uvc_camera_terminal_descriptor *cd;
struct uvc_processing_unit_descriptor *pd;
struct uvc_output_terminal_descriptor *od;
- struct UVC_EXTENSION_UNIT_DESCRIPTOR(1, 1) *ed;
+ struct UVC_EXTENSION_UNIT_DESCRIPTOR(1, 2) *ed;
struct uvc_color_matching_descriptor *md;
struct uvc_descriptor_header **ctl_cls;
int ret;
@@ -1052,31 +1052,32 @@ static struct usb_function_instance *uvc_alloc_inst(void)
od->iTerminal = 0;
ed = &opts->uvc_extension;
- ed->bLength = UVC_DT_EXTENSION_UNIT_SIZE(1, 1);
+ ed->bLength = UVC_DT_EXTENSION_UNIT_SIZE(1, 2);
ed->bDescriptorType = USB_DT_CS_INTERFACE;
ed->bDescriptorSubType = UVC_VC_EXTENSION_UNIT;
ed->bUnitID = 6; //UnitID和guidExtensionCode似情况修改
ed->guidExtensionCode[0] = 0xa2;
ed->guidExtensionCode[1] = 0x9e;
ed->guidExtensionCode[2] = 0x76;
ed->guidExtensionCode[3] = 0x41;
ed->guidExtensionCode[4] = 0xde;
ed->guidExtensionCode[5] = 0x04;
ed->guidExtensionCode[6] = 0x47;
ed->guidExtensionCode[7] = 0xe3;
ed->guidExtensionCode[8] = 0x8b;
ed->guidExtensionCode[9] = 0x2b;
ed->guidExtensionCode[10] = 0xf4;
ed->guidExtensionCode[11] = 0x34;
ed->guidExtensionCode[12] = 0x1a;
ed->guidExtensionCode[13] = 0xff;
ed->guidExtensionCode[14] = 0x00;
ed->guidExtensionCode[15] = 0x3b;
- ed->bNumControls = 3;
+ ed->bNumControls = 0x10; //和下面bmControls数组匹配,开启16个指令功能,uvc app中有
实现几个指令功能就开启几个,没实现的指令位置建议关闭,避免兼容问题
ed->bNrInPins = 1;
ed->baSourceID[0] = 2;
- ed->bControlSize = 1;
- ed->bmControls[0] = 7;
+ ed->bControlSize = 2; //支持2个字节,16条指令
+ ed->bmControls[0] = 0xff; //使能前8条指令
+ ed->bmControls[1] = 0xff; //使能后8条指令
ed->iExtension = 0;

kernel/drivers/usb/gadget/function/u_uvc.h

#include <linux/usb/video.h>
#define fi_to_f_uvc_opts(f) container_of(f, struct f_uvc_opts, func_inst)
-DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(1, 1);
+DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(1, 2);
struct f_uvc_opts {
struct usb_function_instance func_inst;
@@ -54,7 +54,7 @@ struct f_uvc_opts {
struct uvc_camera_terminal_descriptor uvc_camera_terminal;
struct uvc_processing_unit_descriptor uvc_processing;
struct uvc_output_terminal_descriptor uvc_output_terminal;
- struct UVC_EXTENSION_UNIT_DESCRIPTOR(1, 1) uvc_extension;
+ struct UVC_EXTENSION_UNIT_DESCRIPTOR(1, 2) uvc_extension;
struct uvc_color_matching_descriptor uvc_color_matching;
/*

RV1126/RV1109使用AUTO EPTZ功能,需将dts中的otp节点使能,evb默认配置中已将其使能:

&otp {
status = "okay";
};

将上述配置修改之后,重新编译固件,烧录到开发板中。
待烧录成功,重启后,连接电脑.
使用大神提供的调试软件

请添加图片描述

我们使用EPTZ功能,文章最开始有描述

CMD_SET_EPTZ = 0x0a, //EPTZ功能使能控制

所以我们填入CS为10,点击打开,发送命令1,即可enableEPTZ功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值