RK平台瑞发科NS6601 MIPI CSI VC虚拟通道支持不同分辨率

需求:两路不同分辨率的摄像头,通过des后输入给一路MIPI CSI。在capture的时候,可以分别支持不同分辨率的capture动作。

设备树

&i2c2 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&i2c2m4_xfer>;clock-frequency = <400000>;ns6601_dcphy1: ns6601@6b {compatible = "norelsys,ns6601";status = "okay";reg = <0x6b>;clock-names = "xvclk";clocks = <&ns6601_dcphy1_osc0 0>;pinctrl-names = "default";pinctrl-0 =  <&ns6601_dcphy1_pwdn>, <&ns6601_dcphy1_errb>, <&ns6601_dcphy1_lock>;power-domains = <&power RK3588_PD_VI>;rockchip,grf = <&sys_grf>;pwdn-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_HIGH>;lock-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_HIGH>;rockchip,camera-module-index = <0>;rockchip,camera-module-facing = "back";rockchip,camera-module-name = "ns6601";rockchip,camera-module-lens-name = "ns6601";port {ns6601_dcphy1_out: endpoint {remote-endpoint = <&mipi_dcphy1_in_ns6601>;data-lanes = <1 2>;};};/* support mode config start */support-mode-config {status = "okay";bus-format = <MEDIA_BUS_FMT_UYVY8_2X8>;sensor-width = <1600>;sensor-height = <1200>;max-fps-numerator = <10000>;max-fps-denominator = <300000>;bpp = <16>;link-freq-idx = <20>;//vc-array = <0x10 0x20 0x40 0x80>; // VC0~3: bit4~7vc-info = </* enable width height bus_fmt data_type data_bit */1 1920 1080 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc01 1600 1200 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc11 1600 1200 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc21 1600 1200 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc3>;};};

差分代码

Change-Id: I7c88f3dfd386fe3796260351b0cd4d5c1000b983
---.../rk3588-vehicle-maxim-cameras-s66.dtsi     |  11 +-drivers/media/i2c/ns6601.c                    | 108 +++++++++++++++++-2 files changed, 115 insertions(+), 4 deletions(-)diff --git a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-maxim-cameras-s66.dtsi b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-maxim-cameras-s66.dtsi
index 39d7a9f0857e..2951c6ad62df 100644
--- a/arch/arm64/boot/dts/rockchip/rk3588-vehicle-maxim-cameras-s66.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3588-vehicle-maxim-cameras-s66.dtsi
@@ -304,12 +304,19 @@bus-format = <MEDIA_BUS_FMT_UYVY8_2X8>;sensor-width = <1600>;
-			sensor-height = <1080>;
+			sensor-height = <1200>;max-fps-numerator = <10000>;max-fps-denominator = <300000>;bpp = <16>;link-freq-idx = <20>;
-			vc-array = <0x10 0x20 0x40 0x80>; // VC0~3: bit4~7
+			//vc-array = <0x10 0x20 0x40 0x80>; // VC0~3: bit4~7
+			vc-info = <
+					/* enable width height bus_fmt data_type data_bit */
+					1 1920 1080 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc0
+					1 1600 1200 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc1
+					1 1600 1200 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc2
+					1 1600 1200 MEDIA_BUS_FMT_UYVY8_2X8 0 0 // vc3
+			>;};};};
diff --git a/drivers/media/i2c/ns6601.c b/drivers/media/i2c/ns6601.c
index 0ce036f8851e..be7cd0566cc9 100644
--- a/drivers/media/i2c/ns6601.c
+++ b/drivers/media/i2c/ns6601.c
@@ -48,6 +48,19 @@#define NS6601_NAME			"ns6601"+struct ns6601_vc_info {
+	u32 enable; // 0: disable, !0: enable
+	u32 width;
+	u32 height;
+	u32 bus_fmt;
+	/*
+	* the following are optional parameters, user-defined data types
+	*   default 0: invalid parameter
+	*/
+	u32 data_type;
+	u32 data_bit;
+};
+struct ns6601_mode {u32 width;u32 height;
@@ -59,6 +72,7 @@ struct ns6601_mode {u32 bus_fmt;u32 bpp;u32 vc[PAD_MAX];
+	struct ns6601_vc_info vc_info[PAD_MAX];};struct ns6601_hot_plug_work {
@@ -404,12 +418,53 @@ ns6601_set_vicap_rst_inf(struct ns6601 *ns6601,ns6601->is_reset = rst_info.is_reset;}+static int ns6601_get_channel_info(struct ns6601 *ns6601, struct rkmodule_channel_info *ch_info)
+{
+	const struct ns6601_mode *mode = ns6601->cur_mode;
+	struct device *dev = &ns6601->client->dev;
+
+	if (ch_info->index < PAD0 || ch_info->index >= PAD_MAX)
+		return -EINVAL;
+
+	if (mode->vc_info[ch_info->index].enable) {
+		ch_info->vc = mode->vc[ch_info->index];
+
+		ch_info->width = mode->vc_info[ch_info->index].width;
+		ch_info->height = mode->vc_info[ch_info->index].height;
+		ch_info->bus_fmt = mode->vc_info[ch_info->index].bus_fmt;
+
+		/* optional parameters, default 0: invalid parameter */
+		ch_info->data_type = mode->vc_info[ch_info->index].data_type;
+		ch_info->data_bit = mode->vc_info[ch_info->index].data_bit;
+	} else {
+		ch_info->vc = mode->vc[ch_info->index];
+
+		ch_info->width = mode->width;
+		ch_info->height = mode->height;
+		ch_info->bus_fmt = mode->bus_fmt;
+	}
+
+	dev_info(dev, "get channel info, ch_info->index = %d\n", ch_info->index);
+
+	dev_info(dev, "    ch_info->vc = 0x%x\n", ch_info->vc);
+
+	dev_info(dev, "    ch_info->width = %d\n", ch_info->width);
+	dev_info(dev, "    ch_info->height = %d\n", ch_info->height);
+	dev_info(dev, "    ch_info->bus_fmt = 0x%x\n", ch_info->bus_fmt);
+
+	dev_info(dev, "    ch_info->data_type = 0x%x:\n", ch_info->data_type);
+	dev_info(dev, "    ch_info->data_bit = %d\n", ch_info->data_bit);
+
+	return 0;
+}
+static long ns6601_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg){struct ns6601 *ns6601 = v4l2_get_subdevdata(sd);struct rkmodule_csi_dphy_param *dphy_param;long ret = 0;u32 stream = 0;
+	struct rkmodule_channel_info *ch_info;switch (cmd) {case RKMODULE_GET_MODULE_INFO:
@@ -445,6 +500,10 @@ static long ns6601_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)*dphy_param = rk3588_dcphy_param;dev_dbg(&ns6601->client->dev, "sensor get dphy param\n");break;
+	case RKMODULE_GET_CHANNEL_INFO:
+		ch_info = (struct rkmodule_channel_info *)arg;
+		ret = ns6601_get_channel_info(ns6601, ch_info);
+		break;default:ret = -ENOIOCTLCMD;break;
@@ -1173,8 +1232,16 @@ static int ns6601_get_selection(struct v4l2_subdev *sd,struct v4l2_subdev_selection *sel){struct ns6601 *ns6601 = v4l2_get_subdevdata(sd);
+	int i = 0;if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) {
+		/* if multiple channel info enable, get_selection isn't support */
+		for (i = 0; i < PAD_MAX; i++) {
+			if (ns6601->cur_mode->vc_info[i].enable) {
+				v4l2_warn(sd, "Multi-channel enable, get_selection isn't support\n");
+				return -EINVAL;
+			}
+		}sel->r.left = 0;sel->r.width = ns6601->cur_mode->width;sel->r.top = 0;
@@ -1279,6 +1346,7 @@ static int ns6601_support_mode_init(struct ns6601 *ns6601)struct ns6601_mode *mode = NULL;u32 value = 0, vc_array[PAD_MAX];int ret = 0, i = 0, array_size = 0;
+	struct ns6601_vc_info vc_info[PAD_MAX];dev_info(dev, "=== ns6601 support mode init ===\n");@@ -1371,9 +1439,45 @@ static int ns6601_support_mode_init(struct ns6601 *ns6601)dev_info(dev, "vc-array[%d] property: 0x%x\n", i, vc_array[i]);mode->vc[i] = vc_array[i];}
+		
+		for (i = 0; i < PAD_MAX; i++)
+			dev_info(dev, "support mode: vc[%d] = 0x%x\n", i, mode->vc[i]);
+	}
+
+	/* vc info */
+	array_size = of_property_count_u32_elems(node, "vc-info");
+	if ((array_size > 0) &&
+			(array_size % sizeof(struct ns6601_vc_info) == 0) &&
+			(array_size <= sizeof(struct ns6601_vc_info) * PAD_MAX)) {
+
+		memset((char *)vc_info, 0, sizeof(vc_info));
+
+		ret = of_property_read_u32_array(node, "vc-info", (u32 *)vc_info, array_size);
+		if (ret == 0) {
+			/* <enable width height bus_fmt data_type data_bit> */
+			for (i = 0; i < PAD_MAX; i++) {
+				dev_info(dev, "vc-info[%d] property:\n", i);
+				dev_info(dev, "    vc-info[%d].enable = %d:\n", i, vc_info[i].enable);
+
+				dev_info(dev, "    vc-info[%d].width = %d:\n", i, vc_info[i].width);
+				dev_info(dev, "    vc-info[%d].height = %d:\n", i, vc_info[i].height);
+				dev_info(dev, "    vc-info[%d].bus_fmt = %d:\n", i, vc_info[i].bus_fmt);
+
+				dev_info(dev, "    vc-info[%d].data_type = %d:\n", i, vc_info[i].data_type);
+				dev_info(dev, "    vc-info[%d].data_bit = %d:\n", i, vc_info[i].data_bit);
+
+				mode->vc_info[i].enable = vc_info[i].enable;
+
+				mode->vc_info[i].width = vc_info[i].width;
+				mode->vc_info[i].height = vc_info[i].height;
+				mode->vc_info[i].bus_fmt = vc_info[i].bus_fmt;
+
+				mode->vc_info[i].data_type = vc_info[i].data_type;
+				mode->vc_info[i].data_bit = vc_info[i].data_bit;
+
+			}
+		}}
-	for (i = 0; i < PAD_MAX; i++)
-		dev_info(dev, "support mode: vc[%d] = 0x%x\n", i, mode->vc[i]);of_node_put(node);-- 
2.17.1

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

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

相关文章

快速介绍git(Linux)

git 1、安装2、版本控制3、git vs gitee&&GitHub(git故事)4、git的操作 1、安装 很简单&#xff0c;直接 sudo yum install -y git2、版本控制 故事介绍&#xff1a;你是一个大学生&#xff0c;你上课需要交一分实验报告&#xff0c;教你的老师比较负责&#xff0c;…

GAT知识总结

《GRAPH ATTENTION NETWORKS》 解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题&#xff0c;GAT借鉴了Transformer的idea&#xff0c;引入masked self-attention机制&#xff0c; 在计算图中的每个节点的表示的时候&#xff0c;会根据邻居节点特征的不同来…

职升网:中级会计师考场常见的注意问题!

在中级会计师考试的征途中&#xff0c;考生常遇挑战&#xff0c;涵盖考前筹备、考场纪律及考后事宜等多维度。针对准考证信息误差&#xff0c;考生务必迅速联系属地会计考试管理机构进行更正&#xff0c;确保信息无误。若身份证不慎遗失或过期&#xff0c;务必紧急补办临时证件…

MyBatis 参数赋值:#{} 和 ${}及区别

目录 一. #{} 和${} 使用 1 对Interger类型的参数 2 对String类型的参数 二、#{} 和${} 区别 1.性能更好 2.SQL注入 总结 MyBatis 参数赋值有两种方式&#xff1a;#{} 和 ${} 一. #{} 和${} 使用 1 对Interger类型的参数 #{}&#xff1a; Select("select username, pas…

音视频入门基础:WAV专题(3)——FFmpeg源码中,判断某文件是否为WAV音频文件的实现

一、引言 通过FFmpeg命令&#xff1a; ./ffmpeg -i XXX.wav 可以判断出某个文件是否为WAV格式的音频文件&#xff1a; 所以FFmpeg是怎样判断出某个文件是否为WAV格式的音频文件呢&#xff1f;它内部其实是通过wav_probe函数来判断的。从文章《FFmpeg源码&#xff1a;av_prob…

uniapp 使用css实现大转盘

思路&#xff1a; 1.一个原型的外壳包裹 2.使用要分配的个数&#xff0c;计算出角度&#xff0c;利用正切函数tan计算出角度对应对边长度 3.使用clip-path画出一个扇形 4.使用v-for循环出对应的份数&#xff0c;依次使用transform rotate旋转对应的角度。 注意&#xff1a…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况&#xff1a; 其他电脑可以正常访问共享端&#xff0c;但有一台电脑访问提示错误代码0x80004005。 处理检查&#xff1a; 搜索里输入“启用或关闭Windows功能”按回车键&#xff0c;在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后&#xff08;故…

【GoodERP更新日志】增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能

开源项目GoodERP更新-2024年7月29日 本次提交合并增加的功能或解决的问题&#xff1a; 1、增加采购发票、销售发票 批量抵扣记账 批量撤销入账 功能&#xff08;增加上了批量抵扣记账&#xff08;会检查发票号、开票日期有没有填写上&#xff09;、批量撤销入账 两个批量功能…

SpringBoot整合阿里云短信业务

详细介绍SpringBoot整合阿里云短信服务的每一步过程&#xff0c;同时会将验证码存放到Redis中并设置过期时间&#xff0c;尽量保证实战的同时也让没做过的好兄弟也能实现发短信的功能~ 1. 注册阿里云账号和创建Access Key 首先&#xff0c;你需要注册一个阿里云账号&#xff0…

前端Long类型精度丢失:后端处理策略

文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时&#xff0c;发现一个问题&#xff0c;接口返回品牌Id和页面展示的品牌Id不一致&#xff0c;如接口返回的…

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…

制造企业,如何做好设备的维修和保养?

生产设备的稳定高效的运行是保障产能、提升品质、降低成本的关键所在。机器也有疲惫之时&#xff0c;定期的维修与保养不仅是延长设备寿命的必要手段。如何科学、系统地做好生产设备的维修与保养&#xff0c;成为了制造企业必须深思并实践的课题。 以下&#xff0c;从几个关键维…

结构体笔记

结构体 C语言中的数据类型&#xff1a; 基本数据类型&#xff1a;char/int/short/double/float/long 构造数据类型&#xff1a;数组&#xff0c;指针&#xff0c;结构体&#xff0c;共用体&#xff0c;枚举 概念&#xff1a; 结构体是用户自定义的一种数据类型&#xff0c…

Python NLTK 情感分析不正确

1、问题背景 一位 Reddit 用户使用 Python 的 NLTK 库来训练一个朴素贝叶斯分类器以研究其他句子的情感&#xff0c;但是无论输入什么句子&#xff0c;分类器总是预测为正面。 2、解决方案 经过仔细检查&#xff0c;发现原始代码中的问题在于 wordList 为空。因此&#xff0…

Cadence23学习笔记(十四)

ARC就是圆弧走线的意思&#xff1a; 仅打开网络的话可以只针对net进行修改走线的属性&#xff1a; 然后现在鼠标左键点那个走线&#xff0c;那个走线就会变为弧形&#xff1a; 添加差分对&#xff1a; 之后&#xff0c;分别点击两条线即可分配差分对&#xff1a; 选完差分对之后…

Redis:管道

1. 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; 问题由来 edis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…

vue-快速入门

Vue 前端体系、前后端分离 1、概述 1.1、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;可以高效地开发用户界面。…

SpringBoot的约车APP-计算机毕业设计源码96773

摘要 本文基于Spring Boot框架设计并实现了一款约车APP&#xff0c;旨在为用户提供便捷的出行服务。通过后端Spring Boot框架和前端交互界面的设计&#xff0c;实现了用户快速叫车、实时定位、路线规划等功能。系统结合了高效的后端处理和直观的用户体验&#xff0c;为用户提供…

分类常用的评价指标-二分类/多分类

二分类常用的性能度量指标 精确率、召回率、F1、TPR、FPR、AUC、PR曲线、ROC曲线、混淆矩阵 「精确率」查准率 PrecisionTP/(TPFP) 「召回率」查全率RecallTP/(TPFN) 「真正例率」即为正例被判断为正例的概率TPRTP/(TPFN) 「假正例率」即为反例被判断为正例的概率FPRFP/(TNFP)…