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.mzph.cn/bicheng/51503.shtml

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

相关文章

NLP笔记

文本处理和词嵌入 对于机器来说&#xff0c;不能理解一句话的意思&#xff0c;解决办法就是将一句话分割成多个词&#xff0c;用数字代表一个词&#xff0c;将一句话转化成数字的列表 这个词对应的字典又是怎么训练出来的呢&#xff0c;遍历这个词的列表&#xff0c;如果在字…

ConvGRU原理与开源代码

ConvGRU 1. 算法简介与应用场景2. 算法原理2.1 GRU基础2.2 ConvGRU原理2.2.1 ConvGRU的结构2.2.2 卷积操作的优点 2.3 GRU与ConvGRU的对比分析2.4 ConvGRU的应用 3. PyTorch代码 仅需要网络源码的可以直接跳到末尾即可 需要ConvLSTM的可以参考我的另外一篇博客&#xff1a;小白…

初识HTML文件,创建自己的第一个网页!

本文旨在初步介绍HTML&#xff08;超文本标记语言&#xff09;&#xff0c;帮助读者理解HTML中的相关术语及概念&#xff0c;并使读者在完成本文的阅读后可以快速上手编写一个属于自己的简易网页。 一、HTML介绍 HTML(全称HyperText Markup Language&#xff0c;超文本标记语言…

【C++】位图 + 布隆过滤器

目录 1. 位图1.1. 概念1.2. 实现1.3. 应用 2. 布隆过滤器2.1. 背景2.2. 概念2.3. 实现2.4. 优点2.5. 缺点 3. 海量数据面试题3.1. 哈希切割3.2. 位图应用3.3. 布隆过滤器3.4. 总结 1. 位图 1.1. 概念 位图是一种用于高效地存储和操作集合的数据结构。它的基本思想是使用一个二…

高并发内存池(四)Page Cache的框架及内存申请实现

目录 一、Page Cache的框架梳理 二、Page Cache的实现 2.1PageCache.h 2.2VirtualAlloc 2.3std::unordered_map _idSpanMap,> 2.4Page Cache.cpp 一、Page Cache的框架梳理 申请内存&#xff1a; 1. 当central cache向page cache申请内存时&#xff0c;page cache先检…

Intel 13/14代不稳定 微星率先发声:密切监视、8月中旬更新微码

不久前&#xff0c;Intel针对14/14代酷睿i9 K系列不稳定的问题发布了最新声明&#xff0c;确认问题源于微代码算法缺陷与电压过高&#xff0c;并承诺将在8月中旬完成新版BIOS的验证&#xff0c;随后发放。现在&#xff0c;微星在各家主板厂商中第一个站出来&#xff0c;表明了态…

Java 使用 POI 导出Excel,实现单元格输入内容提示功能

在使用Apache POI的库生成Excel导入模板的时候&#xff0c;有时候需要对单元格能够输入的内容进行一个提示&#xff0c;该如何实现这个特性呢&#xff1f;下面是一个示例代码&#xff0c;演示如何实现单元格输入内容提示功能。 代码 import org.apache.poi.ss.usermodel.*; im…

Frienda 4 件套幽灵狩猎猫球运动发光猫球 LED 运动激活猫球运动点亮猫狗互动玩具宠物发光迷你跑步健身球

来自 美国亚马逊&#xff1a;商品评论: Frienda 4 件套幽灵狩猎猫球运动发光猫球 LED 运动激活猫球运动点亮猫狗互动玩具宠物发光迷你跑步健身球玩具(亮色) (amazon.com) Kim 1.0 颗星&#xff0c;最多 5 颗星 Battery does not last/ cant replace 2024年5月29日 在美国审核…

lora微调Qwen模型全流程

LoRA 微调 Qwen 模型的技术原理概述 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型高效微调的方法。通过对模型参数进行低秩分解和特定层的微调&#xff0c;LoRA 能在保持模型性能的前提下显著减少训练所需的参数量和计算资源。接下来是对 LoRA 微调 Qwen…

鸿蒙开发—黑马云音乐之首页导航栏

目录 1.底部导航 2.点击导航栏的时候点亮 3.新建tabbar对应的页面并加载 1.底部导航 Entry Component struct Index {State message: string 首页BuildertabBuilder(text:string,img:Resource) {// 未选中状态样式处理Column({ space: 5 }) {Image(img).width(25).border…

[C++进阶]抽象类

一、抽象类 1.抽象类的概念 在虚函数的后面写上 0 &#xff0c;则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类&#xff08;也叫接口类&#xff09;&#xff0c;抽象类不能实例化出对象。派生类继承后也不能实例化出对象&#xff0c;只有重写纯虚函数&#xff0c;派生类才…

unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单

概述 1.最外层DataForm为空壳编辑数据用。可以有多个DataForm&#xff0c;例如福利DataForm&#xff0c;抽奖DataForm 2.Menu层为左边栏层&#xff0c;每个DataForm可以使用不同样式的MenuForm预制体 3.DataForm中使用ReorderList&#xff0c;可排列配置 4.有定位功能&#xf…

Clickhouse 生产集群部署(Centos 环境)

文章目录 机器环境配置安装 JDK 8安装 zookeeperClickhouse 集群安装rpm 包离线安装修改全局配置zookeeper配置Shard和Replica设置image.png添加macros配置启动 clickhouse启动 10.82.46.135 clickhouse server启动 10.82.46.163 clickhouse server启动 10.82.46.218 clickhous…

《InheriBT行为树》For Unity

InheriBT: Unity Editor中的行为树编辑框架 行为树&#xff08;Behavior Tree&#xff09;是一种广泛应用于人工智能&#xff08;AI&#xff09;领域的决策模型&#xff0c;特别是在游戏开发中。行为树通过分层结构和节点的组合&#xff0c;实现了复杂行为的简洁表达。然而&am…

CPU350% JVM GC频繁并GC不掉EXCEL导出

背景&#xff1a; 有个Excel导出的需求&#xff0c;测试的时候&#xff0c;只要连续导出大量的数据就会导致FAT机器反请求反应迟钝&#xff0c;甚至卡死&#xff0c;无法恢复。 排查&#xff1a; 1 跳板机跳到机器上&#xff0c;查看 项目 ipd 执行ps -ef | grep 项目名称.j…

虚拟机Ubuntu20.04 利用串口调试机械臂

虚拟机Ubuntu20.04 利用串口调试机械臂 串口库问题 由于机械臂使用的是串口进行驱动控制&#xff0c;在python中相关的串口库为serial和pyserial两个&#xff0c;这里我曾踩过雷同时安装了serial与pyserial两个库&#xff0c;导致报错如下所示&#xff1a; AttributeError: m…

数据结构:(1)线性表

一、基本概念 概念&#xff1a;零个或多个数据元素的有限序列 元素之间是有顺序了。如果存在多个元素&#xff0c;第一个元素无前驱&#xff0c;最后一个没有后继&#xff0c;其他的元素只有一个前驱和一个后继。 当线性表元素的个数n&#xff08;n>0&am…

使用Spring Boot与Spire.Doc实现Word文档的多样化操作

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 使用Spring Boot与Spire.Doc实现Word文档的多样化操作具有以下优势&#xff1a; 强大的功能组合&#xff1a;Spring Boot提供了快速构建独立和生产级的Spring应用程序的能力&#xff0c;而Spire.Doc则…

OSError: You are trying to access a gated repo.解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…