ISP实战小技巧
crop能力:经常有客碰到了sensor的数据有不对齐的或者embadder数据,而又想省带宽不走cimdma的通路的时候,这个时候怎么办呢
- 实际上isp online提供crop的能力,可以通过isp的json配置文件选择如下字段即可

通过isp的input port完成截断,方便又简洁
当有多路数据同时进入一个isp,而尺寸不同时该如何配置每一条通路呢
因为isp的pipeline是分时复用的,我们期望的是one by one的执行,但是isp真的会按照我们想的去执行吗?
- sensor的配置信息为S4 4K, S0
S3 1080P, 而S10也为1080P,分别对应的ISP的通路为S4---ISP SLOT 1, S10----ISP SLOT 0, S0S3 ----ISP SLOT 4~7 而实际的启动顺序看是S0 S10,S4 S5 S6 S7,而ISP内部处理buffer是按照slot的顺序循环处理,这样就会出现一个问题
当S0的数据给ISP并处理时,S10的数据也来,但是由于S0的尺寸比较大耗时会比较多导致S10会一致被等待S0处理结束,而在结束之前S4~S7的数据也到了ISP
由于ISP内部是顺序做的,这样ISP正在处理slot 1数据的时候,S0,S4 S5 S6 S7的buffer都filled了,而ISP是循环处理的,这样就会导致S0来的早结果被后来的数据给block了,从而出现了上面的
示意图
- Raw buffer filled状态:

所以期望的处理的顺序是SLOT 1 -->0 -> 4 5 6 7
- 而实际上由于ISP内部的逻辑,如果slot1在处理完之前0 4 5 6都完成的后处理的顺序是

实际处理的变成1->4 5 6 7->0->0 ->1,就变成了2个0的数据间隔很短,下一帧又很长的情况 时序状态:
- 正常流程

- 异常场景下:

ISP interlock时间:1080p 4ms左右,4k--15ms左右
由于s1的尺寸大,interlock时间长,导致s0完成后等待的过程中后续的通路数据也完成,从而使得ISP的遍历优先后来的s4~s7的,再进行遍历s0,出现s0的数据被间隔的处理了
因此在配置尺寸时,应该尽量把大尺寸的放在slot id的低数值上,同时确保slot的启动是顺序的,这样isp的输出处理能做到最丝滑
ISP axi output输出配置参数,客户经常会对实际存储的数据排列问题比较感兴趣,因此针对这块详细的进行讲解一下
Isp支持对output数据进行裁剪,也支持stream output和axi output单独和同时输出

ISP stream output 可支持各种格式,具体可以参考ISP TRM。
ISP output format 由以下参数组合:mode_select, msb_align, mode_width,data_width,h_subsampling, h_subsampling。
目前在通路上只支持yuv422到PYM,以及J6上yuv420到YNR。
对于有需求对输出的bit数据进行调整比如0x0123数据存储,通过修改MSB ALIgn参数,1-MSB,0-LSB,实际存储的数据为:
小端+LSB 23 01
小端+ MSB 30 12
大端+ MSB 12 30
大端+ LSB 01 23
- ISP工作模式介绍,工作模式是客户使用中最常见也是最基本的一个配置选项

sched_mode: isp支持三种工作模式,0-tdmf,1-manual,2-passthru模式
passthru模式:
该模式是直通模式,input的数据不需要下ddr,可节省数据通路延时
由于J5/J6的isp只有一条pipeline,因此选择该模式后,isp就不能再接入其他通路的数据了
tdmf模式 or manual模式:
该模式下sensor的输入数据均需要下ddr后,再进行isp的处理,由于数据先下ddr了,就会产生一帧的数据延时
isp提供了4条online通道,默认slot_id:0~4,选择该通道后,下ddr的工作是由isp内部完成的也即图片中的local sensor模式
slot_id大于4的通道,需要有前级模块将数据放到ddr后再传递给isp进程处理
两者的区别再与tdmf模式是由硬件调度处理的,而manual模式的则是有软件干预的
硬件调度的好处在于高效,软件调度的好处在于可做软件控制,特别是在需要丢帧,策略选择的时候只能在manual的模式下进行
- ISP强大的output输出能力,是对isp进行调试的得力助手

- 从上图可以看出isp是可以支持同时输出raw数据和yuv数据的,对于问题排查,图像效果tuning有很大的帮助

需要注意的是,在stream output enable打开的场景下需要进行配对使用
isp性能测试相关参数
isp驱动相关的线程
- ISP初始化后,除了运行的主线外还会运行3个后台线程:isp_process_thread, isp_connection_thread,中断下半部线程

isp_process_thread线程由信号量驱动,会每隔1ms从message queue中获取event并对event进程处理
isp_connect_thread:初始化socket,并监听端口信息,当收到信息后,解析并处理信息,主要是给control tool使用的
中断下半部线程会根据中断事件下发不同的event给isp process thread进行处理,该线程是由于isp对时序要求较高,传统的下半部特别是在rt enable的环境下时序无法控制,因此改造成了独立线程控制
ISP驱动的内存空间
ISP内存使用主要有2部分:存放数据的buffer,存放不同slot的配置的CDMA控制内存,其他的是一些小尺寸的统计数据内存
Passthru模式为online模式,不需要申请raw buffer,output buffer可配置
Local sensor通路需要raw buffer 2块,output buffer可配置
Remote sensor通路需要raw buffer 6-8块,涉及到前几模块的轮转,output buffer可配置
CDMA就是一段ddr空间,用于存储每个slot的寄存器信息,在初始化时会将每个slot对应的CDMA地址配置好。在相关的寄存器更新即将要处理的slot时,硬件自动从该slot对应的cdma空间把数据拷贝至硬件寄存器,之后isp开始工作,等工作完成后,在BE_END中断前硬件会自动将统计数据从寄存器拷贝至CDMA空间
总结
ISP有强大的功能,这里只是简单对客户经常碰到和使用的场景进行简单粗略的介绍,感兴趣的可以进行深入的沟通交流
