Edit online

调试指南

4 Dec 2024
Read time: 10 minute(s)

如无特殊说明,本节描述的 DE 驱动表示显示模块的驱动,包含显示引擎模块、显示接口模块以及 LCD 的 panel 驱动,并非仅指示显示引擎。

关于本节涉及的 Component、CMA 和 DMA-BUF 的详细设计描述,可查看设计说明

打开 DE 调试开关

Luban 根目录下执行 make linux-menuconfig,进入 kernel 的功能配置,打开 DE 模块的 DEBUG 选项:
Linux
    Kernel hacking
        ArtInChip Debug
            [*] DE driver debug
打开 DEBUG 选项后:
  • 驱动以-O0 编译。

  • pr_dbg()dev_dbg() 调试信息会被编译。

    在系统运行时,如果要打印 pr_dbg()dev_dbg() 信息,还需要调整 loglevel 为 8,可以通过以下两种方式实现:
    • board.dts 中修改 bootargs,增加 “loglevel=8”

    • 在板子启动到 Linux Shell 后,执行下列命令:
      echo8 > /proc/sys/kernel/printk

打开 CMA 调试开关

在 Luban 根目录下执行 make kernel-menuconfig,进入 kernel 的功能配置界面,打开 CMA 框架的 DEBUG 选项:

Linux
     Memory Management options
         [*]   CMA debug messages (DEVELOPMENT)
         [*]   CMA debugfs interface

打开 DEBUG 选项后:

  • CMA 框架中 pr_debug() 调试信息会被编译

  • debugfs 中会添加 cma 结点

查看组件注册信息

通过以下命令查看组件的注册信息:
mount -t debugfs none /sys/kernel/debug/
cat /sys/kernel/debug/device_component/soc:display-fb
组件信息输出示例如下:
master name                                            status
-------------------------------------------------------------
soc:display-fb                                          bound

device name                                            status
-------------------------------------------------------------
98a00000.de                                             bound
98800000.rgb                                            bound
panel0                                                  bound

如果 bound 失败,控制台输出将显示 not bound,如下所示:

master name                                            status
-------------------------------------------------------------
soc:display-fb                                      not bound

device name                                            status
-------------------------------------------------------------
18a00000.de                                         not bound
18800000.rgb                                        not bound
(unknown)                                      not registered

调试 CMA

在 menuconfig 配置中使能 CMA debug 开关后,通过 debugfs 调试 CMA。

mount -t debugfs none /sys/kernel/debug/
ls /sys/kernel/debug/cma/cma-reserved/
alloc          bitmap         free           order_per_bit
base_pfn       count          maxchunk       used
CMA 调试接口
  • alloc:申请 cma 内存,以 page 为单位

  • free:释放 cma 内存,以 page 为单位

  • base_pfn:cma 内存起始页框号

  • count:cma 总 page 数

  • maxchunk:cma 最大连续 page 数

  • order_per_bit:每个 bit 代表 2 ^ order_per_bit 个 page

  • bitmap:记录 cma page 使用情况的位图。1 表示占用,0 表示空闲

  • 查看 CMA page 使用情况:
    • cat /sys/kernel/debug/cma/cma-reserved/bitmap
      输出结果示例:
      4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295
      4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295
      4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295
      4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295
      4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295 4294967295
      4294967295 4294967295 2097151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
      0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    • cat /sys/kernel/debug/cma/cma-reserved/count
      8192
    • cat /sys/kernel/debug/cma/cma-reserved/used
      1525
    • cat /sys/kernel/debug/cma/cma-reserved/base_pfn
      548864
    • cat /sys/kernel/debug/cma/cma-reserved/order_per_bit
      0
    sysfs 的 meminfo 结点亦可查看 CMA 的使用情况:
    cat /proc/meminfo
    输出结果示例如下,已省略无关信息:
        ...
        CmaTotal:          32768 KB
        CmaFree:           29068 KB
    注: CmaFree 中记录的信息并不准确,推荐使用 debugfs 中 cma 节点的 bitmap 来查看 cma page 的使用情况。
  • 手动申请 100 个 page

    echo 100 >  /sys/kernel/debug/cma/cma-reserved/alloc
  • 手动释放 100 个 page
    echo 100 >  /sys/kernel/debug/cma/cma-reserved/free

查看 DMA-BUF 使用情况

debugfs 中查看当前 DMA-BUF 的使用情况:

mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/dma_buf/bufinfo

dma_buf

查看 /dev/fb 信息

  1. 在 sysfs 中列示所有 /dev/fb 相关信息:
    ls /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/ -l
    输出结果示例如下:
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 bits_per_pixel
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 blank
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 console
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 cursor
    -r--r--r--    1 root     root          4096 Jan  1 00:01 dev
    lrwxrwxrwx    1 root     root             0 Jan  1 00:01 device -> ../../../soc:display-fb
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 mode
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 modes
    -r--r--r--    1 root     root          4096 Jan  1 00:01 name
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 pan
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 rotate
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 state
    -r--r--r--    1 root     root          4096 Jan  1 00:01 stride
    lrwxrwxrwx    1 root     root             0 Jan  1 00:01 subsystem -> ../../../../../../class/graphics
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 uevent
    -rw-r--r--    1 root     root          4096 Jan  1 00:01 virtual_size
  2. 根据需求,查看具体信息。查看信息的命令和部分输出示例如下所示:
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/bits_per_pixel
      输出示例:
      32
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/blank
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/console
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/dev
      输出示例:
      29:0
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/mode
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/pan
      输出示例:
      0,0
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/name
      输出示例:
      aicfb0
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/stride
      输出示例:
      3200
    • cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/virtual_size
      输出示例:
      800,480

查看 Display Engine 信息

在 sysfs 中查看当前 Display Engine 的相关信息,包括 Video Layer、UI Layer、UI Rectangle、Tearing-effect、Display Dither、Display Timing、Display Pixelclock :
cat /sys/devices/platform/soc/18a00000.de/debug/display
输出示例如下:
Video Layer Enable       : 0
Video Layer Format       : 0
Video Layer Input Size   : 0 x 0
Video Layer Stride       : 0 0
Scaler Output Size       : 0 x 0
UI Layer Control         : format: 0, color key1: 0, alpha2: 1
UI Layer Input Size      : 1024 x 600
UI Layer Color Key3       : 0
UI Layer Alpha           : mode: 0, g_alpha: 255
UI Rectangle Control     : 1 0 0 0
UI Rectangle Size        : (1024, 600) (0, 0) (0, 0) (0, 0)
UI Rectangle Offset      : (0, 0) (0, 0) (0, 0) (0, 0)
UI Rectangle Stride      : 4096 0 0 0
Tearing-effect           : TE mode: 0, TE pulse width: 0
Display Dither           : dither_en: 0, red depth: 0, green depth: 0, blue depth: 0
Display Timing           : hactive: 1024, vactive: 600 hfp: 160 hbp: 140 vfp: 20 vbp: 12 hsync: 20 vsync: 3
Display Pixelclock       : 60000000 HZ

调试 DE Color bar 模式

在 sysfs 中使用 Display Engine 的 Color Bar 模式进行调试:
  • 开启 Color Bar
    echo 1 >  /sys/devices/platform/soc/18a00000.de/debug/color_bar
  • 关闭 Color Bar
    echo 0 >  /sys/devices/platform/soc/18a00000.de/debug/color_bar

获取 Framebuffer 截图

  1. 拷贝 /dev/fb0 裸数据。
    cp /dev/fb0 fb0.bgra
  2. 使用 ADB pull 将 fb0.bgra 文件传输到 PC 上,并使用 RawViewer 软件查看。

    RawViewer 软件可在其官网免费下载。
    注:

    使用 RawViewer 查看 fb0.bgra 文件,需要手工设置数据源的宽高,在开启双 buffer 的场景下,需要将高度 * 2。

1 表示 enable / disable 状态
2 表示 enable / disable 状态
3 表示 color value