AHD模拟摄像头

我们常见的摄像头接口一般有MIPI、USB、DVP等等,但是MIPI摄像头受限于高速信号的传输距离问题,导致走线不能太长,这样在安防监控领域、车载等领域,使用就很受限,因此会引入一些技术延长摄像头的数据传输距离,例如之前文章所提到的serdes,或者采用模拟摄像头的方式。模拟摄像头一般是通过模拟信号的方式来实现,模拟信号的传输距离远,一般可以达到100米左右,但是模拟信号的传输速度较慢,一般只能达到100kbps左右,因此在安防监控领域、车载等领域,使用就很受限。本文主要介绍AHD摄像头的调试方法。

AHD摄像头简介

AHD 是 Analog High Definition 的缩写,意为模拟高清。AHD 摄像头是一种采用模拟信号传输的高清摄像头,传输信号为高清模拟信号。其画面垂直解析度通常为 1080i、720p 或 1080p,最高清晰度可等同于网络高清 1080P 的全高清级别。

  • 技术特点

    • 高清画质:采用先进的亮色分离、信号滤波、3D降噪技术,能够有效减少高频区的色噪声,使图像清晰度更高,还原性更好,细节表现更加丰富。

    • 传输距离远:利用同轴电缆传输,普通75-5线可达500米,在长距离传输过程中,图像质量仍然能够保持相对清晰。

    • 零延时:前端数据未经过编码压缩直接传输到后端,实现全实时、高保真传输,保证了画面的及时性和流畅性,不存在延迟带来的误判风险。

    • 兼容性好:可以兼容普通D1/960H以及模拟外围设备,如分配器、矩阵等,便于接入现有系统,适用于旧系统的升级改造。

    • 易操作:支持OSD菜单设计,用户可以根据自己的需求轻松对摄像头的各项参数进行调整,如亮度、对比度、色彩饱和度等。

    • 成本效益高:其价格与普通模拟摄像头相近,但却能提供高清品质的图像,具有较高的性价比,在民用及工业级市场中都拥有非常大的发展空间。

    • 高集成:AHD前端芯片集成度高,使得摄像头的体积可以更小,同时也降低了生产成本。

    • 开放标准:遵循第三方开放标准,兼容其他厂家的AHD产品,有利于市场的推广和应用,加速了整个行业的发展。

  • 工作原理:AHD摄像头通过将模拟信号转换为数字信号,然后再将数字信号转换回模拟信号来实现高清图像的传输。它使用了一种特殊的编码技术,能够在已有的模拟传输线上实现高清视频信号的可靠传输。

  • 应用领域

    • 安防监控:在家庭、商业场所、公共设施、工业生产等领域广泛应用,可用于监控室内和室外环境,帮助人们更清晰地观察监控画面,及时发现异常情况,提高安全性和监控效果。

    • 车载领域:AHD倒车影像摄像头是现代汽车安全辅助系统的重要组成部分,能够让驾驶员在倒车时通过车内显示屏清晰地看到车后的情况,避免因看不到车后情况而发生车祸,提高驾驶的安全性。

    • 其他领域:在一些对图像质量有一定要求,但又不需要太高成本的网络高清设备的场景中,AHD摄像头也能发挥其优势,如小型店铺的监控、停车场的管理等。

AHD 摄像头转接芯片

AHD是模拟摄像头,因此需要AD转换芯片来转换,输出数字信号给到主控进行接收。一般AHD摄像头的AD转换芯片有两种:

  • AHD转MIPI:将AHD摄像头的模拟信号转换为MIPI信号,然后再通过MIPI转接口将MIPI信号传输到主控。

  • AHD转BT1120:将AHD摄像头的模拟信号转换为BT1120并口,然后再通过BT1120转接口将BT1120信号传输到主控。

常见的AHD转MIPI芯片有:

  • NVP系列:NVP6188/NVP6324/NVP6158C等

  • TP系列:TP2815/TP9950/TP9930/TP2825等

  • RN系列:RN6854/RN6752等

AHD转MIPI调试

以NVP6188为例

硬件确认

  1. 确保 NVP6188 供电电压(如 3.3V、1.8V)稳定,通过万用表测量电源引脚电压

  2. 检查外部时钟源(如 24MHz 晶振)是否正常起振,可通过示波器测量时钟信号幅度和频率

  3. NVP6188 通过 I²C 接口与 RK3588 通信(需确认 I²C 总线引脚,如 SCL/SDA),需确保上拉电阻(通常 4.7kΩ)正确焊接,避免通信失败

  4. 模拟视频输入(如 CVBS 信号)通过电容耦合至 NVP6188 的 AIN 引脚,注意阻抗匹配(75Ω)

  5. 如复位引脚(RESET)需正确连接至 RK3588 的 GPIO,确保上电时完成复位操作

内核配置

内核启用如下配置项:

  • V4L2 子系统(CONFIG_VIDEO_V4L2=y)

  • I²C 核心及设备驱动(CONFIG_I2C=y、CONFIG_I2C_GPIO=y)

  • NVP6188 驱动模块(CONFIG_VIDEO_NVP6188=y)

DTS配置

&csi2_dphy0_hw {
	status = "okay";
};
 
&csi2_dphy0 {
	status = "okay";
 
	ports {
		#address-cells = <1>;
		#size-cells = <0>;
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;
 
			mipi_dphy0_in_nvp6188: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&nvp6188_out>;
				data-lanes = <1 2 3 4>;
			};
		};
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;
 
			csidphy0_out: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&mipi2_csi2_input>;
			};
		};
	};
};
 
&i2c7 {
	status = "okay";
 
 
	nvp6188: nvp6188@31 {
		compatible = "nvp6188";
		status = "okay";
		reg = <0x31>;
		clocks = <&cru CLK_MIPI_CAMARAOUT_M2>;
		clock-names = "xvclk";
		power-domains = <&power RK3588_PD_VI>;
		pinctrl-names = "default";
		pinctrl-0 = <&mipim1_camera1_clk>;
		rockchip,grf = <&sys_grf>;
		/*power-gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>;*/
		reset-gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>;
		rockchip,camera-module-index = <0>;
		rockchip,camera-module-facing = "back";
		rockchip,camera-module-name = "nvp6188";
		rockchip,camera-module-lens-name = "nvp6188";
 
		port {
			nvp6188_out: endpoint {
				remote-endpoint = <&mipi_dphy0_in_nvp6188>;
				data-lanes = <1 2 3 4>;
			};
		};
	};
};
 
&mipi2_csi2 {
	status = "okay";
 
	ports {
		#address-cells = <1>;
		#size-cells = <0>;
 
		port@0 {
			reg = <0>;
			#address-cells = <1>;
			#size-cells = <0>;
 
			mipi2_csi2_input: endpoint@1 {
				reg = <1>;
				remote-endpoint = <&csidphy0_out>;
			};
		};
 
		port@1 {
			reg = <1>;
			#address-cells = <1>;
			#size-cells = <0>;
 
			mipi2_csi2_output: endpoint@0 {
				reg = <0>;
				remote-endpoint = <&cif_mipi2_in>;
			};
		};
	};
};
 
&rkcif_mipi_lvds2 {
	status = "okay";
	/* parameters for do cif reset detecting:
	 * index0: monitor mode,
		   0 for idle,
		   1 for continue,
		   2 for trigger,
		   3 for hotplug (for nextchip)
	 * index1: the frame id to start timer,
		   min is 2
	 * index2: frame num of monitoring cycle
	 * index3: err time for keep monitoring
		   after finding out err (ms)
	 * index4: csi2 err reference val for resetting
	 */
	rockchip,cif-monitor = <3 2 1 1000 5>;
 
	port {
		cif_mipi2_in: endpoint {
			remote-endpoint = <&mipi2_csi2_output>;
		};
	};
};
 
&rkcif {
	status = "okay";
	rockchip,android-usb-camerahal-enable;
	// memory-region = <&cif_reserved>;
};
 
&rkcif_mmu {
	status = "okay";
};

注解

rockchip,android-usb-camerahal-enable;该配置是在多路摄像头的时候使用,可以让应用注册4路摄像头,从而apk可以同时预览4路。如果是自行开发应用,使用v4l2从video节点直接取数据流的话,那么可以不用。

编译烧录

./build.sh lunch #选择板级配置文件
./build.sh kernel #编译内核

编译完成后烧录内核镜像boot.img即可。

调试

  1. 查看内核日志

dmesg | grep nvp6188
  1. 检查I2C设备是否识别

i2cdetect -y 7 #假设NVP6188连接在I2C7上
  1. 查看摄像头设备设备节点

ls /dev/video* # 应出现NVP6188对应的视频设备(如/video0)
v4l2-ctl --list-devices  # 检查设备名称是否为“nvp6188”
  1. 查看摄像头信息

v4l2-ctl -d /dev/video0 --list-formats-ext
  1. 配置摄像头参数

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=NV12
  1. 启动摄像头预览

./rockchip-test/camera/camera_rkaiq_test.sh #如果无法启动请检查脚本内对应设备节点是否正确

AHD转BT1120调试

以NVP6158C为例

内核配置

内核启用如下配置项:

  • V4L2 子系统(CONFIG_VIDEO_V4L2=y)

  • I²C 核心及设备驱动(CONFIG_I2C=y、CONFIG_I2C_GPIO=y)

  • NVP6188 驱动模块(CONFIG_VIDEO_NVP6158=y)

DTS配置

&i2c2 {
	status = "okay";
	pinctrl-names = "default";
	pinctrl-0 = <&i2c2m1_xfer>;
	nvp6158: nvp6158@30 { 
		compatible = "nvp6158-v4l2"; // 设备的兼容性标识
		status = "okay";
		reg = <0x30>; 
		
		clocks = <&cru CLK_CIF_OUT>; //时钟源,走GPIO CIF时钟 配置为是27M
		clock-names = "xvclk"; //时钟名称

		power-domains = <&power RK3568_PD_VI>; 
		pinctrl-names = "default"; 
		pinctrl-0 = <&cif_clk &cif_dvp_clk &cif_dvp_bus16>; 
		//pwr-gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;  
		rst-gpios = <&gpio4 RK_PB0 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,走BT1120模式
		rockchip,channel_nums = <4>; //并口的数据lane ,只有一条lane 可配置1 参数:1/2/4
		rockchip,dual_edge = <1>; // pclk的边沿有效 一般用于配置分辨率 720p:0 1080P:1
		rockchip,default_rect= <1920 1080>; // 摄像头分辨率,rkcif会从nvp6158驱动里获取
		port {
			nvp6158_out: endpoint { 
				remote-endpoint = <&dvp_in_bcam1>; 
			}; 
		}; 
	};
};
/*NVP6158C CONFIG*/
&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>; 
			}; 
			}; 
		}; 
};

编译烧录

./build.sh lunch #选择板级配置文件
./build.sh kernel #编译内核

编译完成后烧录内核镜像boot.img即可。

调试

  1. 查看内核日志

dmesg | grep nvp6158c
  1. 检查I2C设备是否识别

i2cdetect -y 7 #假设NVP6158c连接在I2C7上
  1. 查看摄像头设备设备节点

ls /dev/video* # 应出现NVP6158c对应的视频设备(如/video0)
v4l2-ctl --list-devices  # 检查设备名称是否为“nvp6158c”
  1. 查看摄像头信息

root@RK356X:/# v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
	Type: Video Capture Multiplanar

	[0]: 'NV16' (Y/CbCr 4:2:2)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[1]: 'NV61' (Y/CrCb 4:2:2)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[2]: 'NV12' (Y/CbCr 4:2:0)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[3]: 'NV21' (Y/CrCb 4:2:0)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[4]: 'YUYV' (YUYV 4:2:2)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[5]: 'YVYU' (YVYU 4:2:2)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[6]: 'UYVY' (UYVY 4:2:2)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[7]: 'VYUY' (VYUY 4:2:2)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[8]: 'RGB3' (24-bit RGB 8-8-8)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[9]: 'RGBP' (16-bit RGB 5-6-5)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[10]: 'BGRH' (18-bit BGRX 6-6-6-14)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[11]: 'RGGB' (8-bit Bayer RGRG/GBGB)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[12]: 'GRBG' (8-bit Bayer GRGR/BGBG)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[13]: 'GBRG' (8-bit Bayer GBGB/RGRG)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[14]: 'BA81' (8-bit Bayer BGBG/GRGR)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[15]: 'RG10' (10-bit Bayer RGRG/GBGB)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[16]: 'BA10' (10-bit Bayer GRGR/BGBG)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[17]: 'GB10' (10-bit Bayer GBGB/RGRG)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[18]: 'BG10' (10-bit Bayer BGBG/GRGR)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[19]: 'RG12' (12-bit Bayer RGRG/GBGB)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[20]: 'BA12' (12-bit Bayer GRGR/BGBG)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[21]: 'GB12' (12-bit Bayer GBGB/RGRG)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[22]: 'BG12' (12-bit Bayer BGBG/GRGR)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[23]: 'BYR2' (16-bit Bayer BGBG/GRGR)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[24]: 'Y16 ' (16-bit Greyscale)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[25]: 'GREY' (8-bit Greyscale)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[26]: 'EBD8' (Embedded data 8-bit, compressed)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
	[27]: 'SPD6' (Shield pix data 16-bit, compressed)
		Size: Stepwise 64x64 - 1920x1080 with step 8/8
  1. 配置摄像头参数

v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=NV12
  1. 启动摄像头预览 可以参考如下脚本,根据实际情况修改对应设备节点及分辨率等参数。

#!/bin/bash
# 设置调试级别为5
rt GST_DEBUG=*:5

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/gstreamer-1.0 # 确保GStreamer库路径正确

# 设置摄像头格式为1920x1080 NV12
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=NV12 || {
    echo "错误:无法设置摄像头为1920x1080 NV12格式!"
    exit 1
}

# 使用相同的分辨率和格式启动GStreamer管道
echo "启动1920x1080高清预览..."
echo "按 Ctrl+C 停止预览"

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! waylandsink

常见问题

I2C设备无法识别

  1. 检查I2C设备是否正确连接(I2C是否有上拉电阻)

  2. 检查I2C设备的地址是否正确

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

  4. 排查供电是否正常

无图像

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

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

  3. 检查摄像头是否连接,供电是否正常