海思 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
繁體地址,請注明出處:http://hk.pswp.cn/web/81861.shtml
英文地址,請注明出處:http://en.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 文件…