痞子衡嵌入式:在i.MXRT1170上快速点亮一款全新LCD屏的方法与步骤(MIPI DSI接口)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是在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接口)的更多相关文章
- 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...
- 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...
- 痞子衡嵌入式:在i.MXRT1170上启动含DQS的Octal Flash可不严格设Dummy Cycle (以MT35XU512为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Octal或Hyper Flash上DQS信号与Dummy Cycle联系. 关于在 i.MXRT 上启动 NOR Flash 时如何设 ...
- 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...
- 痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间. 关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候, ...
- 痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功能. ECC是"Error Correcting ...
- 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...
- 痞子衡嵌入式:大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核互相激活的方法. 痞子衡最近在深耕i.MXRT1170这颗划时代的 ...
- 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略. 关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过 ...
- 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...
随机推荐
- 「joisc2016 - D3T2」回転寿司
题意大概是这样,「每次操作选出区间中的一个 LIS(strictly),满足其开端是极靠近左端点且大于 \(A\) 的位置,答案即这个 LIS 的末尾,做一个轮换后弹出序列末端」. 首先做几个观察. ...
- element-ui实现弹窗
element-ui实现弹窗 需要的官网组件 要弹出的页面 <template> <el-form :model="ruleForm" :rules=" ...
- js递归查询之根据id查询当前对象
需求:递归查询数组中id对应的数据 Json数据格式: 1 let cityArr = [ 2 { 3 id: 1000, 4 name: '四川省', 5 children: [ 6 { 7 id: ...
- strimzi实战之二:部署和消息功能初体验
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<strimzi实战>系列 ...
- 【RocketMQ】事务实现原理总结
RocketMQ事务的使用场景 单体架构下的事务 在单体系统的开发过程中,假如某个场景下需要对数据库的多张表进行操作,为了保证数据的一致性,一般会使用事务,将所有的操作全部提交或者在出错的时候全部回滚 ...
- 在macOS上,可以使用以下步骤来清理本地多个版本的Python:
确认已经安装了Homebrew 如果您还没有安装Homebrew,可以在终端中运行以下命令进行安装: /bin/bash -c "$(curl -fsSL https://raw.githu ...
- 这款 7k Star 的国产监控系统,真不错!
我们都知道天下没有"永不宕机"的系统,但每次线上出问题都要拉出一个程序员"祭天".所以一款靠谱.好用的监控工具就显得十分重要,它可以在生产环境出故障的第一时间发 ...
- Java并发编程和多线程的区别
并发编程: 并发编程是一种编程范式,它关注的是编写能够正确和高效处理多个并发任务的程序.并发编程不仅包括多线程,还包括了处理多个独立任务的各种技术和模式,如进程.协程.分布式编程等.并发编程的目标是实 ...
- 基于SpringBoot+Netty实现即时通讯(IM)功能
简单记录一下实现的整体框架,具体细节在实际生产中再细化就可以了. 第一步 引入netty依赖 SpringBoot的其他必要的依赖像Mybatis.Lombok这些都是老生常谈了 就不在这里放了 &l ...
- 21.3 Python 使用DPKT分析数据包
dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作.它可以处理多种协议,例如TCP.UDP.IP等,并提供了一些常用的网络操作功能,例如计算校验和.解析DNS数据包等.由于其简单易 ...