S32V234 软件系列 - ISP | copy_1to1_ipus ISP 算子解析

关于 S32V ISP 的介绍我们在上一篇博文 《S32V234 软件系列 – ISP | debayer_rgb_simple_interleaved ISP 算子解析》中已经有讲过,在这里我们就不再赘述。 本篇博文我们将和大家分享如何在 S32V234 上进行 copy_1to1_ipus ISP 算子解析。

一、模组介绍

这颗模块是由 DS90UB933 和 SONY 的 ISX019 Sensor 组成的,其中 ISX019 是自带 ISP 的,模块厂已经把参数调整好了,输入 8V 电压,即可输出分辨率 1280*720,30fps 格式为 YUV422(UYVY) 8bit 的图像数据,部分规格参数图如下,我们将通过调试这颗模块来讲解如何搭建一个使用 copy_1to1_ipus 这个 ISP kernel 算子的工程。

         

外观如下图

         

二、 使用 S32DS开发环境创建工程

我们这里通过调试 ISX019 这颗 sensor 来讲解怎样搭建一个工程,并添加 copy_1to1_ipus 这个 kernel 算子,最终通过 S32V234 内的 ISP 模块输出图像的。

 

1、搭建 ISX019 的 S32DS 工程的 ISP Graph

(1)首先添加"CSI_UB964_OV9716" 设备,绘制通过四个"copy_1to1_ipus" 输出四路的 ISP graph,如下图

         

(2)需要注意的是,要修改 MIPI 设备输出端的"Pixel To Transfer Quantity" 。

         

(3)1280 (单颗像素) 修改为 5120(四颗总像素)。

         

(4)在 graph 中第 2、3、4 个算子输入端的 “Pixel Offset [Pixels]” 需要修改。

         

(5)如下图属性是第 1 个算子的输入端为 “0”,第 2、3、4 分别修改为:“1280”、“2560”、“3840” 。

          

(6)选择 “Validate diagram”,验证图形是否有问题,然后执行 Emit 。

         

(7)图形验证成功。

         

(8)由图形 Emit 生成源码。

         

(9)Emit 完成。

         

(10)Emmit Graph 得到如下文件。

         

2、修改 main.cpp

(1)创建 Application Project,打开 main.cpp 。

         


(2)把上面 Emmit 得到的文件“isp_ti964_isx019_graph_c.h”添加到头文件。

         


(3)在 io_config() 函数中添加 DDR buffers 的初始化设置。

         

(4)在 isp_process.cpp 添加如下代码,用于进行四个摄像头图像的四分割显示。

         

(5)在 isp_process.cpp 的 ISP_CALL() 函数中添加如下代码,用于进行四个摄像头图像的四分割显示。

         

(6)在 isp_process.cpp 的 ISP_CALL() 函数中修改显示屏初始化大小为 1920*1080 。

         

(7)在 isp_process.cpp 的 ISP_CALL() 函数中定义四个 SDI 输入图像容器用于后续的四分割处理。

         



(8)在 isp_process.cpp 的 ISP_CALL() 函数中修改如下代码,用于进行图像的四分割处理。

         

                  

          

(9)注释掉原来的代码。

         

(10)添加如下红框中的代码,用于进行图像的四分割处理。

         

(11)注释掉原来的代码。

          

(12)添加如下红框中的代码,用于进行图像的四分割处理。

         

(13)注释掉原来的代码。

         


3、S32DS 应用程序编译

(1)找到 S32DS 工具栏中的如下图标。

         

(2)选定项目,找到工具栏中锤子的图标点击三角形下拉菜单,选择 “A53_Linux” 的方式编译,得到 isp_ti964_isx019_Application_RTM_1_20.elf 文件,放到 S32V 板运行即可。

         

          

(3)放到 S32V 运行即可获得四路摄像头的画面。

          


三、copy_1to1_ipus 算子解析

1、查找算子

(1)在 Graph 中可以看到使用的算子是 “copy_1to1_ipus” 。

         


(2)在 S32DS 左侧 Project 中的 ISP_kernels 目录中可以找到 “copy_1to1_ipus” 算子。


          

(3)双击即可在右侧打开。

         

2、算子解析

上面的 Demo 程序所使用的 “copy_1to1_ipus” 是如何工作的呢,接下来让我们分析算子的处理过程。

(1)可以看到把注释部分去掉之后,代码的主体部分非常简单,和之前的博文一样,代码中带 “//” 的是该句代码作用的解析。

         

global copy_1to1_ipus_start				// .global 定义一个全局函数的入口

copy_1to1_ipus_start: // copy_1to1_ipus 函数入口

done copy_1to1_ipus_loop,i // i 参数表示移入一个像素组件到输入矩阵中,完
//成后跳转到标号 copy_1to1_ipus_loop

copy_1to1_ipus_loop: //上一句处理完之后跳转的标号

dout ina0,copy_1to1_ipus_loop,ixo //把 ina0 的值放入 OUT0 后跳转,i 表示移入下一个
//像素,x 表示 “XPOS” 会按照 “XSTEP” 的配
//置递增,一旦达到设置的横向像素 “XSIZE”,将停
//止执行的指令,即完成水平方向的执行周期



halt //该指令停止流水线,并结束程序执行

.global copy_1to1_ipus_end //定义的全局函数的出口

copy_1to1_ipus_end: // copy_1to1_ipus 算子的出口

 

以上就是 copy_1to1_ipus 算子的处理过程,即很简单的把进入 ISP 模块的图像数据通过 ina0 一个一个立即输出,因为该摄像头模块自带 ISP 的,模组厂已经把参数调整好了,输入 8V 电压,即可输出分辨率 1280*720,30fps 格式为 YUV422(UYVY) 8bit 的图像数据,所以通过 copy_1to1_ipus 算子也不会改变数据结构,仍旧是输出 YUV422(UYVY) 8bit 数据,再在 S32V 中以 YUV422 数据处理即可。

接下来我们也会不断更新更多 S32V234 相关的开发博文, 同时我们也会持续推出更多 ADAS 相关(i.MX8、Hi3566V100、Hi3559AV100、Hi3518EV300,硬件、软件、算法等)的技术开发博文, 如需更深入交流,欢迎在博文下方评论或者关注给我留言。



【参考资料】:

     [1] S32V234RM_Rev2.1.pdf

     [2] NXP S32V234 的 debayer_rgb_simple_interleaved  ISP 算子解析

 



★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论