跳转至

MI FB DEBUG SOP


REVISION HISTORY

Revision No.
Description
Date
1.00
  • Initial release
  • 12/08/2023
    1.01
  • 添加 Pattern模式、带宽调试 及 “水线值”介绍
  • 12/10/2024

    1. 名词解释

    • disp_path

      MI_FB直接在DISP模块上显示UI和硬件鼠标的方式,FB的图像能够直接通过DISP模块输出到屏幕上,该方式适用于DISP支持GOP硬件的芯片。

    • video_path

      MI_FB通过MI_RGN将FB的画面间接叠加到RGN支持贴OSD的模块上(SCL/VENC/DISP等),该方式适用于用户想以Framebuffer的方式叠加画面到视频流上或者DISP不支持GOP硬件的芯片。

    • 像素alpha值

      不同颜色格式的像素的alpha分量计算方式不同。MI_FB中的alpha值越小代表越透明,0代表完全透明,最大值代表完全不透明(ARGB1555格式需要是例外)。

      • RGB格式(例如RGB565)像素所有的alpha值默认为255。

      • ARGB格式(例如ARGB8888、ARGB4444、ARGB1555)像素alpha值需要参考像素中alpha分量的bits。ARGB8888像素的alpha分量占bit[24:31]共8bits,取值范围是0-255;ARGB4444像素的alpha分量占bit[12:15]共4bits,取值范围是0-15;ARGB1555像素的alpha分量占bit[15]共1bit,取值范围是0-1,bit[15] = 0的像素实际像素alpha值等于alpha属性中"alpha0"的值,bit[15] = 1的像素实际像素alpha值等于alpha属性中"alpha1"的值。

      • Index格式(例如I2、I4、I8)像素值只存储了Index,具体的ARGB值需要查表"Cmap"("video_path"时,FB 的Cmap不能设置,用户需要设置MI_RGN的palette table来替代)来确定,"Cmap"中的格式为ARGB8888,其中alpha分量有8bits,取值范围是0-255。

    • 水线值

      GOP硬件使用DMA FIFO来缓存MIU返回的数据,并从DMA FIFO中读数据去显示。FIFO中缓存的数据默认有一个阈值,称为“水线值”。 当FIFO中剩余的数据小于等于“水线值”时,GOP硬件会再次向MIU发请求,获得新的数据。正常显示情况下无需调整“水线值”。

      • “水线值”越大,FIFO 中数据不易被取空,UI不易显示错位/闪烁。

      • “水线值”越小,FIFO 中数据容易被取空,UI容易显示错位/闪烁。

    2. FB常见问题

    2.1. mi_fb.ko加载失败

    • 确认问题步骤:

      1. 查看加载mi_fb.ko失败的日志,确认失败类型:

        (1). 日志:insmod: can't insert '/xxx/mi_fb.ko': unknown symbol in module or invalid parameter

        (2). 日志:Must support at least one disp path, please check memuconfig config

        (3). 日志:parsing ini config failed

    • 出现"unknown symbol"日志的原因

      缺少mi_fb.ko依赖,需要进一步获取Linux的kmsg的log才能知道具体缺少那些依赖。cat /proc/kmsg

      缺少symbol类型 示例 原因 解决方式
      Linux framebuffer框架 register_framebufferframebuffer_alloc ... Linux framebuffer框架被编译成模块(fb.ko)并且fb.ko没有在mi_fb.ko之前加载。 加载mi_fb.ko之前先加载fb.ko或者把Linux framebuffer框架编译进内核里。
      DISP MHAL_DISP_DeviceGetInstanceMHAL_DISP_DeviceGetDisplayInfo ... 没有先加载mi_disp.ko。 加载mi_fb.ko之前先加载mi_disp.ko;或者关闭fb的"disp_path"(如果用户不需要在DISP模块上显示FB UI)。
      RGN mi_rgn_GetWinInstanceMHAL_RGN_GetInternalApis 没有先加载mi_rgn.ko。 加载mi_fb.ko之前先加载mi_rgn.ko;如果只提示缺少mi_rgn_GetWinInstance且用户不需要在DISP以外的模块上显示FB UI,可以选择关闭fb的"video_path"。
    • 出现"please check menuconfig config"日志的原因

      编译MI_FB时"disp_path"和"video_path"都没有打开。MI_FB要求编译时必须至少打开"disp_path"或"video_path"中的一个选项。

    • 出现"parsing ini config failed"日志的原因

      MI_FB的配置文件config.json不存在或者配置失败。请用户检查配置文件,如有需要可联系FAE协助.

    2.2. FB UI不显示

    • 确认问题步骤:

      EXP:MI_FB /dev/fb0 UI没有显示出来。

      1. 获取FB proc信息(cat /proc/mi_modules/mi_fb/mi_fbX "X即fb设备的副设备号"),以下是部分内容。

        从以上proc信息可以看出:

        1. "xres"、"yres"、"xres_virtual"、"yres_virtual"、"xoffset"、"yoffset"等属性确认UI的宽高分别为1024x600,且UI显示的内容在整张framebuffer的[0, 0]位置。

        2. "Show"属性为TRUE,如果该属性为FALSE时FB UI不会显示。

        3. "colorFmt"属性为I8,代表UI的颜色格式为Index-8格式,确定像素的颜色和透明度需要结合MI_FB设定的Cmap("video_path"的Cmap由MI_RGN API MI_RGN_Init的参数确定)。

        4. "Alpha Info"中"Channel"属性为1,代表透明模式为像素模式;"Invert"为0,代没有打开透明反转。如果像素的alpha分量为0,FB UI就不会显示。

        5. "ColorKey Info"属性的"Enable"为0,代表没有使能ColorKey功能。如果使能了ColorKey且指定的颜色与FB UI像素的颜色一致,那部分像素就不会显示。

      2. 保存framebuffer到文件

        cmd cp /dev/fbX [path]/[file name]

        执行完后会在指定的[path]路径下生成名为[file name]的文件,推荐使用软件《7yuv》打开文件查看画面。如果用户没有把UI画到framebuffer的正确区域UI是无法正常显示的,如果UI像素对应的alpha分量最后表达的透明值为0(透明值接近0是UI也可能看不清楚),那么UI就不会显示出来。

    • 出现UI不显示的原因

      proc信息 原因 解决方式
      "xres"、"yres"、"xres_virtual"、"yres_virtual" 框定的区域尺寸不符合用户预期。 如果用户不会调用ioctl FBIOPAN_DISPLAYFBIOPUT_VSCREENINFOFBIOSET_DISPLAYLAYER_ATTRIBUTES去修改framebuffer屏幕尺寸,那么需要用户去修改MI_FB的配置文件config.json中的"fb_width"和"fb_height"("xres"和"xres_virtual"的默认值为"fb_width","yres"的默认值为"fb_height","yres_virtual"不小于"yres");如果用户会在打开fb之后去修改屏幕尺寸,需要用户去检查参数是否有误。
      "xoffset"、"yoffset" 可见屏幕偏移位置不在用户更新framebuffer的位置。 需要用户确认调用ioctl FBIOPAN_DISPLAY的参数是否有误。
      "Show" UI显示属性为FALSE。 需要用户确认调用ioctl FBIOSET_SHOW的参数是否有误。可以通过echo命令快捷修改(cmd echo SHOW GUI [enable] > /proc/mi_modules/mi_fb/mi_fbX)
      "colorFmt"和"Alpha Info" 像素alpha属性最终表达值接近0。 这类情况需要结合用户保存的framebuffer文件一起分析(参考步骤2)。"Channel"属性为1时,透明模式为像素模式,该模式下用户需要确认每个像素的像素alpha值(参考本文"1. 名词解释"中"像素alpha值");"Channel"为0时,透明模式为全局模式,该模式下用户需要确认"GlobalAlphaValue"的值。然后确定透明反转的属性,如果"Invert"属性为1,代表打开了透明反转,实际透明值 = 255 - 当前透明值。最后计算出的实际透明值如果接近0,FB UI将不显示。如果确定是该原因,用户需要调整alpha属性(全局模式 cmd echo GLOBAL_ALPHA GUI [GlobalAlpha] > /proc/mi_modules/mi_fb/mi_fbx。像素模式且颜色格式为ARGB1555时 cmd echo ALPHA01 GUI [alpha0] [alpha1] > /proc/mi_modules/mi_fb/mi_fbX)或者UI的alpha分量。
      "ColorKey Info" ColorKey使能且指定的颜色与用户UI的颜色一致(一般是UI部分消失)。 关闭colorkey功能(cmd echo COLORKEY GUI 0 0 0 0 > /proc/mi_modules/mi_fb/mi_fbX),或者调整colorkey指定的颜色(cmd echo COLORKEY GUI 1 [R] [G] [B] > /proc/mi_modules/mi_fb/mi_fbX)或者UI的颜色。

    2.3. FB UI颜色异常

    • 确认问题步骤:

      1. 获取FB proc信息(cat /proc/mi_modules/mi_fb/mi_fbX "X即fb设备的副设备号"),以下是部分内容。

        从"colorFmt"属性可以看出FB的颜色格式为"I8",如果用户设定cmap没有成功UI显示的颜色就会不对(仅颜色格式为"I8"会有该类问题)。

    • 出现问题的原因

      1. 用户没有使用正确颜色格式的UI。

      2. cmap设定没有成功。("video_path"时,FB 的Cmap不能设置,用户需要设置MI_RGN的palette table来替代)

      3. config.json 配置项中 "fb_hwlayer_dst" 和 "fb_hwlayer_outputcolor" 不匹配。

        (1). 默认 DISP 视频层只开启第一个颜色空间转换单元,此时需确认 "fb_hwlayer_outputcolor = 0" 即可。

        (2). 若 DISP 视频层只开启第二个颜色空间转换单元,此时需满足条件:

        a. "fb_hwlayer_dst = 3" 且 "fb_hwlayer_outputcolor = 1"

        b. "fb_hwlayer_dst = 12" 且 "fb_hwlayer_outputcolor = 0"