This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] SN65DSI83:连接时出现问题

Guru**** 2670045 points

Other Parts Discussed in Thread: SN65DSI83

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1576263/sn65dsi83-issues-connecting-the

器件型号: SN65DSI83

工具/软件:

你(们)好

我在让内核模块正确初始化 MIPI_DSI_LVDS_BRIDGE 时遇到一些问题。 我已经在器件树源 (DTS) 文件中定义了显示时序、并确保在构建内核时编译 ti_ns65dsi83 内核模块、之后可以加载该模块。 但是、在启动期间或之后加载内核模块时、屏幕上都不会显示任何内容。 我怀疑该问题与 SN65DSI83 芯片的初始化有关。 除了与显示和 DSI 通道数量相关的时序外、似乎大多数配置都由内核模块处理、例如启用 PLL。

研究内核模块时、有一个名为“sn65dsi83_atomic_pre_enable"的“的函数、该函数负责启用 PLL。 但何时以及如何调用这个函数呢? 如何确认函数被调用?

我使用的嵌入式处理器是 NXP iMX7ULP、Linux 版本是 Scarthgap 6.6.52。 唯一可以指向的方向,为什么没有显示在显示屏上的线索是内核消息在引导期间. 下面是与 mipi-DSI 相关的内核消息副本。

有什么想法、为什么屏幕上没有显示任何内容?

/Henrik

root@imx7ulpevk:/# dmesg | grep -i -E "mipi|sn65|lcdif|video|drm|panel"
[    0.085332] platform 40a90000.mipi_dsi: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c
[    0.134710] platform 40a90000.mipi_dsi: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c
[    0.135162] i2c 2-002c: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c/panel@0/ports/port@0
[    0.135253] i2c 2-002c: Fixed dependency cycle(s) with /bus@40800000/mipi_dsi@40a90000
[    0.142246] videodev: Linux video capture interface: v2.00
[    0.146419] MIPI CSI2 driver module loaded
[    0.564469] mipi_dsi_northwest 40a90000.mipi_dsi: i.MX MIPI DSI driver probed
[    2.187945] [drm] Initialized vivante 1.0.0 20170808 for 41800000.gpu on minor 0
[    7.157978] systemd[1]: Starting Load Kernel Module drm...
[   14.327604] systemd[1]: modprobe@drm.service: Deactivated successfully.
[   14.514570] systemd[1]: Finished Load Kernel Module drm.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henrik、

    我不太熟悉此功能在该模块下执行的内核模块和特定指令、但我确实怀疑 SN65DSI83 器件中缺少配置设置。  

    • 您能详细介绍一下这个内核模块、以及它是如何实现和调用的吗?

    在 Ikram 的论坛上、这里指出了两种资源:

    以下是有关此组件的介绍视频: https://www.ti.com/video/5829448496001

    您也可以从以下指南中找到有关编程的更多信息: https://www.ti.com/lit/an/slla332b/slla332b.pdf

    我注意到、在编程指南中、它能够生成一个包含寄存器编程的平面日志、您可以在此处看到:  

    您是否引用了需要为此应用程序编程的必要 CSR 寄存器、并引用了该启动应用程序以确定它们是否正确配置? 我们的数据表中还有一个初始化脚本示例:

    如果您有关于器件如何连接的任何其他详细信息、是否有通过分立式 I2C 事务提供的配置?

    此致、

    Miguel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Miguel

    感谢您的答复。

    当 Linux 正在引导时、我看到错误“i2c 2-002c:延迟探头挂起“、同时我无法检测到 I2C 总线上的任何通信。 我可以使用 modinfo 检索有关内核模块的信息、modinfo 指示该模块在引导过程中按预期装入。 但是、由于 I2C 总线上没有活动并且出现消息“Deferred probe pending“、因此似乎存在某种阻止内核模块运行的情况。 我已经确认在 Linux 完全启动后可以与桥接器通信、从而使 I2C 接口本身正常工作。

    编写内核模块 (Marek Vasut) 的同一人也创建了一个名为“ti,sn65dsi83.yaml"的“的支持文件,该文件描述了运行内核模块的要求。 这些属性包括“使能 GPIO “、“兼容“、“寄存器“和“VCC 电源“等。 我遵循了该支持文件中的说明、但仍然不起作用。 对于可能缺失的内容、您有什么建议吗?

    其次、当内核模块处于激活状态并控制电桥配置时、如何验证例如寄存器 0x0D 中的 PLL 是否启用(通过设置位 0)? 内核模块中存在寄存器和位的定义、但如何确认模块实际应用了该配置?

    好极了

    Henrik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henrik、

    感谢您分享有关此问题的详细信息。 请给我 1-2 天时间检查并回复您。

    此致、
    Ikram

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Ikram

    我期待听到您的声音、因为我仍然坚持使用不显示任何图片的显示器。

    我已经处理了设备树源 (DTS)、似乎 u-boot 正在 解析 DTS、因为 u-boot 报告了正确的屏幕分辨率。 此外、内核消息指示配置应正确:

    root@imx7ulpevk:~# dmesg | grep -i -E "mipi|sn65|lcdif|video|drm|panel|2-002c|deferred|i2c"
    [    0.086988] platform 40a90000.mipi_dsi: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c
    [    0.100902] platform panel-lvds: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c
    [    0.137775] platform panel-lvds: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c
    [    0.138077] platform 40a90000.mipi_dsi: Fixed dependency cycle(s) with /bus@40000000/lpi2c4@402b0000/sn65dsi83@2c
    [    0.138436] i2c 2-002c: Fixed dependency cycle(s) with /panel-lvds
    [    0.138657] i2c 2-002c: Fixed dependency cycle(s) with /bus@40800000/mipi_dsi@40a90000
    [    0.139426] i2c i2c-2: LPI2C adapter registered
    [    0.143261] i2c i2c-3: LPI2C adapter registered
    [    0.145179] i2c i2c-1: LPI2C adapter registered
    [    0.145869] videodev: Linux video capture interface: v2.00
    [    0.149966] MIPI CSI2 driver module loaded
    [    0.567590] mipi_dsi_northwest 40a90000.mipi_dsi: i.MX MIPI DSI driver probed
    [    0.571637] mxsfb 40aa0000.lcdif: supply lcd not found, using dummy regulator
    [    0.704630] mipi_dsi_northwest 40a90000.mipi_dsi: MIPI DSI dispdv inited
    [    0.704681] mxsfb 40aa0000.lcdif: registered mxc display driver mipi_dsi_northwest
    [    0.746530] sii902x bound to mxs-lcdif from 40aa0000.lcdif
    [    0.862295] mxsfb 40aa0000.lcdif: initialized
    [    2.091842] i2c_dev: i2c /dev entries driver
    [    2.535788] [drm] Initialized vivante 1.0.0 20170808 for 41800000.gpu on minor 0
    [    7.297291] systemd[1]: Starting Load Kernel Module drm...
    [    8.709721] systemd[1]: modprobe@drm.service: Deactivated successfully.
    [    8.747407] systemd[1]: Finished Load Kernel Module drm.
    [   13.300238] i2c 2-002c: deferred probe pending

    由 Marek Vasut 编程的内核模块不包括内核消息、而是使用“动态调试“。 我尝试从内核模块获取动态调试消息、但到目前为止、我还没有看到来自 sn65dsi83 模块的任何消息。 也许是因为没有什么? 这就解释了为什么不进行 I2C 通信。

    我可以获取内核信息:

    root@imx7ulpevk:~# modinfo ti-sn65dsi83
    name:           ti_sn65dsi83
    filename:       (builtin)
    license:        GPL v2
    file:           drivers/gpu/drm/bridge/ti-sn65dsi83
    description:    TI SN65DSI83 DSI to LVDS bridge driver
    author:         Marek Vasut <marex@denx.de>

    告诉我它已正确内置到内核中。

    我希望你可以帮助得到一个图片显示在屏幕上:-)

    此致、Henrik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henrik、

    这里是否共享同一个驱动程序?  有关 SN65DSI84 的问题
     上面的论坛中链接了唯一的 Linux Shared 示例代码。

    对此器件的编程也可以通过对寄存器进行 I2C 写入来完成。 您可以使用 DSI 调谐器工具生成寄存器设置、从而对器件进行编程、还可以对处理器进行编程、以匹配显示配置。 您认为这是一种更简单的方法吗? 请检查处理器显示时序是否与为 DSI83 编程的驱动器设置相匹配。


    此外、对于当前系统、请检查是否遵循了数据表初始化序列、并读回寄存器 0xE5 以检查发生的任何错误。  

    此致、
    Ikram

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Ikram

    您所指的驱动程序是 在 10 多年前编写的、似乎是为 dsi85 而不是 dsi83 编写的。 虽然驱动程序的某些部分可能能够正常工作、但我更倾向于使用 Marek Vasut 编写的从未使用过的驱动程序、该驱动程序随 Yocto 版本一起提供(请参阅下面的链接)。 此驱动程序可以构建为可在启动期间或启动后加载的内核模块,也可以包含在内核中 — 这是在内核配置中设置的。

    https://github.com/torvalds/linux/blob/master/drivers/gpu/drm/bridge/ti-sn65dsi83.c


    我两种情况似乎都是内核模块推迟的,但我不知道为什么? 由 Marek Vasut 编写的内核驱动程序正在使用动态调试,这是我有一些困难得到打印在终端。

    根据我的理解、内核模块应该读取设备树源代码中的设置和定义、并相应地配置 sn65dsi83。 由于内核模块延迟且不运行、因此不会读取这些设置、也不会配置器件。 作为解决方法、我编写了一个 bash 脚本、用于配置芯片以验证硬件是否正常工作。 尽管屏幕上的图片仍然存在一些问题、很可能与某些硬件特定设置有关、但脚本会证明硬件正在工作。  

    使用脚本作为解决方法的问题是、在引导过程中无法显示有关引导状态的信息、这是提供良好的系统用户体验所必需的、当用户可以看到系统正在引导并且很快就会准备就绪时。

    因此问题仍然存在:为什么 sn65dsi83 的内核模块在 Linux 引导期间不能正确加载?

    此致

    Henrik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    由于  在美国的公共假期、团队即将离开。 响应将延迟 到星期一 

    感谢您的耐心

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Henrik、

    我们必须分享的唯一驱动程序示例是上一个 E2E 链接中链接的驱动程序示例。

    是否可以在您的系统上通过 I2C 设置 DSI83? 使用 DSI 调谐器 GUI、您可以输入显示时序、LVDS 时序和 DSI 配置、并且需要写入寄存器的输出。

    您可以将该初始化脚本用作数据表中共享的初始化序列的一部分。 这是否比使用驱动器更合适? 是否有任何原因导致您无法显示引导信息? 这是否显示在显示屏上? 只有在初始化 DSI83 后、显示屏才会打开。 请检查它是否适用于您的系统。 它只涉及极少的寄存器设置、并且可以添加到启动序列中、以便从 SoC 进行控制。

    此致、
    Ikram