Edit online

调试指南

DE 调试开关

Luban 根目录下执行 make linux-menuconfig,进入 kernel 的功能配置,打开 DE 模块的 DEBUG 选项:
Linux
    Kernel hacking
        Artinchip Debug
            [*] DE driver debug
Drivers options  --->
    Drivers debug  --->
        [*] Enable Display driver debug
此 DEBUG 选项打开的影响:
  1. DE 驱动以-O0 编译

  2. DE 驱动的 pr_dbg()和 dev_dbg()调试信息会被编译

在系统运行时,如果要打印 pr_dbg() 和 dev_dbg() 信息,还需要调整 loglevel 为 8,两个方法:
  1. 在 board.dts 中修改 bootargs,增加 “loglevel=8”

  2. 在板子启动到 Linux shell 后,执行命令:
    echo8 > /proc/sys/kernel/printk
    
注:

如无特殊说明,本文档中的 DE 驱动表示显示模块的驱动,包含显示引擎模块,显示接口模块,LCD 的 panel 驱动。并非仅仅指示显示引擎。

CMA 调试开关

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

LinuxMemoryManagementoptions[*]CMAdebugmessages(DEVELOPMENT)[*]CMAdebugfsinterface

这两个 DEBUG 选项打开的影响:

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

  2. debugfs 中添加 cma 结点

Component

查看 Component 的注册信息,

# 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 失败,控制台输出如下:

# cat /sys/kernel/debug/device_component/soc\:display-fb
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 使用情况:

# cat /sys/kernel/debug/cma/cma-reserved/bitmap4294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729542949672954294967295429496729520971510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000# cat /sys/kernel/debug/cma/cma-reserved/count8192# cat /sys/kernel/debug/cma/cma-reserved/used1525# cat /sys/kernel/debug/cma/cma-reserved/base_pfn548864# cat /sys/kernel/debug/cma/cma-reserved/order_per_bit0

手动申请 100 个 page

# echo 100 >  /sys/kernel/debug/cma/cma-reserved/alloc

手动释放 100 个 page

# echo 100 >  /sys/kernel/debug/cma/cma-reserved/free

sysfs 的 meminfo 结点亦可查看 CMA 的使用情况(为节省篇幅,已省略无关信息):

# cat /proc/meminfo
    ...
    CmaTotal:          32768 KB
    CmaFree:           29068 KB
注:

CmaFree 中记录的信息并不准确,推荐使用 debugfs 中 cma 节点的 bitmap 来查看 cma page 的使用情况。

DMA-BUF

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

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

../images/dma_buf.png

注:

Component, CMA,DMA-BUF 相关概念在后续设计说明章节会有补充介绍。

/dev/fb

在 sysfs 中查看 /dev/fb 的一些信息:

# ls /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/ -l
-rw-r--r--    1 root     root          4096 Jan  100:01 bits_per_pixel
-rw-r--r--    1 root     root          4096 Jan  100:01 blank
-rw-r--r--    1 root     root          4096 Jan  100:01 console
-rw-r--r--    1 root     root          4096 Jan  100:01 cursor
-r--r--r--    1 root     root          4096 Jan  100:01 dev
lrwxrwxrwx    1 root     root             0 Jan  100:01 device -> ../../../soc:display-fb
-rw-r--r--    1 root     root          4096 Jan  100:01 mode
-rw-r--r--    1 root     root          4096 Jan  100:01 modes
-r--r--r--    1 root     root          4096 Jan  100:01 name
-rw-r--r--    1 root     root          4096 Jan  100:01 pan
-rw-r--r--    1 root     root          4096 Jan  100:01 rotate
-rw-r--r--    1 root     root          4096 Jan  100:01 state
-r--r--r--    1 root     root          4096 Jan  100:01 stride
lrwxrwxrwx    1 root     root             0 Jan  100:01 subsystem -> ../../../../../../class/graphics
-rw-r--r--    1 root     root          4096 Jan  100:01 uevent
-rw-r--r--    1 root     root          4096 Jan  100:01 virtual_size
# cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/bits_per_pixel32# 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/dev29:0
# cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/mode# cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/pan0,0
# cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/name
aicfb0
# cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/stride3200# cat /sys/devices/platform/soc/soc\:display-fb/graphics/fb0/virtual_size800,480

Display Engine

在 sysfs 中查看当前 display engine 的一些信息:

# 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       : 00
Scaler Output Size       : 0 x 0
UI Layer Control         : format: 0, color key: 0, alpha: 1
UI Layer Input Size      : 1024 x 600
UI Layer Color Key       : 0
UI Layer Alpha           : mode: 0, g_alpha: 255
UI Rectangle Control     : 1000
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      : 4096000
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
注:

UI Layer Control 中的 color key 和 alpha 表示 enable / disable 状态。 UI Layer Color Key 才表示 color value。

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 截图

拷贝 /dev/fb0 裸数据,使用 RawViewer 查看

# cp /dev/fb0 fb0.bgra

使用 ADB pull fb0.bgra 文件,在 PC 上使用 RawViewer 软件查看。

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

注:

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