RK DVP NVP6158配置 学习

news2024/9/29 9:30:55

NVP6158简介

       NVP6158C是一款4通道通用RX,提供高质量图像的芯片。它接受来自摄像机和其他视频信号的独立4通道通用输入来源。它将4通道通用1M至8M 7.5P视频格式数字化并解码为代表8位ITU-R BT.656/1120 4:2:2格式的数字分量视频,并将单独的BT.601格式与27/36/37.125MHz同步,54/72/74.25MHz和108/144/148.5/297MHz多路复用。54/72/74.25/108/144/148.5/297MHz复用功能可用,因为它在时钟范围内锁相环NVP6158C包括4通道模拟处理电路,包括抗混叠滤波器、ADC、钳位和均衡器滤波器。采用自适应高性能梳状滤波器和垂直峰值滤波器,获得了最佳的图像质量。它还支持可编程的饱和度、色调、亮度、对比度以及CTI、可编程峰值滤波器和各种补偿滤波器等多种功能。

RK DVP简介:

     


DVP(Digital Video Port) 是传统的sensor输出接口,采用并行输出方式,d数据位宽有8bit、10bit、12bit、16bit,是CMOS电平信号(重点是非差分信号),PCLK最大速率为96MHz,接口如下图:

PCLK:pixel clock ,像素时钟,每个时钟对应一个像素数据;
HSYNC:horizonal synchronization,行同步信号
VSYNC:vertical synchronization,帧同步信号;
DATA:像素数据,视频数据,具体位宽要看ISP是否支持;
XCLK:或者MCLK,ISP芯片输出给驱动sensor的时钟;
SCL,SDA:IIC用来读写sensor的寄存器,配置sensor。

NVP6158 与 RK3568 DVP连接相关原理图:

设备树配置:

&rkcif { 
	status = "okay"; 
	memory-region = <&cif_reserved>; 
 
};
&rkcif_dvp { 
	status = "okay"; 
		ports { 
		#address-cells = <1>; 
		#size-cells = <0>;
			port@0 { 
			#address-cells = <1>; 
			#size-cells = <0>; 
			/* Parallel bus endpoint */ 
			dvp_in_bcam1: endpoint@1 { 
			reg = <1>; 
			remote-endpoint = <&nvp6158_out>; 
			bus-width = <16>; 
			}; 
			}; 
		}; 
};	
nvp6158: nvp6158@30 { 
		compatible = "nvp6158-v4l2"; 
		status = "okay";
		reg = <0x30>; 
		clocks = <&cru CLK_CIF_OUT>; 
		clock-names = "xvclk"; 
		power-domains = <&power RK3568_PD_VI>; 
		pinctrl-names = "default"; 
		pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus16>; 
		//pinctrl-0 = <&cif_dvp_clk &cif_dvp_bus8 &cif_dvp_bus16>;
		pwr-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>; 
		//pwr2-gpios = <&gpio4 RK_PC7 GPIO_ACTIVE_HIGH>;/* 360 camera */ 
		rst-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>; 
		/*rst2-gpios = <&gpio2 RK_PC5 GPIO_ACTIVE_HIGH>;*/ 
		/*pwdn-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;*/ 
		/*pwdn2-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;*/ 
		rockchip,camera-module-index = <0>; 
		rockchip,camera-module-facing = "back"; 
		rockchip,camera-module-name = "default"; 
		rockchip,camera-module-lens-name = "default"; 
		rockchip,dvp_mode = "BT1120"; //BT656 or BT1120 or BT656_TEST 
		rockchip,channel_nums = <4>; //channel nums, 1/2/4 
		rockchip,dual_edge = <0>; // pclk dual edge, 0/1 
		rockchip,default_rect= <1920 1080>; // default resolution 
		port {
			nvp6158_out: endpoint { 
			remote-endpoint = <&dvp_in_bcam1>; 
		}; 
		}; 
	};

clocks = <&cru CLK_CIF_OUT>; //走GPIO CIF时钟 配置为是27M

 clock-names = "xvclk";

	nvp6158->xvclk = devm_clk_get(dev, "xvclk");
	if (IS_ERR(nvp6158->xvclk)) {
		dev_err(dev, "Failed to get xvclk\n");
		return -EINVAL;
	}
	if (ret < 0) {
	#define NVP6158_XVCLK_FREQ			27000000
	ret = clk_set_rate(nvp6158->xvclk, NVP6158_XVCLK_FREQ);
		dev_err(dev, "Failed to set xvclk rate (24MHz)\n");
		return ret;
	}

rockchip,dvp_mode = "BT1120" :走BT1120模式

rockchip,channel_nums = <4>;//并口的数据lane ,只有一条lane 可配置1 参数:1/2/4

rockchip,default_rect= <1280 720>;摄像头分辨率。 rkcif会从nvp6158驱动里获取

rockchip,dual_edge :pclk的边沿有效 一般用于配置分辨率 720p:0 1080P:1 如下

rkcif 会获取对应的pclk dual_edge 
static int nvp6158_g_mbus_config(struct v4l2_subdev *sd,
				 struct v4l2_mbus_config *cfg)
{
	struct nvp6158 *nvp6158 = to_nvp6158(sd);

	cfg->type = V4L2_MBUS_BT656;
	if (nvp6158->dual_edge == 1) {
		cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
			V4L2_MBUS_PCLK_SAMPLE_RISING |
			V4L2_MBUS_PCLK_SAMPLE_FALLING;
	} else {
		cfg->flags = RKMODULE_CAMERA_BT656_CHANNELS |
			V4L2_MBUS_PCLK_SAMPLE_RISING;
	}
	return 0;
}

nvp6158关注的代码:

初始化热拔插工作队列:

INIT_DELAYED_WORK(&nvp6158->plug_state_check.d_work, nvp6158_plug_state_check_work);
        nvp6158->plug_state_check.state_check_wq =
                create_singlethread_workqueue("nvp6158_work_queue");
        if (nvp6158->plug_state_check.state_check_wq == NULL) {
                dev_err(dev, "%s(%d): %s create failed.\n", __func__, __LINE__,
                          "nvp6158_work_queue");
        }

热拔插队列:打开DVP摄像头后 nvp6158_no_signal 读取nvp6158 0xa8地址,判断摄像头有无接入


#ifdef WORK_QUEUE
static void nvp6158_plug_state_check_work(struct work_struct *work)
{
        struct sensor_state_check_work *params_check =
                container_of(work, struct sensor_state_check_work, d_work.work);
        struct nvp6158 *nvp6158 =
                container_of(params_check, struct nvp6158, plug_state_check);
        struct i2c_client *client = nvp6158->client;
        struct v4l2_subdev *sd = &nvp6158->subdev;
        u8 novid_status = 0x00;
        u8 sync_status = 0x00;

        nvp6158_no_signal(sd, &novid_status);
        nvp6158_sync(sd, &sync_status);
        nvp6158->cur_detect_status = novid_status;

        /* detect state change to determine is there has plug motion */
        novid_status = nvp6158->cur_detect_status ^ nvp6158->last_detect_status;
        if (novid_status)
                nvp6158->hot_plug = true;
        else
                nvp6158->hot_plug = false;
        nvp6158->last_detect_status = nvp6158->cur_detect_status;

        dev_info(&client->dev, "%s has plug motion? (%s)", __func__,
                         nvp6158->hot_plug ? "true" : "false");
        if (nvp6158->hot_plug) {
                dev_info(&client->dev, "queue_delayed_work 1500ms, if has hot plug motion.");
                queue_delayed_work(nvp6158->plug_state_check.state_check_wq,
                                   &nvp6158->plug_state_check.d_work, msecs_to_jiffies(1500));
                nvp6158_write(client, 0xFF, 0x20);
                nvp6158_write(client, 0x00, (sync_status << 4) | sync_status);
                usleep_range(3000, 5000);
                nvp6158_write(client, 0x00, 0xFF);
        } else {
                dev_info(&client->dev, "queue_delayed_work 100ms, if no hot plug motion.");
                queue_delayed_work(nvp6158->plug_state_check.state_check_wq,
                                   &nvp6158->plug_state_check.d_work, msecs_to_jiffies(100));
        }
}
#endif

调试:

  I2C无法读取写入:

             1.确认电源电压

            2.确认时钟脚有无27M CLK信号

            3.排查是否其他器件影响

无图像:1.确认时钟脚有无27M CLK信号

              2.确认下发的分辨率与接入的摄像头是否对应得上

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

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

相关文章

计算机网络——概述

计算机网络——概述 计算机网络的定义互连网&#xff08;internet&#xff09;互联网&#xff08;Internet&#xff09;互联网基础结构发展的三个阶段第一个阶段——APPANET第二阶段——商业化和三级架构第三阶段——全球范围多层次的ISP结构 ISP的作用终端互联网的组成边缘部分…

Nodejs 第四十九章(lua)

lua Lua是一种轻量级、高效、可嵌入的脚本语言&#xff0c;最初由巴西里约热内卢天主教大学&#xff08;Pontifical Catholic University of Rio de Janeiro&#xff09;的一个小团队开发而成。它的名字"Lua"在葡萄牙语中意为"月亮"&#xff0c;寓意着Lua…

数据分析-Pandas数据y轴双坐标设置

数据分析-Pandas数据y轴双坐标设置 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

平衡搜索二叉树—AVL树

一、定义&#xff1a; 为了避免搜索二叉树的高度增长过快&#xff0c;降低二叉树的性能&#xff0c;规定在插入和删除二叉树的结点的时候&#xff0c;任何结点左右子树的高度差绝对值不超过1&#xff0c;这样的二叉树被称为平衡二叉树&#xff08;balanced Binary Tree&#xf…

为PDF创建目录(侧边栏目录)

通过可以新建书签的pdf阅读器。 知云翻译&#xff1a;可以新建书签和子书签。 Adobe Acrobat&#xff1a;只能新建书签&#xff0c;不能建立子书签。

DA14531在三星手机手写笔的应用让我打开眼镜

手写笔的功能 这是一款内置蓝牙功能的魔性笔&#xff0c;它是遥控器、是照相、切换摄像头、是暂停或者打开播放列表。乃至更多操作-通过不同的手势隔空操作&#xff0c;或者按下触控按键便可轻松搞定。 手写笔硬件设计 内部结构 采用2.3V可循环充电电池&#xff0c;放入手…

软件测试零基础新手入门必看

软件测试&#xff1a;使用技术手段验证软件是否满足使用需求 目的&#xff1a;减少缺陷&#xff0c;保证质量 一、测试主流技能&#xff1a; 1.功能测试 测试主要验证程序的功能是否满足需求 2.自动化测试 使用工具或代码代替手工&#xff0c;对项目进行测试 3.接口测试 …

【原理图PCB专题】Allegro模块化移动器件报...has the LOCKED property怎么解锁?

在模块化原理图时,PCB也需要做一个模块.mdd文件。这时需要先画好图纸然后再制作模块化文件。 修改文件时会发现模块化器件报错,无法编辑模块内部器件和走线,器件和走线都被LOCKED,如下所示报错内容: Symbol "U1" Selected Cannot edit Symbol "U1". M…

(Linux学习七)进程介绍

一、进程 进程生命周期&#xff1a;由系统程序。form出来的子程序&#xff0c;具备一定的父的资源&#xff08;权利&#xff0c;内存空间&#xff0c;PID&#xff09;直到运行完毕&#xff0c;退出系统 查看进程 ps aux 查看所有进程参数&#xff1a;aux ps a 显示现行…

剑指offer 二维数组中的查找 C++

目录 前言 一、题目 二、解题思路 1.直接查找 2.二分法 三、输出结果 前言 最近在牛客网刷题&#xff0c;刷到二维数组的查找&#xff0c;在这里记录一下做题过程 一、题目 描述 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

前端知识点、技巧、webpack、性能优化(持续更新~)

1、 请求太多 页面加载慢 &#xff08;webpack性能优化&#xff09; 可以把 图片转换成 base64 放在src里面 减少服务器请求 但是图片会稍微大一点点 以上的方法不需要一个一个自己转化 可以在webpack 进行 性能优化 &#xff08;官网有详细描述&#xff09;

数据结构与算法:堆排序和TOP-K问题

朋友们大家好&#xff0c;本节内容来到堆的应用&#xff1a;堆排序和topk问题 堆排序 1.堆排序的实现1.1排序 2.TOP-K问题3.向上调整建堆与向下调整建堆3.1对比两种方法的时间复杂度 我们在c语言中已经见到过几种排序&#xff0c;冒泡排序&#xff0c;快速排序&#xff08;qsor…

光伏发电预测

XGB、LGB在datacamp(学习网站) data fountain与国家电投系列赛,光伏发电预测 题目:给一组特征,预测瞬时发电量,训练集9000个点,测试集8000个点,特征包含光伏板的属性和外部环境等。 数据字段:ID、光伏电池板背侧温度、光伏电站现场温度、计算得到的平均转换效率、数…

Javaweb之SpringBootWeb案例之自动配置案例的自定义starter分析的详细解析

3.2.4.1 自定义starter分析 前面我们解析了SpringBoot中自动配置的原理&#xff0c;下面我们就通过一个自定义starter案例来加深大家对于自动配置原理的理解。首先介绍一下自定义starter的业务场景&#xff0c;再来分析一下具体的操作步骤。 所谓starter指的就是SpringBoot当…

数据删除

目录 数据删除 删除员工编号为 7369 的员工信息 删除若干个数据 删除公司中工资最高的员工 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 数据删除 删除数据就是指删除不再需要的数据 delete from 表名称 [where 删…

HTML+CSS+BootStrap景区官网

一、技术栈 支持pc、pad、手机访问&#xff0c;页面自适应&#xff01;&#xff01; html5cssbootstrapjs 二、项目截图 接受项目定制&#xff0c;站内联系博主&#xff01;&#xff01;&#xff01;

算法学习03:前缀和与差分(互逆)

算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09; 文章目录 算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09;前言一、前缀和1.一维2.二维 二、差分1.一维在这里插入图片描述2.二维在这里插入图片描述 ![在这里插入图片描述](https://img-blog…

CSS全局样式的设置,web开发交流

面试题 HTML 1&#xff0c;html5有哪些新特性&#xff1f; 2&#xff0c;html5移除了那些元素&#xff1f; 3&#xff0c;如何处理HTML5新标签的浏览器兼容问题 戳这里领取完整开源项目&#xff1a;【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】…

Vue+腾讯地图-实现关键词输入提示功能

不废话&#xff0c;上代码~~~ 效果图&#xff1a; 1、先去腾讯地图后台创建自己的应用获取到应用的 Key 腾讯地图后台地址&#xff1a;腾讯位置服务 - 立足生态&#xff0c;连接未来 创建应用的 Key 如下&#xff1a; 2、在项目中添加腾讯地图API的js插件&#xff0c;如…