1. Camera模块简述:
本文档简单介绍Camera子系统软件架构、列出已支持的Camera模组,并提供相应的配置说明,同时引用Sensor点亮调试方法介绍一颗新模组接入的步骤,再按根据重要功能按专题介绍接入方案限制、EMB接收等,并最终汇总平台已有单板的Camera接入使用说明,用于指导J6在Camera接入上的量产调试。
1.1 硬件特性:
J6上Camera接入后,进入后级模块处理,其数据流通路主要相关模块有如下:

MIPI RX: 3路CDPHY,每路为DPHY最大4.5Gbps/lane x 4lane或CPHY最大3.5Gbps/trio x 3trio,每路支持4VC,最多支持12路接入。
MIPI TX: 2路DPHY,每路为2.5Gbps/lane x 4lane,支持RX bypass与IDU输出方式。
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处理。

此处默认示例使用的模组及连接关系为:
RX口LINK端子模组描述备注RX0ALCE-OVX8B Fov1203840x2160 RAW12CLCE-OVX8B Fov303840x2160 RAW12DLCE-OVX3C Fov601920x1280 RAW12RX1A-DLCE-OVX3C Fov1001920x1280 RAW12RX4A-DSENSING-ISX031 Fov1901920x1536 YUV422
本sample基于Matrix 6E/M硬件使用,其硬件连接及数据流通路如下:

1.2 软件功能:
J6的Sensor接入属于图像处理子系统中的Camera部分,各模块间有结构如下:

其中Camera部分主要包括: Sensor,Deserial,Poc,Txser设备驱动及MIPI配置操作,系统结构有如下:

本sample基于VIO API实现,调用libvio提供的API,同时通过配置文件的方式,实现单路或多路Camera接入验证,并支持将接收的数据图像dump到文件系统中,用于图像数据验证,同时还支持可选的hbplayer显示功能,用于查看Camera输入图像。

2. Camera-Sample使用:
本文的demo sample实现单路、多路Camera接入与处理。
2.1 调用流程
采用MediaCodec的poll模式来解耦输入和输出,可使编码帧率性能达到最优。 在主线程中灌YUV数据:取出一个空的input buffer,配置YUV数据的地址信息(如phys addr),再queue input buffer并通知编码器处理该帧数据; 另一个线程取输出码流:通过select接收硬件编码完成通知,取出一个硬件填满输出码流的output buffer,将编码结果写到文件中后归还output buffer。

此处的hb_cam_start/hb_cam_stop为可选调用,目前在sample中未直接使用,若有兼容原VIO API流程需要,仍支持继续调用。
int32_t hb_vio_init( const char *cfg_file):初始化VIO模块,包括cim& isp & pym & gdc & ynr,初始化配置文件配置的所有pipeline,多路场景时配置文件对应包含多路配置,vio init必须最先调用,再调用hb_cam_init。
int32_t hb_vio_deinit(void):释放init中用到的各种资源,内存等。
int32_t hb_cam_init(uint32_t cfg_index,const char *cfg_file):初始化cam模块中的sensor & mipi rx(mipi tx)。
int32_t hb_cam_deinit(uint32_t cfg_index):释放camera模块资源,和hb_cam_init对应。
int32_t hb_vio_start_pipeline(uint32_t pipeline_id):启动vio pipe通路工作,对应初始化中的数据通路。
int32_t hb_cam_start(uint32_t port):启动sensor数据流,mipi检查是否有hs信号,使能对应cim/cimdma。
int32_t hb_vio_get_data(uint32_t pipeline_id, VIO_DATA_TYPE_E info_type,void* data):指定pipeline_id,通过type类型,执行不同的实际操作,得到对应type类型的数据结构,获取到的yuv图像地址默认是连续的。
int32_t hb_cam_stop(uint32_t port):关闭sensor数据流,执行mipi stop,关闭对应cim/cimdma。
int32_t hb_vio_stop_pipeline(uint32_t pipeline_id):关闭vio对应pipe id通路工作,对应初始化中的数据通路,如果数据通路包含hb_vio_start_pipeline所打开的,退出时需要先关闭camera数据。
2.2 源码主干:
Encoder:
2.3 编译&运行:
获取AppSDK包后,进入appuser执行:
*其中hbrootfs-sdk_0.0.1.XXX_all.deb是地平线自己的库和头文件,rootfs-sdk-focal_0.0.1.XXX_all.deb是系统库,aarch64-linux-hb-gcc_12.2.0_amd64.deb是gcc 12.2.0工具链,目前在ubuntu22.04非docker环境下运行正常。其它环境不能保证。
进入toolchain执行:
Sample代码路径:
运行参数说明:
参数名说明是否必须备注-c指定Camera配置文件,默认为./hb_j6dev.json否若非当前目录,需指定-v指定VIO配置文件,默认为./vpm_config.json否若非当前目录,需指定-p指定运行camera通道的数量,默认为自动获取否若非全运行,需指定-M指定运行camera通路的掩码,默认为自动获取否若非全运行,可指定-t指定要获取的数据类型,按bit掩码,默认为CIM_RAW支持b#的方式进行配置,如:CIM_RAW:b24,CIM_YUV:b25否若为YUV数据,需指定-d使能dump功能,将数据dump到当前运行目录下支持dump数量设置,如:-d 10 为前10帧否若要dump数据,需使能-s使能hbplayer显示功能否若要显示查看,需使能-S配置hbplayer显示用端口,默认0使用默认端口否-l指定log打印信息,通过bit掩码配置,默认为1,只打印fps统计信息:b0-fps统计信息,b1-取帧时信息,b2-帧基础信息,b3-帧详细信息,b4-显示发送信息;否-r指定运行时间,默认为0,只验证配置后立即退出是若要长时运行,需指定-V获取sample版本信息否-h查看帮助信息否
复制/src源码到新建文件夹codec并构建新Makefile:
Makefile:
执行make完成编译,生成的文件为./program

使用WinScp将program和cfg文件夹都传输到单板上。
硬件连接:


RX口LINK端子模组描述RX0ALCE-OVX8B Fov1203840x2160 RAW12CLCE-OVX8B Fov303840x2160 RAW12DLCE-OVX3C Fov601920x1280 RAW12RX1A-DLCE-OVX3C Fov1001920x1280 RAW12
Sample运行时日志:*1V
sample支持将数据dump到文件系统,供查看验证,只需在运行命令加上:-d 10 (dump前10帧)。

可取上述raw数据查看使用。
hbplayer显示:
本sample支持将数据通过网络发送到PC端,配合hbplayer工具,在线查看数据流接入,只需在运行命令加上: -s 1 (若要长时间运行,可通过-r调整运行时间)。
之后运行,将自动获取图像并发送给hbplayer。
PC打开hbplayer\out\hbplayer.exe:*获取的为raw数据

*如果出现监视窗口缩放系数错误的问题请尝试修改主机分辨率为100%:


