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.

[参考译文] AM67:DSI 显示测试

Guru**** 2535750 points
Other Parts Discussed in Thread: AM67

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1562043/am67-dsi-display-testing

器件型号:AM67


工具/软件:

你(们)好  

目标:

我当时正在研究一个特殊情况、需要从 am67 测量 DSI 信号

我尝试 bf 的方法很少

  • 将 k3-j722s-EVM-DSI-RPI-7inch-panel.dtbo 加载到器件中并叠加在 nEnv.txt 中
  •  我尝试将驱动器修改为虚假的输出面板
    1. 仍将  k3-j722s-EVM-DSI-RPI-7inch-panel.dtbo 用作器件树
    2. 修改了 panel-simple.c  
      1. -> panel_simple_get_modes
        1. FOSE 为一种模式和固定分辨率
        2. 添加硬编码的面板模式 
  • 结果->

MIPI-DSI 30500000.DSI.0:延迟探头待定:MIPI-DSI:供应商桥接调节器未就绪

平台桥接调节器:延迟探头待定:平台:供应商 3-0045 未就绪

Platform 30220000.dss:延迟探头挂起:tidss:端口 1 探头失败

我知道、DSI 面板大多需要连接到桥接器。

因此、我决定通过驾驶员的检查

  • 绕过电源依赖检查 
  • CDN - DSI
    • 没有桥接器 
    • 强制将 DSI 主机标记为就绪 
  • tidss_drv.c
    • tidss_probe->强制启用端口 


但 在 SDK 中找不到 cdns-dsi.c  

您能告诉我 CDN - DSI 在哪里

或者、您能告诉我什么方法可以直接绕过从 am67 检测 DSI 信号

CPU→DSI 控制器→DSI 面板 

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

    您好:

    有关专家今天已离职。 请期待星期一的答复。

    此致、

    Nihar Potturu

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

    您好、
    您是否在寻找:drivers/GPU/DRM/bridge/cadence/CDN-dsi-core.c?

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

    是的、非常感谢。 我不知道、它在 DSI 之后得到了内核。

    我发现另一个有趣的事情是   CDNS-DSI-CORE.c 中的测试图形发生器 (TVG)

    您能否提供我们在 EVM 上打开 TVG 以输出 DSI 信号进行测试的使能方法?

    THX

    Will

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

    请参阅:  【常见问题解答】AM62P:显示子系统 (DSS):基本调试和论坛最佳实践  

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

    是的、我将调试过程理解为链接。

    但所有方法都需要将 DSI 面板连接到 EVM、这就是我们的 bf 尝试方法。 我们的主要目标是找出问题、这就是我们只需要在没有任何连接的情况下提供 DSI 输出的原因。

    根据我的理解、这个“modetest -M tidss -s 50@48:1920x1080 -s 40@38:1920x1200“是一个输出测试模式。

    我将配置修复为输入、以便在没有连接的情况下输出、我会告诉您好消息。

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

    尊敬的 Divyansh:

    我只是尝试让驱动器在探测后打开测试 PATTEN。

    我可以测量 clk p 和 clk n、以及 3.3V  
    我是否可以说 3.3V 输出意味着 DRM 和测试 PATTEN 是可以使用的? 由于没有理由我的数据输出小于 100mV、因此看起来并不正确。

    THX

    Will  

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

    您好、
    对于  k3-j722s-EVM-DSI-RPI-7inch-panel.dtbo、您需要将 RPi 面板连接到电路板、因为驱动程序中存在初始握手、该握手会失败并引发这些错误。 请先连接面板、然后再继续。

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

    尊敬的 Divyansh:

    我修改了 cdns-dsi-core.c

    即 CDN 驱动器探测成功时的心态  

    CDN_DSI_DRM_PROBE 
    启动时钟
    安排 TVG 测试模式


    探头功能如下所示  

    static int cdns_DSI_DRM_probe(结构 platform_device *pdev) 

    结构 CDN_DSI *DSI;
    结构 cdns_dsi_input *输入;
    INT RET、IRQ;
    u32 val、tmp;

    DSI = devm_kzalloc (&pdev->dev、sizeof (* DSI)、gfp_kernel);
    IF(!DSI)
    返回-ENOMEM;

    platform_set_drvdata (pdev、DSI);

    输入=&DSI->输入;

    dsi->regs = devm_platform_ioremap_resource (pdev、0);
    IF (IS_ERR(DSI ->寄存器))
    返回 PTR_ERR (DSI->REGS);

    dsi->dsi_p_clk = devm_clk_get (&pdev->dev、“dsi_p_clk")“);
    IF (IS_ERR (DSI->DSI_p_clk))
    返回 PTR_ERR (DSI->DSI_p_clk);

    dsi->dsi_p_rst = devm_reset_control_get_option_exclusive (&pdev->dev、
    “dsi_p_rst")“);
    IF (IS_ERR (DSI_->DSI_p_rst))
    返回 PTR_ERR (DSI->DSI_p_rst);

    dsi->dsi_sys_clk = devm_clk_get (&pdev->dev、“dsi_sys_clk")“);
    IF (IS_ERR (DSI->DSI_SYS_clk))
    返回 PTR_ERR (DSI->DSI_SYS_clk);

    IRQ = platform_get_IRQ (pdev、0);
    IF (IRQ < 0)
    返回 IRQ;

    dsi->dphy = devm_phy_get (&pdev->dev、“dphy")“);
    IF (IS_ERR (DSI->dphy))
    返回 PTR_ERR (DSI->dphy);

    RET = clk_prepare_enable (dsi->dsi_p_clk);
    IF (RET)
    返回 ret;

    VAL = READL (DSI->REGS + ID_REG);
    if (REV_VENDOR_ID (val)!= 0xcad){
    dev_err(&pdev->dev、“无效的供应商 id\n“);
    RET =-EVAL;
    goto err_disable_pclk;
    }

    dsi->platform_ops = of_device_get_match_data (&pdev->dev);

    Val = readl (DSI->regs + IP_CONF);
    ds->direct_cmd_fifo_depth = 1 <<(DIRCMD_FIFO_DEPTH (val)+ 2);
    ds->rx_fifo_depth = RX_FIFO_DEPTH (val);
    init_completion (&dsi->direct_cmd_comp);

    writel (0、DSI ->寄存器+ MCTL_MAIN_DATA_CTL);
    writel (0、DSI ->寄存器+ MCTL_MAIN_EN);
    writel (0、DSI ->寄存器+ MCTL_MAIN_PHY_CTL);

    /*
    *我们只支持 DPI 输入,所以强制输入-> id
    * CDN_DPI_INPUT。
    */
    input->id = CDN_DPI_input;
    input->bridge.funcs =&CDNS_DSI_BRIDGE_funcs;
    input->bridge.of_node = pdev->dev.of_node;

    /*在注册 IRQ 处理程序之前屏蔽所有中断。 */
    writel (0、DSI ->寄存器+ MCTL_MAIN_STS_CTL);
    writel (0、DSI ->寄存器+ MCTL_DPHY_ERR_CTL1);
    writel (0、DSI ->寄存器+ CMD_MODE_STS_CTL);
    writel (0、DSI ->寄存器+ DIRECT_CMD_STS_CTL);
    writel (0、DSI ->寄存器+ DIRECT_CMD_RD_STS_CTL);
    Writel (0、DSI ->寄存器+ VID_MODE_STS_CTL);
    写入 (0、DSI ->寄存器+ TVG_STS_CTL);
    Writel (0、DSI ->寄存器+ DPI_IRQ_EN);
    RET = devm_request_irq (&pdev->dev、IRQ、cdns_DSI_interrupt、0、
    DEV_NAME (&pdev->dev)、DSI);
    IF (RET)
    goto err_disable_pclk;

    pm_runtime_enable (&pdev->dev);
    dsi->base.dev =&pdev->dev;
    dsi->base.ops =&cdns_DSI_ops;

    if (DSI->platform_ops && DSI->platform_ops ->init){
    RET = DSI->platform_ops->init (DSI);
    如果 (ret !=0){
    dev_err(&pdev->dev、“platform initialization failed:%d\n“、
    RET);
    转到 err_disable_runtime_pm;
    }
    }

    RET = mipi_DSI_HOST_REGISTER (&DSI->BASE);
    IF (RET)
    goto err_deinit_platform;

    CLK_DISABLE_UNPREPARE (DSI->DSI_p_clk);
    //===================== 然后引导启动测试模式===================
    //重新啟用時鐘以便配置 TVG
    RET = clk_prepare_enable (dsi->dsi_p_clk);
    if (ret){
    DEV_WARN(&pdev->dev、“无法为 TVG 启用时钟、但仍在继续...\n“);
    }其他{
    //配置 TVG 測試圖案 — 800x480 垂直條紋
    写入 (TVG_LINE_SIZE (800)| TVG_NBLINES (480)、DSI ->寄存器+ TVG_IMG_SIZE);
    Writel (TVG_COL1_RED (0xFF)| TVG_COL1_GREEN (0x00)、DSI ->寄存器+ TVG_Color1);
    写入 (TVG_COL1_BLUE (0x00)、DSI->REGS + TVG_Color1_BIS);
    写入 (TVG_STRICE_SIZE (40)| TVG_MODE_VSTRIPES | TVG_RUN、DSI ->寄存器+ TVG_CTL);

    //選擇 TVG 作為數據源
    tmp = readl (DSI ->寄存器+ MCTL_MAIN_DATA_CTL);
    tmp |= TVG_SEL;//啟用 TVG
    tmp &=~if_VID_MODE;//禁用视频模式
    writel (tmp、DSI_>REGS + MCTL_MAIN_DATA_CTL);

    CLK_DISABLE_UNPREPARE (DSI->DSI_p_clk);

    DEV_INFO (&pdev->dev、“DSI TVG 测试模式在引导时启用 — 垂直条带 800x480\n“);
    }
    //===================== 测试模式已完成======================


    返回 0;

    ERR_DEINIT_PLATFORM:
    if (DSI ->platform_ops && DSI ->platform_ops ->deinit)
    dsi->platform_ops->deinit(dsi);

    ERR_disable_runtime_pm:
    pm_runtime_disable(&pdev->dev);

    ERR_disable_pclk:
    CLK_DISABLE_UNPREPARE (DSI->DSI_p_clk);

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

    如离线讨论所述、您目前正在设计在驱动器中启用 4 个通道、而不是 1 个通道。 如有任何其他疑问、请随时在此主题上执行 ping 操作。

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

    是的、我遗漏了这些信息。 修改了 4 通道驱动程序、 我会告诉您它是否起作用。 这是客户验证 DSI 信号的好方法。  

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

    尊敬的 Divyansh:

    很抱歉、我错过了信息、输出信号应该保持在视频模式->所以我的解决方案与 情况不符。

    因此、我的新方法需要修改 tidss_drv.c->tidss_probe

    ->

    对于 (i = 0;i < tidss->dispc->num_ports; i++){
    tidss->dispc->ports[i]。available = true;
    tidss->dispc->ports[i]启用= true;
    DEV_INFO (dev、“强制启用显示端口%d\n“、i);
    }
    //===================

    我的问题是应该切换哪个文件、bc 在器件中没有看到 tidss_drv.ko。

    THX

    Will

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

    不确定我是否理解您的问题。 我在器件上看到以下内容:

    root@am62pxx-evm:~# find / | grep tidss
    /usr/lib/modules/6.12.35-ti-00915-ge3e551586dfa/kernel/drivers/gpu/drm/tidss
    /usr/lib/modules/6.12.35-ti-00915-ge3e551586dfa/kernel/drivers/gpu/drm/tidss/tidss.ko
    /usr/lib/modules/6.12.35-ge3e551586dfa-dirty/kernel/drivers/gpu/drm/tidss
    /usr/lib/modules/6.12.35-ge3e551586dfa-dirty/kernel/drivers/gpu/drm/tidss/tidss.ko
    /usr/lib/dri/tidss_dri.so

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

    尊敬的 Divyansh:

    是的、非常感谢。  

    我没有关于控制直接帧缓冲区的问题。

    我当时正在处理此案例。 我发现内核的 menuconfig 有一个选项可以控制帧缓冲区。

    您是否有开放内核配置以控制帧缓冲区以测试显示信号的任何示例或用例?

    THX  

    Will

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

    不确定我得到了您指向的配置、能否提供它的名称:config_xxxxx。

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

    尊敬的 Divyansh:

    我知道 ti DRM/kms 系统提供测试模式功能。

    因此、我在 panel-simple.c 中调用 TEST PATTEN API 或函数
    您能告诉我在哪里可以找到要调用的测试模式函数或 API?

    我不知道哪一个是正确的,它调用在太多的地方

    THX

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

    您的意思是:

    kmsxxtest --device=/dev/dri/by-path/platform-30220000.dss-card

    请注意、在 SDK < 11.1 中、kmsxxtest 是 kmstest。

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

    不、这是一个应用程序。

    我要求像这样的库  

    dispc_set_test_pattern
    {}

    可能在 Tidss_CRTC 或其他  函数中、但我想问他们在哪里调用测试模式函数。

    我想念 bc 太多的测试模式库,我想知道哪一个是核心的?  

    THX

    Will

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

    我不知道内核 DRM 框架中包含任何测试图形库。 我看到的 TEST_PATTERN 的主要搜索结果是针对特定于供应商的驱动程序增强、但不适用于核心驱动程序。 这是预期的,因为,即使你在核心框架中有类似的东西,你将需要一个用户空间应用来实际调用它。

    相反,我们直接使用 userpace 应用来创建测试模式。 也许跟踪 https://github.com/tomba/kmsxx/tree/master/utils 中的系统调用 可以帮助您的案例吗?

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

    Divyansh


    1.在 DRM 下、如果面板或目标器件未连接、是否有方法输出 DSI 信号? 是否有一个虚拟节点、我们可以在没有实际器件的情况下输出 DSI 信号?

    2、是否有简单的方法在 DRM 下生成测试 PATTEN、带或不带面板/设备?  

    3、如果没有 DRM、我们能否使用直接帧缓冲器来输出 DSI 信号?

    4.没有 DRM、我们能否使用直接帧缓冲器输出测试图形以输出 DSI 信号?

    Br、Rich   

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

    您好 Rich、
    1.没有 驾驶员期望并检查连接的面板、包括检查面板上是否存在设备调节器和触摸控制器。 如果不这样做、探头将会出现故障。
    2.设备只有在探测成功后才会在 DRM 中注册。 DRM 驱动程序本身没有测试图形发生器。 您可以在 【常见问题解答】AM62P:显示子系统 (DSS):基本调试和论坛最佳实践中查看 TVG 图形发生器 但请注意:  这将从 DSI 桥而不是从 DSS 生成图形。 不确定这是否对您的案例有用。 我们通常在驱动程序探测时使用此功能、而您看不到屏幕显示。 如果您的驱动程序本身未成功探测、则不确定它是否有帮助。
    3、4. 基于帧缓冲的方法是传统的、我们不再对此提供支持。 您可以启用 config_fbdev_emulation 来枚举 fb 器件、但我们无法 使用它来帮助进行任何测试/实验。