硬件说明:我的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
错误主要与 输入信号格式/时序不匹配、内存分配不足、时钟同步异常 有关。主要包括以下问题来源:
- 信号同步问题:输入分辨率和格式与设备树配置不符。
- 时钟与等待线(wait-line):
wait-line
值未正确设置或动态配置失败。 - CMA内存配置:内存分配不足或未对齐。
- 硬件错误:例如信号线接触不良、电源波动。
解决办法:
根据错误信息,应该是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:0x840004
、0xc00005
等错误可能由以下原因引起:
在3588文档中关于 DVP 接口的错误机制明确指出:
DVP_SIZE_ERR
:输入图像的分辨率或格式与驱动配置不匹配。DVP_CLK_ERR
:PCLK 时钟异常(频率/极性错误)。DVP_DATA_ERR
:数据线同步错误或传感器输出不稳定。- 内存不足:未正确预留 CMA 内存或未对齐。
错误代码 | 优先级 | 核心原因 | 验证方法 |
---|---|---|---|
0x840004 | 高 | 行同步丢失或帧尺寸超限 | 检查分辨率与驱动参数 |
0xc00005 | 高 | 数据位宽不匹配或 PCLK 异常 | 示波器测量时钟频率 |
0xc00050 | 中 | 行数据突发错误(如接触不良) | 检查线缆连 |
错误定位:检查芯片手册,发现输出的BT1120是单边缘采样,修改为单边缘继续测试。
3.3其他错误
在调试过程中,断断续续持续了整整一天时间还有其他问题,但都是小问题,仔细看错误信息都可以快速排除,如果你们还有其他问题也可以贴上来,我们一起解决。