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

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://xiahunao.cn/news/3019310.html

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

相关文章

winscp断点续传

背景 超大文件上传&#xff0c; scp可能因为网络或其他原因中断&#xff0c;并且已上传完的文件无法同步。如何断点续传呢&#xff1f;使用winscp软件 winscp安装 百度搜索&#xff0c;自行安装 开启断点续传功能 https://jingyan.baidu.com/article/fdffd1f8395529b2e98ca…

什么可以替代iframe?

网页嵌套中&#xff0c;iframe曾几何时不可一世&#xff0c;没有其他更好的选择&#xff01; iframe即内联框架&#xff0c;作为网页设计中的一种技术&#xff0c;允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利&#xff0c;但也存在多方面的缺陷…

Linux中文乱码

背景介绍 通过unzip命令解压后中文命名的文件显示乱码 中文名称文件显示乱码 原因 这是因为Linux没有设置对中文的支持 解决办法 编辑~/.bashrc添加export LC_ALLC.UTF-8 使更改的配置生效 source ~/.bashrc查看系统字体编码格式 locale查看中文名称的文件显示是否正常…

【已解决】‘pip‘ 不是内部或外部命令问题

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

RabbitMQ - 以 MQ 为例,手写一个 RPC 框架 demo

目录 前言 一、再谈自定义应用层协议 二、再谈 BrokerServer 三、再谈 Connection、Channel 四、Demo a&#xff09;启动服务器 b&#xff09;客户端连接 前言 本篇文章来自于笔者之前写过的一个系列 —— “根据源码&#xff0c;模拟实现 RabbitMQ” 系列&#xff0c…

C语言 | Leetcode C语言题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; void swap(int *a, int *b) {int t *a;*a *b, *b t; }void sortColors(int *nums, int numsSize) {int p0 0, p2 numsSize - 1;for (int i 0; i < p2; i) {while (i < p2 && nums[i] 2) {swap(&nums[i], &num…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限&#xff0c;您可以使用SHOW GRANTS语句。这将列出用户的权限&#xff0c;包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令&#xff1a; SHOW GRANTS; 如果您想查看特定用户的权限&#xff0c;可以使用以下命令&…

【每日力扣】543. 二叉树的直径与101. 对称二叉树

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 543. 二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的…

nginx--系统参数优化telenct

系统参数 在生产环境中&#xff0c;根据自己的需求在/etc/sysctl.conf来更改内核参数 net.ipv4.ip_nonlocal_bind 1 允许非本地IP地址socket监听 net.ipv4.ip_forward 1 开启IPv4转发 net.ipv4.tcp_timestamps 0 是否开启数据包时间戳 net.ipv4.tcp_tw_reuse 0 端⼝口复⽤…

idea2023专业版安装破解+maven配置教程

前言 上一篇文章已经介绍了maven在Win10系统的安装配置教程。基于Win10的maven配置环境&#xff0c;本篇文章将介绍idea2023的安装破解教程及maven在idea2023的配置教程&#xff08;同时会将maven在idea2023的配置教程内容补充至上一篇文章&#xff09;。 一、idea2023下载安…

Java零拷贝技术实战

文章目录 引入传统IO内存映射mmap文件描述符sendFile测试总结 引入 为什么要使用零拷贝技术&#xff1f; 传统写入数据需要4次拷贝&#xff0c;如下图&#xff1a; 传统IO import java.io.*; import java.net.Socket;public class TranditionIOClient {private static fina…

sh包装脚本

两个脚本,运行的时间间隔分别是一分钟和五分钟,放入到sh文件中,挂在后代,脚本里面的路径最好是绝对路径。 新建sh文件 新建 run_test.sh 文件,使其可以运行两个不同的 Python 脚本,一个每分钟运行一次,另一个每五分钟运行一次。下面是修改后的 run_test.sh 文件的示例:…

机器学习:人工智能中实现自动化决策与精细优化的核心驱动力

&#x1f512;文章目录: &#x1f4a5;1.概述 ❤️2.机器学习基本原理 &#x1f6e4;️2.1定义与关键概念 &#x1f6e3;️2.2 机器学习算法 ☔3.自动化决策中的机器学习应用 &#x1f6b2;4.精细优化与机器学习的结合 &#x1f44a;5.挑战与前景 &#x1f4a5;1.概述 …

【WEB前端2024】简单几步制作web3d《萌宠星球》智体节点模板(2)

【WEB前端2024】简单几步制作web3d《萌宠星球》智体节点模板&#xff08;2&#xff09; 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体…

21 使用Hadoop Java API读取序列化文件

在上一个实验中我们筛选了竞赛网站日志数据中2021/1和2021/2的数据以序列化的形式写到了hdfs上。 接下来我们使用Java API 读取序列化的数据保存到磁盘中。 其他命令操作请参考&#xff1a;16 Java API操作HDFS-CSDN博客 1.我直接在上一个项目中test/java目录下创建com.maidu.s…

鸿蒙 Next 模拟器 体验

参加华为社区相关Next 的活动&#xff0c;只要申请通过就可以下载模拟器。整个过程稍微慢些&#xff0c;大家可以根据活动相关信息&#xff0c;加入微信群。跟踪催促进度。争取早日体验 next 。 目前模拟器里边还是空空的&#xff0c;没有什么内置 APP &#xff0c;但是足够大…

net7部署经历

1、linux安装dotnet命令&#xff1a; sudo yum install dotnet-sdk-7.0 或者直接在商店里安装 2、配置反向代理 127.0.0.1:5000》localhost 访问后报错 原因&#xff1a;数据表驼峰名&#xff0c; 在windows的数据表不区分大小写&#xff0c;但是在linux里面是默认区分的&…

【xxl-job | 第三篇】SpringBoot整合xxl-job

文章目录 3.SpringBoot整合xxl-job3.1定时任务服务配置3.1.1导入maven依赖3.1.2yml配置3.1.3XxlJobConfig配置类3.1.4定时任务类 3.2xxl-job配置3.2.1新增执行器3.2.2新增任务3.2.3执行任务3.2.4查看日志3.2.5查看任务后台日志 3.3小结 3.SpringBoot整合xxl-job 3.1定时任务服…

第一个C++项目

文章目录 一、新建项目1.打开软件&#xff0c;选择“创建新项目”2.新建项目栏中&#xff0c;按自己的需求来设置项目模板&#xff0c;项目名称和文件存放位置&#xff0c;设置好后点击“确认”3. 点击“Next”4. 按照自己需求设置&#xff0c;设置完后&#xff0c;点击“Next”…

【数据治理】指标体系

文章目录 1. 如何进行体系化建模2. 高层模型设计3. 派生指标3.1 派生指标体系的架构、概念一种可行的指标构造方式&#xff1a;举例&#xff1a; 3.2 派生指标体系的规范细则 1. 如何进行体系化建模 体系化建模流程图&#xff1a; 指标相关设计流程&#xff1a; 首先&#x…