草庐IT

RK3568/RK3566平台 HDMIIN调试

人生苦短,我想躺平 2023-04-27 原文

这篇文章给大家介绍一下在Rk356X等平台,HDMIIN的调试,RK356X的平台没有自带的HDMIRX的模块,因此只能通过外接转接芯片来完成,常见的一般是HDMI转MIPI-CSI和HDMI转BT1120等芯片,这篇文章主要介绍一下在RK356X平台上面,上面两种转接芯片的调试。

目录

(一)HDMIIN VIDEO框架

 (1)类camera框架

(2)HDMIIN基本流程

(二)功能调试

(1)驱动调试

①驱动接口介绍

②DTS配置说明

③常见调试命令

(2)应用调试

①XML适配

②APK适配

 (三)总结


(一)HDMIIN VIDEO框架

 (1)类camera框架

RK356X/RK3399平台上的HDMIIN实现都是通过HDMI转MIPI或者转BT1120等转接芯片实现的,因此驱动代码框架是基于V4L2的camera框架实现的,将转接芯片当做是一个类camera设备,注册成v4l2的节点,通过media-framework的框架与主控vicap控制器link,应用层从对应的video节点取数据流。这里需要注意一下几点:

  1. HDMIIN的转接芯片一般直接输出YUV422的数据格式,主控将其当做是SOC camera设备,不需要ISP的3A调试。
  2. RK3399/RK3288等CIF不支持MIPI接口,因此只能使用ISP接收HDMIIN的数据。
  3. RK3568/RK3566平台VICAP(CIF)控制器支持MIPI接口,因此在该平台上的时候,不需要经过ISP,vicap接收数据即可。本文即以RK3568为例进行介绍。
  4. 针对HDMIN的特定功能,如拔插、分辨率切换等功能,驱动定制化实现相关接口。

(2)HDMIIN基本流程

HDMIIN的基本流程如下图所示,驱动成功注册,安卓上层将转接芯片识别成camera设备后,HDMIIN定制的APK打开预览,会定时查询当前的拔插状态和分辨率,识别到插入的状态,APK会下发正确的分辨率进行预览。

(二)功能调试

(1)驱动调试

HDMIIN的设备驱动相比于正常的camera驱动会针对HDMIIN的应用场景多出几个部分内容:拔插和分辨率切换功能的识别。这里以龙讯的LT6911UXC调试作为示例。

①驱动接口介绍

这里主要介绍一下HDMIIN的驱动对比camera的驱动增加的一些接口,并对接口进行说明

query_dv_timings:查询timing信息的接口,给应用查询分辨率格式等信息

s_dv_timings:设置timing

g_dv_timings:获取timing

lt6911uxc_res_change_irq_handler:分辨率变化的中断处理函数,最终执行到lt6911uxc_format_change,会上报分辨率变化的事件。

plugin_detect_irq_handler:拔插的中断处理函数。

lt6911uxc_get_ctrl:获取拔插状态的接口,应用通过这个接口获取拔插的状态。

驱动代码主要主要注意增加拔插和分辨率变化中断,query_dv_timings和_get_ctrl,APK分别通过这两个接口获取分辨率信息和拔插的状态。

②DTS配置说明

dts配置参考如下,链路对应为:LT6911UXC->CSI_DPHY0->MIPI_CSI2->RKCIF_MIPI_LVDS

&i2c3 {
	status = "okay";

	lt6911uxc: lt6911uxc@2b {
		status = "okay";
		reg = <0x2b>;
		compatible = "lontium,lt6911uxc";
		clocks = <&ext_cam_clk>;
		clock-names = "xvclk";
		interrupt-parent = <&gpio4>;
		interrupts = <16 IRQ_TYPE_LEVEL_LOW>;
		power-gpios = <&gpio0 29 GPIO_ACTIVE_HIGH>;
		reset-gpios = <&gpio4 26 GPIO_ACTIVE_LOW>;
		plugin-det-gpios = <&gpio0 30 GPIO_ACTIVE_LOW>;
		hpd-ctl-gpios = <&gpio3 27 GPIO_ACTIVE_LOW>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "LT6911UXC";
		rockchip,camera-module-lens-name = "NC";

		port {
			lt6911uxc_out: endpoint {
				remote-endpoint = <&hdmi_to_mipi_in>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};

&csi2_dphy_hw {
	status = "okay";
};

&csi2_dphy0 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			hdmi_to_mipi_in: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&lt6911uxc_out>;
				data-lanes = <1 2 3 4>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			csidphy_out: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&mipi_csi2_input>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};

&mipi_csi2 {
	status = "okay";

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy_out>;
				data-lanes = <1 2 3 4>;
			};
		};

		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;

			mipi_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi_in>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};

&rkcif {
	status = "okay";
};

&rkcif_mipi_lvds {
	status = "okay";

	port {
		cif_mipi_in: endpoint {
			remote-endpoint = <&mipi_csi2_output>;
			data-lanes = <1 2 3 4>;
		};
	};
};

&rkcif_mmu {
	status = "okay";
};

③常见调试命令

以下是常见的调试命令。

查看拓扑结构:

media-ctl -p

抓数据流,正常会输出帧率信息

v4l2-ctl --verbose -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080

抓图命令:

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat='NV12' --stream-mmap=3 --stream-skip=4 --stream-to=/data/1920x1080p60_nv12.yuv --stream-count=5 --stream-poll

(2)应用调试

①XML适配

类似camera,需要配置对应的xml,安卓应用才能注册上camera设备:

<Profiles cameraId="0" name="LT6911UXC" moduleId="m00">

②APK适配

APK通过ioctl的方式访问LT6911UXC设备节点,获取当前的连接状态和分辨率。LT6911UXC设备节点在isp/isp/vicap链路上可能会差异。需要根据实际情况修改APK源码.

rkCamera2/jni/native.cpp

 (三)总结

HDMIIN设备类似camera设备,基于V4L2框架和media-framework,只需要重点注意HDMIIN相比于camera多了分辨率切换和拔插的动作,在rk356x/rk3399等的平台上,驱动是提供对应的接口,应用上面通过ioctl查询对应的状态,然后apk执行开关的操作,在RK3588后续的平台上,已经改成由驱动上报事件,应用订阅事件的方式来完成,后续会再介绍。

有关RK3568/RK3566平台 HDMIIN调试的更多相关文章

  1. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  2. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  3. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

  4. ruby - Ruby 是否有类似于 Perl 的 "perl -d"的逐步调试器? - 2

    Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby​​2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby​​-debug的后继者 关于ruby-Ruby

  5. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  6. ruby-on-rails - 使用 Pow 作为服务器在 RubyMine 中调试 - Ruby 2.1.1 + Rails 4 - 2

    我已经开始使用RubyMine6。我正在处理Rails4、Ruby2.1.1项目。我无法找到如何使用Pow作为服务器调试到RubyMine。你能给我指明正确的方向吗? 最佳答案 我能够使用远程调试从RubyMine进行调试。我正在使用RubyMine6、Rails3、Ruby2.1.1。首先创建一个.powenv文件并添加:exportRUBY_DEBUG_PORT=1234exportPOW_WORKERS=1将以下gem添加到您的Gemfile:gem'ruby-debug-ide'gem'debase'创建一个新的初始化器st

  7. ruby-on-rails - 放置调试语句 - 2

    当我编写代码时,我非常频繁地使用“puts”语句进行调试。它允许我查看服务器中发生的情况。在调试代码的时候,不知道是什么原因,我把这些“puts”语句去掉了。这是个好主意还是我应该保留它们以使我的服务器日志更加清晰? 最佳答案 您应该使用记录器而不是puts。使用这种语句:Rails.logger.debug"DEBUG:#{self.inspect}#{caller(0).first}"ifRails.logger.debug?如果您想(几乎)实时查看调试,只需在另一个终端窗口中使用tail命令:tail-Flog/develop

  8. ruby-on-rails - Rails 在记录 200 OK 后在做什么? (调试响应时间慢) - 2

    我试图在我的RubyonRails应用程序中调试一个极其缓慢的请求调用。我已设法根据自己的喜好优化Controller方法,Rails的日志告诉我它已在XX毫秒内完成操作(Completed200OKin5049ms(Views:34.9ms|ActiveRecord:76.3ms)).但是,在加载页面时,在浏览器中实际呈现任何内容之前打印此消息很长;最多约15秒的等待时间。Rackmini-profiler证实了这一点,告诉我GET操作(不计算完成Controller操作所花费的时间)花费了14秒左右。(分析器还确认Controller操作的执行时间约为5秒)。我可以接受Contro

  9. ruby:如何在调试时进入任意函数 - 2

    假设我在调试时停在了点上:defget_databyebug=>@cache||=calculate_dataend而@cache有值,所以step函数calculate_data不会被执行。但是我需要在这个确切的运行时点检查calculate_data内部发生了什么。我可以只执行calculate_data并在控制台输出中查看其结果,但是我可以从调试控制台执行函数并同时进入它?(使用byebug或其他一些调试工具)。目标-是在任意时间检查calculate_data逻辑,特别是当get_data调用时@cache已填充。 最佳答案

  10. ruby-on-rails - 如何在不退出 IRB session 的情况下退出调试器? - 2

    这是一个长期存在的挫败感来源,但也许我遗漏了什么。如果我正在调试,并且我想退出调试器并返回到IRB或Rails控制台,“退出”将不起作用,因为它将退出IRB。“完成”似乎也与继续具有相同的效果。使用“删除”删除断点然后尝试“继续”或“完成”不起作用。有什么想法吗? 最佳答案 至少在byebug中,你可以这样做:evalreturn它具有计算当前函数的return语句的净效果。这有时会奏效,具体取决于调用堆栈的外观。现在虽然这不会删除当前断点....如果您只是想收回控制权,在大多数情况下这会做到这一点,具体取决于您的代码结构。在您的代

随机推荐