IPL Earlyinit及TTFF/TTCL说明

1. 概述

相比于之前在RTOS阶段做Sensor Earlyinit,Iford、Souffle系列芯片会将Sensor Earlyinit的动作放在IPL阶段实现,主要目的是为了加快Sensor的出流,加快TTFF(第一帧出图的时间)。在IPL阶段完成Sensor Earlyinit后,Sensor开始出流,图像数据会先存放在固定的MMA Buffer里面。等到RTOS启动时在Preload APP创建完整的Pipeline,MI Pipe就可以接收Sensor Earlyinit的图像数据了。 该方案目前仅针对自带硬件AE功能的Sensor,IPL阶段预存的图像数据为Sensor Raw数据。

2. Sensor Earlyinit说明

2.1. Sensor Earlyinit流程

图1-1 简略启动流程图

  • 注:CMDQ是Sstar的一个独立的硬件,可以不依赖CPU执行一些简单的操作。

1、IPL阶段会从Flash Load Earlyinit Bin,并且运行Earlyinit Bin。

2、Earlyinit Bin会初始化Sensor Interface相关的IO Padmux、MIPI CSI RX、VIF和WDMA,初始化完成后Sensor和VIF硬件就绪,VIF WDMA硬件支持缓存4帧数据。

3、Earlyinit Bin会从XXX_init_table.h取得操作命令表,然后将要操作的命令(例powerdown/reset/delay)和I2C初始化表转换为实际的寄存器操作指令。转换完毕后存放在CMDQ申请好的内存中。然后trig CMDQ。

4、Earlyinit Bin完成处理,返回IPL,继续Load IPL_CUST,此时CMDQ不依赖CPU,同时在下Sensor Earlyinit相关寄存器。

5、IPL_CUST阶段,CPU Core0先Load RTOS和MISC分区,Load完后唤醒CPU Core1,在CPU Core1上跑RTOS,同时CPU Core0继续Load Linux和Linux Ramdisk。

6、RTOS在跑到RTOS主要任务后会去串流,对应到rtos_preload.c,RtosAppMainEntry -> MI_PreloadTask -> MI_PreloadMiPipe ->Test_vif_vpe_venc。创建MI Pipeline时,Sensor和VIF Driver会检查Earlyinit是否完成,如果完成了就不会重复再下相关设定。APP设定VIF相关参数(宽高、fps、hdr mode等),需要与Earlyinit配置的一致。

7、创建Pipeline时注意VIF和ISP需要使用Framemode绑定,因为只有Framemode的场景下才能使用VIF的WDMA,而Earlyinit依赖WDMA缓存接收到的Sensor画面。

8、在VIF Driver初始化完成后,会检查WDMA状态,将所有在Earlyinit Done到VIF Driver初始化这段时间缓存的Buffer,直接传递到ISP去处理。

9、Earlyinit的操作是直接由CMDQ操作的,完成之后,就把操作Sensor的权限交回CPU->RTOS->I2C driver->Sensor。后续的例如AE/filp/mirror/fps就回到Driver的接口通过I2C设定给Sensor。

10、后续Sensor出流->Isp->Scl->Venc继续往后处理。

源码路径:

Earlyinit fw实现:

rtos/proj/sc/driver/sysdriver/earlyinit_fw/sensor/drv/src/earlyinit_drv_sensor.c

RTOS Preload APP实现:

rtos/proj/sc/application/pipeline_demo/dualos_camera/src/rtos_preload.c

2.2. Earlyinit使用的Buffer说明

VIF和ISP使用Framemode绑定,在Earlyinit阶段需要由MI SYS预先从MMA划分4块Buffer给到VIF使用。

图1-2 buffer使用图

在Earlyinit bin In IPL阶段,会根据Sensor的分辨率计算出对应的Bufsize,提前在MMA指定区域申请好4块buffer,等到Earlyinit完成后,Sensor开始出流了,VIF就可以将图像数据填充在Buffer里面。

在RTOS阶段,MI VIF初始化完成,会先获取到4张Earlyinit的Buffer,检查该Buffer是否已经写完。如果已经写完,SYS就会将Buffer给到ISP去处理。

2.3. Sensor Driver文件说明

Sensor Driver会有两部分,分为Earlyinit和通用的Driver,使用上与Purelinux基本无差异。

参考如下:

表1-1 Sensor Driver描述

文件 路径 描述
drv_ss_cus_XXX_MIPI.c sdk/driver/SensorDriver/drv/src 通用的Driver文件,和Purelinux下用的完全一致。里面注册的函数会被MI_SNR/MI_VIF的接口调用到。
rtk_sensor_module_init.c sdk/driver/SensorDriver/rtk 在DualOS下Sensor Driver的Module Init文件,新增Driver在该文件下添加对应的Init Function
drv_earlyinit_XXX.c
earlyinit 文件
sdk/driver/SensorDriver/earlyinit/drv/src xxxEarlyInitGetSensorInfo:
填写sensor信息,和drv_ss_cus_XXX_MIPI.c中要一致。
xxxEarlyInitShutterAndFps:
回调函数。函数传参的shutter、fps、经过此函数后返回的I2C寄存器值,应该要和drv_ss_cus_XXX_MIPI.c中的pCus_SetFPS、pCus_SetAEUSecs转换的一致。不然是异常的。
xxxEarlyInitGain:
回调函数。函数传参的gain、经过此函数后返回的I2C寄存器值,应该要和drv_ss_cus_XXX_MIPI.c中的pCus_setAEGain转换的一致。不然是异常的。
sensor_early_init.mak sdk/driver/SensorDriver/earlyinit 在DualOS下earlyinit的makefile文件,新增earlyinit在该文件下添加对应的.c文件
XXX_init_table.h sdk/driver/SensorDriver/drv/inc 可以看到,该文件只有一个Sensor_init_table,却包括了sensor从上电(powerdown/delay/reset)到I2C初始化到设定sensor寄存器表的所有操作。
后面lib中会将这个table转换为CMDQ可以操作的寄存器指令,交给CMDQ去操作。
其中的sensor初始化表的部分,应该要和drv_ss_cus_XXX_MIPI.c Sensor_init_table_Xlane的完全一致。
值得注意的是,其中的SNR_SHUTTER_FPS_2A1D和 SNR_GAIN_2A1D这两行打印一定要加上,用于占位,后面才会跑到drv_earlyinit_XXX.c中的回调函数。

从上表我们可以看到,其实drv_earlyinit_XXX.c和XXX_init_table.h 完全来自于drv_ss_cus_XXX_MIPI.c。所以当用户只要有调好的drv_ss_cus_XXX_MIPI.c,就可以自己整理Earlyinit的部分。

2.4. Earlyinit开发参考

ToDo

2.5. Earlyinit参数切换说明

ToDo:Earlyinit_fw 搭配uart使用,接收uart发送的参数,设定Earlyinit。

3. Preload APP影响

1、VIF和ISP需要使用Framemode绑定,APP建立绑定关系时需注意。

2、APP设定的Sensor和VIF相关设定需与Earlyinit中对应,包含Sensor的Resolution Index、Fps、Hdr mode、VIF的宽高、压缩模式、HDR mode等。(To Do: 从固定地址信息中,获取这些Earlyinit设定的参数,APP可参考参数设置,直接对齐)

4. TTFF说明

TTFF(Time To First Frame)是指开机到输出第一帧出图时间,与Sensor的上电时序有直接关系,不同Sensor的TTFF相应也会有差。目前第一帧出图时间暂时无法从软件上记录,在IPL阶段做完earlyinit后,Sensor就可以输出第一帧图像,此时没有相应的中断记录该信息,所以没有记录在timestamp中。目前通过示波器测量Sensor的data lane 接收讯号,来观察板子上电到Sensor接收到数据的时间。 以imx415为例 4K@30fps,用示波器量測,sensor自身初始化动作所需57.4ms,以下面的timestamp为例,RUNEIB-为19.9ms,所以TTFF可以估测为19.9+57.4 = 77.3ms。

TTFF以RUNEIB为时间依据,再自行加上Sensor启动后到VIF接收到第一帧frame start时间

5. TTCL说明

TTCL(Time To Command Line)是指开机到命令行的时间,与所使用的Flash型号、RTOS Size、MISC分区Size、Kernel Size、Kernel ramdisk Size相关,如要确保快速开机进入命令行,首先需要做的就是裁剪Size。

Sigmastar公版使用WB - W25N01JW(ID:EF-BC-21)快启Flash的TTCL数据大约在208ms左右,

开机后可通过命令cat /sys/class/sstar/msys/booting_time获取每一阶段时间,所获取的timestamp如下:

/ # cat /sys/class/sstar/msys/booting_time
IPL (20 records)
000 time:   15447, diff:       0, I
001 time:   15612, diff:     165, IPL+
002 time:   16053, diff:     441, MIU+
003 time:   17383, diff:    1330, MIU-
004 time:   19303, diff:    1920, LDERRTK
005 time:   19760, diff:     457, LDEND
006 time:   19760, diff:       0, RUNEIB+
007 time:   19900, diff:     140, RUNEIB-
008 time:   20168, diff:     268, LDCUST
009 time:   20874, diff:     706, LDEND
010 time:   20950, diff:      76, CUST+
011 time:   21277, diff:     327, LDRTK
012 time:   42683, diff:   21406, LDEND
013 time:   42691, diff:       8, LDMISC
014 time:   59219, diff:   16528, LDEND
015 time:   59220, diff:       1, LDLINUX
016 time:   90361, diff:   31141, LDEND
017 time:   90362, diff:       1, LDRAMFS
018 time:   96219, diff:    5857, LDEND
019 time:   96226, diff:       7, CJMP+
Total cost:   80779(us)
RTOS (11 records)
000 time:   61073, diff:       0, Rtos Premain Start
001 time:   67780, diff:    6707, DrvAlgoEntry
002 time:   78351, diff:   10571, Test_vif_vpe_venc Start
003 time:  105101, diff:   26750, PreloadFile Start
004 time:  135425, diff:   30324, Test_vif_vpe_venc Done
005 time:  136736, diff:    1311, PreloadFile end
006 time:  150102, diff:   13366, Ready to Linux
007 time:  215574, diff:   65472, VIF ch0 int 0
008 time:  226051, diff:   10477, MI_VENC_DRVCFG_MhalVencEncodeOn
009 time:  244317, diff:   18266, MI_VENC_DRVCFG_MhalVencEncodeOn
010 time:  248905, diff:    4588, VIF ch0 int 1
Total cost:  187832(us)
LINUX (7 records)
000 time:   97484, diff:       0, start_kernel+, 853
001 time:  112808, diff:   15324, setup_arch-, 874
002 time:  148724, diff:   35916, kernel_init+, 1429
003 time:  150591, diff:    1867, do_basic_setup+, 1328
004 time:  151326, diff:     735, do_initcalls+, 1306
005 time:  208557, diff:   57231, do_basic_setup-, 1337
006 time:  208755, diff:     198, ramdisk_execute_command+, 1456
Total cost:  111271(us)

timestamp各段分析如图1-3 FastBoot流程所示:

图1-3 bootflow和timestamp分析

该图片在文档中会被压缩,建议右键图片在新标签页中打开图片查看原图