HIL-Replay台架CHR使用手册

本文档主要介绍HIL-Replay台架CHR的使用方法和SDK二次开发。CHR台架硬件配置如下:

微信图片_20260508114557_74_1.jpg

硬件说明
GMSL2注入板卡CH2(1或2张)12路GMSL2视频PCIe注入板卡
AMD EPYC单路服务器主板根据负载选配EPYC7002/7003/9005系列主板
内存(4条)根据负载选配DDR4RECC 3200MHz或DDR5RECC 4800MHz
CPU(1片)根据负载选配EPYC7002/7003/9005系列CPU,核心至少16核32线程,主频3.0GHz以上
显卡(1张)根据负载选配Nvidia GPU,满足实时解码H264/H265需求
CAN卡(1或2张)根据情况选配PEAK或FINTEK的PCIe的CAN卡,支持4到8路,可配置为CAN或CANFD

SDK下载

版本change log
v1.0.1initial release

CH2板卡

caronsim_hil_2_0_0

CH2板卡基础用法配置如下:

  1. SW9拨码配置为0/1/0/1的sd卡启动模式(注意拨码数字"1234"一侧为0,而"ON KE"一侧为1)
  2. SW10拨码配置为0/1/0/1,配置MAX9295加串器的IIC默认地址为80,以及GMSL2为6Gbs模式
  3. sd卡用读卡器在PC上格式化为fat32,然后在根目录下放入BOOT.bin(固件镜像),最后把sd卡插入CH2板卡的sd卡插槽
  4. 注意风扇正确插入FAN插槽,RST开关拨ON(即靠近FAN插槽一侧)。在服务器关机状态下,把CH2板卡插到PCIe的x16插槽,此时板卡完全由PCIe插槽供电不需要外接电源
  5. 上图中有三组12路视频编号,这里推荐用“罗森版HFM四腔母头转XX”系列的mini-fakra线材来连接CH2板卡和你的域控,比较常见的情况如下:

1 2 3 4 5

安装依赖

SDK默认运行环境为ubuntu22.04,如果是其他Linux操作系统,我们可以进行适配工作。

在ubuntu22.04系统中下载SDK后unzip hil_replay_sdk-vx.y.z.zip解压,cd进入hil_replay_sdk目录,用root运行host_install.sh脚本。host_install.sh脚本做了三件事:

  1. 更换lowlatency的ubuntu内核,并且优化系统性能
  2. 安装必要的系统依赖和pip依赖
  3. 安装Nvidia显卡驱动和CH2板卡驱动
  4. CAN卡驱动(PEAK的pcan驱动和FINTEK的f81601a驱动),如果你没有用这两种CAN卡可直接忽略

安装过程中请按照脚本提示对系统进行重启,最终输出"host_install ok!"代表脚本运行成功。

如果服务器插了CH2板卡,如果ls /dev/xdma*可以看到相关设备则代表CH2板卡驱动安装成功。

如果服务器插了Nvidia显卡,运行nvtop可以看到GPU信息代表显卡驱动安装成功。

如果服务器插了PEAK或者FINTEK的CAN卡,运行ip link show可以看到can0/can1/can2/can3这样的socketcan设备,则代表can卡驱动安装成功。

部署SDK

在config.sh中可以对SDK参数进行配置,每次修改完config.sh之后,必须运行一次./host_deploy.sh重启服务。

可以看到SDK包含了video.service(必选)、can.service(可选)和timesync.service(可选)这三个服务:

  • video.service:常驻后台服务,video.service通过共享内存接受来自decode_video_app解码后的raw图像,然后再走PCIe传到CH2板卡中
  • can.service:常驻后台服务,负责管理socketcan接口
  • timesync.service:常驻后台服务,负责管理域控和服务器的时间同步,自带基于clockdiff和ptp两种时间同步方法

在config.sh中,配置core核心参数部分:

  • HOST_USER:操作系统非root普通用户名
  • ENABLE_SERVICES:这里必选video,can和timesync服务可以不选
  • HIL_TS_SRC:回灌的时候SDK会比较等待注入每帧数据的时间戳和当前HIL_TS_SR对应的时间,如果时间到了则立刻注入该帧
    • CLOCK_REALTIME:直接获取当前系统时间,即你运行date命令输出的这个时间
    • clockdiff:timesync.service服务会基于chronyd实时测量服务器HOST和待测DUT(DeviceUnderTest)域控的时间差,然后更新到/dev/shm/HOST_clockdiff_DUT共享内存中,这样就能通过读取HOST_clockdiff_DUT共享内存间接获取DUT时间
    • /dev/ptp0:基于ptp/gptp协议把待测DUT(DeviceUnderTest)域控的时间同步到本地网卡时间,也就是运行sudo phc_ctl /dev/ptp0 get输出的这个时间
  • REPLAY_OR_SIM: 这里Replay模式为0
  • BIND_CPU: 在大负载的情况下,用lscpu.txt配置文件对关键进程绑定到固定CPU核心上,优化性能

在config.sh中,配置video.service参数部分:

  • REPLAY_AHEAD: 回灌开始的时候,SDK会去VIDEO_A_0_PATH视频第一帧的时间戳作为起始时间T_start,然后把时间回拨到T_start - REPLAY_AHEAD时刻,系统需要在回注开始前完成时间同步等准备工作
  • VIDEO_TS_SUBTRACT:decode_video_app在获取每帧视频时间戳的时候,会减去这个值,来对注入链路延迟进行补偿
  • RAW8_R_ISP_LUT:把RAW8图像通过反向ISP接口转换为RAW10/12/14/16,你可以自行设定增益、gamma等参数,对应映射关系见raw8_reverse_isp_lut.png,如下raw8_reverse_isp_lut
  • VIDEO_FSYNC_USE:VIDEO_FSYNC_USE=0的时候,图像根据时间戳注入域控DUT;VIDEO_FSYNC_USE=1的时候,图像会等待域控的frame-sync/frame-trigger信号到达后才注入
  • 12路视频分成四组:0到3组、4到7组、8到9组、10到11组,每组的分辨率和图像格式相同

在config.sh中,can.service参数部分配置CHR台架自带PEAK和FINTEK的CAN卡(你可以在ENABLE_SERVICES环境变量中删除这个服务):

  • CAN_DRIVER:PEAK对应pcan,FINTEK对应f81601a
  • CAN_*:配置socketcan名称和是否为canfd

在config.sh中,timesync.service参数部分配置CHR台架自带的clockdiff和ptp的两种同步机制(你可以在ENABLE_SERVICES环境变量中删除这个服务):

  • HOST_*:这部分配置是为了让DUT域控能通过HOST的WAN口上外网
  • DUT_HOST_SYNC:选择clockdiff会在DUT域控中运行chronyd服务端,HOST主机侧用chronyd客户端通过ntp协议查询和DUT的时间差,然后写入/dev/shm/HOST_clockdiff_DUT共享内存中;选择ptp会在DUT域控中运行ptp4l服务端,HOST主机通过ptp4l把时间到本地网卡HOST_LAN中
  • timesync这个服务假设DUT域控是aarch64的linux操作系统,所以不支持QNX系统。修改完config.sh中timesync相关参数后,需要运行./dut_deploy.sh,该脚本会把dut_deploy目录下的dut.service服务部署的DUT域控中,域控开机自启动服务运行dut.sh

标定视频

在tools目录下,运行h264_gen.sh默认可以生成1920x1536@30fps且每帧带有时间戳的h264标定视频,你也可以按你需求修改参数。推荐使用KMPlayer查看生成的h264/h264,生成的h264视频会在每帧画上时间戳+帧号,并且在h264视频流中也会嵌入时间戳+帧号,如下图: video_fmt

我们把视频注入DUT域控之后,域控再录制下来之后带时间戳的视频之后,我们就可以通过OCR识别出时间戳+帧号从而验证出注入的准确性。具体可以参考tools目录下的h264_ocr.sh脚本。

这里运行命令生成12路标定视频如下:

./h264_gen.sh
cp tmp.raw.h264 ../data/video_a0.h264
cp tmp.raw.h264 ../data/video_a1.h264
cp tmp.raw.h264 ../data/video_a2.h264
cp tmp.raw.h264 ../data/video_a3.h264
cp tmp.raw.h264 ../data/video_a4.h264
cp tmp.raw.h264 ../data/video_a5.h264
cp tmp.raw.h264 ../data/video_a6.h264
cp tmp.raw.h264 ../data/video_a7.h264
cp tmp.raw.h264 ../data/video_a8.h264
cp tmp.raw.h264 ../data/video_a9.h264
cp tmp.raw.h264 ../data/video_a10.h264
cp tmp.raw.h264 ../data/video_a11.h264

开始注入

现在模拟注入12路视频、can和udp,由于负载很大这里配置config.sh中的BIND_CPU=1来对进程进行绑核优化(如果你服务器配置很好也可以BIND_CPU=0不绑核)。绑核配置文件见lscpu.txt,绑核的时候尽量把同一个进程绑定到1个物理CPU的2个逻辑核上。比如下面这个lscpu.txt的绑核配置中,可以看到CPU为16核32线程,有4个NUMA节点,同一个进程被绑定到同1个物理CPU的2个逻辑核上。

# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# Node,CPU
0,0,video_service_app_0_0
0,1,decode_video_app_0_0
0,2,decode_video_app_0_4
0,3,decode_video_app_0_8
1,4,video_service_app_0_1
1,5,decode_video_app_0_1
1,6,decode_video_app_0_5
1,7,decode_video_app_0_9
2,8,video_service_app_0_2
2,9,decode_video_app_0_2
2,10,decode_video_app_0_6
2,11,decode_video_app_0_10
3,12,video_service_app_0_3
3,13,decode_video_app_0_3
3,14,decode_video_app_0_7
3,15,demo_can,decode_video_app_0_11
0,16,video_service_app_1_0
0,17,decode_video_app_0_0
0,18,decode_video_app_0_4
0,19,decode_video_app_0_8
1,20,video_service_app_1_1
1,21,decode_video_app_0_1
1,22,decode_video_app_0_5
1,23,decode_video_app_0_9
2,24,video_service_app_1_2
2,25,decode_video_app_0_2
2,26,decode_video_app_0_6
2,27,decode_video_app_0_10
3,28,video_service_app_1_3
3,29,decode_video_app_0_3
3,30,decode_video_app_0_7
3,31,demo_udp,decode_video_app_0_11

运行./replay.sh,正式开始一次注入,流程如下:

  1. 首先把所有12路h264/h265视频流中每帧时间戳都解析出来,然后把第0路视频第一帧时间作为起始时间
  2. 把待测DUT域控时间回拨到起始时间前一点,然后等待待测DUT域控会和HOST主机自动时间同步OK
  3. 在背景中运行demo_can.sh进程注入can数据,运行demo_udp.sh进程注入以太网udp数据
  4. 在背景中运行12个decode_video_app进程,解码12路视频数据

注入开始后,运行./monitor.sh可以监控注入情况,如下图: monitor 上图可以看到12路video注入帧率都是30fps,是绿色OKAY状态。 timesync服务选择的clockdiff同步方式,且成功测出了DUT域控和HOST的时间差,是绿色OKAY状态。 can服务链路正常,但是没用流量所以是黄色WARN状态,一旦有发送can报文就是绿色OKAY状态。

二次开发

客户可以对decode_video_app和libhil_api.so进行二次开发,在api子目录中运行./build.sh即可编译这两个二进制。

decode_video_app主要是通过ffmpeg对视频进行解码,然后把解码后的图像通过共享内存给video.service,video.service再通过PCIe把图像传给CH2板卡。

libhil_api.so主要是获取当前仿真时间hil_ts,客户可能有自己的时间同步方案,可以在修改这里。

demo_can.sh和demo_udp.sh只是一个空的模板,客户可以替换里面的逻辑实现CAN和UDP的注入。

CH2板卡进阶用法

SW9全部为ON/ON/ON/ON状态为JTAG模式,OFF/ON/OFF/ON为sd卡启动模式,原理图如下: image-IpEI.png

SW10为OFF/ON/OFF/ON状态为I2C地址80+6Gbs模式,其他模式配置见如下原理图: image-PuXt.png

两个12pin的简牛口引出了GMSL2加串器的frame-sync/frame-trigger接口以及IIC接口,方便获取对应信号,如下图: image-DmWl.png

把BOOT.BIN放到hil_replay_sdk/tools目录下,运行./flash.sh BOOT.BIN可以刷写CH2板卡固件,刷写完后需要reboot重启服务器。