海思 35XX MIPI读取YUV422

news2025/6/5 17:06:58

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_I2C
    g_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;
    }
#else
    int 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;
    }
#endif

    return 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_I2C
    i2c_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;
    }
#else
    td_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;
    }

#endif
    return 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.coloradmin.cn/o/2393799.html

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

相关文章

第1章 Redis 概述

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

硬件工程师笔记——二极管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…

LINUX安装运行jeelowcode后端项目(idea启动)

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

硬件I2C和软件I2C的区别

硬件I2C和软件I2C的区别 一、硬件I2C 1、硬件IC的局限性及学习意义 尽管硬件IC外设在STM32等微控制器中提供了标准化的通信支持&#xff0c;但在实际应用中&#xff0c;其稳定性可能存在问题。例如&#xff0c;某些情况下外设会因事件检测异常而进入死锁状态&#xff0c;仅能…

AWS WAF设置IP白名单

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

智能门禁的项目

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

《Google I/O 2025:AI浪潮下的科技革新风暴》

Google I/O 2025 盛大开幕 在科技飞速发展的时代&#xff0c;Google I/O 开发者大会一直是全球科技爱好者和开发者瞩目的焦点&#xff0c;堪称科技领域的年度盛宴。2025 年 5 月 20 日至 21 日&#xff0c;Google I/O 2025 在美国加州山景城的 Shoreline Amphitheatre 盛大举行…

职坐标IT培训:硬件嵌入式与AI芯片开发实战

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

一句话开发Chrome摸鱼插件

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

Spring Boot + OpenCSV 数据清洗实战:CSV 结构化处理与可视化

目录 摘要 演示 一、背景&#xff1a;为什么需要自动化数据清洗&#xff1f; 二、技术选型&#xff1a;为什么选择这三个工具&#xff1f; 三、核心功能实现&#xff1a;从数据读取到智能清洗 1. 配置控制器 2. 文件上传控制器 3. CSV数据处理服务接口 4. CSV数据处理…

Cmake编译glog成功并在QT中测试成功步骤

glog是开源的日志记录系统&#xff0c;下载地址GitHub - google/glog: C implementation of the Google logging module 跟gflags有点相似&#xff0c;编译和测试过程比较周折&#xff0c;所以记录下来具体的编译和测试步骤。 编译环境&#xff1a;WindowsCmakeVs2022Qt5.14.…

xhr、fetch和axios

XMLHttpRequest (XHR) XMLHttpRequest 是最早用于在浏览器中进行异步网络请求的 API。它允许网页在不刷新整个页面的情况下与服务器交换数据。 // 创建 XHR 对象 const xhr new XMLHttpRequest();// 初始化请求 xhr.open(GET, https://api.example.com/data, true);// 设置请…

2025吉林ccpc【部分题解】

文章目录 C - SSPPSPSPProblemD.互互互质质质ProblemF. Ever ForeverProblemG.石石石头头头剪剪剪刀刀刀布布布Problem J.奇偶游戏Problem L.好矩阵 C - SSPPSPSP 题目来源&#xff1a;C - SSPPSPSP !](https://i-blog.csdnimg.cn/direct/26fc1492b1724446be61cf39b718cf9b.…

PowerDesigner通过SQL反向生成类图

PowerDesigner通过SQL反向生成类图 背景操作步骤步骤1: 选择这个步骤2: 目前我是选择的这个步骤3: 选择这个 其他 背景 工作学习 操作步骤 步骤1: 选择这个 步骤2: 目前我是选择的这个 步骤3: 选择这个 其他 其他同事告诉我的, 我还没有亲自尝试, 应该问题不大. 尝试后再反…

【bug排查记录】由Redission配置引发的Satoken血案

背景 在今天服务更改服务配置的redis的database后&#xff0c;本地测试通过&#xff0c;发布到线上。出现所有用户登录状态失效&#xff0c;并且重新登录后也是失效的问题&#xff0c;由于鉴权登录框架使用的是satoken&#xff0c;线上database配置的是1&#xff0c;然后去red…

MAC程序签名遇到的问题

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

华为OD机试真题——宜居星球改造计划(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《宜居…

Linux下基本指令的介绍

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

零基础开始的网工之路第十四天------Linux程序管理

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