2409846_zh-CN

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2409846_zh-CN

2409846_zh-CN

RT1172 LT8918 LCD 并行 LCDIFV2 小层 + 背景欠载

很遗憾,我无法直接将 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将其输出到并行输出时存在一些时序问题。

我该如何调试这个问题?谢谢。

Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

我又尝试了一些方法,现在看来输出确实稳定了,没有出现欠载错误,至少根据我打印的诊断信息来看是这样。我认为最主要的变化是第一个变化,其他变化实际上更难一些,但为了清楚起见,我还是列出来吧。这个设置仍然是 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 的速度应该非常快,我很惊讶速度降低这么多竟然会产生这样的效果。

Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

正确的。非常感谢!我们来尝试更多的事情。这是另一条日志。

我还是想坚持使用RGB888。ARGB8888 有什么理由更适合这个用途吗?我或许会找时间试试 alpha 版本。

CTRLDESCL5: 0xD8000260

我查阅了参考手册,BPP 设置位于第 27-24 位,所以“8”表示我已成功将其设置为 RGB888,至少看起来是这样。最后几个字节似乎无关紧要,alpha 设置似乎也无害地关闭了。

屏幕输出看起来不一样,但并不固定。或许有所改进?虽然仍有环绕效果,但没那么夸张了。

我还尝试过提高像素时钟的速度,但不确定这样做是好是坏。

我可以尝试更改更多视频设置吗?我原以为我设置的 25% Hsync 参数已经非常高了,但话说回来,我以前从未这样做过。什么样的场景才算特别好?垂直同步也相关吗?还有一个 LT8918 桥接器也需要获取这些设置输入,不过我也可以处理它。我只能靠猜来填入正确的数字吗?

驱动程序是 JD9365DA-H3,希望这能有所帮助。这是一个带有触摸屏的奇怪设备,但我对此没有任何意见。

Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

@davidpspeedtech

谢谢你的更新!但是,问题在于您的某些设置不一致。

  • 0xD9000260 → 硬件锁定的格式为 ARGB8888(32 位/像素)。
  • 因此,当您设置步长 = 384 (=128×3, RGB888) 时,硬件仍然会读取 128×4 = 512 字节/行 → 每行未对齐,读取超出缓冲区,并发生下溢。

你每次都只更改了步长或 BPP 宏,但硬件实际上遵循 .pixelFormat,它仍然是 ARGB8888——这四个值从来都不一致。

请一次性将它们全部统一设置为 32 位 ARGB8888 或 RGB888:

 
#define SMALL_LAYER_0_BPP 4U
#define SMALL_LAYER_0_STRIDE (SMALL_LAYER_0_WIDTH * 4) /* = 512 */
uint8_t smallLayer0_Buffer0[256][512];
.pixelFormat = kLCDIFV2_PixelFormatARGB8888,
.strideBytes = SMALL_LAYER_0_STRIDE, /* 512,而不是 3200 */
 

CTRLDESCL3 现在应该读取 0x200 (512)。32 位帧缓冲区和 24 针 RGB888 输出是独立的——24 针连接不需要 3 字节缓冲区。

此外,这三行代码使用了 eLCDIF 位定义;LCDIFv2 没有 RUN 位,这可能会干扰控制状态:

 
LCDIFV2->CTRL &= ~LCDIF_CTRL_SFTRST_MASK;
LCDIFV2->CTRL &= ~LCDIF_CTRL_CLKGATE_MASK;
LCDIFV2->CTRL |= LCDIF_CTRL_RUN_MASK;
 
Gavin_Jia_0-1788249587860.pngGavin_Jia_0-1788249587860.pngGavin_Jia_0-1788249587860.pngGavin_Jia_0-1788249587860.pngGavin_Jia_0-1788249587860.png

请仅使用标准 API 进行驱动。

为了证实你提出的其他几点:

  • 步长是基于 RAM 缓冲区宽度,而不是屏幕宽度——正确。
  • 背景颜色稳定,因为它是由寄存器生成的(无需内存读取);这证明输出路径正常,并将故障隔离到层读取路径。
  • 颜色缓冲区在原色/辅助色之间闪烁(“就像丢失了一个字节”),这恰恰是欠载丢字节造成的;一旦格式一致,这种情况应该就会消失。
  • 带宽不是瓶颈(OCRAM,128 宽)。如果在此之后仍然存在欠载现象,请降低像素时钟频率或增加 HBP/HFP 以确认。
Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

但这并不能解决问题。实际上,无论是 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)或二次色之间闪烁,就像丢失了一个字节一样。

Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

@davidpspeedtech

感谢您对 NXP MIMXRT 系列产品的关注!

我已查看您提供的附件,其中一些设置可能需要调整。

CTRLDESCL3: 0x00000C80(音高/步幅 = 3200 字节)

#define SMALL_LAYER_0_BPP 3U /* RGB888 */
#define SMALL_LAYER_0_STRIDE (128 * 3) /* = 384 字节 */
uint8_t smallLayer0_Buffer0[256][384];

-->您编程到 CTRLDESCL3 中的 PITCH 值(3200 字节)与您的实际缓冲区布局不匹配。您的缓冲区在 RGB888 模式下为 128 x 256,因此每行只有 128 x 3 = 384 字节。
 
当 PITCH = 3200 时,LCDIFv2 每行推进 3200 字节而不是 384 字节,因此每行结束后都会远远超出有效数据。仅仅这一个不匹配就足以产生你看到的两种症状:每行错误的起始地址导致图像失真/倾斜,而每行获取大约 8 倍的(无效的)数据会使输出 FIFO 容量不足,从而引发下溢错误。
 
请使层描述符与缓冲区保持一致:
  1. CTRLDESCL3 (引脚间距) = 384 (0x180),即SMALL_LAYER_0_STRIDE = 128 * 3。
  2. 缓冲区基地址 64 字节对齐;保持不可缓存(您当前的设置是正确的),或者在显示之前清除 数据缓存。

此致,
加文

Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

@davidpspeedtech

描述符现在是自洽的: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 倍,因此停止了——但这低于面板的最低要求。

为了快速运行而不至于半倒,以下方法可能有所帮助:

  1. 切换到 ARGB8888 端到端:.pixelFormat=ARGB8888,BPP=4,步长=256×4=1024,缓冲区大小为 4 字节/像素,并确保像素写入代码写入 32 位字。两个原因:(a)它与您现有的 32 位内容匹配 → 修复绿色;(b)RM 指出打包的 RGB888 在总线上发出长度为 15 的突发信号(效率较低,更容易出现欠载),而 ARGB8888 是 32 位对齐的,具有干净的长度为 16 的突发信号。使用绿色转储进行验证:应该是一个干净的重复,而不是逐行漂移。
  2. 提高 LCDIFv2 b_clk(时钟根),将像素时钟恢复到 ≥22 Hz——这是提高速度的正确方法,而不是降低时钟频率。LCDIFv2 不使用 eDMA,因此“提高 DMA 优先级”不适用;可用的控制手段有 b_clk、突发长度、未完成的请求和 THRES 动态优先级阈值。
  3. 从 JD9365DA-H3 面板数据手册中获取时序——不要猜测——并将 LT8918 输入时序与之匹配。~200 水平消隐是可以接受的;更大的消隐可以缓解欠载,但会增加 htotal(需要更高的像素时钟),所以这是一个权衡——根本的解决方法是更高的 b_clk。垂直同步/垂直门廊必须与面板匹配,但对每行欠载影响很小。

此致,
加文

Re: RT1172 LT8918 LCD parallel LCDIFV2 small layer + background underrun

我是 NXP 的新手,所以一开始就应该正确设置,但实际上解决这个问题的简单方法是将 BUS_CLK_ROOT 增加到 200MHz,而不是默认的 24MHz。我完全忽略了这些默认设置。

之后不仅小窗口显示正常,整个屏幕也恢复正常,而且显示频率也达到了 60Hz(像素时钟频率约为 80MHz)。SDRAM 的设置当然更复杂,但 OCRAM 和 SDRAM 都受到总线时钟的限制,这很合理。

我还调整了其他一些时钟,或许这些调整是必要的。查看 EVK 示例以及时钟外设工具,也会发现他们为这些项目更改了这些内容。查看“clock_config.c”时很难注意到这一点。

总之,非常感谢!

タグ(1)
評価なし
バージョン履歴
最終更新日:
昨日
更新者: