海思 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 其他错误
原因:就是硬件不行
解决办法:甩锅给硬件。
相关文章:

海思 35XX MIPI读取YUV422
1.项目背景: 使用海思芯片,接收FPGA发送的MIPI数据,不需要ISP处理,YUV图像格式为YUV422。 2.移植MIPI驱动 修改IMX347的驱动远吗,将I2C读写的部分注释,其他的不用再做修改。 int imx347_slave_i2c_init(ot…...
sass三大循环语法
for for 指令可以在限制的范围内重复输出格式,每次按要求(变量的值)对输出结果做出变动。这个指令包含两种格式:for $var from through ,或者 for v a r f r o m < s t a r t > t o < e n d > ÿ…...

第1章 Redis 概述
一、Redis 简介 Redis,Remote Dictionary Server,远程字典服务,由意大利人Salvatore Sanfilippo(又名Antirez)开发,是一个使用ANSI C 语言编写、支持网络、 可基于内存亦可持久化的日志型、NoSQL 开源内存数据库,其提供多种语言的API。…...

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

30V/3A,云岑CP8335B,完美替换EUP3484
1 FEATURES ● Wide Input Voltage Range: 6V ~ 30V ● Low RDS(ON) for Internal Switches (Top/Bottom): 90mΩ/65 mΩ ● 3A output current capability ● 500kHz Switching Frequency Minimize the External Components ● Internal 1.5-ms Soft-Start ● 0.6V/0.8V/0.925…...
基于大模型预测的FicatIII-IV期股骨头坏死综合治疗研究报告
目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究意义和创新点 二、FicatIII-IV 期股骨头坏死概述 2.1 疾病定义与分期 2.2 病因与病理机制 2.3 临床症状与诊断方法 三、大模型预测原理与方法 3.1 大模型简介 3.2 数据收集与预处理 3.3 模型训练与优…...
promptfoo:让语言模型评测不再“靠感觉”——一站式 LLM 自动化测评神器深度解读
大家好,这里是你们喜闻乐见、永远不低调的 AI 技术博主。这篇分享,我要隆重介绍一个我愿称之为“LLM 测试自动化福音”的神器——promptfoo。 如果你做 LLM(大模型)落地开发,调教 prompt 拼死拼活,一上线用…...

LINUX安装运行jeelowcode后端项目(idea启动)
参考 LINUX安装运行jeelowcode后端项目(命令行)-CSDN博客 IntelliJ IDEA下载地址(社区版、付费版)-CSDN博客 软件已安装好,数据库也初始化完毕。 步骤1:打开项目目录步骤2:配置JDK步骤3&…...

硬件I2C和软件I2C的区别
硬件I2C和软件I2C的区别 一、硬件I2C 1、硬件IC的局限性及学习意义 尽管硬件IC外设在STM32等微控制器中提供了标准化的通信支持,但在实际应用中,其稳定性可能存在问题。例如,某些情况下外设会因事件检测异常而进入死锁状态,仅能…...
单元测试报错
报错信息如下所示: 五月 30, 2025 5:35:44 下午 org.junit.vintage.engine.descriptor.RunnerTestDescriptor warnAboutUnfilterableRunner 警告: Runner org.junit.internal.runners.ErrorReportingRunner (used on class redis.demo.RedisTemplateTest) does not…...

AWS WAF设置IP白名单
目标 设置一个组白名单IP地址,当发现是这些IP地址发过来的请求后,WAF自动放行。 创建IP集 打开WAF页面,开始IP集创建如下图: 设置ip集,如下图: aws waf acl配置白名单 找到Web ACL,开始在…...

智能门禁的项目
项目需求 矩阵键盘输入密码,正确开锁,错误提示,三次错误后蜂鸣器响三秒;按下#号确认输入,按下*号修改密码;密码保存在W25Q128里;OLED屏幕显示信息。 硬件清单 矩阵键盘OLED显示屏继电器蜂鸣器…...

《Google I/O 2025:AI浪潮下的科技革新风暴》
Google I/O 2025 盛大开幕 在科技飞速发展的时代,Google I/O 开发者大会一直是全球科技爱好者和开发者瞩目的焦点,堪称科技领域的年度盛宴。2025 年 5 月 20 日至 21 日,Google I/O 2025 在美国加州山景城的 Shoreline Amphitheatre 盛大举行…...

职坐标IT培训:硬件嵌入式与AI芯片开发实战
课程体系以硬件嵌入式开发与AI芯片技术融合为核心,构建模块化知识框架。从硬件设计规范切入,系统讲解PCB Layout设计中的信号完整性控制、电磁兼容性(EMC)优化等关键要素,延伸至高速电路设计中阻抗匹配与电源完整性&am…...

一句话开发Chrome摸鱼插件
本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴。 CodeBuddy 一、CodeBuddy新功能特色 Craft智能体:自然语言驱动的全栈开发引擎Craft开发智能体的核心突破在于实现需求理解-任务拆解-代码生成的…...

Spring Boot + OpenCSV 数据清洗实战:CSV 结构化处理与可视化
目录 摘要 演示 一、背景:为什么需要自动化数据清洗? 二、技术选型:为什么选择这三个工具? 三、核心功能实现:从数据读取到智能清洗 1. 配置控制器 2. 文件上传控制器 3. CSV数据处理服务接口 4. CSV数据处理…...

Cmake编译glog成功并在QT中测试成功步骤
glog是开源的日志记录系统,下载地址GitHub - google/glog: C implementation of the Google logging module 跟gflags有点相似,编译和测试过程比较周折,所以记录下来具体的编译和测试步骤。 编译环境:WindowsCmakeVs2022Qt5.14.…...
AI绘画提示词:从零开始掌握Prompt Engineering的艺术
文章目录 什么是AI绘画提示词?提示词的基本结构主体描述场景/背景风格指定技术参数负面提示人物肖像模板风景模板 高级技巧权重调整混合风格颜色控制情绪氛围 常见问题与解决方法手部变形问题构图不理想风格不够突出 提示词示例库科幻场景奇幻人物静物画 结语 在当今…...

xhr、fetch和axios
XMLHttpRequest (XHR) XMLHttpRequest 是最早用于在浏览器中进行异步网络请求的 API。它允许网页在不刷新整个页面的情况下与服务器交换数据。 // 创建 XHR 对象 const xhr new XMLHttpRequest();// 初始化请求 xhr.open(GET, https://api.example.com/data, true);// 设置请…...
lcd-framebuffer驱动开发参考文章
MMAP mmap的时候总是失败,查了很多资料,显存大小是驱动层fb_info->fix.smem_len设置,要遵循内核页大小的整数倍,应用层调用mmap也要遵循对齐。 MMAP使用(一、基本接口)_mmap接口-CSDN博客 基于fbtft和…...

2025吉林ccpc【部分题解】
文章目录 C - SSPPSPSPProblemD.互互互质质质ProblemF. Ever ForeverProblemG.石石石头头头剪剪剪刀刀刀布布布Problem J.奇偶游戏Problem L.好矩阵 C - SSPPSPSP 题目来源:C - SSPPSPSP !](https://i-blog.csdnimg.cn/direct/26fc1492b1724446be61cf39b718cf9b.…...

PowerDesigner通过SQL反向生成类图
PowerDesigner通过SQL反向生成类图 背景操作步骤步骤1: 选择这个步骤2: 目前我是选择的这个步骤3: 选择这个 其他 背景 工作学习 操作步骤 步骤1: 选择这个 步骤2: 目前我是选择的这个 步骤3: 选择这个 其他 其他同事告诉我的, 我还没有亲自尝试, 应该问题不大. 尝试后再反…...
【appium】环境安装部署问题记录
1.安装uiautomator2 appium driver install uiautomator2(超时报错,多执行几遍) 出现code1,安装失败 执行APPIUM_SKIP_CHROMEDRIVER_INSTALL1 appium driver install uiautomator2 安装失败code196 清理缓存npm cache clean --for…...

【bug排查记录】由Redission配置引发的Satoken血案
背景 在今天服务更改服务配置的redis的database后,本地测试通过,发布到线上。出现所有用户登录状态失效,并且重新登录后也是失效的问题,由于鉴权登录框架使用的是satoken,线上database配置的是1,然后去red…...
深入理解 MySQL 隔离级别:理论与实战
深入理解 MySQL 隔离级别:理论与实战 在数据库管理系统中,事务的隔离级别是确保数据一致性和完整性的关键因素。MySQL 作为广泛使用的关系型数据库,提供了四种不同的事务隔离级别: 读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行…...

MAC程序签名遇到的问题
整体步骤 需要一个apple开发者账号,个人账户注册需要按年付费 申请证书 申请证书链接 command 空格打开聚焦搜索 输入钥匙串访问打开 默认情况下是没有要的证书的 点击左上角的证书助理,选择请求证书 根据输入创建请求文件并保存到本地 点开申请…...

华为OD机试真题——宜居星球改造计划(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《宜居…...
C#实现图片缩略图生成:多种模式详解与实践
C#实现图片缩略图生成:多种模式详解与实践 在图像处理的场景中,生成图片缩略图是一项常见且实用的功能。无论是搭建图片展示网站,还是开发本地图片管理工具,按需生成合适尺寸的缩略图,能够有效减少图片传输和显示所需…...

Linux下基本指令的介绍
目录 1.目标 2.快速认识指令 1.pwd 2.clear 3.ls 4.mkdir 5.cd 6.touch 3.细化每一条指令 1.ls指令 2.pwd指令 注: 3.cd指令 4.touch和mkdir指令 6.删除文件 4.总结 1.目标 上一篇博客中,我们了解了Linux的起源和发展,也知道…...

零基础开始的网工之路第十四天------Linux程序管理
目录 一、Linux程序与进程 1、程序,进程,线程的概念 2、程序和进程的区别 3、进程和线程的区别 二、Linux进程基础(生命周期) 1、进程生命周期 2、父子进程的关系 三、程序管理 1、常见的软件包类型 四、Linux操作系统启动流程详解 1、概述 2、启动流程核心阶段 1…...