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.

[参考译文] TDA2HG:[visionSDK3.08]通过0xadcc9f60的 GBM 器件与初始化值0x3a0040不匹配

Guru**** 2549750 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/931948/tda2hg-visionsdk3-08-gbm-device-passed-0xadcc9f60-does-not-match-with-initialized-value-0x3a0040

器件型号:TDA2HG

您好:
我们正在使用 QT 5.11处理 visionsdk3.08、当我们从 Weston 切换到 eglfs 时、出现以下错误

[AMS][439811]ModelLoader::加载"AVM_qt_app_res/SX12_6_22/SX12.3DS"。 min_x=-1.07、min_y=0.00、min_z=-2.29
[AVM][439811]ModelLoader::加载"AVM_qt_app_res/SX12_6_22/SX12.3DS"。 max_x=1.07、max_y=1.67、max_z=2.29
[AVM][439825] ModelDraw::pre_load_model_data。 文件 AVM_qt_app_res/SX12_6_22/SX12.3DS 成本1380ms
[AVM][439825][AVM][439825] ModelDraw::pre_load_car_data。 ini 文件、det=-1.40
ModelDraw::pre_load_car_data。 ini 文件、det=-1.40
[AVM][439858]ModelDraw::load_model。 VERT_SIZE = 386532、NORMAL SIZE = 386532、UV_SIZE = 1、idx_SIZE = 128844
[AMS][439884]ModelDraw:load_model。 VERT_SIZE = 386532、NORMAL SIZE = 386532、UV_SIZE = 1、idx_SIZE = 128844
###显示[0]:CRTC = 31、连接器= 29、格式= 0x34325258
选择的模式[1920x720]:时钟=> 85614,垂直刷新=> 60,类型=> 72
水平=> 1920、1939、1943、1952、0
垂直=> 720、727、728、731、0
###主显示=>连接器 ID = 29、分辨率= 1920x720
PVR:(错误):[11295->11305]< WSEGL_InitializeDisplay():940|ERROR>GBM 器件通过0xadcc9f60与初始化的值0x3a0040 [0、]
初始化失败
无法初始化 EGL
数据地址0xa850d008
DMA FD 0x1b
宽度1024
高度1024
EGLWindowDisplay 0x3
EGL: After eglCreateImageKHR() eglesgl Error!(0x3lCreateImageKHR
错误:0x3eglEG001失败!)错误:错误:错误:错误:错误:错误:错误:错误:错误:错误:错误:错误:错误! 


以下是源代码  

void SetupEGLEnv ()
{
drmEventContext evctx ={
.version = DRM_EVENT_Context_version、
.page_flip_handler = page_flip_handler、
};
struct GBM_bo * bo;
struct DRM_fb * fb;
int ret = init_drm ();
if (ret){
printf ("初始化 drm\n"失败);
return;
}
printf ("## Primary display => ConnectorId =%d、Resolution =%DX%d\n"、
DRM.connect_id[DISP_ID]、DRM.MODE[DISP_ID]->hISP display.mode[vID]->DRM[vdisplay]
;vINT_ID]



RET = init_GBM();
if (ret){
printf ("初始化 GBM\n"'失败);
return;
}

ret = init_gl ();
if (ret){
printf ("初始化 EGL\n"'失败);
return;
}







static int init_drm (void)
{
drmModeRes *资源;if (rett){ printf ("failed to initialize EGL\n")

;


* rm_drt 编码器= nuln);* rm_drt = nrmcr *编码器*。
uint32_t maxRes、 curRes;

/* Open default dr device */
DRM.FD = open (device,O_RDWR | O_CLOEXEC);
if (DRM.FD < 0){
printf ("无法打开 DRM 器件%s\n",device);
return -1;
}

resources = drmModeGetResources (DRM.FD);
if (!!





return!/tresn)/tresn (return–32);if (rmrmresources:#rmoutn) *
对于(i = 0;i < resources->count_connector;++i){
connector = drmModeGetConnector (DRM.FD、resources-> connector[i]);
if (connection=DRM_mode_connected){

//找到匹配的编码器*
对于(j=0;j count_encoder;++j){
编码器= drmModeGetEncoder(Drm.fd,connecter->Encoder[j]);

//如果没有分配 fisrt,则获取 fisrt 1;//
if (!connecter->Encoder_id)
{
connectors->Encoder_id = encoderer->crk_id;
}

if (encoders->crtc =

== cer_trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&trender&


++k){
/*检查此 CRTC 是否与编码器一起工作*/
if (!(encer->Possible _crtcs &(1 <<k))
continue;

encer->CRTC_id = resources->crtcs[k];
break;
}

if (!encer->CRTC_id)
{
printf ("编码器(%d)

= resources->crtcer_deeder[k];break;}编码器 mcer_deeder_definc);cer_deedereedere编码 器
!)编码器 mcer_definc = nr 编码器

}

break;
}

dmModeFreeEncoder (encoder);
encoder = NULL;
}

if (!encoder){
printf ("连接器(%d):无编码器!\n"、connector->connector_id);
drmModeFreeConnector (connector);
Continue;
}

//选择当前或第一支持的模式*/
CRTC = drmModeCrtc (tc->GetFDc);继续;
对于(j = 0;j < connector->count_modes;+j)
{
if (crtc->mode_valid)
{
if (connector->modes[j].hdisplay == crtc->宽度)&&
(connector->models[j].vdisplay ==&cntc->高度)}
{dr.modes[j].modes[j<connector=>crtc=>dislinks=j>modes<j>crtc.p<j<j>modes=j<j<j<connector>modes<j>[j<connector.display<j>modes<j<j<j<j<j<j>modes=>degm.display<j<j>[j<j<j<j>modes<j<links=>[j>d<d












}


if (j >= connecter->count_modes)
drm.mode[drm.ndisp]=&connecter->modes[0];

drm.connect_id[drm.ndisp]= connectors->connect_id;

drm.encoder[t.ndisp]=(Uprint32_t)编码器;drm.crtctrm.crtc_det_id[d.n.dx






= n!d.trm.trm.endor.trm.endor.n.dx = n 格式、d.trm.endor.trm.udp = n.dx = nvn = n.d.trm.trm.trm.trm.trm.trm.trm.trm.d.endor.d.d.endor.d.d.endor.trm.n.dx (= n.d.d.d.trm.d.d.tr



drm.connect_id[drm.ndisp]、drm.format[drm.ndisp]);
printf ("\tMode channed [%s]:Clock =>%d、Vertical refresh =>%d、Type =>%d\n"、drm.mode[drm.ndisp]-> name、drm.mode[drm.ndisp]、drm.mode[drm.ndisp]、vreflum->clock drm.mode[drm.ndisp]->type);
printf ("\tHorizontal =>%d、%d、%d、%d、%d、 %d\n"、DRM.mode[DRM.ndisp]->hdisplay、DRM.mode[DRM.ndisp]->HSYNC_START、DRM.mode[DRM.ndisp]->HSYNC_END、DRM.mode[DRM.ndisp]->htotal、 drm.mode[drm.ndisp]->hskew);
printf ("\tVertical =>%d、%d、%d、%d、%d、%d、 %d\n"、drm.mode[drm.ndisp]->vdisplay、drm.mode[drm.ndisp]->vsync_start、drm.mode[drm.ndisp]->vsync_end、drm.mode[drm.ndisp]->vtotal、 DRM.mode[DRM.ndisp]->vscan);

//如果指定了 connector_id,请使用相应的显示*/
if ((connector_id !=-1)&&(connector_id =DRM.connector_id[DRM.ndisp])
,则使用相应的显示*/ if (connector_id !=-1)&&(connector_id =DRM.ndisp]),

如果启用了所有显示*[DRM.connector.display_max_modity],请选择 ddr.remax.did]/以最大


显示模式显示*[DRM.display_dis.remax.did](ddr.display_dis.dis.did])。
curRes = drm.mode[drm.ndisp]->vdisplay * drm.mode[drm.ndisp]->hdisplay;

if (curRes > maxRes)
dISP_ID = drm.ndisp;
}

++DRM.ndisp;
}否则{
drmModeFreeConnector (connector);
}


如果(DRM.ndisp = 0){
//我们可以花哨聆听热插拔事件并等待
*一个连接器。
//
printf ("未连接连接器!\n");
return -1;
}

return 0;
}

static int init_GBM (void)
{
gbm.dev = GBM_create_device (drm.fd);

GBM.surface = GBM_surface_create (gbm.dev、
drm.mode[dsp_id]->hdisplay、drm.mode[dsp_id]->fmbm.mode[DCM_ID]->find_dmt_dmt_display_dmt.file_d&dmt_dmt.for_d&v

GBM_BO_USE_SCANOUT | GBM_BO_USE_Rendering);
if (!GBM.surface){
printf ("创建 GBM 表面失败\n");
return -1;
}

return 0;
} 


请参阅此 TT









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

    你好 

     请看一下这个。

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

    您好!

    您能否确认正在使用的 DRM 器件?

    此致

    Hemant

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

    [引用用户="Hemant Hariyani"]您能否确认正在使用的 DRM 器件?

    我们如何确认 DRM 器件、因为上面的状态在使用 Weston 时是可以的。

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

    [引用 user="user5312037"]

    我们如何确认 DRM 器件、因为上面的状态在使用 Weston 时是可以的。

    [/报价]

    您好!

    在您共享的代码中、DRM 器件将在 init_DRM 函数中打开:

    DRM.FD =打开(器件、O_RDWR | O_CLOEXEC);

    您能否在此处查看正在打开的器件? 您是否还可以检查 DRM 器件的名称:

    CAT /sys/kernel/debug/dri/0/name

    此外、您如何根据 GBM 构建应用(或 qt)。 我们需要确保此构建使用正确的标头。 TI 的 GBM 代码现已推出:

    https://git.ti.com/cgit/glsdk/libgbm

    您能否确认这是否是我们正在使用的器件?

    此致

    Hemant

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

    您好 Hemant:

      [引用用户="Hemant Hariyani"]

    DRM.FD =打开(器件、O_RDWR | O_CLOEXEC);

    您能否在此处查看正在打开的器件? 您是否还可以检查 DRM 器件的名称:

    [/报价]

       CHAR*器件="/dev/dri/card0;

       [引用用户="Hemant Hariyani"] cat /sys/kernel/debug/dri/0/name

     

    root@dra7xx-EVM:~# cat /sys/kernel/debug/dri/0/name
    vDRM dev=440000.OCP:vDRM@0 Unique = 440000.OCP:vDRM@0

    [引用 user="Hemant Hariyani">此外、您如何针对 GBM 构建应用程序(或 qt)。 我们需要确保此构建使用正确的标头。 TI 的 GBM 代码位于此处:

      qmake_CXXFLAGS +=-i$${LOC_ROOTFS_PATH}/usr/include/omap -i${LOC_ROOTFS_PATH}/usr/include/drm -i$${LOC_ROOTFS_PATH}/usr/include/gbm -i$${LOC_ROOTFS_PATH}/usr/include/libdrm

     您知道 visionsdk 3.08不支持 QT 环境、因此我们通过 PSDKLA 6.03构建了 QT

      

    附加来自 kmscube 项目的整个源代码

    e2e.ti.com/.../6305.kmscube.c

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

    您好!

    非常感谢您的快速响应。

    QT 在您的设置中与 PSDKLA 配合工作是否正常? 此外、您是否可以将 GBM 接头与我共享的 git repo 进行比较?

    此致

    Hemant

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

    [引用 user="Hemant Hariyani"] QT 在您的设置中与 PSDKLA 配合工作是否正常[/quot]

    QT 在 Weston 和 eglfs 后端都能正常工作。

    使用 eflfs 删除 Weston 时、无法启动 EGL。

    [引用 user="Hemant Hariyani"]此外,您是否可以将 GBM 接头与我共享的 git repo 进行比较?

    一个位扩散器、请参见附件中 psdkla 6.03的 gbm.h。

    e2e.ti.com/.../gbm.h

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

    您好!

    谢谢你。

    您能在 git repo 中尝试与 GBM 进行构建吗?

    此外、我们还能获得更多日志吗? 您可以尝试启用这些构建吗?

    导出 QT_QPA_EGLFS_DEBUG=1
    导出 QT_logging_rules=qt.qpa.eglfs.kms=true

     此致

    Hemant

     

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

    您好 Hemant:

     请参阅登录附件

    e2e.ti.com/.../eglfs_2D00_failed.log

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

    您好!

    感谢您的日志。 我们正在尝试分析日志并在内部进行调试、并尝试在此处重新创建问题。 我们将很快提出建议。 如果我们需要更多测试、我们将告诉您。

    此致

    Hemant

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

    您好、[报价用户="user5312037"]

    QT 在 Weston 和 eglfs 后端都能正常工作。

    [/报价]

    请您澄清此陈述吗? 在 Processor SDK 6.03上、eglfs 后端工作还是失败?

    此致

    Hemant

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

    您好、 Hemant

    [引述用户="Hemant Hariyani""您能澄清这一说法吗? eglfs 后端工作还是在 Processor SDK 6.03上失败?

     在 Processor SDK 6.03上使用 eglfs 后端工作

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

    您好 Hemant:

      让我介绍一下 psdkla\visondk\qt\Weston 的历史

    1.   我们从 visionsdk3.04和3.05开始、因为它不支持 QT、我们从本地 FAE 的 psdkla 3.x 复制 QT 5.6、QT 与 Weston 配合良好、但 visionsdk 不支持 Yocto。
    2.   从 visionsdk 3.08开始、它支持 Yocto、然后我们迁移到 visionsdk 3.08 (与 psdkla 6.03匹配)、我们从本地 FAE 复制 psdkla 6.03中的 qt5.11、QT 与 Weston 搭配使用。

    根据本讨论(

    )

    我们发现 QT 在 Weston 后端性能不佳、因此我们计划用 eglfs 替换 Weston、通过某种测试、它似乎具有更好的性能。

    现在、当我们将 QT 5.11与 eglfs 一起使用时、该问题会出现。

    BTW、关于 GBM 版本、我们在 psdkla 6.03中检查它、该版本与 visonsdk 3.08相同

    root@Ubuntu:/mnt/workshop/ti_reo/libgbm ls /home/a0224068local/1Twork2/psdkal/ti-processor-sdk-linux-automotive-dra7xx-evm-6.00.00.03/linux-devkit/sysroots/armv7at2hf-neon-linux-gnueabi/usr/lib/libgbm.so -la
    lrwxrwxrwx 1 1012 1015 22 2019年12月11日/home/a0224068local/1Twork2/psdkal/ti-processor-sdk-linux-automotive-dra7xx-evm-6.00.00.03/linux-devkit/sysroots/armv7at2hf-neon-linux-gnueabi/usr/lib/libgbm.so -> libgbm.so.1.17.4948957 

    板载 visonsdk 3.08

    root@dra7xx-EVM:~# ls -la /usr/lib/libgbm.so
    lrwxrwxrwx 1 root 根 2018年9月22日17日/usr/lib/libgbm.so -> libgbm.so.1.17.4948957 

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

    尊敬的客户。

    请您澄清一下您是如何做到这一点的? 例如、哪些库/config 文件。 清晰的步骤对我们来说是很好的。

    "我们从本地 FAE 复制 psdkla 6.03中的 qt5.11 "

    非常感谢!

    Yong

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

    您好!

    您能否尝试以下操作:

     -从处理器 SDK Linux Automotive 6.00.03获取所有 qtbase* IPK,然后在 VISION SDK 3.08上安装这些 ipks

    现在尝试使用 eglfs 运行 qt 示例。

    我们尝试了这种方法、似乎起作用了。

    此致

    Hemant

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

    您好 Hemant:

     感谢您的回复、可能这里有一些错误。

    1. QT 在 Weston 和 eglfs 上都运行良好

    2.对于 YUV 纹理、我们需要启动另一个 EGL 上下文以创建 KHRImg 并将 YUV 数据映射到纹理中。 这在使用 Weston 时效果良好、但不适用于 eglfs。

    因此、这可能不是 QT 的问题。

    在另一个难题上、是否有另一种解决方案、我们可以将 YUV 数据映射到纹理中、而无需启动另一个 EGL 上下文?

    谢谢。

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

    您好!

    您能进行快速测试吗? 您能否将/dev/dri/renderD128用作 DRM 器件而不是/dev/dri/card0?

    请告诉我们这是否可行。

    如果不是、您能否通过 qt 项目和 YUV 测试提供简单代码?

    此致

    Hemant

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

    您好!

    您能否尝试使用/dev/dri/card1和/dev/dri/card2而不是/dev/dri/card0? 我们没有看到这些错误、但需要知道渲染是否正常。

    此致

    Hemant

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

    您好 Hemant:

    以下是使用 QT+Weston 在 kmscube.c 中更改不同器件的结果

    /dev/dri/card1
    编码器(28):未找到 CRTC!
    连接器(29):无编码器!
    未连接连接器!
    无法初始化 DRM
    
    /dev/dri/card2
    没有连接的连接器!
    无法初始化 DRM
    
    /dev/dri/renderD128
    drmModeGetResources 失败:权限被拒绝
    无法初始化 DRM 

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

    您好!

    我们对此进行了研究、误差是预期的行为。 这是因为当您使用 eglfs 时、有 GBM EGL 已经被 QT 初始化。 在 kmscube 代码中、您可以在同一显示器上创建新的 GBM 设备、并在该设备上调用 eglInitialize。 这就是为什么 eglInitialize 失败的原因。

    我们可能需要更详细地了解您的要求、但首先、我们能否为 eglfs 建议这种方法:

    1.在 kmscube 中使用 omapdrm (/dev/dri/card1)并在其中创建一个 GBM 器件

    2.不是创建曲面,而是从该设备创建缓冲对象

    3.使用/dev/dri/card0创建另一个 GBM 器件并在该器件中导入曲面?

    请查找随附的一些示例修改。 您可以尝试一下吗? 请注意、这只是为了提供指导、可能需要根据您的用例进行修改。

    此致

    Hemant

    e2e.ti.com/.../qt_2D00_opengl_2D00_surface_5F00_import.tar.gz

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

    您好 Hemant:

     感谢您的更新!

      [引用 user="Hemant Hariyani]HIS 是因为当您使用 eglfs 时、GBM EGL 已经由 QT 初始化。 在 kmscube 代码中、您可以在同一显示器上创建新的 GBM 设备、并在该设备上调用 eglInitialize。 这就是为什么 eglInitialize 失败的原因。

     众所周知、我们使用 YUV 外转和 GL_T纹 理_EXTERNAL_OES 进行 GPU 渲染。 在 QT 中,我们无法找到调用 eglCreateImageKHR()以将 YUV 映射为文本的方法,我们必须启动另一个 EGL 上下文。

    [引用 user="Hemant Hariyani">请查找随附的一些样本修改。 您可以尝试一下吗?

     好的、我们正在处理它、稍后更新。