海思 35XX MIPI读取YUV422

article/2025/7/24 2:17:50

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.hkcw.cn/article/VeMiwBBtke.shtml

相关文章

解压带密码的压缩包

在cmd中通过管理员方式运行 tar -xf "G:\BaiduNetdiskDownload\02-93套-22-SpringBoot.zip" -C "F:\springbootAllProject\un2" 前面是&#xff0c;你要解压的文件夹所在的路径&#xff0c;后面是你要解压到的位置 输完回车后会出现一个让你输密码的指令…

如何以 9 种方式将照片从 iPhone 传输到笔记本电脑

您的 iPhone 可能充满了以照片和视频形式捕捉的珍贵回忆。无论您是想备份它们、在更大的屏幕上编辑它们&#xff0c;还是只是释放设备上的空间&#xff0c;您都需要将照片从 iPhone 传输到笔记本电脑。幸运的是&#xff0c;有 9 种方便的方法可供使用&#xff0c;同时满足 Wind…

涨薪技术|0到1学会性能测试第91课-性能测试过程执行、分析、诊断、调节

至此关于系统资源监控、apache监控调优、Tomcat监控调优、JVM调优、Mysql调优、前端监控调优、接口性能监控调优的知识已分享完&#xff0c;今天开始学习性能测试流程知识。后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试。 性能测试过程执行 当脚本开发、场景…

智绅科技——科技赋能健康养老,构建智慧晚年新生态

当老龄化浪潮与数字技术深度碰撞&#xff0c;智绅科技以 “科技赋能健康&#xff0c;智慧守护晚年” 为核心理念&#xff0c;锚定数字健康与养老服务赛道&#xff0c;通过人工智能、物联网、大数据等技术集成&#xff0c;为亚健康群体与中老年人群构建 “监测 - 预防 - 辅助 - …

基于51单片机的音乐盒键盘演奏proteus仿真

地址&#xff1a; https://pan.baidu.com/s/1tZCAxQQ7cvyzBfztQpk0UA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C51 是一款常用的 8 位单片机&#xff0c;由 Atmel 公司&#xff08;现已被 Microchip 收…

(独家)SAP VC物料 超级BOM怎么开单?怎么计算或发布表标准成本?

由于某公司的订单差异来源于标准成本与实际成本的差异&#xff0c;所以在开生产订单时报错&#xff1a; 在这个基础上&#xff0c;在CK11N计算标准成本时报错&#xff1a; 查了配置、前台相关的都没有相关的路径可以对可配置物料进行标准成本计算。 最后通过几天的研究&#x…

物流项目第十期(轨迹微服务)

本项目专栏&#xff1a; 物流项目_Auc23的博客-CSDN博客 建议先看这期&#xff1a; MongoDB入门之Java的使用-CSDN博客 物流项目第九期&#xff08;MongoDB的应用之作业范围&#xff09;-CSDN博客 业务需求 快递员取件成功后&#xff0c;需要将订单转成运单&#xff0c;用…

【C++高级主题】命令空间(四):命名空间成员的使用

目录 一、扼要重述&#xff1a;命名空间的本质 二、using声明&#xff1a;精准引入单个成员 2.1 定义与语法 2.2 using声明的作用域 2.3 using声明的关键特性 三、命名空间别名&#xff1a;简化长命名空间 3.1 定义与语法 3.2 使用场景 3.3 注意事项 四、using指示&a…

Java基础知识总结继承与多态详解

1. 引言 面向对象编程的核心概念 面向对象编程是模拟人的思维方式来组织代码&#xff0c;便于处理复杂的业务。 面向对象四大核心特征&#xff1a; 封装&#xff1a;将数据和操作数据的方法组合在一起&#xff0c;隐藏内部实现的具体细节&#xff0c;只需要暴露必要的接口。 …

Lyra学习笔记2 GFA_AddComponents与ULyraPlayerSpawningManagerComponent

目录 前言GameFeatureAction_AddComponentsULyraPlayerSpawningManagerComponent缓存所有PlayerStart位置选择位置 前言 1.以control模式为例 2.比较散&#xff0c;想单独拿出一篇梳理下Experience的流程 GameFeatureAction_AddComponents 这部分建议看 《InsideUE5》GameFeatu…

EDW2025|数据治理的神话破除——从误区到现实

在当今数据驱动的世界中&#xff0c;数据治理已成为企业成功的关键因素。然而&#xff0c;许多组织在实施数据治理时&#xff0c;常常被一些常见的误区所困扰。本文将逐一破除这些误区&#xff0c;揭示数据治理的真实面貌。 误区一&#xff1a;你需要一个大的预算&#xff01;…

(24)多租户 SaaS 平台设计

文章目录 2️⃣4️⃣ 多租户 SaaS 平台设计 &#x1f3e2;&#x1f510;&#x1f680; 多租户SaaS平台&#xff1a;打造云端共享公寓的隔离术&#xff01;&#x1f3d7;️ 多租户架构模型&#xff1a;三种共存方式1️⃣ 独立数据库模式2️⃣ 共享数据库&#xff0c;独立Schema模…

理想树图书:以科技赋能教育,开启AI时代自主学习新范式

深耕教育沃土 构建全场景教辅产品矩阵 自2013年创立以来&#xff0c;理想树始终以教育匠心回应时代命题。在教辅行业这片竞争激烈的领域&#xff0c;由专业教育工作者组成的理想树图书始终秉持“知识互映”理念&#xff0c;经过十余年的精耕细作&#xff0c;精心打造了小学同步…

26 C 语言函数深度解析:定义与调用、返回值要点、参数机制(值传递)、原型声明、文档注释

1 函数基础概念 1.1 引入函数的必要性 在《街霸》这类游戏中&#xff0c;实现出拳、出脚、跳跃等动作&#xff0c;每项通常需编写 50 - 80 行代码。若每次调用都重复编写这些代码&#xff0c;程序会变得臃肿不堪&#xff0c;代码可读性与维护性也会大打折扣。 为解决这一问题&…

网易 - 灵犀办公文档

一. 企业介绍 网易是中国领先的互联网技术公司&#xff0c;为用户提供免费邮箱、游戏、搜索引擎服务&#xff0c;通过开设新闻、娱乐、体育等30多个内容频道&#xff0c;以及博客、视频、论坛等互动交流&#xff0c;网聚人的力量。 为了给中小企业和个人打造一款综合性办公产…

2025年素养大赛编程赛项练习题

我用K克网盘分享了「最新素养大赛.zip」&#xff0c;点击链接即可保存。打开「K克App」&#xff0c;无需下载在线播放视频&#xff0c;畅享原画5倍速&#xff0c;支持电视投屏。 链接&#xff1a;https://pan.quark.cn/s/c2f85a297992 提取码&#xff1a;d4Uq

CSS3前端入门(第三天)2D转换 transform

转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以根据实现元素的位移、旋转、缩放等效果 移动&#xff1a;translate旋转&#xff1a;rorate缩放&#xff1a;scale 2D转换之移动translate 2D移动是2D转换里面的一种功能&#xff0c;可以…

深兰科技董事长陈海波受邀出席2025苏商高质量发展(常州)峰会,共话AI驱动产业升级

5月29日&#xff0c;2025苏商高质量发展峰会在常州隆重开幕。本次峰会聚焦新质生产力培育与产业创新转型&#xff0c;汇聚了众多江苏省内知名企业家、专家学者及政府代表。深兰科技创始人、董事长陈海波作为人工智能领域的领军企业代表&#xff0c;受邀出席盛会并参与重要活动环…

【软件】navicat 官方免费版

Navicat Premium Lite https://www.navicat.com.cn/download/navicat-premium-lite

AIGC与影视制作:技术革命、产业重构与未来图景

文章目录 一、AIGC技术全景&#xff1a;从算法突破到产业赋能1. **技术底座&#xff1a;多模态大模型的进化路径**2. **核心算法&#xff1a;从生成对抗网络到扩散模型的迭代** 二、AIGC在影视制作全流程中的深度应用1. **剧本创作&#xff1a;从“灵感枯竭”到“创意井喷”**2…