海思 35XX MIPI读取YUV422

1.项目背景:

         使用海思芯片,接收FPGA发送的MIPI数据,不需要ISP处理,YUV图像格式为YUV422。

2.移植MIPI驱动

        修改IMX347的驱动远吗,将I2C读写的部分注释,其他的不用再做修改。

int imx347_slave_i2c_init(ot_vi_pipe vi_pipe)
{return 0;if (g_fd[vi_pipe] >= 0) {return TD_SUCCESS;}
#ifdef OT_GPIO_I2Cg_fd[vi_pipe] = open("/dev/gpioi2c_ex", O_RDONLY, S_IRUSR);if (g_fd[vi_pipe] < 0) {isp_err_trace("Open gpioi2c_ex error!\n");return TD_FAILURE;}
#elseint ret;char dev_file[I2C_DEV_FILE_NUM] = {0};td_u8 dev_num;ot_isp_sns_commbus *imx347slavebusinfo = TD_NULL;imx347slavebusinfo = imx347_slave_get_bus_info(vi_pipe);dev_num = imx347slavebusinfo->i2c_dev;if (snprintf_s(dev_file, sizeof(dev_file), sizeof(dev_file) - 1, "/dev/i2c-%u", dev_num) < 0) {isp_err_trace("snprintf_s error!\n");return TD_FAILURE;}g_fd[vi_pipe] = open(dev_file, O_RDWR, S_IRUSR | S_IWUSR);if (g_fd[vi_pipe] < 0) {isp_err_trace("Open /dev/ot_i2c_drv-%u error!\n", dev_num);return TD_FAILURE;}ret = ioctl(g_fd[vi_pipe], OT_I2C_SLAVE_FORCE, (IMX347_SLAVE_I2C_ADDR >> 1));if (ret < 0) {isp_err_trace("I2C_SLAVE_FORCE error!\n");close(g_fd[vi_pipe]);g_fd[vi_pipe] = -1;return ret;}
#endifreturn TD_SUCCESS;
}td_s32 imx347_slave_write_register(ot_vi_pipe vi_pipe, td_u32 addr, td_u32 data)
{return TD_SUCCESS; td_s32 ret;if (g_fd[vi_pipe] < 0) {return TD_SUCCESS;}#ifdef OT_GPIO_I2Ci2c_data.dev_addr = IMX347_SLAVE_I2C_ADDR;i2c_data.reg_addr = addr;i2c_data.addr_byte_num = IMX347_SLAVE_ADDR_BYTE;i2c_data.data = data;i2c_data.data_byte_num = IMX347_SLAVE_DATA_BYTE;ret = ioctl(g_fd[vi_pipe], GPIO_I2C_WRITE, &i2c_data);if (ret) {isp_err_trace("GPIO-I2C write failed!\n");return ret;}
#elsetd_u32 idx = 0;td_u8 buf[I2C_BUF_NUM];if (IMX347_SLAVE_ADDR_BYTE == 2) {  /* 2 byte */buf[idx] = (addr >> 8) & 0xff;  /* shift 8 */idx++;buf[idx] = addr & 0xff;idx++;} else {}if (IMX347_SLAVE_DATA_BYTE == 2) {  /* 2 byte */} else {buf[idx] = data & 0xff;idx++;}ret = write(g_fd[vi_pipe], buf, IMX347_SLAVE_ADDR_BYTE + IMX347_SLAVE_DATA_BYTE);if (ret < 0) {isp_err_trace("I2C_WRITE error!\n");return TD_FAILURE;}#endifreturn TD_SUCCESS;
}

3.修改VI配置信息

3.1配置MIPI输入参数

        3519DV500 mipi接口输入配置参考如下:

static combo_dev_attr_t g_mipi_4lane_chn0_sensor_imx347_sdi_16bit_2lan_nowdr_attr = {.devno = 0,.input_mode = INPUT_MODE_MIPI,.data_rate = MIPI_DATA_RATE_X1,.img_rect = {0, 0, 1920, 1080},.mipi_attr = {DATA_TYPE_YUV422_8BIT,OT_MIPI_WDR_MODE_NONE,{0, 1, -1, -1, -1, -1, -1, -1}}
};static combo_dev_attr_t g_mipi_4lane_chn0_sensor_imx347_pal_16bit_2lan_nowdr_attr = {.devno = 2,.input_mode = INPUT_MODE_MIPI,.data_rate = MIPI_DATA_RATE_X1,.img_rect = {0, 0, 720, 576},.mipi_attr = {DATA_TYPE_YUV422_8BIT,OT_MIPI_WDR_MODE_NONE,{4, 6, -1, -1, -1, -1, -1, -1}}
};

        值得注意的是,当接口模式为OT_VI_INTF_MODE_MIPI_YUV420_NORM, OT_VI_INTF_MODE_MIPI_YUV420_LEGACY,OT_VI_INTF_MODE_MIPI_YUV422 时data_reverse必须为TD_FALSE,且掩码的设置必须为component_mask[0] = 0xFF000000,component_mask[1] = 0x00FF0000,即高8bit输入Y数据,低8bit 输入C数据,否则会导致图像异常或无图像等现像。

static ot_vi_dev_attr g_mipi_yuv422_dev_attr = {.intf_mode = OT_VI_INTF_MODE_MIPI_YUV422,/* Invalid argument */.work_mode = OT_VI_WORK_MODE_MULTIPLEX_1,/* mask component */.component_mask = {0xFF000000, 0x00FF0000},.scan_mode = OT_VI_SCAN_PROGRESSIVE,/* Invalid argument */.ad_chn_id = {-1, -1, -1, -1},/* data seq */.data_seq = OT_VI_DATA_SEQ_YUYV,/* sync param */.sync_cfg = {.vsync = OT_VI_VSYNC_FIELD,.vsync_neg = OT_VI_VSYNC_NEG_HIGH,.hsync = OT_VI_HSYNC_VALID_SIG,.hsync_neg = OT_VI_HSYNC_NEG_HIGH,.vsync_valid = OT_VI_VSYNC_VALID_SIG,.vsync_valid_neg = OT_VI_VSYNC_VALID_NEG_HIGH,.timing_blank = {/* hsync_hfb      hsync_act     hsync_hhb */0,                0,            0,/* vsync0_vhb     vsync0_act    vsync0_hhb */0,                0,            0,/* vsync1_vhb     vsync1_act    vsync1_hhb */0,                0,            0}},/* data type */.data_type = OT_VI_DATA_TYPE_YUV,/* data reverse */.data_reverse = TD_FALSE,/* input size */.in_size = {1920, 1080},/* data rate */.data_rate = OT_DATA_RATE_X1,
};
3.2 配置VI设备通道参数
td_void sample_comm_vi_get_default_pipe_info(sample_sns_type sns_type, ot_vi_bind_pipe *bind_pipe,sample_vi_pipe_info pipe_info[])
{td_u32 i;ot_size size;sample_comm_vi_get_size_by_sns_type(sns_type, &size);for (i = 0; i < bind_pipe->pipe_num; i++) {/* pipe attr */pipe_info[i].pipe_attr.pipe_bypass_mode               = OT_VI_PIPE_BYPASS_NONE;pipe_info[i].pipe_attr.isp_bypass                     = TD_TRUE;pipe_info[i].pipe_attr.size.width                     = size.width;pipe_info[i].pipe_attr.size.height                    = size.height;pipe_info[i].pipe_attr.pixel_format                   = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422;pipe_info[i].pipe_attr.compress_mode                  = OT_COMPRESS_MODE_NONE;pipe_info[i].pipe_attr.frame_rate_ctrl.src_frame_rate = -1;pipe_info[i].pipe_attr.frame_rate_ctrl.dst_frame_rate = -1;if (sns_type == GST_412C_SLAVE_THERMO_T3_384_288_30FPS_14BIT) {pipe_info[i].pipe_attr.compress_mode = OT_COMPRESS_MODE_NONE;pipe_info[i].pipe_attr.pixel_format = OT_PIXEL_FORMAT_RGB_BAYER_14BPP;}pipe_info[i].pipe_need_start = TD_TRUE;pipe_info[i].isp_need_run = TD_TRUE;pipe_info[i].isp_quick_start = TD_FALSE;if (i == 0) {pipe_info[i].is_master_pipe = TD_TRUE;}/* pub attr */sample_comm_isp_get_pub_attr_by_sns(sns_type, &pipe_info[i].isp_info.isp_pub_attr);pipe_info[i].nr_attr.enable = TD_TRUE;pipe_info[i].nr_attr.compress_mode = OT_COMPRESS_MODE_FRAME;pipe_info[i].nr_attr.nr_type = OT_NR_TYPE_VIDEO_NORM;pipe_info[i].nr_attr.nr_motion_mode = OT_NR_MOTION_MODE_NORM;/* chn info */pipe_info[i].chn_num = 1;pipe_info[i].chn_info[0].vi_chn                                  = 0;pipe_info[i].chn_info[0].fmu_mode                                = OT_FMU_MODE_OFF;pipe_info[i].chn_info[0].chn_attr.size.width                     = size.width;pipe_info[i].chn_info[0].chn_attr.size.height                    = size.height;pipe_info[i].chn_info[0].chn_attr.pixel_format                   = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422;pipe_info[i].chn_info[0].chn_attr.dynamic_range                  = OT_DYNAMIC_RANGE_SDR8;pipe_info[i].chn_info[0].chn_attr.video_format                   = OT_VIDEO_FORMAT_LINEAR;pipe_info[i].chn_info[0].chn_attr.compress_mode                  = OT_COMPRESS_MODE_NONE;pipe_info[i].chn_info[0].chn_attr.mirror_en                      = TD_FALSE;pipe_info[i].chn_info[0].chn_attr.flip_en                        = TD_FALSE;pipe_info[i].chn_info[0].chn_attr.depth                          = 1;pipe_info[i].chn_info[0].chn_attr.frame_rate_ctrl.src_frame_rate = -1;pipe_info[i].chn_info[0].chn_attr.frame_rate_ctrl.dst_frame_rate = -1;if (sns_type == GST_412C_SLAVE_THERMO_T3_384_288_30FPS_14BIT) {pipe_info[i].chn_info[0].chn_attr.compress_mode              = OT_COMPRESS_MODE_NONE;}}
}

        重要参数说明:

       不使用ISP图像调整: pipe_info[i].pipe_attr.isp_bypass  = TD_TRUE; 

        VI组通道使用YUV422格式: 

pipe_info[i].pipe_attr.pixel_format = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422;

pipe_info[i].chn_info[0].chn_attr.pixel_format = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422;

4.修改VPSS配置信息

td_void sample_comm_vpss_get_default_grp_attr(ot_vpss_grp_attr *grp_attr)
{grp_attr->ie_en                     = TD_FALSE;grp_attr->dci_en                    = TD_FALSE;grp_attr->buf_share_en              = TD_FALSE;grp_attr->mcf_en                    = TD_FALSE;grp_attr->max_width                 = VPSS_DEFAULT_WIDTH;grp_attr->max_height                = VPSS_DEFAULT_HEIGHT;grp_attr->max_dei_width             = 0;grp_attr->max_dei_height            = 0;grp_attr->dynamic_range             = OT_DYNAMIC_RANGE_SDR8;grp_attr->pixel_format              = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422;grp_attr->dei_mode                  = OT_VPSS_DEI_MODE_OFF;grp_attr->buf_share_chn             = OT_VPSS_CHN0;grp_attr->frame_rate.src_frame_rate = -1;grp_attr->frame_rate.dst_frame_rate = -1;
}

5.遇到问题

5.1图像为绿色

        原因:YUV422数据位错误

        解决办法:和FPGA工程师沟通一下,明确输入的MIPI数据YUV格式是,YUYV、YVYU等。

5.2 图像出现错位

        原因:MIPI时钟和FPGA时钟不匹配

        解决办法:检查syscfg的时钟配置。

5.2 其他错误

        原因:就是硬件不行

        解决办法:甩锅给硬件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算力租赁革命:弹性模式如何重构数字时代的创新门槛​

一、算力革命&#xff1a;第四次工业革命的核心驱动力​ 在科技飞速发展的当下&#xff0c;我们正悄然迎来第四次工业革命。华为创始人任正非在一场程序设计竞赛中曾深刻指出&#xff0c;这场革命的基础便是大算力。随着 5G、人工智能、大数据、物联网等信息技术的迅猛发展&am…

改写自己的浏览器插件工具 myChromeTools

1. 起因&#xff0c; 目的: 前面我写过&#xff0c; 自己的一个浏览器插件小工具 最近又增加一个小功能&#xff0c;可以自动滚动页面&#xff0c;尤其是对于那些瀑布流加载的网页。最新的代码都在这里 2. 先看效果 3. 过程: 代码 1, 模拟鼠标自然滚动 // 处理滚动控制逻辑…

深度学习篇---OC-SORT简介

OC-SORT&#xff08;Observation-Centric SORT&#xff09;是一种以观测为中心的多目标跟踪算法&#xff0c;旨在解决传统 SORT 算法在目标遮挡、外观变化和复杂交互场景下关联准确性不足的问题。以下是其详细介绍&#xff1a; 核心创新点 以观测为中心的在线平滑&#xff08…

硬件工程师笔记——二极管Multisim电路仿真实验汇总

目录 1 二极管基础知识 1.1 工作原理 1.2 二极管的结构 1.3 PN结的形成 1.4 二极管的工作原理详解 正向偏置 反向偏置 multisim使用说明链接 2 二极管特性实验 2.1 二极管加正向电压 2.2 二极管加反向电压 2.3 二极管两端的电阻 2.4 交流电下二级管工作 2.5 二极…

vscode中让文件夹一直保持展开不折叠

vscode中让文件夹一直保持展开不折叠 问题 很多小伙伴使用vscode发现空文件夹会折叠显示, 让人看起来非常难受, 如下图 解决办法 首先打开设置->setting, 搜索compact Folders, 去掉勾选即可, 如下图所示 效果如下 看起来非常爽 ! ! !

设计模式学习笔记

设计模式 一&#xff1a;分类&#xff1a; 创建型模式 用于描述“怎样创建对象”&#xff0c;它的主要特点是“将对象的创建与使用分离”。GoF&#xff08;四人组&#xff09;书中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式 用于描述如何将…

Kaggle-Predict Calorie Expenditure-(回归+xgb+cat+lgb+模型融合+预测结果)

Predict Calorie Expenditure 题意&#xff1a; 给出每个人的基本信息&#xff0c;预测运动后的卡路里消耗值。 数据处理&#xff1a; 1.构造出人体机能、运动相关的特征值。 2.所有特征值进行从新组合&#xff0c;注意唯独爆炸 3.对连续信息分箱变成离散 建立模型&#x…

第十二篇:MySQL 分布式架构演进与云原生数据库探索

本篇聚焦 MySQL 在互联网架构演进过程中的角色变化&#xff0c;探讨其从单体向分布式、再向云原生架构转型的关键技术路径与实践建议。 一、传统单体架构下的 MySQL 应用模式 在早期项目中&#xff0c;MySQL 多用于中小型应用&#xff1a; 单节点部署&#xff1b; 水平扩展难…

JVM——回顾:JVM的起源、特性与系统构成

引入 在当今数字化时代&#xff0c;Java语言及其运行环境Java虚拟机&#xff08;JVM&#xff09;在软件开发领域占据着举足轻重的地位。从大型企业级应用到各类移动应用&#xff0c;JVM凭借其独特的特性和强大的功能&#xff0c;为开发者提供了高效且稳定的运行环境。 JVM的起…

大疆上云API+流媒体服务器部署实现直播功能

根据官网文档上云API&#xff0c;先将官方提供的Demo部署起来&#xff0c;后端和前端服务环境搭建请参考官方文档。因为官方文档没有对直播这块的环境搭建进行说明&#xff0c;所以下面主要对直播功能环境搭建做一个记录&#xff0c;仅供参考&#xff0c;如有不足之处&#xff…

计算机网络 HTTP篇常见面试题总结

HTTP各版本区别 HTTP 1.0 无状态、无连接&#xff1a;每次请求都需要建立新的 TCP&#xff0c;处理完后立即关闭&#xff0c;导致开销较大。队头阻塞&#xff1a;每个请求必须按照顺序依次处理&#xff0c;前面的请求未完成&#xff0c;后面的请求只能等待&#xff0c;减低了…

目标检测:YOLO 模型详解

目录 一、YOLO&#xff08;You Only Look Once&#xff09;模型讲解 YOLOv1 YOLOv2 (YOLO9000) YOLOv3 YOLOv4 YOLOv5 YOLOv6 YOLOv7 YOLOv8 YOLOv9 YOLOv10 YOLOv11 YOLOv12 其他变体&#xff1a;PP-YOLO 二、YOLO 模型的 Backbone&#xff1a;Focus 结构 三、…

开源 FcDesigner 表单设计器组件事件详解

FcDesigner 是一款基于Vue的开源低代码可视化表单设计器工具&#xff0c;通过数据驱动表单渲染。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。并广泛应用于在政务系统、OA系统、ERP系统、电商系统、流程管理等领域。 …

关于 smali:2. 从 Java 到 Smali 的映射

一、对照 Java 代码与 Smali 代码差异 1.1 方法调用差异&#xff1a;Java vs Smali Java 方法分类&#xff1a; 方法类型Java 示例Smali 指令特点说明静态方法Utils.print("hi")invoke-static没有 this 指针实例方法obj.show()invoke-virtual有 this&#xff0c;虚…

2025年05月29日Github流行趋势

项目名称&#xff1a;agenticSeek 项目地址url&#xff1a;https://github.com/Fosowl/agenticSeek项目语言&#xff1a;Python历史star数&#xff1a;11898今日star数&#xff1a;2379项目维护者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

Dubbo高频面试题

引言 作为分布式服务框架的标杆&#xff0c;Dubbo凭借其高性能RPC通信、灵活的服务治理能力和丰富的容错机制&#xff0c;成为Java技术栈中微服务领域的核心考点。本文系统梳理Dubbo高频面试核心知识点&#xff0c;涵盖容错策略、负载均衡、注册中心原理、服务上下线感知等关键…

氮气吹扫电磁阀

一、氮气吹扫电磁阀的概述 氮气吹扫电磁阀是一种重要的工业自动控制设备&#xff0c;用于对工业设备中出现的杂质和沉淀物进行清理&#xff0c;以保证生产线的畅通和生产效率的稳定。其作用是在需要吹扫清洗的工业设备中&#xff0c;通过控制气源的气压&#xff0c;打开电磁阀…

网络安全的守护者:iVX 如何构建全方位防护体系

一、安全技术的三大趋势 在数字化时代&#xff0c;网络安全面临着前所未有的挑战。随着企业级应用的普及&#xff0c;安全技术也在不断演进。目前&#xff0c;安全技术架构的发展呈现出三大趋势&#xff1a; 零信任架构的崛起&#xff1a;传统的网络安全依赖于边界防护&#…

微软云如何申请使用

微软云&#xff08;Azure&#xff09;新手“开荒”指南&#xff1a;5步搞定账户&#xff0c;直达云端&#xff01; 还在为云计算的复杂门槛发愁吗&#xff1f;别担心&#xff01;当全球83%的企业都在加速“上云”&#xff0c;微软智能云Azure凭借其在全球34个区域、200服务的庞…

magic-api配置Git插件教程

一、配置gitee.com 1&#xff0c;生成rsa密钥&#xff0c;在你的电脑右键使用管理员身份运行&#xff08;命令提示符&#xff09;&#xff0c;执行下面命令 ssh-keygen -t rsa -b 2048 -m PEM一直按回车键&#xff0c;不需要输入内容 找到 你电脑中的~/.ssh/id_rsa.pub 文件…