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为例
硬件确认
确保 NVP6188 供电电压(如 3.3V、1.8V)稳定,通过万用表测量电源引脚电压
检查外部时钟源(如 24MHz 晶振)是否正常起振,可通过示波器测量时钟信号幅度和频率
NVP6188 通过 I²C 接口与 RK3588 通信(需确认 I²C 总线引脚,如 SCL/SDA),需确保上拉电阻(通常 4.7kΩ)正确焊接,避免通信失败
模拟视频输入(如 CVBS 信号)通过电容耦合至 NVP6188 的 AIN 引脚,注意阻抗匹配(75Ω)
如复位引脚(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即可。
调试
查看内核日志
dmesg | grep nvp6188
检查I2C设备是否识别
i2cdetect -y 7 #假设NVP6188连接在I2C7上
查看摄像头设备设备节点
ls /dev/video* # 应出现NVP6188对应的视频设备(如/video0)
v4l2-ctl --list-devices # 检查设备名称是否为“nvp6188”
查看摄像头信息
v4l2-ctl -d /dev/video0 --list-formats-ext
配置摄像头参数
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=NV12
启动摄像头预览
./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即可。
调试
查看内核日志
dmesg | grep nvp6158c
检查I2C设备是否识别
i2cdetect -y 7 #假设NVP6158c连接在I2C7上
查看摄像头设备设备节点
ls /dev/video* # 应出现NVP6158c对应的视频设备(如/video0)
v4l2-ctl --list-devices # 检查设备名称是否为“nvp6158c”
查看摄像头信息
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
配置摄像头参数
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=NV12
启动摄像头预览 可以参考如下脚本,根据实际情况修改对应设备节点及分辨率等参数。
#!/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设备无法识别
检查I2C设备是否正确连接(I2C是否有上拉电阻)
检查I2C设备的地址是否正确
确认时钟脚有无27M CLK信号
排查供电是否正常
无图像
确认时钟脚有无27M CLK信号
.确认下发的分辨率与接入的摄像头是否对应得上
检查摄像头是否连接,供电是否正常