技术分享 | i.MX8M Mini适配MIPI转eDP芯片

ops/2024/9/18 12:34:16/ 标签: linux, ARM, arm开发

1.方案概述

此方案使用HD-8MMN-CORE的核心板搭配TI公司的芯片SN65DSI86转换芯片实现。

SN65DSI86作为一款MIPI DSI转eDP的芯片,支持双通道DSI输入,最大四通道显示输出,最大支持4K@60fps输出,WUXGA 1080P。本方案中将采用单通道DSI输入,双通道DP输出到1080p的屏幕。

HD8MMN-CORE系列工业级核心板基于NXP(Freescale) i.MX8MM系列Cortex-A53高性能处理器设计,支持硬件加密,支持摄像头接口、USB3.0接口、HDMI/MIPI、PCIe、千兆以太网接口、多路串口等,适用于快速开发一系列最具创新性的应用,如多媒体应用、人机界面、工业4.0、车载终端以及边缘计算设备等。

2.硬件原理图

注:硬件修改REFCLK上需要贴上27M的晶振,TEST2引脚需要通过4.7K电阻上拉到1.8V.

3软件实现

3.1软件介绍

内核版本:Linux5.10;

SN65DSI86驱动:drivers/gpu/drm/bridge/ti-sn65dsi86.c

Panel驱动:drivers/gpu/drm/panel/panel-simple.c

3.2驱动移植

内核配置,需要打开如下两项

CONFIG_DRM_TI_SN65DSI86=y
CONFIG_DRM_PANEL_SIMPLE=y

1)设备树配置

/ {osc_27m: clock-osc-27m {compatible = "fixed-clock";#clock-cells = <0>;clock-frequency = <27000000>;clock-output-names = "osc_27m";};lcd_backlight: lcd_backlight {compatible = "pwm-backlight";pwms = <&pwm1 0 100000>;status = "okay";brightness-levels = < 0  1  2  3  4  5  6  7  8  910 11 12 13 14 15 16 17 18 1920 21 22 23 24 25 26 27 28 2930 31 32 33 34 35 36 37 38 3940 41 42 43 44 45 46 47 48 4950 51 52 53 54 55 56 57 58 5960 61 62 63 64 65 66 67 68 6970 71 72 73 74 75 76 77 78 7980 81 82 83 84 85 86 87 88 8990 91 92 93 94 95 96 97 98 99100>;enable-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;default-brightness-level = <80>;};panel {compatible = "test,test-edp-1080p";        //设置自己的屏幕匹配参数组backlight = <&lcd_backlight>;no-hpd;port {panel1_in: endpoint {remote-endpoint = <&sn65_out>;};};};
};
&pwm1 {pinctrl-names = "default";pinctrl-0 = <&pinctrl_pwm1>;status = "okay";
};&i2c4 {clock-frequency = <400000>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_i2c4>;status = "okay";sn65dsi86@2d {…….clock-names = "refclk";          //默认名字//SN65DSI86仅支持12 MHz, 19.2 MHz, 26 MHz, 27 MHz or 38.4 MHz.clocks = <&osc_27m>;……port@1 {reg = <1>;sn65_out: endpoint {//data-lanes = <0 1 2 3>;//根据eDP屏的通道数设置,这里为2通道data-lanes = <0 1>; ……

2)驱动修改

添加显示屏的显示参数到驱动中,修改drivers/gpu/drm/panel/panel-simple.c:

tatic const struct display_timing test_edp_1080p_timing = {.pixelclock = { 153000000, 153000000, 153000000 },.hactive = { 1920, 1920, 1920 },.hfront_porch = { 100, 100, 100 },…...bus_format = MEDIA_BUS_FMT_RGB666_1X18,.connector_type = DRM_MODE_CONNECTOR_eDP,    
};
static const struct of_device_id platform_of_match[] = {{.compatible = "test,test-edp-1080p",.data = &test_edp_1080p,},

修改sn65dsi86驱动以适应我们的板卡,修改drivers/gpu/drm/bridge/ti-sn65dsi86.c,修改DSI正确的模式,防止找不到注册的panel出现报错“couldnotfindanypanelnode”,开机过程中打印1次是正常的,SN65DSI86的驱动找不到Panel会被多次调用,直到找到panel为止。

static int ti_sn_bridge_attach(struct drm_bridge *bridge,
enum drm_bridge_attach_flags flags)
{
...          
//dsi->mode_flags = MIPI_DSI_MODE_VIDEO;dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |MIPI_DSI_MODE_EOT_PACKET | MIPI_DSI_MODE_VIDEO_HSE;
 

3)调试报错

在调试过程中碰到“Linktrainingfailed,linkisoff”的报错,是因为SN65DSI86默认只支持ASSR模式的eDP屏幕,对于不支持ASSR模式的eDP屏,硬件上则需要将TEST2引脚拉高到1.8V,且修改相关寄存器将芯片从ASSR模式变为支持标准的DP模式,修改如下:

#define SN_ENH_FRAME_REG                        0x5A
#define  ASSR_CONTROL                           BIT(0)
...static int ti_sn_link_training(struct ti_sn_bridge *pdata, int dp_rate_idx,
const char **last_err_str)    
{unsigned int val;
int ret;
int i;/* set dp clk frequency value */regmap_update_bits(pdata->regmap, SN_DATARATE_CONFIG_REG,DP_DATARATE_MASK, DP_DATARATE(dp_rate_idx));regmap_write(pdata->regmap, 0xff, 0x07);regmap_write(pdata->regmap, 0x16, 0x01);regmap_write(pdata->regmap, 0xff, 0x00);
/* For DisplayPort, use the standard DP scrambler seed. */regmap_update_bits(pdata->regmap, SN_ENH_FRAME_REG,ASSR_CONTROL, 0);
/* enable DP PLL */regmap_write(pdata->regmap, SN_PLL_ENABLE_REG, 1);
...
 

如果未接eDP屏幕会出现如下报错:

[ 2.299284] ti_sn65dsi86 3-002d: [drm:ti_sn_bridge_enable] ERROR Can't read lane count (-6); assuming 4          [ 2.765851] ti_sn65dsi86 3-002d: [drm:ti_sn_bridge_enable] ERROR Can't read eDP rev (-6), assuming 1.1
 


http://www.ppmy.cn/ops/37609.html

相关文章

LINUX 入门 5.1

LINUX 入门 5.1 day8 20240503 课程链接地址 第5章 数据库mysql项目实战 mysql基础 第四节&#xff1a; mysql_init(&mysql) NULL失败 mysql_real_connect(&mysql, KING_DB_SERVER_IP, KING_DB_USERNAME, KING_DB_PASSWORD, KING_DB_DEFAULTDB, KING_DB_SERVER_PO…

【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

目录 &#x1f6a9;Servlet运行原理 &#x1f6a9;Servlet API 详解 &#x1f393;HttpServlet核心方法 &#x1f393;HttpServletRequest核心方法 &#x1f388;核心方法的使用 &#x1f534;获取请求中的参数 &#x1f4bb;query string &#x1f4bb;直接通过form表…

Python项目开发实战:万年历小程序(案例教程)

一、项目概述 万年历小程序是一个基于Python语言开发的实用工具,它可以帮助用户快速查询任意日期的公历、农历、节气、节日等信息。本项目旨在通过实战的方式,深入了解Python语言在GUI(图形用户界面)编程、日期处理以及数据检索等方面的应用。 二、需求分析 1.用户交互:程…

基于Springboot+Vue的Java项目-旅游网站系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

K8S快速入门

K8S快速入门 在学习k8s的过程&#xff0c;虽然官网给出的示例教程很简单&#xff0c;但是由于网络和环境的差异&#xff0c;导致实际操作的时候踩了很多坑&#xff0c;下面记录一下自己的操作步骤&#xff0c;方便需要的人参考&#xff0c;也方便以后的自己。 参考官网的资料…

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異&#xff0c;我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展&#xff0c;還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域&#xff0c;逐漸成為引領AI發展的重要力量。通過其分布式和…

欧鹏RHCE 第五次作业

unit5.DNS域名解析服务的部署及优化方案 1. (问答题) 1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;dns-master.timinglee.org ip地址&#xff1a; 172.25.254.100 配置好软件仓库 b&#xff09;服务器2&#xff1a; 主机名&…

工单管理系统解决方案(2024Word原件)

工单管理系统解决方案 1、工单创建&#xff1a;根据告警信息创建工单。 2、工单管理&#xff1a;列表形式展示所有工单信息及进度状态。 3、工单处理&#xff1a;对接收的工单进行处理反馈。 4、工单催办&#xff1a;根据工单时效自动发送工单催办消息通知。 5、工单归档&#…

Mybatis 源码分析

《黑马架构师_源码系列-主流框架&中间件》-- MyBatis &#xff08;讲师&#xff1a;子慕&#xff09; * 手写持久层框架-仿写mybatis * Mybatis架构设计&主要组件 * Mybatis如何完成的初始化? * Mybatis如何完成的sql解析及执行? * Mybatis如何设置的参数? * Mybat…

跟TED演讲学英文:What moral decisions should driverless cars make by Iyad Rahwan

What moral decisions should driverless cars make? Link: https://www.ted.com/talks/iyad_rahwan_what_moral_decisions_should_driverless_cars_make Speaker: Iyad Rahwan Date: September 2016 文章目录 What moral decisions should driverless cars make?Introduct…

nacos v2.2.3 docker简单安装使用

nacos v2.2.3 docker简单安装使用 Nacos 官方文档&#xff1a; https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html 控制台&#xff1a; http://127.0.0.1:8848/nacos/ 初始用户名、密码&#xff1a; 账号&#xff1a;nacos 密码&#xff1a;nacos 启动docker…

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述&#xff1a; Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

Unity射线检测不到MeshCollider的原因

当我们构建的模型是单面模型时&#xff0c;就会出现射线检测不到MeshCollider的问题&#xff0c;对于渲染&#xff0c;我们可以Cull Off来实现双面渲染&#xff0c;而在射线检测时&#xff0c;Unity提供了一个API来控制是否检测背面&#xff1a;Physics.queriesHitBackfaces 案…

java集合中retainAll方法使用注意

java集合中retainAll方法使用注意 retainAll新的改变 retainAll retainAll()方法被用来找出两个集合的共同元素&#xff0c;并且只会在交集不为空的情况下返回true。通过比较操作前后集合的大小是否有变化&#xff0c;我们可以确定是否存在共同元素。 retainAl()方法会改变原集…

数据结构-线性表-应用题-2.2-8

已知在一维数组A[mn]中依次存放两个线性表&#xff08;a1,a2,a3,...am&#xff09;和&#xff08;b1,b2,b3,...bm&#xff09;编写一个函数&#xff0c;将数组中的两个顺序表的位置互换&#xff0c;即将&#xff08;b1,b2,b3,...bm&#xff09;放在&#xff08;a1,a2,a3,...am&…

优思学院|六西格玛中的普氏矩阵(Pugh Matrix)是什么?

决策矩阵&#xff08;Pugh Matrix&#xff09;&#xff0c;也可称作普氏矩阵&#xff0c;它是由设计工程师斯图尔特普发展并得名。这是一个基于标准的矩阵&#xff0c;用于帮助团队从几个备选方案中定量确定给定问题的“最佳”解决方案。普矩阵通常用于产品设计&#xff0c;但实…

vscode与git下载安装

粉丝不过W git下载地址: https://git-scm.com/downloads, 安装git时, 记住你安装Git的路径 vscode下载地址: https://code.visualstudio.com/ 下载完后, 并默认安装好, 你就可以进入配置git的环境变量了, 点击win, 点击设置 在搜索框里搜索, 高级系统设置 点到 高级 , 然后点击…

C语言每日一练(11、判断素数)

探索 C 语言中的素数判断 在 C 语言的编程世界里&#xff0c;判断一个数是否为素数是一个常见而有趣的任务。 素数&#xff0c;那些只能被 1 和自身整除的正整数&#xff0c;有着独特的魅力。让我们一起来看看如何用 C 语言来实现素数的判断吧。 首先&#xff0c;我们需要一…

【算法】基础算法004之前缀和

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 前言 本篇文章为大家带来前缀和…

QGraphicsItem的prepareGeometryChange 和 update方法区别

prepareGeometryChange 这个函数用于为图形的几何形状变化做准备。在改变一个项目的边界矩形之前调用此函数&#xff0c;以保持 QGraphicsScene 的索引是最新的。如果必要的话&#xff0c;prepareGeometryChange() 会调用 update()。QGraphicsScene认为所有图元的boundingRect…