RK3588接入BT1120-DVP

        硬件说明:我的BT1120是FPGA直接输出,3588只接收数据不做配置,因此在此文章中没有涉及I2C的配置环节,我是将nvp6158-v4l2驱动复用以获取视频数据,每个项目都有不同的硬件配置和不同IO输入输出,该方案仅仅可参考,还需按照自己实际配置设备树。

1.设备树配置

        可参考以下配置,但是仅仅是参考,因为每个项目的输入源配置均不相同,需要和输入的硬件配置保持一致。

        在这些配置中以下配置要和硬件反复确认(不反复确认就会吃亏,血的教训)

		rockchip,dvp_mode = "BT1120"; //BT656 or BT1120 or BT656_TEST
		rockchip,channel_nums = <1>; //channel nums, 1/2/4
		rockchip,dual_edge = <0>; // pclk dual edge, 0/1
		rockchip,default_rect= <1920 1080>; // default resolution

       以下是设备树的完整配置: 

/*********************************** DVP Input ***********************************************/

&i2c4 {
	status = "okay";
	pinctrl-names = "default";
    
	nvp6158: nvp6158@3c{
		compatible = "nvp6158-v4l2";
		status = "okay";
        // 设备的I2C地址为0x30
		reg = <0x3c>;

        clocks = <&ext_cam_clk>;
        clock-names = "xvclk";

        // 绑定到RK3588的视频输入(VI)电源域,确保供电管理正确
		power-domains = <&power RK3588_PD_VI>;
		pinctrl-names = "default";
        // 这些引脚组分别用于时钟、数据总线以及同步信号的控制,确保硬件信号正确连接
		pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus8 &cif_dvp_bus16>;
		// pwr-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>;
        // 定义电源控制GPIO引脚,用于控制传感器的主电源,高电平有效
		//pwr2-gpios = <&gpio1 RK_PA5 GPIO_ACTIVE_HIGH>;
		//rst-gpios = <&gpio1 RK_PA3 GPIO_ACTIVE_HIGH>;
		// rst2-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>;
		// pwdn-gpios = <&gpio1 RK_PA4 GPIO_ACTIVE_HIGH>;
		// pwdn2-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;
        // 指定摄像头模块索引为0,在多摄像头系统中用于区分不同摄像头
		rockchip,camera-module-index = <0>;

        rockchip,camera-module-facing = "front";
        rockchip,camera-module-name = "NC";
        rockchip,camera-module-lens-name = "NC";

		rockchip,dvp_mode = "BT1120"; //BT656 or BT1120 or BT656_TEST
		rockchip,channel_nums = <1>; //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 = <&rkcif_dvp_in>; 
            };
        };
    };
};

// VICAP节点
&rkcif_dvp {
    status = "okay";
    port {
        rkcif_dvp_in: endpoint {
            remote-endpoint = <&nvp6158_out>;
            bus-width = <16>;
        };
    };
};

 在以上的配置中,inctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus8 &cif_dvp_bus16>需要和您的项目硬件一一对应,每一个管脚都需要检查是否和硬件连接一致

	cif {
		/omit-if-no-ref/
		cif_clk: cif-clk {
			rockchip,pins =
				/* cif_clkout */
				<4 RK_PB0 1 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		cif_dvp_clk: cif-dvp-clk {
			rockchip,pins =
				/* cif_clkin */
				<4 RK_PC1 1 &pcfg_pull_none>,
				/* cif_href */
				<4 RK_PB6 1 &pcfg_pull_none>,
				/* cif_vsync */
				<4 RK_PB7 1 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		cif_dvp_bus16: cif-dvp-bus16 {
			rockchip,pins =
				/* cif_d8 */
				<3 RK_PD6 1 &pcfg_pull_none>,
				/* cif_d9 */
				<3 RK_PD7 1 &pcfg_pull_none>,
				/* cif_d10 */
				<4 RK_PA0 1 &pcfg_pull_none>,
				/* cif_d11 */
				<4 RK_PA1 1 &pcfg_pull_none>,
				/* cif_d12 */
				<4 RK_PA2 1 &pcfg_pull_none>,
				/* cif_d13 */
				<4 RK_PA3 1 &pcfg_pull_none>,
				/* cif_d14 */
				<4 RK_PA4 1 &pcfg_pull_none>,
				/* cif_d15 */
				<4 RK_PA5 1 &pcfg_pull_none>;
		};

		/omit-if-no-ref/
		cif_dvp_bus8: cif-dvp-bus8 {
			rockchip,pins =
				/* cif_d0 */
				<3 RK_PC6 1 &pcfg_pull_none>,
				/* cif_d1 */
				<3 RK_PC7 1 &pcfg_pull_none>,
				/* cif_d2 */
				<3 RK_PD0 1 &pcfg_pull_none>,
				/* cif_d3 */
				<3 RK_PD1 1 &pcfg_pull_none>,
				/* cif_d4 */
				<3 RK_PD2 1 &pcfg_pull_none>,
				/* cif_d5 */
				<3 RK_PD3 1 &pcfg_pull_none>,
				/* cif_d6 */
				<3 RK_PD4 1 &pcfg_pull_none>,
				/* cif_d7 */
				<3 RK_PD5 1 &pcfg_pull_none>;
		};
	};

2.nvp6158-v4l2驱动编译

        编译nvp6158-v4l2驱动需要打开CONFIG_VIDEO_NVP6158=y的配置,我的配置在OK3588-Linux_defconfig中修改即可,您的估计也查不多。

        因为我的是FPGA和外置转化芯片直接输入BT1120数据,无需进行参数配置,因此我将IIC的配置全部移除了。

整个nvp6158-v4l2驱动我已全部打包上传,需要的可直接下载编译。

3.遇到的错误以及解决办法

遇到问题不要慌,使用dmesg查看错误信息,仔细分析错误问题终会解决。

3.1错误01

[   41.326941] rkcif-dvp: dvp size err intstat 0x1800014
[   41.326949] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0x1800014!!
[   41.500628] rkcif-dvp: dvp size err intstat 0x1800018
[   41.500636] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0x1800018!!
[   42.144119] rkcif-dvp: dvp size err intstat 0xc00002
[   42.144127] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0xc00002!!
[   43.113386] rkcif-dvp: dvp size err intstat 0x1000009
[   43.113394] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0x1000009!!
[   43.140833] rkcif-dvp: dvp size err intstat 0x1800014
[   43.140840] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0x1800014!!
[   43.186580] rkcif-dvp: dvp size err intstat 0x3800041
[   43.186587] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0x3800041!!
[   43.205787] rkcif-dvp: dvp size err intstat 0x2400028
[   43.205793] rkcif-dvp: ERROR: DVP_ALL_ERROR_INTEN:0x2400028!!

 问题分析:

关于DVP接口的描述明确指出,DVP_ALL_ERROR_INTEN错误主要与 输入信号格式/时序不匹配、内存分配不足、时钟同步异常 有关。主要包括以下问题来源:

  1. 信号同步问题:输入分辨率和格式与设备树配置不符。
  2. 时钟与等待线(wait-line)wait-line值未正确设置或动态配置失败。
  3. CMA内存配置:内存分配不足或未对齐。
  4. 硬件错误:例如信号线接触不良、电源波动。

 解决办法:

        根据错误信息,应该是DVP时钟配置错误,检查发现BT1120的CLK应该是3588DVP的时钟输入,修改设备树:将BT1120时钟绑定到GPIO4_B0上。

		/omit-if-no-ref/
		cif_dvp_clk: cif-dvp-clk {
			rockchip,pins =
				/* cif_clkin */
				<4 RK_PB0 1 &pcfg_pull_none>,
				/* cif_href */
				<4 RK_PB2 1 &pcfg_pull_none>,
				/* cif_vsync */
				<4 RK_PB3 1 &pcfg_pull_none>;
		};

3.2错误02 

问题分析:

DVP_ALL_ERROR_INTEN:0x8400040xc00005 等错误可能由以下原因引起:

在3588文档中关于 DVP 接口的错误机制明确指出:

  1. DVP_SIZE_ERR:输入图像的分辨率或格式与驱动配置不匹配。
  2. DVP_CLK_ERR:PCLK 时钟异常(频率/极性错误)。
  3. DVP_DATA_ERR:数据线同步错误或传感器输出不稳定。
  4. 内存不足:未正确预留 CMA 内存或未对齐。
错误代码优先级核心原因验证方法
0x840004行同步丢失或帧尺寸超限检查分辨率与驱动参数
0xc00005数据位宽不匹配或 PCLK 异常示波器测量时钟频率
0xc00050行数据突发错误(如接触不良)检查线缆连

错误定位:检查芯片手册,发现输出的BT1120是单边缘采样,修改为单边缘继续测试。

 3.3其他错误

        在调试过程中,断断续续持续了整整一天时间还有其他问题,但都是小问题,仔细看错误信息都可以快速排除,如果你们还有其他问题也可以贴上来,我们一起解决。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值