Camsys 子系统
系统概述
Camsys 子系统包含 Camera sensor (包括 SerDes)、VIN(包括 MIPI、CIM)、ISP、PYM、GDC、YNR、STITCH 模块。
| 简称 | 全称 | 说明 |
|---|---|---|
| MIPI | Mobile Industry Processor Interface | 移动产业处理器接口,MIPI 联盟制定的标准 |
| CSI | Camera Serial Interface | Camera 串行接口 |
| IPI | Image Pixel Interface | MIPI 与 CIM 之间的图像传输接口 |
| FOV | Field of View | 视场角 |
| SER | Serializer | 加串器 |
| SerDes | Serializer and Deserializer | 加串与解串器 |
| DES | Deserializer | 解串器 |
| CIM | Camera Interface Manger | Camera 接入管理模块,支持 online 或 offline 工作 |
| VIN | Video In(CIM+MIPI+LPWM+VCON) | 视频输入模块 |
| ISP | Image Signal Processor | 图像信号处理器 |
| PYM | Pyramid | 金字塔处理模块: 图像缩小及 ROI |
| GDC | Geometric Distortion Correction | 几何畸变校正模块 |
| LPWM | Lite Pulse Width Modulation | 精简版脉宽调制模块 |
| VPF | Video Process Framework(VIN+ISP+PYM..) | 视频处理管理模块 |
| VIO | Video In/Out (VIN+VPM) | 视频输入/输出模块 |
| STITCH | Stitch hardware Module | 图像拼接处理模块 |
| CAMSYS | Camera System (Camera+VPF) | 相机图像系统 |
camsys 硬件框图

子模块
MIPI
MIPI(Mobile Industry Processor Interface)移动行业处理器接口,是 MIPI 联盟发起的为移动应用处理器制定的开放标准。
- MIPI CSI RX 支持 C/DPHY,DPHY 速率4.5Gbps x 4lane = 18Gbps,CPHY 速率3.5Gsps x 3trios =24Gbps;
- S100上有3个 MIPI RX,分别为 RX0,RX1,RX4;
MIPI(Mobile Industry Processor Interface)移动行业处理器接口,是 MIPI 联盟发起的为移动应用处理器制定的开放标准。
- MIPI CSI RX 支持 C/DPHY,DPHY 速率4.5Gbps x 4lane = 18Gbps,CPHY 速率3.5Gsps x 3trios =24Gbps;
- S600上有6个 MIPI RX,分别为 RX0~RX5;
CIM
CIM(Camera Interface Manager)是一种专门用来接收 MIPI-RX IPI 图像数据的硬件。CIM 负责同时接入多路图像数据,并改变 MIPI IPI 接口的时序以匹配后级硬件或 DDR 的输入时序要求,将图像通过硬件直连或 DDR 形式提供给 ISP 和 PYM。
- S100上共有3个 CIM 模块,分别为 CIM0 CIM1 CIM4;
- 单个 CIM 最大支持接入4V * 8M * 30fps,支持接入 RAW8、RAW10、RAW12、RAW14、RAW16、RAW20、YUV422~8Bit 图像;
- S100 CIM 可 online 输出到 ISP0/ISP1(RAW)与 PYM0/PYM1(YUV),也可 offline 下 DDR。
- S100 CIM0的 IPI0最大接入宽为5696,CIM0其他的 IPI 和其他 CIM 中的 IPI 最大接入宽为4096;
- S600上共有6个 CIM 模块,分别为 CIM0~CIM5;
- 单个 CIM 最大支持接入4V * 8M * 30fps,支持接入 RAW8、RAW10、RAW12、RAW14、RAW16、RAW20、YUV422~8Bit 图像;
- S600 CIM 可 online 输出到 ISP0/ISP1/ISP2/ISP3(RAW)与 PYM0/PYM1/PYM2/PYM3(YUV),也可 offline 下 DDR。
- S600 CIM0~2最大接入宽为5696,其他 CIM 接入最大宽为4096
ISP
ISP (Image Signal Processor)图像信号处理器,是一种专门用于图像信号处理的引擎。 ISP 的功能包括对原始图像进行各类算法处理、图像特性统计、色彩空间转换、多路通道分时复用控制等,最终输出更清晰、更准确、高质量的图像。
- 每个 ISP 硬件模块 IP 最大支持12路 sensor 的接入能力;
- S100上共有2个 ISP 模块,分别为 ISP0 ISP1;
- S100 ISP 处理最大分辨率为4096 * 2160;
- 每个 ISP 硬件模块 IP 最大支持12路 sensor 的接入能力;
- S600上共有4个 ISP 模块,分别为 ISP0~ISP3;
- S600 ISP 处理最大分辨率为5696 * 3328。
ISP 处理 pipeline 如下图:
- MCFE: Multi-Context Front End,用于 ISP 多路调度控制与 buffer 管理,one by one 进行 Multi-camera 图像处理。
- RAW Domain: RAW 域图像处理,包含 input port (含 input crop 功能)、channel switch、input formatter、sensor offset linear、digtal gain、gamma FE(即 decompander)、gamma_sqrt、raw frontend、static defected、sinter、chromatic aberration、gamma_sq、gamma BE、static white blance、radial shading correction、mesh shading correction、digital gain iridix、iridix、demosaic 等。
- RGB Domain: RGB 域图像处理,包含 purple fringe correction、color matrix、gamma RGB forward SQ、crop、CNR、gamma RGB reverse SQ、RGB gamma 等。
- Output formatter: CS(color space) coversion,将 RGB 通道数据转换成 YUV 等 format,output control 进行输出控制。
YNR
YNR 为 yuv 域的降噪模块 Digital Noise Reduction,YNR 支持2DNR 与3DNR 模式
- S100上共有一个 YNR 模块,YNR1,只支持 ISP1-online-YNR1-online-PYM1场景;
- S100在2DNR 或3DNR 模式下,处理的最大宽高为2048*2048;
- S600上共用四个 YNR 模块,YNR0-3,只支持 isp-online-ynr-online-pym 场景,其中 YNR0-2只支持2DNR,YNR3支持2DNR&3DNR;
- S600 YNR0-2支持处理最大宽高为5696,YNR3处理最大宽高为4096;
PYM
PYM(Pyramid)作为一个硬件加速模块,对输入的图像按照金字塔图层的方式处理,并输出到 DDR。
- S100上共有3个 PYM 模块,分别为 PYM0 PYM1 PYM4;
- S600上共有5个 PYM 模块,分别为 PYM0~4;
- SRC 层:代表源图像层;
- BL 层:代表双线性下采样层,BL Base 0~4依次是源图层的1/2,1/4,1/8,1/16,1/32;
- DS 层:输出层,每层能够任意选择输入图层(SRC 或0~4BL),并进行下采样和 ROI 处理后输出到 DDR;
- 缩小 ratio(1/2,1],不支持放大;
- S100每个最大输入宽度输入高度均为4096,最小输入宽度及高度为32;
- S100 PYM0/1:4K@120fps,PYM4:4K@90fps;
- S600每个最大输入宽 高均为5696,最小输入宽度及高度为32;
- S600 PYM0~4:4K@120fps,其中 PYM4 不支持 online 输入。
GDC
GDC 作为一个硬件模块,可将输入的图像进行视角变换、畸变校正和指定角度(0,90,180,270)旋转。
模式支持的输入图像典型尺寸为3840x2160,2688x1944,1920x1080,1280x720,640x480,480x320。
硬件特性如下:
- 最大分辨率:3840x2160
- 最小分辨率:96x96(奇数行或者列不支持)
- 性能:3840x2160,60fps
- 工作模式:ddr-gdc-ddr
- 输入格式:YUV420 semi-planar
- 输出格式:YUV420 semi-planar
- S100上有1个 GDC 模块。
- 最大分辨率:3840x2160
- 最小分辨率:96x96(奇数行或者列不支持)
- 性能:3840x2160,60fps
- 工作模式:ddr-gdc-ddr
- 输入格式:YUV420 semi-planar
- 输出格式:YUV420 semi-planar
- S600上有2个 GDC 模块。
GDCTool 简介
GDC Tool 是一种可在 PC 上进行处理效果仿真的工具。用户可准备 jpg 模式的图像,load 到 gdc-tool 中进行离线校正,校正完成后可以直接保存 config.bin 文件用于硬件校正,也可用保存 layout.json 文件生成 config.bin 进行硬件校正
GDC Tool 启动
-
window 环境启动
安装环境:依赖 nodejs 安装,参考:https://nodejs.cn/download/
安装执行依赖:在 win 命令行,进入 GDC 发布的工具文件(如 gdc-tool-gui-xxxx-windows)目录下,执行 npm install express
启动应用:在 win 命令行进入文件目录(如 gdc-tool-gui-xxxx-windows),执行 node.exe app.js,Chrome 浏览器登陆 http://localhost:3000/
-
unix 环境启动
安装环境:mac: brew install node
安装执行依赖:文件目录下执行 npm install -production
启动应用:执行 node app.js,登陆 http://localhost:3000/
GDC Tool 中的变换模式
变换模式有 Affine,Equisolid,Equisolid(cylinder),Equidistant, Custom, Keystone+dewarping 六种变换供选择,这些模式与软件中的变换模式对应关系见 GDC Bin API 文档中的 transformation_t 描述,下表是各个变换的用途
| 变换模式 | 用途 |
|---|---|
| Affine | 一种线性变换,简单的图像旋转功能,没有畸变校正 |
| Equisolid | 全景变换,变换网格最大 |
| Equisolid(cylinder) | 圆柱形变换 |
| Equidistant | 等距变换,变换后的距离等距。 |
| Custom | 用户定制变换 |
| Keystone+dewarping | 相对于 Equidistant,dewarp_keystone 多了两个参数 trapezoid_left_angle 和 trapezoid_right_angle。默认情况下这两个参数90度,效果和 Equidistant 一样。 |
所有转换类型都有以下三个常用参数 Pan、Tile、Zoom(举例:等距变换,输入/输出分辨率1280x720): 以下输出图像中的蓝色矩形表示仅将特殊参数设置为该值, 并且一个转换中的其他参数保持默认值。
-
Pan
水平方向 (-1280, +1280)通过给定的像素数,偏移变换网格。如下所示:
-
Tile
垂直方向 (-720, +720)通过给定的像素数,偏移变换网格。如下所示:
-
Zoom
按提供的因子 (0, +∞)缩放变换输出,(0, 1)表示值大于 0 且小于 1。如下所示:
-
Affine
-
功能描述
提供线性的变换
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出, 当旋转角度为180或270时,该值需>=1.03 double angle(rotation) 图像旋转的角度 0/90/180/270 注意!输入输出尺寸的宽应保持16字节对齐。
zoom 参数在旋转角度为180或270时,需>=1.03
-
-
Equisolid
-
功能描述
此转换提供等实体(全景 panoramic)校正,并将结果显示为平面上的投影。
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 double strengthX 沿 X 轴的变换强度(非负参数) double strengthY 沿 Y 轴的变换强度(非负参数) double angle(rotation) 图像旋转的角度 0/90/180/270 strength x 调试效果,在 X 轴的转换强度,取值(0, +∞)。如下所示:
strength y 调试效果,在 Y 轴的转换强度,取值(0, +∞)。如下所示:
Rotation 调试效果,取值(-180, 180)。如下所示:
注意!输入输出尺寸的宽应保持16字节对齐。
-
-
Equisold(cylinder)
-
功能描述
此转换提供等实体(全景 panoramic)校正,并将结果显示为平面上的投影。
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 strength 转换的强度 double angle(rotation) 图像旋转的角度 0/90/180/270 strength 调试效果,转换的强度(0,+∞)。如下所示:
rotation 调试效果,取值范围(-180,+180)。如下所示
注意!输入输出尺寸的宽应保持16字节对齐。
-
-
Equidistant
-
功能描述
等距变换包含许多参数,这些参数允许它为投影提供一系列不同的目标平面。这使用户可以更自由地选择要变换的鱼眼帧的所需区域。
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 double angle(rotation) 图像旋转的角度 0/90/180/270 double elevation 定义了投影轴的仰角,范围0到90 double azimuth 定义了投影轴的方位角度。如果仰角参数 elevation 为0,则方位角将没有可见效果 int32_t keep_ratio 转当“保持比率”参数打开时,FOV 高度参数将被忽略,其值将自动计算,以在水平和垂直方向上保持相同的拉伸强度 double FOV_h 描述水平维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double FOV_w 描述垂直 维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double cylindricity_y 描述目标投影沿 Y 轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,而“圆柱度 X”值设置为0,则投影将沿 Y 轴形成圆柱体 double cylindricity_x 描述目标投影沿 X 轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度 Y”值设置为0,则投影将沿 X 轴形成圆柱体 elevation 调试效果:
azimuth 调试效果:
rotation 调试效果:
cylindricity x 调试效果:
描述目标投影沿 X 轴的球形程度。该值的范围为0到1,其中1为球形。如果该值设置为1,圆柱度 Y 值设置为0,则投影将沿 X 轴形成圆柱。如下所示:
cylindricity y 调试效果:
描述目标投影沿 Y 轴的球形程度。该值的范围为0到1,其中1为球形。如果该值设置为1,圆柱度 X 值设置为0,则投影将沿 Y 轴形成一个圆柱体。如下所示:
注意!输入输出尺寸的宽应保持16字节对齐。 正常的视力值大约是90度。对于圆柱度(见下文)等于“0”的变换,视场宽度和高度180的值将导致图像无限拉伸。 如果 cylindricity_x 和 cylindricity_y 圆柱度值都设置为1,则投影将是球形的。如果两者都是0,则变换将是矩形的。
-
-
Custom
-
功能描述
采用 custom 变换后,输入图像中的每个多边形都会变换为正方形。换句话说,任何形状的任何四个邻近输入点在转换后都是正方形,如下图所示。但是,多边形的形状和位置在变换后会发生变化。
它们用于创建任何提供的转换都无法描述的转换。为了纠正任意失真,必须向 GDC 工具提供一个特殊的校准文件 config0.txt。如下图
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 char custom_file[128] config.txt 文件名称 custom_tranformation_t custom 解析的自定义转换结构 Config file 的规则大致需要注意一下几点:
-
第一行是在像素计算中使能 full tile, 1是 enable, 0是 disable。
-
第二行是如果使能了 full file,则要跳过的像素数量;这些值需要大于 0,数字越小,libgdc 的性能越慢(性能越慢是指 config.bin 的大小更大, libgdc 生成 config.bin 的时间更长)。
-
第三行是垂直方向和水平方向标定点的个数, 第一个值 Y = 1081指的是垂直方向有1081个标定点,第二个值 X = 1921指的水平是方向有1921个标定点。
-
第四行是选中区域的中心点,通常是(Y-1)/2、(X-1)/2。
-
标定点必须是大于等于0的 int 或 float 类型、相邻两行的标定点不能重复。 eg.下图是截取的其中的一部分数据图片,第五行到第九行就是标定点在源图的坐标值,格式是 Y: X。以下图为例,一共有1081x1921个标定点。
-
由于标定点必须是等距离的,这意味着输出图片的分辨率取决于标定点的点数。
eg. 输出图片的 Width = 100, Height 计算为340,计算过程如下:100/height = (96
1)/(3241)
下图是更简单的3x3坐标点转换的示例图
-
-
-
Keystone+dewarping
-
功能描述
-
成员说明
成员 含义 int32_t pan default 0, 不修改 int32_t tilt default 0, 不修改 zoom 按提供的因子缩放转换输出 double angle(rotation) 图像旋转的角度 0/90/180/270 double elevation 定义了投影轴的仰角,范围0到90 double azimuth 定义了投影轴的方位角度。如果仰角参数 elevation 为0,则方位角将没有可见效果 int32_t keep_ratio 当“保持比率”参数打开时,FOV 高度参数将被忽略,其值将自动计算,以在水平和垂直方向上保持相同的拉伸强度 double FOV_h 描述水平维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double FOV_w 描述垂直维度中输出视图字段的大小(以度为单位)。有效值的范围是从0到180 double cylindricity_y 描述目标投影沿 Y 轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,而“圆柱度 X”值设置为0,则投影将沿 Y 轴形成圆柱体 double cylindricity_x 描述目标投影沿 X 轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度 Y”值设置为0,则投影将沿 X 轴形成圆柱体 double trapezoid_left_angle 默认90;0.1到90 ;变换网格中,左边边界相对于底边边界的角度,见实际效果 double trapezoid_right_angle 默认90;0.1到90 ;变换网格中,右边边边界相对于底边边界的角度,见实际效果 注意!输入输出尺寸的宽应保持16字节对齐。
-
GDC Tool 变换模式参数说明
配置文件可由 GDC tool 生成,以 layout.json 存在。不同的变换模式有不同的参数,以 custom 模式和 keystone+dewarping 模式为例,说明配置参数。
-
keystone+dewarping 模式
{
"inputRes": [
1920, // 输入图像尺寸的宽
1080 // 输入图像尺寸的高
],
"param": {
"fov": 180, // 输入图像的视场角
"diameter": 1080, // 输入图像的直径,可控制变换网格的整体大小
"offsetX": 0, // 变换网格在水平方向的偏移
"offsetY": 0 // 变换网格在垂直方向的偏移
},
"outputRes": [
1920, // 输出图像尺寸的宽
1080 // 输出图像尺寸的高
],
"transformations": [
{
"transformation": "Dewarp_keystone", // 变换模式
"position": [ // 输出图像的ROI区域设定
0, // 输出图像的ROI水平方向的偏移
0, // 输出图像的ROI垂直方向的偏移
1920, // 输出图像的ROI的宽
1080 // 输出图像的ROI的高
],
"param": {
"left_base_angle": 90, // 默认90;0.1到90;变换网格中,左边边界相对于底边边界的角度
"right_base_angle": 90, // 默认90;0.1到90;变换网格中,右边边界相对于底边边界的角度
"azimuth": 90, // 定义了投影轴的方位角度。如果仰角参数elevation为0,则方位角将没有可见效果
"elevation": 0, // 定义了投影轴的仰角,范围0到90
"rotation": 0, // 输出图像要旋转的角度
"fovWidth": 90, // 描述水平维度中输出视图字段的大小(以度为单位)。 数值越大,变换网格水平方向越宽,有效值的范围是从0到180
"fovHeight": 90, // 描述垂直维度中输出视图字段的大小(以度为单位)。数值越大,变换网格垂直方向越宽,有效值的范围是从0到180
"keepRatio": 0, // 当“保持比率”参数为1时候,fovHeight参数将被忽略,其值将自动计算,以在水平和垂直方向上保持相同的拉伸强度
"cylindricityX": 1, // 描述目标投影沿X轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度Y”值设置为0,则投影将沿X轴形成圆柱体。
"cylindricityY": 1 // 描述目标投影沿X轴的球面度。此值从0到1,其中1是球形的。如果此值设置为1,并且“圆柱度Y”值设置为0,则投影将沿X轴形成圆柱体。
},
"ptz": [
0, // pan参数
0, // tile参数
1 // zoom参数
],
"roi": { // 输入图像ROI区域设定
"x": 0, // 输入图像ROI区域的水平方向偏移
"y": 0, // 输入图像ROI区域的垂直方向偏移
"w": 1920, // 输入图像ROI区域的宽
"h": 1080 // 输入图像ROI区域的高
}
}
],
"mode": "semiplanar420", // 处理的格式设定
"eccMode": "eccDisabled", // 处理的ecc模式
"colourspace": "yuv" // 处理的数据格式
} -
custom 模式
{
"inputRes": [
1280, // 输入图像尺寸的宽
720 // 输入图像尺寸的高
],
"param": {
"fov": 192, // 输入图像的视场角
"diameter": 720, // 输入图像的直径,可控制变换网格的整体大小
"offsetX": 0, // 变换网格在水平方向的偏移
"offsetY": 0 // 变换网格在垂直方向的偏移
},
"outputRes": [
560, // 输出图像尺寸的宽
258 // 输出图像尺寸的高
],
"transformations": [
{
"transformation": "Custom", // 变换模式
"position": [ // 输出图像的ROI区域设定
0, // 输出图像的ROI水平方向的偏移
0, // 输出图像的ROI垂直方向的偏移
560, // 输出图像的ROI的宽,小于等于outputRes的宽
258 // 输出图像的ROI的高,小于等于outputRes的高
],
"ptz": [
0, // pan参数
0, // tile参数
1 // zoom参数
],
"roi": { // custom模式下无效
"x": 0, // custom模式下无效
"y": 0, // custom模式下无效
"w": 0, // custom模式下无效
"h": 0 // custom模式下无效
},
"param": {
"customTransformation": "/path_to/camera_0_gdc.txt" // 坐标点文件的在板子中的路径
}
}
],
"mode": "semiplanar420", // 处理的格式设定
"eccMode": "eccDisabled", // 处理的ecc模式
"colourspace": "yuv" // 处理的数据格式
}注意!- ecc mode 统一填写 ecc is disable。可选 ecc mode 使能,但没有实际效果。
- 当参数为小数时,保证精度为浮点运算以后8位小数及以上,否则 可能生成的 bin 不一致。
- 用户填充数据结构或者 json 时填充的信息应该包含各种模式示例所有项。
- 非 custom 模式,配置文件中的 roi 参数代表输入图片的 roi。
- 配置文件中的 position 参数代表输出图片的 roi。
-
Affine 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Affine",
"position": [
0,
0,
1920,
1080
],
"param": {
"rotation": 0
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Equisolid 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Panoramic",
"position": [
0,
0,
1920,
1080
],
"param": {
"strength": 1,
"strengthY": 1,
"rotation": 0
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Equisolid(cylinder) 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Stereographic",
"position": [
0,
0,
1920,
1080
],
"param": {
"strength": 1,
"rotation": 0
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Equidistant 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 160,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Universal",
"position": [
0,
0,
1920,
1080
],
"param": {
"azimuth": 0,
"elevation": 0,
"rotation": 0,
"fovWidth": 90,
"fovHeight": 90,
"keepRatio": 0,
"cylindricityX": 1,
"cylindricityY": 1
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Custom 输入1280x720,输出560x258。配置文件内容如下:
{
"inputRes": [
1280,
720
],
"param": {
"fov": 192,
"diameter": 720,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
560,
258
],
"transformations": [
{
"transformation": "Custom",
"position": [
0,
0,
560,
258
],
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 0,
"h": 0
},
"param": {
"customTransformation": "/path_to/camera_0_gdc_config_3.1.txt"
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
-
Keystone+dewarping 配置文件内容如下:
{
"inputRes": [
1920,
1080
],
"param": {
"fov": 180,
"diameter": 1080,
"offsetX": 0,
"offsetY": 0
},
"outputRes": [
1920,
1080
],
"transformations": [
{
"transformation": "Dewarp_keystone",
"position": [
0,
0,
1920,
1080
],
"param": {
"left_base_angle": 90,
"right_base_angle": 90,
"azimuth": 0,
"elevation": 0,
"rotation": 0,
"fovWidth": 90,
"fovHeight": 90,
"keepRatio": 0,
"cylindricityX": 1,
"cylindricityY": 1
},
"ptz": [
0,
0,
1
],
"roi": {
"x": 0,
"y": 0,
"w": 1920,
"h": 1080
}
}
],
"mode": "semiplanar420",
"eccMode": "eccDisabled",
"colourspace": "yuv"
}输入图片加变换网格如下
输出图片如下
GDC bin 相关 API 参考
以下 API 用于 GDC BIN 生成,GDC 模块控制 API 见 HBN API。
-
hb_vio_gen_gdc_cfg
【函数声明】
int32_t hb_vio_gen_gdc_cfg(param_t *gdc_parm, window_t *wnds, uint32_t wnd_num, void **cfg_buf, uint64_t *cfg_size)
【参数描述】
- [IN] param_t *gdc_parm:gdc 对应参数,包括分辨率,格式等。
- [IN] window_t *wnds:gdc 内部区域参数。
- [IN] uint32_t wnd_num: window 数目。
- [OUT] uint32_t **cfg_buf:生成的 gdc cfg bin,内部分配。
- [OUT] uint64_t *cfg_size:gdc cfg bin 文件的大小。
【返回值】
- 成功:E_OK: Success
- 失败:E_NOT_OK: Fail,return error code;失败,返回错误码;range:[-10000,-1]
【功能描述】
生成 gdc 模块工作所需的 bin 文件。
-
hb_vio_set_gdc_cfg
【函数声明】
int32_t hb_vio_set_gdc_cfg(uint32_t pipeline_id, uint32_t *cfg_buf, uint64_t cfg_size)
【参数描述】
- [IN] uint32_t pipeline_id:pipeline id ; 软件通道 id;range:[0, 23],default:0;
- [IN] cfg_buf:config buffer of gdc cfg bin; gdc cfg bin 的 buffer
- [IN] cfg_size:size of gdc cfg bin ; gdc cfg bin 文件的大小
【返回值】
- 成功:E_OK: Success;成功
- 失败:E_NOT_OK: Fail,return error code;失败,返回错误码;range:[-10000,-1]
【功能描述】
设置 gdc 模块的 cfg bin。
-
hbn_free_gdc_bin
【函数声明】
void hb_vio_free_gdc_cfg(uint32_t *cfg_buf)
【参数描述】
- [IN] uint32_t* cfg_buf:Buffer of gdc cfg bin; gdc cfg bin 的 buffer.
【返回值】
- NONE
【功能描述】
释放生产 gdc 模块 cfg bin 的 buffer
GDC bin 相关参数说明
-
typedef struct param_t
名称 类型 最小值 最大值 默认值 含义 必选 format frame_format_t 处理图像格式 是 in reso lution_t 实际输入图像尺寸 是 out reso lution_t 实际输出图像尺寸 是 x_offset int32_t 0 0 输入区域沿 x 轴的偏移像素数 是 y_offset int32_t 0 0 输入区域沿 y 轴的偏移像素数 是 diameter int32_t 定义矩形输入图 像上包含实际鱼眼 照片的输入圆形区 域的像素直径。对 于某些相机,此圆 形图像区域的直径 可以大于或小于矩 形画布的尺寸(有 时可能会被裁剪)一般情况下 diameter 应保持与 input.height 一致。 是 fov double 0 视场定 义输入图像的可视 角度,影响源网格 的曲率。视场越大 ,透视变形越大。 是 -
typedef enum frame_format frame_format_t
名称 类型 最小值 最大值 默认值 含义 必选 FM T_UNKNOWN enum 未知格式 FMT_LUMINANCE enum 暂不支持 FMT_P LANAR_444 enum 暂不支持 FMT_P LANAR_420 enum 暂不支持 FMT_SEMIP LANAR_420 enum NV12 FM T_GDC_MAX enum -
typedef struct resolution_s resolution_t
名称 类型 最小值 最大值 默认值 含义 必选 w uint32_t 宽度(像素) h uint32_t 高度(像素) -
typedef struct window_t
名称 类型 最小值 最大值 默认值 含义 必选 out_r rect_t 输出数据大小信息 transform transformation_t 0 6 0 使用的转换模式 input_roi_r rect_t roi 区域 pan int32_t 以输出图像为中心的水平方向目标位移(像素单位) tilt int32_t 以输出图像为中心的垂直方向目标位移(像素单位) zoom double 目标缩放系数 strengthX double x 方向变换的非负变换强度参数 strengthY double y 方向变换的非负变换强度参数 angle double 主投影轴绕自身旋转的角度 elevation double 指定主投影轴的角度 azimuth double 指定主投影轴的角度,从北方向顺时针计数 keep_ratio int32_t 在水平方向和垂直方向保持相同的拉伸强度 FOV_h double 输出视场的垂直尺寸以度数表示 FOV_w double 输出视场的水平尺寸以度数表示 cylindricity_y double 目标在垂直方向上的投影形状的圆柱度水平 cylindricity_x double 目标在水平方向上的投影形状的圆柱度水平 custom_file[128] char custom 模式下的自定义转换描述文件 custom custom_tranformation_t 自定义模式下的转换信息 trapezoid_left_angle double 梯形底与斜边之间的左锐角 trapezoid_right_angle double 梯形底与斜边之间的右锐角 check_compute uint8_t 暂时无用 -
typedef struct rect_s rect_t
名称 类型 最小值 最大值 默认值 含义 必选 x int32_t 起始点 x 坐标 y int32_t 起始点 y 坐标 w int32_t 宽度 h int32_t 高度 -
typedef enum gdc_transformation transformation_t
名称 类型 最小值 最大值 默认值 含 义 必选 PANORAMIC enum 全景变 换 CYLINDRICAL enum NA STEREOGRAPHIC enum 畸变校正与全景变换相同,但输出图像是圆柱全景图,而不是平 面图 UNIVERSAL enum Equidistant 等距变 换 CUSTOM enum 用户定制的变换,可定制用于变换的网 格 AFFINE enum 线性变 换 DEWARP_KEYSTONE enum 相对于等距变换,可选择非等距。等距变换 Equidistant 是其 一种特殊情况 -
typedef struct point_s point_t
名称 类型 最小值 最大值 默认值 含义 必选 x double x 坐标 y double y 坐标 -
typedef struct custom_tranformation_s custom_tranformation_t
名称 类型 最小值 最大值 默认值 含义 必选 full_tile_calc uint8_t 是否开启分块计算;如果使能 fulltile,libgdcbin 会额外分块做 min/max 计算,tile 越多,精度越高,效果越好,但生成 bin 的时间也越长 tile_incr_x uint16_t tile increase in x tile_incr_y uint16_t tile increase in y w int32_t 自定义转换网格中水平方向上的数字或点 h int32_t 自定义转换网格中垂直方向上的数字或点 centerx double 沿 x 轴的中心,通常是水平方向坐标点数的一半 centery double 沿 y 轴的中心,通常是垂直方向坐标点数的一半 *points point_t config.txt中定义的转换点序列,数量 =w * h
STITCH
简介
stitch 是一个可配置的图像拼接计算单元,可以完成多幅图像之间的融合拼接,主要应用于自动泊车场景下的360度环视图像拼接。stitch 基于 ROI 进行计算,每个 ROI 可以完成两幅源图像的 alpha-beta blending 融合, 并将其写入目标图像指定的 ROI 中,这种融合拼接方式可以使得拼接过渡更加自然,同时 stitch 还支持 Y、U、V 各通道的增益调节,可以实现源图像间的亮度、色度均衡,进一步提升拼接效果。此外 stitch 支持用户输入自定义像素级 alpha-beta 权重值,基此可实现多种融合效果,如背景虚化、图像水印等。 Stitch 硬件支持最大的输入输出尺寸为4096x4096。 Stitch 输入支持选择最大的 ROI 区域为2000x2000。
硬件工作模式
- Online blnding: 无需输入 LUT 表,硬件自动进行融合拼接,要求 ROI w=h;该模式下硬件依据配置参数中的过渡带宽度、方向等,自动计算出每个像素点的 alpha、beta 权重值。
- Alpha blending: 需要输入 alpha LUT 表,硬件读取 DDR 中的 alpha 权重值进行加权融合; 其中 alpha LUT 表中存储着该 ROI 中每个像素点的 alpha 权重值。对于每个像素点硬件会分别读取 y、uv、alpha 的值进行加权融合。
- Alpha-beta blending: 需要输入 alpha、beta LUT 表,硬件读取 DDR 中的 alpha、beta 权重值进行加权融合。
- Src copy: 不需要输入 LUT 表,硬件直接拷贝 src0。
- Src alpha copy: 需要 alpha LUT 表,硬件读取 DDR 中的 alpha 权重值并进行融合 src0。 其中,LUT 表指的 是融合拼接权重参数 buf
硬件拼接示意图
通过使用图片上的两个源 ROI 进行不同 blend mode 的拼接,最终输出对应的 ROI 结果
拼接方案介绍
硬件拼接功能可以完成将多张图片拼接融合生成一张图片。硬件上设计灵活,以 ROI 为基本处理单位,基于 alpha blend 算法,使用不同的配置字参数划分出不同的 ROI 划分区域灵活的配置生成多种不同的拼接方案,并且运用 LUT 表处理拼接的过渡区域优化效果,在自动驾驶以及 ADAS 的 APA 场景下,可以将四路摄像头已经被畸变矫正过后的 IPM 图像数据拼接成一路360环视图,用于停车位的检测,方便用户查看车位线周边情况进行停车。
典型场景
在 APA 场景,四路环视泊车,GDC 从 DDR 中获取4张回灌图片和参考点(CFG BIN)通过畸变矫正输出4张 IPM 图,然后通过 STITCH 硬件拼接模块使用预先定义好的配置字拼接方案参数(CPG PARAM)进行硬件拼接输出鸟瞰图。
摆放位置
- 四张 IPM 图通过 copy 模式放到指定输出地址的指定位置
- 没有重合的区域可以使用直接拷贝模式
- ROI 重合区域使用 Alpha Blend 模式进 行融合拼接
LUT 表
LUT 表存放的是 alpha/beta 融合参数系数,类似权重值,每个 ROI 都要生成对应像素点的融合参数系数,范围0~255,依次存放进 LUT 表的内存中, 当 ROI 的拼接模式使用 alpha 和 beta 融合时候,会使用该参数进行融合。
比如 坐标点参数举例章节中的 LUT 生成: ROI-0/1: 256512 ROI-2/3: 560256 ROI-4/5:256218 ROI-6/7:256186 LUT:ROI-0 + ROI-1 + ROI-2 + ROI-3 + ROI-4 + ROI-5 + ROI-6 + ROI-7 目前 LUT 表可以通过 convert_tool 工具生成。
坐标点参数举例
硬件拼接的 ROI 的划分与相机的安装位置有直接关系,目前可以通过 convert-tool 工具生成,下图为各 ROI 划分区域坐标点显示示例。
| ROI | 范围 | SRC0 | 起点 | 大小 | SRC1 | 起点 | 大小 | 目标起点 | 模式 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 左视全图 | 左视(frame0) | (0,0) | -256,512 | / | / | / | (0,40) | 直接拷贝 |
| 1 | 右视全图 | 右视(frame2) | (0,0) | -256,512 | / | / | / | (304,40) | 直接拷贝 |
| 2 | 后视全图 | 后视(frame3) | (0,0) | -560,256 | / | / | / | (0,366) | 直接拷贝 |
| 3 | 前视全图 | 前视(frame1) | (0,0) | -560,256 | / | / | / | (0,0) | 直接拷贝 |
| 4 | 左视与前视重合 | 左视(frame0) | (0,0) | -256,218 | 前视(frame1) | (0,40) | -256,218 | (0,40) | AlphaBlend |
| 5 | 右视与前视重合 | 右视(frame2) | (0,0) | -256,218 | 前视(frame1) | (304,40) | -256,218 | (304,40) | AlphaBlend |
| 6 | 左视与后视重合 | 左视(frame0) | (0,366) | -256,186 | 后视(frame3) | (0,0) | -256,186 | (0,366) | AlphaBlend |
| 7 | 右视与后视重合 | 右视(frame2) | (0,366) | -256,186 | 后视(frame3) | (304,0) | -256,218 | -304,366 | AlphaBlend |
LPWM
LPWM 简述
LPWM 为类似 PWM 的信号源,一般用于 camsys 系统中触发 sensor 曝光。LPWM 本身也需要外界触发,在收到 trigger 信号后,按照所配置的 period, high-time, offset 等参数输出 1Hz ~ 500KHz,有效高电平 0us ~ 4095us,默认精度为 1us 的方波。
S100 总共有 3 个 LPWM chip,每个 LPWM chip 下面有 4 个 LPWM 通道,请根据实际的硬件连接使用配置。
S100 的 camera 硬件同步功能的主体实现依赖 LPWM 模块,其支持 S100 多种 trigger 信号源,并产生多通道的可配置 PWM 信号,输出给外部 camera 使用(可经 SerDes 转发),从而实现 trigger 源与 camera 的同步及所有多 camera 之间的同步。
LPWM 配置项说明
-
trigger_mode [0, 1]:LPWM 触发方式,0 为内部软件触发,1 为外部触发。
-
trigger_source [0, 10]:LPWM 触发源,使用外部触发源需将 trigger_mode 设置为1。一般场景下使用 0,触发周期默认为1s。
| trigger_source 的值 | 对应的触发源 |
|---|---|
| 0 | aon_rtc_pps |
| 1 | reserve |
| 2 | pps0 |
| 3 | pps1 |
| 4 | pps2 |
| 5 | reserve |
| 6 | pcie0_ptm_pps |
| 7 | pcie1_ptm_pps |
| 8 | acore_eth0_pps |
| 9 | acore_eth1_pps |
| 10 | mcu_eth_pps |
- period [2, 1000000)us:LPWM 输出的方波周期。
- offset [0, 1000000)us:LPWM 在每个 trigger 周期内第一个波形的偏移时间,需要小于 period 值。
- duty_time [0, 4096)us:LPWM 输出波形的有效高电平时间,需要小于 period 值。
- threshold [0, 65535]us:缓慢同步功能阈值,高阶功能,一般可忽略。
- adjust_step [0, 15]:每次的调整时间 adjust_time = 2^adjust_step,高阶功能,一般可忽略。
LPWM 配置计算说明
LPWM 的 trigger 源为 PPS,常用周期为 1s,在收到 trigger 信号后,首先进行一个 offset 的时间偏移,接着会输出连续方波,方波的周期以及有效电平的时间由配置所得,当下一个 trigger 信号到来,会重复偏移以及出波。
offset 设置依赖于 sensor fps,如果 fps 不能被 1s 整除,则需要设置 offset,反之 offset 设置为 0。
常见场景如接入30fps sensor,period 应设置为 1s/fps = 33333us。sensor 在跑完 30 帧经过 999,990us ,与下次 PPS trigger 会有 10us 的间隙,因此 offset 应设为 10us(至少10us,至多(period - duty_time us,为了稳妥,建议在计算出的 offset 基础上再加 1),否则 lpwm 会在1s 内发出 31 个方波)。
由于硬件或者外设差异,PPS 落在了高电平区域,若关闭缓慢同步功能或者缓慢同步成功后需要走完高电平区域才能进入下一个 trigger 周期,即重新计算 offset,此时可能存在 trigger 周期内 LPWM 波形未达到预期数量,导致曝光同步下 sensor 帧率不符合预期,可将 offset 适当增加保证 PPS 每次一定落在低电平区域,输出预期的波形。
Period = 1000000 / fps
Offset = 1000000 - Period * fps + 1
推荐使用配置
| 使用场景 | trigger_source | trigger_mode | duty_time | offset | period |
|---|---|---|---|---|---|
| 全30fps | 8(eth0)/9(eth1) | 1 | 100 | 11 | 33333 |
| 全25fps | 8(eth0)/9(eth1) | 1 | 100 | 11 | 40000 |
| 12.5/25fps | 8(eth0)/9(eth1) | 1 | 100 | 11 | 80000/40000 |
| 30/10fps | 8(eth0)/9(eth1) | 1 | 100 | 11 | 33333/100000 |
其他说明
当使能 MCU 的 RTC 功能时,CIM 硬件会自动锁存 LPWM trigger 信号对应的时间戳,软件会将该时间与 global_time 同步后提供给用户。当 sensor 工作在曝光同步模式下,此时间戳代表 sensor 触发曝光开始的时间。
当 sensor 工作在同步出图或者未同步的状态下,此时 sensor 曝光起始时间与 LPWM 信号无关,即 CIM 的 frame start(tv) 与 LPWM trigger(trig_tv) 时间之间无关联,此时该值无参考价值,无需关注。
实际使用需要确保 PPS 稳定落在低电平区域,因此可以根据实际调试情况适当调大 offset。
数据流和性能指标
RDK-S100 接入 camera 后,进入后级模块处理,其数据流通路如下图所示:
- MIPI RX: 3路 CDPHY,每路为 DPHY 最大 4.5Gbps/lane x 4lane 或 CPHY 最大 3.5Gbps/trio x 3trio,每路支持4VC,理论最多支持 12 路接入 。
| RDK-S100 软件预计最大支持 6路 camera,RX4 通过 serdes 最多可接入 4 路 camera,RX0 和 RX1 各接入 1路 camera,如果不是这种常规接法,请联系 FAE 进行确认。 |
|---|
商业版提供更完整的功能支持、更深入的硬件能力开放和专属的定制内容。为确保内容合规、安全交付,我们将通过以下方式开放商业版访问权限。
商业版本获取流程:
- 填写问卷:提交您的机构信息、使用场景等基本情况
- 签署保密协议(NDA):我们将根据提交信息与您联系,双方确认后签署保密协议
- 内容释放:完成协议签署后,我们将通过私有渠道为您开放商业版本资料
如您希望获取商业版内容,请点击下方链接填写问卷,我们将在 3 ~ 5 个工作日内与您联系: https://horizonrobotics.feishu.cn/share/base/form/shrcnpBby71Y8LlixYF2N3ENbre
-
CIM: RX 接入,可 online 输出到 ISP0/ISP1(RAW) 与 PYM0/PYM1(YUV),也可 offline 下 DDR,之后各模块通过 DDR 读取使用数据流。
-
ISP: 2 个 ISP 设备,各支持 4 路 online + 8 路 offline 输入,每个 ISP 最大支持 2x4K@60fps 处理。
-
PYM: 3 个 PYM 设备,其中 PYM0/PYM1 为全功能模块支持 online/offline,PYM4 只支持 offline,4K@60fps 处理。
-
GDC: 1 个 GDC 设备,只支持 offline 方式,4K@60fps 处理。
| CIM | ISP0 / ISP1 | PYM0 / PYM1 | PYM4 | GDC | YNR | STITCH | |
|---|---|---|---|---|---|---|---|
| 1080P 处理每帧耗时 | 3.7151 ms | 1.8616 ms | 2.2373 ms | 2.7616 ms | 3.7447 ms | 1.7774 ms | 1.5739 ms |
| 4k 处理每帧耗时 | 14.8606 ms | 7.4467 ms | 7.1356 ms | 10.7018 ms | 15.0624 ms | 7.1096 ms | 5.7349 ms |
Camsys 接入能力
S100 camsys 硬件设计理论可以最大接入8路4k RAW 30fps + 4路1536p YUV 30fps。 实际验证过最大接入场景为:
- 3路4k RAW(38402160) 30fps + 9路1280p RAW(19201280)30fps;
- 3路4k RAW(38402160) 30fps + 5路1280p RAW(19201280)30fps + 4路1536p YUV(1920*1536)30fps;
已点亮 sensor
| 类型 | sensor name | 备注 |
|---|---|---|
| MIPI sensor | IMX219 | raw10 1080p |
| GMSL sensor | 0820c | yuv 4k & 1080p |
| OVX3C | raw12 1280P | |
| OVX8B | raw12 4K |
Camera API
| 注意,本章节是基于 HBN 架构进行描述和列举内容,非 V4L2 架构。 |
|---|
模块描述
RDK-S100 HBN Camera 包含三个组件:Camera sensor、解串器(Deserial)、串行器(Serializer)。串行器是对 mipi tx 的封装。 每个组件都有 attach、detach 接口和 vin 绑定或解绑。如 camera 和 vin 绑定,就是确定 camera 使用 SoC 上的哪个 mipi rx、i2c controller 然后初始化 sensor 的过程。
API 参考
- hbn_camera_create
【函数声明】
int32_t hbn_camera_create(camera_config_t *cam_config, camera_handle_t *cam_fd)
【参数描述】
[IN] camera_config_t *cam_config:要配置的 camera 对应的参数结构体指针;
[OUT] camera_handle_t *cam_fd:根据配置参数返回的 fd,作为 camera 的操作 handle;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
根据 camera_config_t 传入的配置创建 camera handle。
【注意事项】
API 里面会对 sensor lib 进行检查,如果 sensor 驱动代码不符合 HBN 框架规范,则会检查报错。
API 里面会对 cam_config 进行检查,如果配置不符合 IP 硬件能力,则会检查报错。
- hbn_camera_destroy
【函数声明】
int32_t hbn_camera_destroy(camera_handle_t cam_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera 的操作 handle,由 hbn_camera_create 所创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
根据 camera handle 销毁对应的软件资源。
【注意事项】
hbn_camera_destroy 需要和 hbn_camera_create 成对使用。
hbn_camera_destroy 会释放 sensor lib, 执行完成后,sensor 将无法正常访问。
hbn_camera_destroy 内部会调用 hbn_camera_detach_from_vin,会触发 sensor 停流操作,所以 hbn_camera_destroy 需要在 hbn_vflow_destroy 之前调用。
- hbn_camera_attach_to_vin
【函数声明】
int32_t hbn_camera_attach_to_vin(camera_handle_t cam_fd, vpf_handle_t vin_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
[IN] vpf_handle_t vin_fd:由 hbn_vnode_open 接口创建的 vin node handle。
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
通过 camera 和 vin node 的 handle,将两者在 vpf 框架中绑定,并对 camera 的硬件初始化。
【注意事项】
同一个 camera,不能重复执行 hbn_camera_attach_to_vin,否则会报 attach error 错误。
- hbn_camera_detach_from_vin
【函数声明】
int32_t hbn_camera_detach_from_vin(camera_handle_t cam_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
将 camera 与 vin node 解绑,并做去初始化操作。
【注意事项】
hbn_camera_detach_from_vin 需要和 hbn_camera_attach_to_vin 成对使用。
hbn_camera_destroy 内部调用了 hbn_camera_detach_from_vin,所以调用了 hbn_camera_destroy 接口,hbn_camera_detach_from_vin 可以不再调用。
- hbn_camera_attach_to_deserial
【函数声明】
int32_t hbn_camera_attach_to_deserial(camera_handle_t cam_fd, deserial_handle_t des_fd, camera_des_link_t link)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
[IN] deserial_handle_t des_fd:deserial handle,由 hbn_deserial_create 创建;
[IN] camera_des_link_t link:camera 与 deserial 的 link 方式,根据 camera 接到哪个 link 决定。
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
通过 camera 和 deserial 的 handle,将两者绑定,并对 deserial 和 camera 硬件初始化。
【注意事项】
硬件上有解串器时才需要调用该接口。
执行 hbn_camera_attach_to_deserial 后,就不需要再执行 hbn_camera_attach_to_vin,而是由 deserial 绑定到 vin node。
- hbn_camera_detach_from_deserial
【函数声明】
int32_t hbn_camera_detach_from_deserial(camera_handle_t cam_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
将 camera 与 deserial 解绑,并做去初始化操作。
【注意事项】
hbn_camera_detach_from_deserial 需要和 hbn_camera_attach_to_deserial 成对使用。
调用该 api 前需要先调用 hbn_deserial_detach_from_vin
- hbn_camera_start
【函数声明】
int32_t hbn_camera_start(camera_handle_t cam_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
配置 camera 寄存器,开始出流。
【注意事项】
camera handle attach 到 vflow 后,该接口可以不调用。如果要调用必须先调用 hbn_vflow_start,再调用 hbn_camera_start。
- hbn_camera_stop
【函数声明】
int32_t hbn_camera_stop(camera_handle_t cam_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
camera 关流。
【注意事项】
需要和 hbn_camera_start 成对使用。
- hbn_camera_reset
【函数声明】
int32_t hbn_camera_reset(camera_handle_t cam_fd)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
通过重新初始化 sensor 来做 reset。
【注意事项】
如果在 camera attach vin 之前调用该接口,则会通过 camera_attach_to_vin 接口来给 sensor 初始化,达到 reset 效果。如果是在 camera attach vin 之后调用该接口,则会调用 sensor stop,sensor deinit,然后初始化再重新 init sensor,start sensor。
- hbn_camera_change_fps
【函数声明】
int32_t hbn_camera_change_fps(camera_handle_t cam_fd, int32_t fps)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
[IN] int32_t fps:sensor 出图帧率;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
动态切换 sensor 帧率。
【注意事项】
该功能需要在 sensor lib 库中实现相应的回调函数 dynamic_switch_fps。
- hbn_camera_read_register
【函数声明】
int32_t hbn_camera_read_register(camera_handle_t cam_fd, camera_reg_type_t type, uint32_t reg_addr)
【参数描述】
[IN] camera_handle_t cam_fd:camera handle,由 hbn_camera_create 创建;
[IN] camera_reg_type_t type:读取 sensor 寄存器的类型;
[IN] uint32_t reg_addr:寄存器地址;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
读取 camera 寄存器的值。
【注意事项】
无
- hbn_camera_get_handle
【函数声明】
camera_handle_t hbn_camera_get_handle(vpf_handle_t vin_fd, int32_t camera_index)
【参数描述】
[IN] vpf_handle_t vin_fd:vin node 的 fd;
[IN] int32_t camera_index:camera 的 port index;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
通过 vin node handle 或者 camera port index,获取对应的 camera handle。
【注意事项】
无
- hbn_camera_init_cfg
【函数声明】
int32_t hbn_camera_init_cfg(const char *cfg_file)
【参数描述】
[IN] const char *cfg_file:camera 配置文件路径(json);
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
通过传入的配置,创建 camera handle 和 deserial handle 并绑定。
【注意事项】
该 API 是通过解析 json 方式来创建 camera,与 sample 中非 json 方式接口不同,详情请咨询 FAE。
商业版提供更完整的功能支持、更深入的硬件能力开放和专属的定制内容。为确保内容合规、安全交付,我们将通过以下方式开放商业版访问权限。
商业版本获取流程:
- 填写问卷:提交您的机构信息、使用场景等基本情况
- 签署保密协议(NDA):我们将根据提交信息与您联系,双方确认后签署保密协议
- 内容释放:完成协议签署后,我们将通过私有渠道为您开放商业版本资料
如您希望获取商业版内容,请点击下方链接填写问卷,我们将在 3 ~ 5 个工作日内与您联系: https://horizonrobotics.feishu.cn/share/base/form/shrcnpBby71Y8LlixYF2N3ENbre
- hbn_deserial_create
【函数声明】
int32_t hbn_deserial_create(deserial_config_t *des_config, deserial_handle_t *des_fd)
【参数描述】
[IN] deserial_config_t *des_config:deserial 配置参数结构体指针;
[OUT] deserial_handle_t *des_fd:根据配置创建的 deserial handle;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
根据传入的配置,创建 deserial handle。
【注意事项】
硬件上有解串器时才需要调用该接口。
该接口会对 deserial 的配置进行检查,如果配置超出一定范围,则会报错。
该接口会对 deserial lib 进行检查,如果不符合 HBN 架构规范,则会报错。
- hbn_deserial_destroy
【函数声明】
int32_t hbn_deserial_destroy(deserial_handle_t des_fd)
【参数描述】
[IN] deserial_handle_t des_fd:deserial handle,由 hbn_deserial_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
根据 deserial handle 销毁对应的软件资源。
【注意事项】
hbn_deserial_destroy 需要和 hbn_deserial_create 成对使用。
- hbn_deserial_attach_to_vin
【函数声明】
int32_t hbn_deserial_attach_to_vin(deserial_handle_t des_fd, camera_des_link_t link, vpf_handle_t vin_fd)
【参数描述】
[IN] deserial_handle_t des_fd:deserial handle,由 hbn_deserial_create 创建;
[IN] camera_des_link_t link:deserial 的 link 编号;
[IN] vpf_handle_t vin_fd:要绑定到的 vin node handle;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
将 deserial 与 vin node 绑定。
【注意事项】
硬件上带有解串器,则 camera 与 deserial 进行绑定,deserial 与 vin node 绑定。
- hbn_deserial_detach_from_vin
【函数声明】
int32_t hbn_deserial_detach_from_vin(deserial_handle_t des_fd, camera_des_link_t link)
【参数描述】
[IN] deserial_handle_t des_fd:deserial handle,由 hbn_deserial_create 创建;
[IN] camera_des_link_t link:deserial 的 link 编号;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
将 deserial 与 vin node 解绑。
【注意事项】
hbn_deserial_detach_from_vin 与 hbn_deserial_attach_to_vin 需要成对使用。
- hbn_txser_create
【函数声明】
int32_t hbn_txser_create(txser_config_t *txs_config, txser_handle_t *txs_fd)
【参数描述】
[IN] txser_config_t *txs_config:tx serial 配置参数结构体指针;
[OUT] txser_handle_t *txs_fd:根据配置创建的 tx serial handle;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
根据传入的配置,创建串行器句柄 tx serial handle。
【注意事项】
硬件上有串行器时才需要调用该接口。
该接口会对 txser 的配置进行检查,如果配置超出一定范围,则会报错。
该接口会对 txser lib 进行检查,如果不符合 HBN 架构规范,则会报错。
- hbn_txser_destroy
【函数声明】
int32_t hbn_txser_destroy(txser_handle_t txs_fd)
【参数描述】
[IN] txser_handle_t txs_fd:tx serial handle,由 hbn_txser_create 创建;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
根据 tx serial handle 销毁对应的软件资源。
【注意事项】
硬件上有串行器时才需要调用该接口。
hbn_txser_destroy 与 hbn_txser_create 需要成对使用。
- hbn_txser_attach_to_vin
【函数声明】
int32_t hbn_txser_attach_to_vin(txser_handle_t txs_fd, camera_txs_csi_t csi, vpf_handle_t vin_fd)
【参数描述】
[IN] txser_handle_t txs_fd:tx serialhandle,由 hbn_txser_create 创建;
[IN] camera_txs_csi_t csi:tx csi index;
[IN] vpf_handle_t vin_fd:要绑定到的 vin node handle;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
将 tx serial 与 vin node 绑定。
【注意事项】
硬件上有串行器时才需要调用该接口。
该接口会对 txser 硬件进行初始化。
硬件上带有串行器,则 camera 与 txser 进行绑定,txser 与 vin node 绑定。
- hbn_txser_detach_from_vin
【函数声明】
int32_t hbn_txser_detach_from_vin(txser_handle_t txs_fd, camera_txs_csi_t csi)
【参数描述】
[IN] txser_handle_t txs_fd:tx serial handle,由 hbn_txser_create 创建;
[IN] camera_txs_csi_t csi:tx csi index;
【返回值】
成功:RET_OK 0
失败:异常为负值错误码
【功能描述】
将 tx serial 与 vin node 解绑。
【注意事项】
hbn_txser_detach_from_vin 需要与 hbn_txser_attach_to_vin 成对使用。
参数说明
typedef struct camera_config_s
| 名称 | 类型 | 最小值 | 最大值 | 默认值 | 含义 | 必选 |
|---|---|---|---|---|---|---|
| name[CAMERA_MODULE_NAME_LEN] | char | - | CAMERA_MODULE_NAME_LEN(108) | - | camera 模组名称,需要和 sensor lib 名称对应,如:sensor 驱动名称为:libimx219.so,那么 name 为 imx219 | 是 |
| addr | uint32_t | 0x00 | 0x7f | 0x00 | sensor 设备地址,一般是 i2c 7位地址 | 是 |
| isp_addr | uint32_t | 0x00 | 0x7f | 0x00 | isp 设备地址(如有),默认无 | 否 |
| eeprom_addr | uint32_t | 0x00 | 0x7f | 0x00 | eeprom 设备地址(如有),默认无 | 否 |
| serial_addr | uint32_t | 0x00 | 0x7f | 0x00 | serdes 设备地址(如有),默认无 | 否 |
| sensor_mode | uint32_t | 1 | 5 | 1 | sensor 工作模式,可以使用 enum sensor_mode_e 枚举,定义如下: | 是 |
| 1:NORMAL_M,linear 模式; | ||||||
| 2:DOL2_M,hdr2帧合成1帧; | ||||||
| 3:DOL3_M,hdr3帧合成1帧; | ||||||
| 4:DOL4_M,hdr4帧合成1帧; | ||||||
| 5:PWL_M,hdr 模式 sensor 内部合成 | ||||||
| sensor_clk | uint32_t | - | - | 0x00 | sensor 一些 clk 时钟配置,目前未生效,备用 | 否 |
| gpio_enable | uint32_t | 0 | 0xFFFFFFFF | 0 | 是否使用 X5 gpio 控制 camera sensor 的引脚,以满足 sensor 上下电的时序要求。 | 是 |
| 如:使用 gpio 来控制 sensor XSHUTDN 引脚。 | ||||||
| 注意:需要在 dts 中配置对应的 gpio number。 | ||||||
| 0:不使用 gpio 来控制; | ||||||
| 非0:使用 gpio 来控制 sensor,按照 bit 来使能 gpio。比如: 0x07 则代表使能 [gpio_a, gpio_b, gpio_c] 3 个 gpio。 | ||||||
| gpio_level | uint32_t | 0 | 1 | 0 | 如果选择 gpio_enablet,则可以配置 gpio_level bit 来控制 sensor 引脚高低电平。某个 gpio bit 与 sensor 管脚高低电平关系如下: | 是 |
| 0: 先输出低电平, sleep 1s,再输出高电平; | ||||||
| 1: 先输出高电平,sleep 1s,再输出低电平。 | ||||||
| 比如:0x05 = 101,从 bit0 到 bit2 分别代表 gpio_a 先输出高电平,再输出低电平,gpio_b 先输出低电平,再输出高电平,gpio_c 先输出高电平,再输出低电平。 | ||||||
| 需要根据 sensor spec 上电时序来自定义。 | ||||||
| bus_select | uint32_t | 0 | 6 | 0 | sensor i2c number 选择,一般硬件固定后,对应的 i2c 也是固定的,所以建议在 dts 中配置,这里可以省去。 | 否 |
| dts 中绑定 sensor i2c,详情见:camera 点亮说明文档。 | ||||||
| bus_timeout | uint32_t | 0 | - | 0 | I2C 的 timeout 时间配置。配置了 bus_select,才需要配置。 | 否 |
| fps | uint32_t | 0 | 120 | 0 | sensor 帧率配置。 | 是 |
| width | uint32_t | 0 | 8192 | 0 | sensor 出图宽度(pixel) | 是 |
| height | uint32_t | 0 | 4096 | 0 | sensor 出图高度(pixel) | 是 |
| format | uint32_t | - | - | - | sensor 数据类型,常见的如下: | 是 |
| RAW8: 0x2A; | ||||||
| RAW10: 0x2B; | ||||||
| RAW12: 0x2C; | ||||||
| YUV422 8-bit: 0x1E | ||||||
| flags | uint32_t | 0 | - | 0 | 可选功能:诊断,恢复,debug 等 | 否 |
| extra_mode | uint32_t | 0 | - | 0 | 各 sensor 库内部定制配置: 多用于区分模组与功能开关 | 是 |
| config_index | uint32_t | 0 | - | 0 | 各 sensor 库内部定制配置: 多用于区分模组与功能开关 | 是 |
| ts_compensate | uint32_t | 0 | - | 0 | 预留参数,备用 | 否 |
| mipi_cfg | mipi_config_t | - | - | - | MIPI 配置, 置为 NULL 自动从 sensor 驱动中获取配置(get_csi_attr)。 | 是 |
| calib_lname | char | - | - | - | sensor 效果库路径,默认路径为 /usr/hobot/lib/sensor | 是 |
| sensor_param | char | - | - | - | sensor 自定义数据 | 否 |
| iparam_mode | uint32_t | - | - | - | 预留参数,备用 | 否 |
| end_flag | uint32_t | - | - | - | 结构体配置的结束标志,默认为 CAMERA_CONFIG_END_FLAG | 是 |
typedef struct deserial_config_s
| 名称 | 类型 | 最小值 | 最大值 | 默认值 | 含义 | 必选 |
|---|---|---|---|---|---|---|
| name | char[CAMERA_MODULE_NAME_LEN] | - | - | - | Deserial 的名称,例如 max9296。 | 是 |
| addr | uint32_t | 0 | - | - | Deserial 设备的地址。 | 是 |
| gpio_enable | uint32_t | 0 | - | - | GPIO 操作使能位,索引自 VCON。 | 是 |
| gpio_level | uint32_t | 0 | - | - | GPIO 工作状态位,表示当前 GPIO 状态。 | 是 |
| gpio_mfp | uint8_t[CAMERA_DES_GPIO_MAX] | 0 | CAMERA_DES_GPIO_MAX | 0x0 | MFP 的 GPIO 功能选择,用于指定 GPIO 的多功能配置。 | 是 |
| bus_select | uint32_t | 0 | - | - | I2C 总线选择,索引自 VCON。 | 是 |
| bus_timeout | uint32_t | 0 | - | - | I2C 超时时间设置,单位为毫秒。 | 是 |
| lane_mode | uint32_t | 0 | - | - | PHY 配置的 lane 模式选择。 | 是 |
| lane_speed | uint32_t | 0 | - | - | PHY 配置的 lane 速率。 | 是 |
| link_map | uint32_t | 0 | - | - | Link 和 CSI/VC 的映射关系配置。 | 是 |
| link_desp | char[CAMERA_DES_LINKMAX][CAMERA_DES_PORTDESP_LEN] | - | - | - | 各 Link 连接模组的配置描述,用于多进程使用。 | 是 |
| reset_delay | uint32_t | 0 | - | - | Reset 操作的延迟时间,单位为毫秒。 | 是 |
| flags | uint32_t | 0 | - | - | 可选功能标志,例如诊断、调试等。 | 否 |
| poc_cfg | poc_config_t* | - | - | NULL | POC 配置指针,若为 NULL 则无 POC 功能。 | 否 |
| mipi_cfg | mipi_config_t* | - | - | NULL | MIPI 配置指针,若为 NULL 则自动获取配置。 | 否 |
| deserial_param | char* | - | - | NULL | Deserial 自定义数据指针。 | 否 |
| end_flag | uint32_t | 0 | 0xFFFFFFFF | - | 结构体配置的结束标志,默认为 DESERIAL_CONFIG_END_FLAG | 是 |
typedef struct poc_config_s
| 名称 | 类型 | 最小值 | 最大值 | 默认值 | 含义 | 必选 |
|---|---|---|---|---|---|---|
| name | char[CAMERA_MODULE_NAME_LEN] | - | - | - | POC 的名称,例如 max20087。 | 是 |
| addr | uint32_t | 0 | - | - | POC 设备的地址。 | 是 |
| gpio_enable | uint32_t | 0 | - | - | GPIO 操作使能位,索引自 VCON。 | 是 |
| gpio_level | uint32_t | 0 | - | - | GPIO 工作状态位,表示当前 GPIO 状态。 | 是 |
| poc_map | uint32_t | 0 | - | - | POC 与 Link 的映射关系。 | 是 |
| power_delay | uint32_t | 0 | - | - | POC 开关操作的延迟时间,单位为毫秒。 | 是 |
| end_flag | uint32_t | 0 | 0xFFFFFFFF | - | 结构体配置的结束标志,用于校验完整性,默认为 POC_CONFIG_END_FLAG | 是 |
返回值说明
| 错误码 | 宏定义 | 描述 | 常见原因及解决方法 |
|---|---|---|---|
| 0 | HBN_STATUS_SUCESS | 成功 | |
| 1 | HBN_STATUS_INVALID_NODE | vnode 无效,找不到对应的 vnode | |
| 2 | HBN_STATUS_INVALID_NODETYPE | vnode 类型无效,找不到对应的 vnode | 对于 VIN,vnode 类型为 HB_VIN |
| 3 | HBN_STATUS_INVALID_HWID | 无效的硬件模块 id | 对于 VIN,hw_id 取值为 0 |
| 4 | HBN_STATUS_INVALID_CTXID | 无效的 context id | 可设置为 AUTO_ALLOC_ID,由 HBN 框架自动分配 |
| 8 | HBN_STATUS_INVALID_NULL_PTR |