大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤

  我们知道 LCD 屏的接口有很多:DPI-RGB、MIPI DSI、DBI/MCU(I8080)、LVDS、SPI 等等,接口不同,对应的软件驱动也不同。RT1170 片内外设对以上接口都能很好地支持,今天我们主要聊最近比较火的 MIPI DSI 接口。

  在恩智浦官方 SDK (v2.14) 里目前支持的 MIPI DSI 接口的 LCD 屏主要有如下四款,但客户在实际应用中选择的屏五花八门(生产 MIPI DSI 接口的 LCD 厂商非常多),如果我们拿到一款全新 LCD 屏,该如何快速点亮它呢?今天痞子衡教你方法:

LCD屏型号 LCD分辨率 LCD驱动IC
晶鸿电子 RK055AHD091 720x1280 瑞鼎科技 RM68200
晶鸿电子 RK055MHD091 720x1280 奇景光电 HX8394-F
晶鸿电子 RK055IQH091 540x960 瑞鼎科技 RM68191
定制屏 G1120B0MIPI 390x390 瑞鼎科技 RM67162

一、点屏准备工作

  磨刀不误砍柴工,在开始点屏之前我们需要准备如下材料,这在后续修改和调试 LCD 屏相关代码时非常重要。其中 LCD 屏数据手册一般需要向屏厂获取,有了屏数据手册我们就能知道其相应驱动 IC,从而下载这个驱动 IC 的数据手册。

1. LCD 屏配套的数据手册
2. LCD 屏内置驱动 IC 的数据手册
3. RT1170 板卡连接 LCD 屏的原理图
4. 恩智浦 SDK_2_14_0_MIMXRT1170-EVKB
5. 能够访问 github

  痞子衡就以深圳柯达科电子生产的 KD050FWFIA019-C019A 屏为例,这款 MIPI DSI 屏分辨率是 480x854,其驱动 IC 是来自奕力科技的 ILI9806E。

二、点屏标准步骤

2.1 熟悉SDK标准例程

  恩智浦 SDK 里的 elcdif_rgb 例程是一个很好的基础工程,我们可以基于这个工程来修改代码做调试。工程里我们主要关注 elcdif_support.c/h 文件,在这个文件里,恩智浦已经把不同屏之间的差异做了抽离处理,你搜索 MIPI_PANEL_ 宏就能找到那些差异,这些差异的地方就是我们需要改动的地方。

\SDK_2_14_0_MIMXRT1170-EVKB\boards\evkbmimxrt1170\driver_examples\elcdif\rgb\cm7\iar

  这个 elcdif_rgb 例程里没有看到 G1120B0MIPI 身影,因为小分辨率的圆屏不太适合这个 example,其驱动可在 RT595_SDK\boards\evkmimxrt595\vglite_examples 里找到。

2.2 调整屏控制I/O脚(Power_en、Reset、Backlight)

  先来关注硬件上需要注意的改动,RT1170 上 MIPI DSI 这个外设不同于其它外设有很多 pinmux 选项,其就一组固定的引脚(并且是专用的),所以这组引脚我们不需要做任何代码上的配置。

  但是 LCD 屏除了 MIPI DSI 相关信号以及电源、地之外,通常还有三个控制信号,即 Power_en(电源使能-可选)、Reset(硬复位)、Backlight(背光控制),这三个信号一般是通过普通 GPIO 来控制的。

  所以我们需要打开板卡原理图,找到 LCD 相关连接把这三个信号所用的 GPIO 找出来,并在代码里如下地方做相应改动:

  elcdif_rgb 例程会在共享函数 BOARD_InitLcdPanel() 里操作 BOARD_MIPI_PANEL_BL 宏所指向的 GPIO 来打开背光。此外 BOARD_MIPI_PANEL_RST 和 BOARD_MIPI_PANEL_POWER 宏所指向的 GPIO 操作已经被封装在如下函数里,这个函数被进一步封装进 display_handle_t 里供后续驱动灵活使用:

static void PANEL_PullResetPin(bool pullUp);
static void PANEL_PullPowerPin(bool pullUp);

2.3 创建LCD驱动IC源文件

  现在我们需要在如下目录下,创建 ILI9806E 的驱动文件,可以先直接拷贝 hx8394 文件夹下的文件并将其改名后添加进工程,并且在 elcdif_support.c/h 里也复制添加相应代码保证编译通过(后续再参考 ILI9806E 数据手册修改代码)。

\SDK_2_14_0_MIMXRT1170-EVKB\components\video\display

2.4 调整屏上电复位延时(Power_en、Reset)

  有了 fsl_ili9806e.c/h 基本源文件后,现在我们需要根据 ILI9806E 数据手册来修改代码。首先是调整屏上电以及复位延时时间,这个延时一般既可以在 KD050FWFIA019-C019A 屏的数据手册也可以在 ILI9806E 的数据手册里找到。

  有了延时数值之后,在 ILI9806E_Init() 函数里做相应设置即可:

status_t ILI9806E_Init(display_handle_t *handle, const display_config_t *config)
{
const ili9806e_resource_t *resource = (const ili9806e_resource_t *)(handle->resource);
/* Only support 480 * 854 */
if (config->resolution != FSL_VIDEO_RESOLUTION(480, 854))
{
return kStatus_InvalidArgument;
}
/* Power on. */
resource->pullPowerPin(true);
ILI9806E_DelayMs(1U);
/* 根据屏数据手册调整复位延时时间. */
resource->pullResetPin(true);
ILI9806E_DelayMs(10U);
resource->pullResetPin(false);
ILI9806E_DelayMs(10U);
resource->pullResetPin(true);
ILI9806E_DelayMs(120U); /* 代码省略 */
}

2.5 调整屏显示相关参数

  现在我们需要在 elcdif_support.h 里根据 KD050FWFIA019-C019A 屏的数据手册修改如下定义包含:屏分辨率、六个行列扫描参数、四个信号极性(APP_POL_FLAGS)、数据位宽,这些都是屏本身的特性。

#if (USE_MIPI_PANEL == MIPI_PANEL_KD050FWFIA019)
#define APP_PANEL_HEIGHT 854
#define APP_PANEL_WIDTH 480
#define APP_HSW 4
#define APP_HFP 18
#define APP_HBP 30
#define APP_VSW 4
#define APP_VFP 20
#define APP_VBP 30
#endif
#define APP_POL_FLAGS \
(kELCDIF_DataEnableActiveHigh | kELCDIF_VsyncActiveLow | kELCDIF_HsyncActiveLow | kELCDIF_DriveDataOnFallingClkEdge) #define APP_DATA_BUS 24
#define APP_LCDIF_DATA_BUS kELCDIF_DataBus24Bit

  关于六个行列扫描参数(HSW/HFP/HBP/VSW/VFP/VBP)稍稍科普一下,这些信号是以行列同步信号(VSYNC/HSYNC)为时间起点来做的延时,相当于在实际显示的图像宽高基础上做了外围扩大,从而提高图像有效区域显示的可靠性(实际上是等待面板做好每行数据刷新前的准备工作)。

  分辨率和行列扫描参数均设置正确了之后,别忘了根据想要的刷新率(比如 60Hz)计算得出所需的 pixel clock,在 BOARD_InitLcdifClock() 函数里做相应设置。

void BOARD_InitLcdifClock(void)
{
/*
* The pixel clock is (height + VSW + VFP + VBP) * (width + HSW + HFP + HBP) * frame rate.
* Use PLL_528 as clock source.
* For 60Hz frame rate, the KD050FWFIA019 pixel clock should be 29MHz.
*/
const clock_root_config_t lcdifClockConfig = {
.clockOff = false,
.mux = 4, /*!< PLL_528. */
#if (USE_MIPI_PANEL == MIPI_PANEL_RK055AHD091) || (USE_MIPI_PANEL == MIPI_PANEL_RK055MHD091)
.div = 9,
#elif (USE_MIPI_PANEL == MIPI_PANEL_RK055IQH091)
.div = 15,
#elif (USE_MIPI_PANEL == MIPI_PANEL_KD050FWFIA019)
// 我们需要设置 29MHz 的 pixel clock
.div = 18,
#endif
};
CLOCK_SetRootClock(kCLOCK_Root_Lcdif, &lcdifClockConfig);
mipiDsiDpiClkFreq_Hz = CLOCK_GetRootClockFreq(kCLOCK_Root_Lcdif);
}

2.6 配置LCD驱动芯片

  现在到了最难也是最重要的环节了,KD050FWFIA019-C019A 面板主要是由 ILI9806E 芯片驱动的,ILI9806E 本身是个万能驱动芯片,其支持的接口很多,MIPI DSI 仅是其一,而且 2.5 节里设置的那些关于屏显示相关参数,我们都需要设置进 ILI9806E 内部寄存器里。

  打开 ILI9806E 数据手册(V097版),一共 328 页,寄存器一大堆,我们难道要看着数据手册一个个去设置吗?当然不是!这时候需要打开万能的 github,搜索跟 ili9806e 相关的代码,看看前人有没有调试好的现成代码。

  其实关于屏的支持,Linux 里做得比较多,痞子衡找了个 RaspberryPI 移植的分支,里面有 ili9806e 参数初始化表,注意这个表不一定完全适用 KD050FWFIA019-C019A(因为用 ILI9806E 芯片驱动的面板非常多),我们需要在这个参数表基础之上做一些调整。

https://github.com/raspberrypi/linux/blob/rpi-6.1.y/drivers/gpu/drm/panel/panel-ilitek-ili9806e.c

  把 RaspberryPI 仓库里的参数表移植进我们的 fsl_ili9806e.c 文件里后,粗粗看了一下注释,其配置的是 480x800 的屏,极性设置相关也都和 KD050FWFIA019-C019A 有差异。

  最后我们再对照 ILI9806E 数据手册里的寄存器定义做一些参数上的微调,如下四个寄存器需要重点关注。这些微调做完之后,把代码下载进板卡运行,这时候你应该能看到屏开始正常工作了。

  至此,在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤(MIPI DSI接口)的更多相关文章

  1. 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...

  2. 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...

  3. 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...

  4. 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...

  5. 痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间. 关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候, ...

  6. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功能. ECC是"Error Correcting ...

  7. 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...

  8. 痞子衡嵌入式:大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核互相激活的方法. 痞子衡最近在深耕i.MXRT1170这颗划时代的 ...

  9. 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略. 关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过 ...

  10. 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...

随机推荐

  1. 「joisc2016 - D3T2」回転寿司

    题意大概是这样,「每次操作选出区间中的一个 LIS(strictly),满足其开端是极靠近左端点且大于 \(A\) 的位置,答案即这个 LIS 的末尾,做一个轮换后弹出序列末端」. 首先做几个观察. ...

  2. element-ui实现弹窗

    element-ui实现弹窗 需要的官网组件 要弹出的页面 <template> <el-form :model="ruleForm" :rules=" ...

  3. js递归查询之根据id查询当前对象

    需求:递归查询数组中id对应的数据 Json数据格式: 1 let cityArr = [ 2 { 3 id: 1000, 4 name: '四川省', 5 children: [ 6 { 7 id: ...

  4. strimzi实战之二:部署和消息功能初体验

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<strimzi实战>系列 ...

  5. 【RocketMQ】事务实现原理总结

    RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚 ...

  6. 在macOS上,可以使用以下步骤来清理本地多个版本的Python:

    确认已经安装了Homebrew 如果您还没有安装Homebrew,可以在终端中运行以下命令进行安装: /bin/bash -c "$(curl -fsSL https://raw.githu ...

  7. 这款 7k Star 的国产监控系统,真不错!

    我们都知道天下没有"永不宕机"的系统,但每次线上出问题都要拉出一个程序员"祭天".所以一款靠谱.好用的监控工具就显得十分重要,它可以在生产环境出故障的第一时间发 ...

  8. Java并发编程和多线程的区别

    并发编程: 并发编程是一种编程范式,它关注的是编写能够正确和高效处理多个并发任务的程序.并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程.协程.分布式编程等.并发编程的目标是实 ...

  9. 基于SpringBoot+Netty实现即时通讯(IM)功能

    简单记录一下实现的整体框架,具体细节在实际生产中再细化就可以了. 第一步 引入netty依赖 SpringBoot的其他必要的依赖像Mybatis.Lombok这些都是老生常谈了 就不在这里放了 &l ...

  10. 21.3 Python 使用DPKT分析数据包

    dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作.它可以处理多种协议,例如TCP.UDP.IP等,并提供了一些常用的网络操作功能,例如计算校验和.解析DNS数据包等.由于其简单易 ...