很遗憾,我无法直接将 mipi 输出连接到这个 LCD,所以添加了 LT8918,但似乎没有出现任何问题。测试图案可以顺利传输到该设备上,我的调试日志也显示它已同步并通过了基本设置。
但是我的输出结果有问题。我目前的代码是为一个非常简单的小型内存缓冲区(128x256)设计的,位于 800x1280 屏幕的中间。无需查看实际输出屏幕,但画面看起来非常失真。另外,在打印的诊断信息中,我遇到了很多欠载错误,就好像 DMA 获取数据的速度不够快,无法完成整行写入一样。
所以,我对液晶显示器或恩智浦寄存器并不精通。我是不是在某个地方犯了什么低级错误?存在诸多不确定因素。SRAM_OC1 真的速度很慢吗?或许可以通过调整 AXI 或 DMA 设置来获得正确的时序?我在 MPU 代码中将其重新配置为非缓存模式,但这可能也是一个错误。很遗憾,我看不出默认区域和 ncache 区域之间有什么区别。还有很多其他事情需要考虑,比如我尝试将步长更改为整个 800 像素行,而不是较小的 128 图层 0 大小。RGB 像素时钟比 MIPI 字节时钟慢,但我预计 MIPI 无论如何都会快得多,因为它只有 2 条线,而 RGB 有 24 个并行连接。
另外,我之所以只创建这么小的第 0 层区域,是因为 同步动态随机存取存储器(SDRAM) 可能会出现错误。为了摆脱这种不确定性,我把它简化成一个更小的、可控的部分,但即使在这里,我似乎也找不到到底哪里出了问题。
能走到这一步固然令人欣慰,但同时也让人很沮丧,因为我不知道该如何才能取得更大的进步。背景单色显示一切正常,测试图案也能显示形状良好的条形区域,所以我认为这不是真正的“LCD”问题,而是RAM缓冲区读取或LCDIFv2将其输出到并行输出时存在一些时序问题。
我该如何调试这个问题?谢谢。
我又尝试了一些方法,现在看来输出确实稳定了,没有出现欠载错误,至少根据我打印的诊断信息来看是这样。我认为最主要的变化是第一个变化,其他变化实际上更难一些,但为了清楚起见,我还是列出来吧。这个设置仍然是 RGB888,我还没想改成 alpha 层绘制来尝试,因为它还不是很好。
1. 将像素时钟频率降低很多,刷新率降至接近 15Hz。DMA或许有额外的工作时间?但正如你所说,OCRAM 的速度应该很快。我在 MPU 配置中也将其设置为该空间中的 NCACHE 区域。
2. 使用的颜色只有黑色和白色。尝试使用绿色背景实际上会引入一些背景问题,绿色可能会偏移到 RGB 图案中,导致每一行都发生变化(偏移 1 个字节?)。
3. 将 RAM 层 0 的宽度更改为 256,以匹配高度 256。实际上,高度为 128 也完全可以,只是这个特定的日志高度为 256,你可以看到步幅也变成了 768。
4. 前廊和后廊的视频设置要大得多。我怀疑这不是主要因素,我也尝试过用更快的速度运行这些设置,但效果并不理想。数据表允许 Hfp + Hbp + Hs 的最大值任意大,有什么理由让总和超过 200 吗?垂直设置总共限制为 250 个。
总之,这很有趣!从技术角度来说,LCD 数据手册上说它应该至少以 22Hz 的频率运行,但我没有看到白色部分出现闪烁。我希望它跑得更快。
我完全没有关注RT1172上的DMA,有什么办法可以加快它的运行速度或者提高它的优先级之类的吗?LCDIFv2还有其他相关设置吗?尤其是考虑到 OCRAM 的速度应该非常快,我很惊讶速度降低这么多竟然会产生这样的效果。
正确的。非常感谢!我们来尝试更多的事情。这是另一条日志。
我还是想坚持使用RGB888。ARGB8888 有什么理由更适合这个用途吗?我或许会找时间试试 alpha 版本。
CTRLDESCL5: 0xD8000260
我查阅了参考手册,BPP 设置位于第 27-24 位,所以“8”表示我已成功将其设置为 RGB888,至少看起来是这样。最后几个字节似乎无关紧要,alpha 设置似乎也无害地关闭了。
屏幕输出看起来不一样,但并不固定。或许有所改进?虽然仍有环绕效果,但没那么夸张了。
我还尝试过提高像素时钟的速度,但不确定这样做是好是坏。
我可以尝试更改更多视频设置吗?我原以为我设置的 25% Hsync 参数已经非常高了,但话说回来,我以前从未这样做过。什么样的场景才算特别好?垂直同步也相关吗?还有一个 LT8918 桥接器也需要获取这些设置输入,不过我也可以处理它。我只能靠猜来填入正确的数字吗?
驱动程序是 JD9365DA-H3,希望这能有所帮助。这是一个带有触摸屏的奇怪设备,但我对此没有任何意见。
谢谢你的更新!但是,问题在于您的某些设置不一致。
你每次都只更改了步长或 BPP 宏,但硬件实际上遵循 .pixelFormat,它仍然是 ARGB8888——这四个值从来都不一致。
请一次性将它们全部统一设置为 32 位 ARGB8888 或 RGB888:
CTRLDESCL3 现在应该读取 0x200 (512)。32 位帧缓冲区和 24 针 RGB888 输出是独立的——24 针连接不需要 3 字节缓冲区。
此外,这三行代码使用了 eLCDIF 位定义;LCDIFv2 没有 RUN 位,这可能会干扰控制状态:
请仅使用标准 API 进行驱动。
为了证实你提出的其他几点:
但这并不能解决问题。实际上,无论是 RGB888 的步长为 128*3,还是 ARGB8888 的步长为 800*4 并尝试将整个屏幕放入 RAM 中,输出看起来都非常相似,屏幕边缘都会出现失真,而且我仍然会遇到欠载错误。我尝试了很多设置,不仅仅是那些文件中的文本!
#define SMALL_LAYER_0_HEIGHT 256U
#define SMALL_LAYER_0_WIDTH 128U
#define SMALL_LAYER_0_BPP 3U /* RGB888 */
#define SMALL_LAYER_0_STRIDE (SMALL_LAYER_0_WIDTH*SMALL_LAYER_0_BPP) /*384*/
~调试打印~ CTRLDESCL3: 0x 180 (引脚间距/步长 = 384 字节)
这样做也不行。
但我很高兴你能确认我的第 0 层步长设置应该基于 RAM 缓冲区宽度,而不是基于 LCD 屏幕宽度。正确的?
由于 LT8918 的接口是 24 针并联连接,所以它实际上应该是 RGB888。我有时担心 DMA 或其他什么功能跟不上,但由于缓冲区大小太小,SRAM_OC1 已经用完了。或许 RGB565 也能有类似的输出,因为其 RGB 引脚可以正确输出最高有效位。我甚至可能会尝试单色系的作品。
我可能犯了更多错误,如示例代码所示,RGB888 的 BPP 设置为 4 而不是 3。
是否必须将“背景区域”放在不同的层中,并缓冲到其他内存中?我喜欢它的背景设置似乎工作正常,无论我将其设置为哪种纯色,输出颜色都能保持稳定。对非白色 RAM 缓冲区进行一些实验,可以让屏幕在原色(RGB)或二次色之间闪烁,就像丢失了一个字节一样。
感谢您对 NXP MIMXRT 系列产品的关注!
我已查看您提供的附件,其中一些设置可能需要调整。
CTRLDESCL3: 0x00000C80(音高/步幅 = 3200 字节)
此致,
加文
描述符现在是自洽的:CTRLDESCL5=0xD8000260(BPP=8=RGB888),CTRLDESCL3=0x300=768=256×3。你没看错。
但根本的不匹配仍然存在;只是被低时钟频率掩盖了。颜色“每行都改变,就像丢失了一个字节”就是证据:你的内存转储全是 0xFFFFFFFF,而 Center Pixel 将一个像素读取为一个 32 位字——也就是说,内容仍然是 32 位/像素,而硬件获取了 3 个字节。白色在每个字节中都是 0xFF,因此会被隐藏;绿色会逐行漂移。
降低像素时钟“消除”欠载,但这并不是因为 OCRAM 速度慢(OCRAM 速度很快,片上内存不是瓶颈)。欠载取决于 LCDIFv2 作为 AXI 主设备的读取吞吐量。你将刷新率降低到 ~13.5 Hz (18.85 MHz ÷ (1000×1400)),使读取需求减少了 3-4 倍,因此停止了——但这低于面板的最低要求。
为了快速运行而不至于半倒,以下方法可能有所帮助:
.pixelFormat=ARGB8888,BPP=4,步长=256×4=1024,缓冲区大小为 4 字节/像素,并确保像素写入代码写入 32 位字。两个原因:(a)它与您现有的 32 位内容匹配 → 修复绿色;(b)RM 指出打包的 RGB888 在总线上发出长度为 15 的突发信号(效率较低,更容易出现欠载),而 ARGB8888 是 32 位对齐的,具有干净的长度为 16 的突发信号。使用绿色转储进行验证:应该是一个干净的重复,而不是逐行漂移。此致,
加文
我是 NXP 的新手,所以一开始就应该正确设置,但实际上解决这个问题的简单方法是将 BUS_CLK_ROOT 增加到 200MHz,而不是默认的 24MHz。我完全忽略了这些默认设置。
之后不仅小窗口显示正常,整个屏幕也恢复正常,而且显示频率也达到了 60Hz(像素时钟频率约为 80MHz)。SDRAM 的设置当然更复杂,但 OCRAM 和 SDRAM 都受到总线时钟的限制,这很合理。
我还调整了其他一些时钟,或许这些调整是必要的。查看 EVK 示例以及时钟外设工具,也会发现他们为这些项目更改了这些内容。查看“clock_config.c”时很难注意到这一点。
总之,非常感谢!