高通 Q+A Hypervisor系统,显示方案涵盖了 高通QDI + WFD,QNX screen,Android surface等框架,整体还是比较麻烦的,有时间再针对各个框架做下整理和总结。
下面先简单整理了下显示相关的调试命令。
1. 调试 - 屏幕 - Android系统
1.1 调试 - 屏幕 - 截屏 - screencap
Android系统的截屏命令
$ adb shell screencap /sdcard/capture/screen1.png
$ adb pull /sdcard/capture/screen1.png .
1.2 调试 - 屏幕 - 显示系统相关内容dump
当主机发生黑屏并且系统处于运行状态的情况下,可借助人为触发方式(硬按键、中控特殊touch手势、诊断等)主动触发Android截屏显示相关log
$ adb dumpsys window windows
$ adb dumpsys activity activities
$ adb dumpsys SurfaceFlinger
$ adb dumpsys display
$ adb dumpsys input
1.3 调试 - 屏幕 - DumpLayer
#!/bin/bash
adb root
adb remount
adb shell
mkdir /data/misc/display/
vndservice call display.qservice 21 i32 10 i32 7 i32 3
最后把“/data/misc/display/” 用adb pull命令上传到本地
PS:该命令有即时性,必须在问题发生时dump
2. 调试 - 屏幕 - QNX系统
2.1 调试 - 屏幕 - 截屏 - screenshot
QNX系统的截屏命令
screenshot Options:
-size=[width]x[height] Sets the dimension of the screenshot
-pos=[x],[y] Sets the starting position of the capture region
-display=[str] The display to acquire
-file=[str] Sets target screenshot file name, Default is
"screenshot.bmp"
-verbose or -v Enable extra information messages on stdout
-format=[str] Sets target format. Default is rgbx8888.
$ screenshot -display=1 -file=dpy1.png
$ screenshot -display=2 -file=dpy2.png
默认不带路径,存于“/”下
2.2 调试 - 屏幕 -保存QNX screen log
QNX系统/dev/screen目录下保存了qnx侧显示应用使用screen框架包含的各种信息,比如display windows buffer等
$ tar -zcvf /var/log/screen.tar.gz.log $(find /dev/screen/ -type f)
2.3 调试 - 屏幕 -保存QNX display framebuffer
保存经DPU合成后的framebuffer,用以判断DPU是否正常
$ echo surfacedump=0xFF > /dev/displaylog
2.4 调试 - 屏幕 -保存DPU 相关寄存器log
保存DPU相关寄存器的配置,用以判断DPU是否正常
$ echo rd=1 > /dev/displaylog
cp /tmp/displog_register_dump /var/log/displog_register_dump.log
2.5 调试 - 屏幕 -screencmd命令解析
命令解读
修改screen对象的属性。一个程序在创建screen组件完成后,screen进程会将程序设置的一些信息输出在/dev/screen/process name/win-id文件中,cat /dev/screen/process name/win-id 后会看到screen的相关信息。
$ screencmd
如:
screencmd setcv grp-11 SCREEN_PROPERTY_NAME "My Group Name"
screencmd setiv win-1 SCREEN_PROPERTY_BUFFER_SIZE 100,100
screencmd setpv win-1 SCREEN_PROPERTY_ALTERNATE win-2
screencmd setllv dpy-1 SCREEN_PROPERTY_IDLE_TIMEOUT 1234
screencmd setgp win-1 "My Group Name"
screencmd apply
[cmd]:
表示要应用于属性的值的类型,取决于你想要设置的属性。
命令 | 属性值类型/格式 |
setcv | 想要设置一个字符串属性 |
setgp | 对象应该加入的组的名称 |
setiv | 要将属性设置为的整数或以逗号分隔的整数列表。(例如,1280,760) |
setllv | 要将属性设置为的长整数。 |
setpv | 要将属性设置为的屏幕对象。指定对象的方法与指定对象参数的方法相同。 |
[Objects (obj)]:
指定要改变属性的目标对象,通过<对象类型前缀>-的形式指定对象。对象类型的ID可以通过查看屏幕调试文件来确定,例如/dev/screen/mem。screencmd支持以下Screen对象,并列出了它们的关联前缀:
比如一个window类型对象的ID为1,那么win-1就可以用来表示这个对象。
ctx-[int] to specify a context
dev-[int] to specify a device
dpy-[int] to specify a display
grp-[int] to specify a group
pix-[int] to specify a pixmap
ssn-[int] to specify a session
str-[int] to specify a stream
win-[int] to specify a window
[property]:
要应用于Screen对象的属性。screencmd支持每种对象类型的所有有效属性。
大小写不敏感,并且省略“SCREEN_PROPERTY_”也是可以的。
screencmd setiv win-1 SCREEN_PROPERTY_ZORDER(或ZORDER或zorder) 1
列表有:
命令 | 属性值类型/格式 |
id | screen窗口的唯一标识符,在创建窗口时生成,dpy-1表示窗口在display id 1上 |
permissions | 窗口权限 |
status | 显示状态 ,FULLY表示显示在显示屏上,VISIBLE表示是可见的,FULL表示全屏显示,INVISIBLE表示窗口隐藏 |
pipeline | 设置使用的pipeline |
name | 对象应该加入的组的名称,screencmd setcv grp-11 name "My Group Name" |
size | 设置对象的大小,screencmd setiv win-1 size 400,800 |
buffer_size | 设置buffer的尺寸,要将属性设置为的整数或以逗号分隔的整数列表。(例如,1280,760), screencmd setiv win-1 buffer_size 100,100 |
global_alpha | 设置透明度,screencmd setiv win-6 global_alpha 0 |
color | 设置背景色, |
zorder | 设置对象的窗口层级,screencmd setiv win-1 zorder 1 |
scale_mode | 设置scale模式 |
rotation | 设置图像翻转度数,screencmd setiv win-6 rotation 90 |
2.6 调试 - 屏幕 -screencmd命令实例
1. 首先查询对应的window ,比如ui_hmi对应的window为win-6
ls /dev/screen/ui_hmi
ui_hmictx-7 ssn-4 win-6 grp-0 str-5
2. 设置win-6的窗口大小为(500,500)
$ screencmd setiv win-6 size 500,500
3. 设置win-6窗口旋转 90度
$ screencmd setiv win-6 rotation 90
4. 设置win-6窗口的Z-ORDER为1000
$ screencmd setiv win-6 zorder 1000