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.

[参考译文] Linux/AM5728:分离 LCD 和 HDMI 显示缓冲器

Guru**** 2582405 points
Other Parts Discussed in Thread: AM5728

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/626761/linux-am5728-separating-the-lcd-and-hdmi-display-buffers

器件型号:AM5728

工具/软件:Linux

我们开发了一款基于 AM5728并具有 HDMI 和 LCD 显示屏的产品。  我们在视频1引脚上有 LCD 我们让显示屏正常工作、但当前配置中的显示屏共享相同的帧缓冲器/dev/fb0.

我已经介绍了 DSS 用户指南、但看不到这方面的任何内核配置。  除了 LCD 之外、我无法在器件树中找到任何东西、并且我已对其进行了修改以适应我们的 LCD。

我的一个线索是、需要对视频多路复用器寄存器进行重新编程、以使用视频1流而不是电视流、并通过 DSS_CTRL 寄存器的位17和16来完成。  但是、我看不到哪种合适的方法来实现这一点。

有人能否提供有关如何配置 omapdrm 驱动程序和/或设备树以执行此操作的适当方法的指导?  

提前感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一些其他信息(4.9.x 内核4.00.04 SDK)尝试浏览 DSS 用户指南以及遇到的问题:

    1) 1)我找不到 CRTC 数量的设置。 Kconfig 文件仅显示 exynos 和 KMS 驱动程序的 CRTC。
    2) 2) OMAP2+显示子系统支持菜单中不清楚哪些显示与哪些 DSS 输出对应。 我们需要电视和 VIDEO1输出、但菜单仅显示:

    -- OMAP2+显示子系统支持 ││μ A
    ││[]调试支持 ││μ A
    ││[] DebugFS 文件系统支持 ││μ A
    ││[*] DPI 支持 ││μ A
    ││[*] VENC 支持 ││μ A
    OMAP4的││[*] HDMI 支持 ││μ A
    OMAP5的││[*] HDMI 支持 ││μ A
    ││[*] SDI 支持 ││μ A
    ││[*] DSI 支持 ││μ A
    ││(0)最小 FCK/PCK 比率(用于调节) ││μ A
    VENC 复位20ms 后││[*]睡眠

    用户指南中没有讨论如何将视频多路复用器配置为将 VIDEO1引脚多路复用到 VIDEO1输出而不是电视输出(HDMI)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在回答问题时、请记住我们的要求摘要:

    1) 1)用于 HDMI 和 LCD 显示屏的独立帧缓冲器
    2) 2)视频1引脚上的 LCD 需要配置 DSS 多路复用器、以便接收 LCD1通道输出。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仍在为此而挣扎。 DSS 用户文档已过期,并且已进行了大量更改。 诸如 CRC 数量等内核配置选项已被删除。

    到目前为止、我已经从我遇到的补丁中找到了 omapdrm.Displays 设置:

    patchwork.kernel.org/.../

    使用 omapdrm.Displays=0、1设置内核命令似乎已分隔 HDMI 和 LCD、并且 LCD 与/dev/fb0帧缓冲相关。

    但 HDMI 没有第二个帧缓冲器设置。 omap_drv.c 代码意味着 num_crtcs 在内部跟踪.Displays 设置中的条目数、因此我认为我使用的参数最终应将 num_crtcs 设置为2、但我仍然只看到具有 omapdrm.0的单帧缓冲区

    如何获得为 HDMI 分配的帧缓冲器?

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有人可以就此提供任何帮助吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris、很抱歉耽误你的时间。 此问题的关键人员已不在。 我现在将对其进行研究、我们将进行跟进。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常好、感谢后续行动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Chris Welch66">仍在努力解决此问题。 DSS 用户文档已过期,并且已进行了大量更改。 内核配置选项(如 CRC 数量)已被删除。[/quot]

    不再需要 CRC 的内核配置选项、驱动程序自行决定编号。

    [引用 user="Chris Welch66">但 HDMI 没有第二个帧缓冲器设置。 omap_drv.c 代码意味着 num_crtcs 在内部跟踪.Displays 设置中的条目数、因此我认为我使用的参数最终应将 num_crtcs 设置为2、但我仍然只能看到具有 omapdrm.0[/quot]的单帧缓冲区

    请提供有关您尝试执行的操作的更大图片。 您是否需要为您的用例或 DRM 提供 fbdev。

    我们不再支持 fbdev。 默认情况下、在最近的内核中、仅在单个屏幕上支持 fbdev 仿真。 如果您需要多个/dev/fbX 设备、则需要转至 omapfb 驱动程序并自行修复/改进工作。 另请注意、当您具有 fbdev 仿真和 fb 控制台时、fbdev 会确保显示 fbdev 的 DRM CRTC 已启用。 因此、如果禁用了 fbdev、或仅在其中一台显示器上启用了 fbdev、DRM 应用程序需要确保配置并启用它使用的 crtcs。  

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

    产品上有 LCD 和 HDMI 显示屏。

    液晶屏是前面板上的2.5英寸触摸面板。  显示屏独立运行。

    我们必须在 HDMI 上运行 X-11、因为该产品具有大型应用程序库。  这是一项硬性要求。  

    LCD 可能不需要运行 X、但我必须与大家聊天、我们可能可以转到 DRM 来运行 LCD。

     如果我理解正确、我认为我们没有选择提供 X-11要求。

    问题:

    1) 1)我的理解是、我们需要帧缓冲器支持来运行 X-11、这是正确的吗? 如果没有、如何通过 DRM 完成?

    2) 2)我已经能够将 LCD 分离并连接到仿真帧缓冲器上、但我无法进行相反的操作(与仿真帧缓冲器关联的 HDMI、LCD 分离)。  那么、我需要做些什么来设置一个配置、这样 LCD 是 DRM、而 HDMI 使用 fbdev 仿真呢?

    谢谢

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

    您能否提供有关如何完成配置的帮助、以便 HDMI 利用仿真帧缓冲器、LCD 可以使用 DRM?

    我们的 LCD 与 EVM LCD 示例兼容、我们将其用作器件树规格:

    lcd0:显示{
    兼容="osdDisplays、osd070t178-19ts"、"panel-dpi";

    标签="lcd";

    背光=<&LCD_BL>;

    ENABLE-GPIO =<&GPIO2 5 GPIO_ACTIVE_HIGH_>;
    面板正时{
    时钟频率=<6500000>;
    hactive =<320>;
    Vactive =<240>;
    前沿=<20>;
    后沿=<68>;
    HSYNC-LEN =<2>;
    后沿=<18>;
    垂直前沿=<4>;
    vsync-len =<2>;
    HSYNC-ACTIVE =<0>;
    vsync-active =<0>;
    停用=<1>;
    像素时钟激活=<1>;
    };

    端口{
    LCD_IN:端点{
    远程端点=<&dp_dout>;
    };
    };
    };

    DSS{
    端口{
    #address-cells =<1>;
    #size-cells =<0>;

    DSS_PORT:端口{
    DPI_OUT:端点{
    远程端点=<&LCD_IN>;
    数据线=<24>;
    };
    };
    };
    };

    但是、这会将 LCD 与仿真帧缓冲器相关联。 我们如何将其设置为位于与仿真帧缓冲器分离的 CRTC 上?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Chris Welch66]1)我的理解是,我们需要帧缓冲器支持来运行 X-11,这是正确的吗? 如果没有、如何通过 DRM 完成?

    X11具有不同的 X 驱动程序。 有 fbdev 驱动程序需要 fbdev 后端、然后使用 DRM 的驱动程序很少、其中最相关的可能是包含在主 X 服务器中的标准"模式设置"驱动程序(任何相对较新的 X)。 xorg 配置文件可用于选择使用的驱动程序。  

    如果您使用使用 DRM 的 X 驱动程序、并且您希望 HDMI 和 LCD 上的 X 都可以正常工作。 但是、如果您不想在 LCD 上使用 X、则会遇到一些复杂的问题。 无法使用 DRM 应用来绘制 LCD、因为 X 服务器已保留 DRM 器件。 在这种情况下、选项可以是-

     

    1) 1) Hack the driver、以便为两个显示屏创建单独的 FB。

    然后在 ine 上运行 fbdev X、在另一个上运行自定义内容。  

     

    2) 2)在 HDMI 屏幕上运行模式 X、同时在 LCD 上运行 fbdev。 可能需要对 X 进行一些更改、以便 X 在启动时不会关闭 fbdev。

    请注意  、PLSDK 上没有 X11支持。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我一直在使用 OMAP 驱动程序(基于 fb)进行 X-11配置、但我将查看模式设置驱动程序。

    我们可以在 LCD 上处理 X-11的使用问题,因此我将按照您的建议在两台显示器上设置 DRM 驱动程序并运行 X。

    声明:

    "如果您使用的是使用 DRM 的 X 驱动程序、并且您希望 HDMI 和 LCD 上的 X 都可以正常工作"

    这是否意味着显示器是独立的还是镜像显示器?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我构建了 libdrm 材料、并且能够在我们的 LCD 上获得测试模式(使用 omapdrm 驱动程序):

    /modetest -s 31:320x240

    和 HDMI 上

    /modetest -s 36:800x600

    但是、我无法同时运行这两条命令、即使以 root 身份运行、也会出现"拒绝权限"错误。 我认为这与您提到的"因为 X 服务器已经保留了 DRM 器件"有关、但我不理解这些器件是单独的器件、为什么一个器件在使用另一个器件时被锁定?

    X 正在查看 DRM 器件:

    [1037.412](II) XFree86:添加 DRM 器件(/dev/dri/card0)
    [1037.413](II) XFree86:添加 DRM 器件(/dev/dri/card1)

    但模式设置驱动程序不起作用:

    [1324.483](II)模式设置(G0):使用 drv /dev/dri/card1
    [1324.483](WW)回退到旧探头模式以进行模式设置
    [1324.483](EE) No devices detected (未检测到设备)。
    [1324.483](EE)
    致命服务器错误:
    [1324.483](EE)找不到屏幕(EE)

    我尝试使用"kmsdev"选项设置模式以使用/dev/dri/card0 DRM 器件、但它仍然使用/dev/dri/card1

    我搜索了这些驱动程序,有一个我曾经尝试过的驱动程序,它声称是 DRM,Armada-etnaviv,所以我启动了它,X 确实启动了,但它还是在 LCD 和 HDMI 上。 但是、日志表明它正在使用 DRM 访问:

    [1484.329](II) Armada (0):为 KMS 器件添加了屏幕/dev/dri/card1
    [1484.329](WW)退回旧探头方法(用于 Armada)
    [1484.329](WW) VGA 仲裁器:无法打开内核仲裁器、不支持多卡
    [1484.329](II) Armada (0):硬件:omapdrm
    [1484.329](**) Armada (0):深度16,(-)帧缓冲区 bpp 16
    [1484.329](=) Armada (0):RGB 重量565
    [1484.329](=) Armada (0):默认视觉为 TrueColor

    奇怪的是,它忽略/dev/dri/card0,Armada 驱动程序似乎没有指定备用 KMS 设备的选项。

    那么、回到最初的问题、现在我已经使用了 DRM、我如何区分显示屏、即每个显示屏都运行自己的 X 会话?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    其他一些新闻。 我尝试使用模式设置驱动程序打开调试、它开始工作。 我注释了调试选项、它继续工作。 执行图示。

    模式设置驱动程序使用/dev/dri/card0,但与 Armada 驱动程序存在相同的问题,因为 LCD 和 HDMI 上都有相同的 X 会话。

    我从 processors.wiki.ti.com/.../Graphics_Display_Getting_Started_Guide 上运行了一些测试 、这些测试表明显示屏是分开的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、我刚刚注意到我在执行此操作时使用了不同的内核。 另一个内核在使用模式设置驱动程序时似乎出现问题、我将检查配置文件是否存在问题。 请注意、使用内核时、只有一个 CRTC、/dev/dri/card0. 对于两个内核、器件树的设置方式与 LCD 相同。

    Motetest 显示了两个采用此设置的 CRC、OMAP 测试似乎能够单独处理显示。

    我怀疑单独的显示屏操作必须通过模式设置驱动程序来完成、因此我将研究一下它的多头操作。

    同样、如果您有任何建议、请在 X 下将显示屏分开
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我理解正确、我需要一个 DRM 驱动程序、该驱动程序允许在 xorg.conf 的器件配置部分指定 CRTC、以便获得单独的显示(有效的多显示操作)。

    我在查看的现有驱动程序(modesetting 和 Armada)中看不到此功能。 我似乎需要使用驱动程序来添加一个选项,允许为 xorg.conf 配置的设备部分选择特定的 CRTC。

    模式设置仅允许选择 KMS 器件、但 KMS 器件与我的两个显示屏相关、因此它不提供分离功能。

    但是、在我看来、它比这更复杂、因为您不能使用同一 KMS 有两个单独的驱动程序。 驱动程序必须在这样的位置实施,使其作为单个驱动程序运行,但可以支持单独的 xorg.conf 设备 CRTC 选项规格。

    或者,一种方法是选择 xorg.conf 的屏幕部分可以引用 xorg.conf 声明的设备中的 CRTC。

    这似乎是一个很重的伸展动作、只需单独显示即可。 我将花更多的时间来研究这一点、但我认为这对我们来说不是可行的方法、我应该考虑为 LCD 设置单独的帧缓冲驱动器。

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

    [引用用户="Chris Welch66"]只有一个 CRTC、/dev/dri/card0.

    您正在混合使用 DRM 卡、crtcs 和显示屏。 我们有一个用于 DSS 的 DRM 卡。 该卡设备具有多个 crtcs、每个 crtcs 都将显示在不同的显示屏上。 当应用程序使用卡设备时、将保留该卡、并保留该卡的所有 crtcs 和面板。  

    这就是 "但是、我无法同时运行两个命令"的原因。 您可以执行以下操作来运行单个模式、该模式设置两个显示:

    /modetest -s 31:320x240 -s 36:800x600

    您看到的第二个卡是 SGX (用于3D 图形的硬件加速器)它也是 DRM 卡设备、即使它没有任何显示输出。 当有多个 DRM 器件时、它是"随机"、一个以 card0结尾、另一个以 Card1结尾。 因此、正确的应用将浏览卡片并找到感兴趣的卡片。  

    不确定为什么要在模式 X 驱动器上获得镜像输出。 以下配置在 X.Org X Server 1.19.3上默认具有单独的配置。  

    "器件"部分

                 标识符           "已配置的视频设备"

                 驾驶员                 "模式设置"

                 选项               "SWcurs"True"

                 选项               "ShadowImage FB"(错误)

                 选项               "kmsdev"/dev/dri/card0

           选项                      "AccelMethod""无"

    结束段

     我们不是 X 专家、无法提供有关如何配置 X wrt 显示输出的建议。 这些是标准配置。 在运行时、用户可以使用"xrandr"工具执行所有类型的 X 显示配置。 但是、要使其成为固定配置、可以使用 X 配置文件、其中包含屏幕等部分。网络上应该有大量有关该文件的信息。  

    查看以下内容、了解如何交换主显示屏(HDMI 上的 fbdev)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢这对澄清我的理解和第二个/dev/dri/card.很有帮助 我现在看到由于 Card0是 SGX 加速器而跳过、因此它没有输出、因此会被忽略。

    我在 xorg.conf 方面取得了一些进展:

    "监视器"部分
    标识符 "HDMI"
    选项 "参考模式"1920x1080
    结束段

    "监视器"部分
    标识符 "LCD"
    选项 "参考模式"320x240"
    结束段

    "器件"部分
    标识符 "DRM 器件0"
    编号 驱动器 " Armada "
    驱动器 "模式设置"
    编号 选项 "HWCursor (硬件光标) "错误"
    选项 "Monitor-HDMI-0"(显示器-HDMI-0)"HDMI"
    选项 "Monitor-NONE-0"(显示器-无-0)"LCD"
    结束段

    我现在有了与相应监视器相关联的 DRM 输出 HDMI-0和 None-0(通过 xrandr 报告获得),尽管 X 仍然在两个监视器上呈现,同时将它们视为单个显示。

    我认为这可能会导致一个解决方案、因此我将继续寻求解决方案、但是、如果您确实了解了两个输出为什么都是从同一个输出呈现的以及如何将它们分离、我会很感激。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    复制问题似乎是显示管理器过于有用。 我们使用的显示管理器可拾取 LCD 和 HDMI 作为多个监视器存在、并在这两个监视器上进行渲染。

    我们解决此问题的方法是在 xorg.conf 中将 LCD 定位到 HDMI 侧的右侧(也可以使用 xrandr)。 因此、X 光标可以浏览到 LCD。

    我们的应用程序在主屏幕和显示器上以全屏运行,因此我们通过将鼠标限制在应用程序窗口区域来解决鼠标问题。

    请记住、无法将这些显示与运行模式设置的 X-11会话或其他基于 DRM 的驱动程序分开、因为 DRM 操作需要在同一应用程序下管理所有 DRM 连接。

    X-11在 AM5728 EVM 上的设置相当简单、例如使用 BeagleBoard X-15软件材料的电路板。