调试指南
如无特殊说明,本节描述的 DE 驱动表示显示模块的驱动,包含显示引擎模块、显示接口模块以及 LCD 的 panel 驱动,并非仅指示显示引擎。
关于本节涉及的 Component、CMA 和 DMA-BUF 的详细设计描述,可查看设计说明。
打开 DE 调试开关
Linux
Kernel hacking
ArtInChip Debug
[*] DE driver 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
-
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
查看 /dev/fb 信息
-
在 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
- 根据需求,查看具体信息。查看信息的命令和部分输出示例如下所示:
-
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 信息
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 模式
-
开启 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 裸数据。
cp /dev/fb0 fb0.bgra
-
使用 ADB pull 将 fb0.bgra 文件传输到 PC 上,并使用 RawViewer 软件查看。
RawViewer 软件可在其官网免费下载。注:使用 RawViewer 查看 fb0.bgra 文件,需要手工设置数据源的宽高,在开启双 buffer 的场景下,需要将高度 * 2。