K1 OH5.0 系统调试说明
修订记录
修订版本 | 修订日期 | 修订说明 |
001 | 2025-01-13 | 初始版本 |
002 | 2025-04-11 | 添加MUSE Pi Pro |
1. 调试工具和方法
1.1. 串口调试
可用,波特率 115200,直接使用即可,可以查看 uboot
,kernel
,OpenHarmony init
进程相关打印。
1.1.1. 调整串口打印等级
1.1.1.1. 仅本次启动有效
串口中执行如下命令即可:
echo 8 > /proc/sys/kernel/printk
1.1.1.2. 持续生效
主要通过修改 env_k1-x.txt
文件中的 loglevel
值来实现,有 2 种方式:
-
修改代码并编译固件,修改
device/board/spacemit/xxx/kernel/boot/bootfs/env_k1-x.txt
中loglevel
的值,重新编译固件并烧录即可 -
系统中直接修改,按照如下步骤进行:
- 挂载内核
# cd dev/block/
# ls
by-name loop5 mmcblk2p1 mmcblk2p3 mmcblk2p9 ram12 ram4
loop0 loop6 mmcblk2p10 mmcblk2p4 platform ram13 ram5
loop1 loop7 mmcblk2p11 mmcblk2p5 ram0 ram14 ram6
loop2 mmcblk2 mmcblk2p12 mmcblk2p6 ram1 ram15 ram7
loop3 mmcblk2boot0 mmcblk2p13 mmcblk2p7 ram10 ram2 ram8
loop4 mmcblk2boot1 mmcblk2p2 mmcblk2p8 ram11 ram3 ram9
#
# mount mmcblk2p5 /tmp
# cd /tmp
# ls
Image.itb bianbu.bmp env_k1-x.txt k1-x_ZT001H.dtb lost+found- 通过
hdc
拉出env_k1-x.txt
,修改后,再推入/tmp
文件夹
D:\>hdc file recv /tmp/env_k1-x.txt
FileTransfer finish, Size:134 time:23ms rate:5.83kB/s
D:\>hdc file send env_k1-x.txt /tmp/
FileTransfer finish, Size:134, File count = 1, time:8ms rate:16.75kB/s- 取消挂载内核,重启即可生效
# unmount /tmp
# reboot
1.1.2. 串口连接方式
1.1.2.1. MUSE Paper
MUSE Paper 可以通过 TF 卡口来引出串口,需要单独购买配件,如下:
将 TF 卡槽拿出来,将上面配件插入即可,上面配件的金手指朝向桌面。
1.1.2.2. MUSE Pi & MUSE Card
MUSE Pi 和 MUSE Card 开发板上面有明显的串口连接标识 (GND/RX/TX)
,按线序连接即可。
1.1.2.3. MUSE Pi Pro
1.1.2.4. MUSE Book
1.2. hdc
hdc
类似 android
的 adb
,支持 usb
和 tcp
这 2 种连接模式,使用 tcp
模式,端口默认设置为 55555
。配置文件为 device/board/spacemit/xxx/cfg的default.para
,如下所示:
persist.hdc.mode=usb,tcp
persist.hdc.port=55555
1.2.1. 主机支持 hdc
1.2.1.1. windows 系统
windows 系统将 hdc.exe(点我下载)放在特定目录,并设置环境变量路径。
1.2.1.2. ubuntu 系统
-
安装依赖项:打开终端,输入以下命令来更新软件包列表并安装必要的开发工具和库
sudo apt-get update
sudo apt-get install build-essential libstdc++6 libc++1· -
下载 HDC 工具包:前往 OpenHarmony 官网下载适用于 Linux 平台的最新版 HDC 工具压缩包。将其放置于合适位置后进行解压操作,请根据实际情况调整解压路径
tar -zxvf hdc_std_<version>_linux.tar.gz -C /opt/hdc/
-
设置环境变量:编辑用户的 shell 初始化脚本(如
.bashrc
),添加以下行至文件末尾:export PATH=$PATH:/opt/hdc/bin
source ~/.bashrc -
验证安装成功与否:在新的终端窗口里尝试运行简单的帮助指令以确认一切就绪,如果能够看到详细的帮助文档,则表明整个过程顺利完成
hdc help
1.2.2. hdc 连接
1.2.2.1. 网络连接
需确保 hdc 的服务端和客户端在同一个局域网内,连接方式如下:
D:\>hdc tconn 10.0.90.142:55555
Connect OK
D:\>hdc shell
#
1.2.2.2. usb 连接
D:\>hdc list targets
0123456789ABCDEF
D:\>hdc shell
#
1.2.2.3. 多设备连接
通过 -t
参数指定设备即可,如下:
D:\>hdc list targets
0123456789ABCDEF
ABCDEF
D:\>hdc -t 0123456789ABCDEF shell
#
1.2.3. hdc 常用命令
命令 | 用途 |
hdc list targets | 查看当前所有设备 |
hdc shell reboot | 重启 |
hdc uninstall com.example.myapp | 卸载hap包 |
hdc install -r xxx.hap | 重新安装hap包 |
hdc shell aa start -a EntryAbility -b com.example.myapp | 启动hap |
hdc file recv /xxx D:/ | 从小机copy文件到本地 |
hdc file send D:/xxx /data/ | 发送本地文件到小机 |
hdc start -r | 重启服务端 |
1.2.4. 各设备的 hdc 连接口
1.2.4.1. MUSEPaper&MUSEPaper2
1.2.4.2. MUSEPi
1.2.4.3. MUSECard
1.2.4.4. MUSEBook
1.2.4.5. MUSEPiPro
1.3. hilog
1.3.1. 基本使用方法
hilog 类似于 android 的 logcat,基本使用方法如下:
hilog
hilog -r
1.3.2. 常用命令
命令 | 用途 | 示例 |
hilog -h | 获取帮助 | |
hilog -t app|core|kmsg|init | - 阻塞式实时查询模块日志 - 可以与其他参数同时使用 | hilog -t core |
hilog -t app|core|kmsg|init -x | - 非阻塞式实时查询模块日志 - 可以与其他参数同时使用 | hilog -t core -x |
hilog -T <tag> | - 模块内指定tag - 可以与其他参数一起使用 | hilog -T Launcher_Default |
hilog -L D|I|W|E|F | - 指定level查询 - D:debug, I:info, W:warning, E:error, F:fatal | hilog -L I |
hilog -D <domain> | - 日志的服务域,用于指定输出日志所对应的业务领域 - 这是一个十六进制整数,范围从 0x0 到 0xFFFFF。 - 建议使用0xAAABB格式,AAA表示子系统,BB表示模块 - 指定domian查询 - 可以与其他参数一起使用 | hilog -D 0x0 |
^ | - 排除 | hilog -t ^app -T ^BatteryThread |
1.3.3. 日志落盘
日志落盘意思就是将日志保存到文件中,导出来进行查看。
命令 | 用途 |
hilog -w start [-f "xxx"] [-l <length>] [-j <jobid>] [-m <algorithm>] [-n <number>] | 启动落盘任务 |
hilog -w query [-j <jobid>] | 查询落盘任务 |
hilog -w stop [-j <jobid>] | 停止落盘任务 |
示例如下:
# hilog -w query
#
#hilog -w start -f "hilog" -l 66k -j 222 -m zlib -n 2
Persist task [jobid:222] started successfully
#cd /data/log/hilog
# ls -al
total 100
drwxr-x--- 2 logd log 4096 1970-01-02 03:34 .
drwxrwx--- 6 system log 4096 1970-01-01 00:38 ..
-rw-r----- 1 logd system 65540 1970-01-02 03:34 .persisterInfo_222
-rw-r----- 1 logd system 132 1970-01-02 03:34 .persisterInfo_222.info
-rw-r----- 1 logd system 12239 1970-01-02 03:34 hilog.002.19700102-033431.gz
-rw-r----- 1 logd system 6883 1970-01-02 03:34 hilog.003.19700102-033431.gz
#
# hilog -w query -j 222 #指定jobid查询
222 core,app zlib /data/log/hilog/hilog 67584 2
#
# hilog -w query #查询全部落盘任务
222 core,app zlib /data/log/hilog/hilog 67584 2
#
# hilog -w stop -j 222
Persist task [jobid:222] stopped successfully
#
# ls -al
total 36
drwxr-x--- 2 logd log 4096 1970-01-02 03:35 .
drwxrwx--- 6 system log 4096 1970-01-01 00:38 ..
-rw-r----- 1 logd system 12239 1970-01-02 03:34 hilog.002.19700102-033431.gz
-rw-r----- 1 logd system 13000 1970-01-02 03:35 hilog.003.19700102-033431.gz
1.4. hidumper
hidumper 是 OpenHarmony 中为开发、测试人员,IDE 工具提供统一的系统信息获取工具,帮助使用者分析,定位问题。
命令 | 用途 |
hidumper -h | 获取帮助 |
hidumper --cpuusage [pid] | 查看某个进程的cpu占用信息 |
hidumper --mem [pid] | 查看某个进程的内存占用情况 |
hidumper --cpufreq | 查看cpu的频率 |
hidumper --storage | 查看存储情况 |
hidumper --net | 查看网络情况 |
1.5. 参数管理
命令 | 用途 |
param -h | 获取帮助 |
param ls -r | 查看所用系统参数 |
param ls -r persist.sys.hilog.debug.on | 查看系统参数 |
param get persist.sys.hilog.debug.on | 获取系统参数 |
param set persist.sys.hilog.debug.on true | 设置系统参数 |
1.6. 模拟按键
1.6.1. 鼠标操作
# uinput -?
Usage: uinput <option> <command> <arg>...
The option are:
-M --mouse
commands for mouse:
-m <dx> <dy> --move <dx> <dy> -move to relative position (dx,dy),
<dx1> <dy1> <dx2> <dy2> [smooth time] --trace -dx1 dy1 to dx2 dy2 smooth movement
-d <key> --down key -press down a button,
0 is the left button, 1 is the right,
2 is the middle
-u <key> --up <key> -release a button
-c <key> --click <key> -press the left button down,then raise
-b <dx1> <dy1> <id> [press time] [click interval time] --double click
[press time] the time range is more than 1ms but less than 300ms,
[click interval time] the time range is more than 1ms but less than 450ms,
Otherwise the operation result may produce error or invalid operation
-press the left button down,then raise
key value:0 - button left
key value:1 - button right
key value:2 - button middle
key value:3 - button side
key value:4 - button extra
key value:5 - button forward
key value:6 - button back
key value:7 - button task
-s <key> --scroll <key> -positive values are sliding backwards
-g <dx1> <dy1> <dx2> <dy2> [total time] --drag <dx1> <dy1> <dx2> <dy2> [total time],
dx1 dy1 to dx2 dy2 smooth drag
-i <time> --interval <time> -the program interval for the (time) milliseconds
negative values are sliding forwards
1.6.1.1. 命令示例
命令 | 用途 |
uinput -M -m 50 50 | 鼠标光标移动到(50,50)位置 |
Uinput -M -b 50 200 0 100 300 | 鼠标在(50,200)左键双击,点击事件100ms,双击的间隔时间300ms |
1.6.2. 键盘操作
# uinput -?
Usage: uinput <option> <command> <arg>...
The option are:
-K --keyboard
commands for keyboard:
-d <key> --down <key> -press down a key
-u <key> --up <key> -release a key
-l <key> [long press time] --long_press <key> [long press time] -press and hold the key
-i <time> --interval <time> -the program interval for the (time) milliseconds
1.6.2.1. 按键值
key | keycode |
KEYCODE_HOME | 1 |
KEYCODE_BACK | 2 |
KEYCODE_VOLUME_UP | 16 |
KEYCODE_VOLUME_DOWN | 17 |
KEYCODE_POWER | 18 |
KEYCODE_VOLUME_MUTE | 22 |
KEYCODE_DPAD_UP | 2012 |
KEYCODE_DPAD_DOWN | 2013 |
KEYCODE_DPAD_LEFT | 2014 |
KEYCODE_DPAD_RIGHT | 2015 |
KEYCODE_DPAD_CENTER | 2016 |
KEYCODE_TAB | 2049 |
1.6.2.2. 命令示例
命令 | 用途 |
uinput -K -d 1 -u 1 | 按HOME键返回主界面 |
uinput -K -d 1 -u 1 | 声音调大 |
1.6.3. 触屏操作
# uinput -?
Usage: uinput <option> <command> <arg>...
The option are:
-T --touch
commands for touch:
-d <dx1> <dy1> --down <dx1> <dy1> -press down a position dx1 dy1,
-u <dx1> <dy1> --up <dx1> <dy1> -release a position dx1 dy1,
-m <dx1> <dy1> <dx2> <dy2> [smooth time] --smooth movement
<dx1> <dy1> <dx2> <dy2> [smooth time] -smooth movement,
dx1 dy1 to dx2 dy2 smooth movement
-c <dx1> <dy1> [click interval] -touch screen click dx1 dy1
1.6.3.1. 命令提示
待完善
1.7. 服务管理
命令 | 用途 |
service_control start pulseaudio | 启动pulseaudio服务 |
service_control stop pulseaudio | 停止pulseaudio服务 |
1.8. hiperf
https://device.harmonyos.com/cn/docs/documentation/guide/subsys-toolchain-hiperf-0000001186316470
1.9. bytrace
通过 hdc 来获取 trace 的方法如下:
- 抓取 trace:
D:\>hdc shell
# param set const.security.developermode.state true
# param set persist.hdc.root 1
# echo > /sys/kernel/debug/tracing/trace
# echo 4096 > /sys/kernel/debug/tracing/saved_cmdlines_size
# bytrace -t 10 -b 4096 --overwrite ohos zimage zmedia zcamera zaudio ability distributeddatamgr graphic freq irq mdfs workq mmc idle notification sync pagecache ace app > /mnt/mynewtrace.ftrace
# echo > /sys/kernel/debug/tracing/trace
# exit
D:\>hdc file recv /mnt/mynewtrace.ftrace
查看trace:
https://ui.perfetto.dev(科学上网)
查看 trace:
1.10. bootchart
使用方法:
- 抓数据
hdc shell begetctl bootchart enable
hdc shell reboot # 重启
...
重启完成后
...
hdc shell begetctl bootchart stop
hdc shell begetctl bootchart disable
进入到/data/service/el0/startup/init/文件夹下查看是否有如下文件:
header、proc_diskstats.log、proc_ps.log、proc_stat.log
在/data/service/el0/startup/init/目录下执行命令:tar -czf bootchart.tgz * # 打包
hdc file recv /data/service/el0/startup/init/bootchart.tgz ./ # 导出
- 下载 bootchart.jar,点我下载
- 数据转图片,执行如下命名,会生成
bootchart.png
java -jar bootchart.jar bootchart.tgz
如果执行该命令报错,如下,需要升级本机 java 版本
D:\>java -jar bootchart.jar bootchart.tgz
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/bootchart/Main has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
- 生成的
bootchart.png
如下:
1.11. wpa_supplicant&wpa_cli
使用方法:
1. 开启再关闭wifi
2. cd /vendor/bin/
3. ./wpa_supplicant -B -i wlan0 -c /data/service/el1/public/wifi/wpa_supplicant/wpa_supplicant.conf
4. ps -ef | grep wpa查看wpa_supplicant是否起来
5. /wpa_cli -p /data/service/el1/public/wifi/sockets/wpa
6. > scan
7. > scan_results
8. > add_network,返回一个ID
9. > set_network ID ssid "WIFI名称"
10. > set_network ID psk "WIFI密码"
11. > enable_network ID
1.12. snapshot_display
param set const.security.developermode.state true
param set persist.hdc.root 1
snapshot_display -f /data/local/tmp/test1.jpeg
1.13. wukong
待完善
1.14. power-shell
power-shell setmode 602 #性能模式,关闭休眠
power-shell suspend #休眠
power-shell display -s xxx #设置亮度
1.15. 重新挂载 system/vendor 分区为可读写
system/vendor 分区默认挂载为只读(ro),当调试的时候需 要使用 hdc file send
推文件的时候,需要将其重新挂载为可读写,如下:
mount -o remount,rw /vendor
mount -o remount,rw /
系统重启后失效,需要重新挂载
1.16. gdb 调试
待添加
1.17. 调频
1.17.1. CPU 频率
cd /sys/devices/system/cpu/cpufreq/policy0/
cat scaling_cur_freq
# 查看当前频率
cat scaling_available_frequencies
# 查看可用频率
echo userspace > scaling_governor
echo 1228800 > scaling_setspeed
# 调整频率
cat scaling_cur_freq
# 查看调整是否生效
1.17.2. DDR 调频
# 频率表:
# 2400M C
# 1600M A
# 1200M 8
# 800M 4
# 600M 2
devmem 0xd4282980 4
# 读取当前频率
devmem 0xd4282980 4 0xX
# 设置频率,0xX值要比频率表的值+1,相当于bit0写1
# 比如设置2400M,devmem 0xd4282980 32 0xD
1.17.3. EMMC 调频
待添加
2. 常用测试方法
2.1. monkey 测试
2.1.1. 环境配置(windows)
- 安装 Python(3.8 及以上版本)及相关库。
- 安装
hdc
设备链接工具并配置环境变量,保证cmd
命令窗口中可以执行hdc shell
或者hdc_std shell
正确链接测试设备 - 下载
stablility_test_tool_v1.0
这个python
测试工具包
2.1.2. 执行测试
D:\stablility_test_tool_v1.0>python.exe D:\stablility_test_tool_v1.0\monkey_test.py -d H1241200045 -p hdc -i 1000 -t 1000
参数说明:
- -d:测试设备的
sn
序列号,可通过hdc list targets
查询获取 - -p:
hdc
路径,有的是hdc_std
,根据配置的环境变量修改 - -i:操作间隔时间,单位 ms, 建议间隔
500ms
, 硬件配置低时,操作时间不能设置过短,否者系统压力过大 - -t:测试时间长度,单位分钟
2.2. 循环 reboot
2.2.1. 环境配置(windows)
- 安装 Python(3.8 及以上版本)及相关库。
- 安装
hdc
设备链接工具并配置环境变量,保证cmd
命令窗口中可以执行hdc shell
或者hdc_std shell
正确链接测试设备 - 下载
stablility_test_tool_v1.0
这个python
测试工具包
2.2.2. 执行测试
D:\stablility_test_tool_v1.0>python.exe D:\stablility_test_tool_v1.0\reboot_test.py -d H1241200045 -p hdc -c 2000
参数说明:
- -d:测试设备的
sn
序列号,可通过hdc list targets
查询获取 - -p:
hdc
路径,有的是hdc_std
,根据配置的环境变量修改 - -c:开关机次数,默认 600 次,间隔 80s, 最大等待设备重启时间 300s,若想修改两次测试间隔时间,可以修改 REBOOT_WAIT_TIME,但不能比设备开机时间短
2.3. 循环音乐播放
直接打开“音乐”即可,自动循环播放音乐。
2.4. 循环视频播放
下载视频老化专用测试 hap(在这里),通过 hdc 安装
hdc install 视频老化测试.hap
安装完成后,直接点击 Launcher
桌面上的图标运行即可,会自动循环播放。
2.5. GPU 老化测试(glmark)
使用方法:
执行下面3条命令可运行glmark老化:
power-shell setmode 602
cd /system/bin
./glmark2-es2 --run-forever --size 720x720
3. 常见问题调试手段
3.1. 外设
3.1.1. 屏幕背光无法调节
- 通过查看和设置节点
sys/class/backlight/backlight/brightness
来确认驱动是否正常 - 如果设置上述节点亮度无变化,说明驱动存在问题,需要查驱动,重点查看背光对应的 PWM 是否正常工作
- 如果设置上述节点亮度有变化,说明是 OH 上层的问题,可以通过命令 power-shell display -s xxx(100>xxx>0)来查看亮度是否有变化
3.2. 系统
3.2.1. 替换内核
- 挂载内核,可替换
Image.itb
和k1-x_ZT001H.dtb
(dtb
文件,不同方案的名称不一样)
# cd dev/block/
# ls
by-name loop5 mmcblk2p1 mmcblk2p3 mmcblk2p9 ram12 ram4
loop0 loop6 mmcblk2p10 mmcblk2p4 platform ram13 ram5
loop1 loop7 mmcblk2p11 mmcblk2p5 ram0 ram14 ram6
loop2 mmcblk2 mmcblk2p12 mmcblk2p6 ram1 ram15 ram7
loop3 mmcblk2boot0 mmcblk2p13 mmcblk2p7 ram10 ram2 ram8
loop4 mmcblk2boot1 mmcblk2p2 mmcblk2p8 ram11 ram3 ram9
#
# mount mmcblk2p5 /tmp
# cd /tmp
# ls
Image.itb bianbu.bmp env_k1-x.txt k1-x_ZT001H.dtb lost+found
- 通过
hdc
将更新的内核或者dtb
文件推入/tmp
文件夹
D:\>hdc file send Image.itb /tmp/
D:\>hdc file send k1-x_ZT001H.dtb /tmp/
- 取消挂载内核,重启即可生效
# unmount /tmp
# reboot
3.2.2. cppcrash
待添加
3.3. 休眠唤醒异常
3.3.1. 只关屏,无法深度休眠
- 查看
vendor/spacemit/xxx/power_config/power_mode_config.xml
是否设置了禁止深度休眠,具体参考K1 OH5.0系统定制说明
的电源管理定制
章节 - 通过
power-shell dump -a
查看系统是否拿了禁止休眠的锁,如下:
- 查看 hilog 和内核 log 是否有异常打印