添加GPIO测试,自循环声音录放测试。
author孙春阳 <snickersun@163.com>
Thu, 27 Nov 2025 23:44:34 +0000 (07:44 +0800)
committer孙春阳 <snickersun@163.com>
Thu, 27 Nov 2025 23:44:34 +0000 (07:44 +0800)
29 files changed:
Makefile.pcm_volume [new file with mode: 0644]
PCM_PERIOD_INFO.md [new file with mode: 0644]
PCM_VOLUME_USAGE.md [new file with mode: 0644]
README_PCM_VOLUME.txt [new file with mode: 0644]
Serial Debug 2025-11-27 205022.txt [new file with mode: 0644]
autobuild.sh
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/bootloader/flashboot/brandy/nandflash/nandflash_config.c
code/sdk/drivers/drivers/driver/nand_flash/nand/nandflash_config.c
code/sdk/middleware/services/media/foundation/audiomanager/frameworks/audioservice/src/devicemanager/src/device_hal.c
code/sdk/middleware/services/media/foundation/sample/wrapper/player_sample_wrapper.cpp
code/sdk/open_source/openharmony/third_party/lwip/lwip_v2.1.3/src/core/init.c
code/sdk/zhihui/ai/media/ai_media_service.cpp
code/sdk/zhihui/utils/custom_utils_at_cmd.c
code/sdk/zhihui/utilscpp/AUDIO_TEST_README.md [new file with mode: 0644]
code/sdk/zhihui/utilscpp/AUDIO_TEST_USAGE.md [new file with mode: 0644]
code/sdk/zhihui/utilscpp/CMakeLists.txt
code/sdk/zhihui/utilscpp/M1_pins.xlsx [new file with mode: 0644]
code/sdk/zhihui/utilscpp/audio_test.cpp [new file with mode: 0644]
code/sdk/zhihui/utilscpp/custom_utilscpp.h
code/sdk/zhihui/utilscpp/generate_gpio_test_config.py [new file with mode: 0644]
code/sdk/zhihui/utilscpp/gpio_test.cpp [new file with mode: 0644]
code/sdk/zhihui/utilscpp/gpio_test_config.json [new file with mode: 0644]
code/sdk/zhihui/utilscpp/include/pcm_1khz_period.h [new file with mode: 0644]
code/sdk/zhihui/utilscpp/include/pcm_volume_calculator.h [new file with mode: 0644]
code/sdk/zhihui/utilscpp/pcm_volume_calculator.cpp [new file with mode: 0644]
generate_pcm_1khz.py [new file with mode: 0644]
pcm_volume_test.c [new file with mode: 0644]
test_pcm_volume.py [new file with mode: 0644]

diff --git a/Makefile.pcm_volume b/Makefile.pcm_volume
new file mode 100644 (file)
index 0000000..0454330
--- /dev/null
@@ -0,0 +1,16 @@
+# Makefile for PCM volume calculator test
+
+CC = gcc
+CFLAGS = -Wall -Wextra -std=c99 -O2
+LDFLAGS = -lm
+
+TARGET = pcm_volume_test
+SOURCES = pcm_volume_calculator.c pcm_volume_test.c
+
+$(TARGET): $(SOURCES)
+       $(CC) $(CFLAGS) -o $(TARGET) $(SOURCES) $(LDFLAGS)
+
+clean:
+       rm -f $(TARGET)
+
+.PHONY: clean
diff --git a/PCM_PERIOD_INFO.md b/PCM_PERIOD_INFO.md
new file mode 100644 (file)
index 0000000..e392c7b
--- /dev/null
@@ -0,0 +1,47 @@
+# 1kHz PCM数据周期信息
+
+## 最小重复单位(一个完整周期)
+
+对于1kHz的正弦波信号,在不同采样率下的最小重复周期长度:
+
+| 采样率 | 周期样本数 | 周期时长 | 数据大小 |
+|--------|-----------|---------|---------|
+| 8kHz   | 8 样本    | 1.00 ms | 16 字节 |
+| 16kHz  | 16 样本   | 1.00 ms | 32 字节 |
+| 44.1kHz| 44.1 样本 | 1.00 ms | ~88 字节 (非整数周期) |
+| 48kHz  | 48 样本   | 1.00 ms | 96 字节 |
+
+## 生成最小周期数据
+
+使用 `--period` 或 `-p` 参数生成单个周期的数据:
+
+```bash
+# 16kHz采样率,1kHz信号,生成一个周期(16样本)
+python3 generate_pcm_1khz.py --period 16000 1000
+
+# 48kHz采样率,1kHz信号,生成一个周期(48样本)
+python3 generate_pcm_1khz.py --period 48000 1000
+```
+
+## 使用示例
+
+生成的数据可以循环播放来产生连续的正弦波:
+
+```c
+#include "pcm_1khz_period.h"
+
+void play_continuous_tone(void) {
+    int index = 0;
+    while (playing) {
+        // 循环播放周期数据
+        output_sample(pcm_1khz_data[index]);
+        index = (index + 1) % PCM_1KHZ_DATA_SIZE;
+    }
+}
+```
+
+## 优势
+
+- **节省内存**: 只需存储一个周期(16-48样本)而不是整秒数据(8000-48000样本)
+- **灵活**: 可以循环播放任意时长
+- **精确**: 保证周期完整性,无相位跳变
diff --git a/PCM_VOLUME_USAGE.md b/PCM_VOLUME_USAGE.md
new file mode 100644 (file)
index 0000000..0d91be0
--- /dev/null
@@ -0,0 +1,174 @@
+# PCM音量计算函数使用说明
+
+## 功能概述
+
+提供完整的PCM音频数据音量计算功能,包括:
+- **RMS (均方根)** 值计算
+- **峰值 (Peak)** 计算
+- **分贝 (dB)** 转换
+- **音量等级** 判断
+
+## 文件说明
+
+- `pcm_volume_calculator.h` - 头文件,包含函数声明和数据结构
+- `pcm_volume_calculator.c` - 实现文件
+- `pcm_volume_test.c` - 测试示例
+- `test_pcm_volume.py` - Python测试脚本(用于验证)
+
+## 快速开始
+
+### 1. 基本使用
+
+```c
+#include "pcm_volume_calculator.h"
+
+// 你的PCM数据
+const int16_t pcm_data[] = { /* ... */ };
+size_t sample_count = sizeof(pcm_data) / sizeof(pcm_data[0]);
+
+// 计算结果
+pcm_volume_result_t result;
+if (pcm_calculate_volume(pcm_data, sample_count, &result) == 0) {
+    printf("RMS: %.2f%% (%.2f dB)\n", result.rms * 100, result.rms_db);
+    printf("峰值: %.2f%% (%.2f dB)\n", result.peak * 100, result.peak_db);
+    printf("音量等级: %s\n", pcm_get_volume_level(result.rms_db));
+}
+```
+
+### 2. 单独计算RMS或峰值
+
+```c
+// 只计算RMS
+double rms = pcm_calculate_rms(pcm_data, sample_count);
+printf("RMS值: %.2f%%\n", rms * 100);
+
+// 只计算峰值
+double peak = pcm_calculate_peak(pcm_data, sample_count);
+printf("峰值: %.2f%%\n", peak * 100);
+```
+
+### 3. 分贝转换
+
+```c
+// 线性值转分贝
+double linear = 0.5;  // 50%
+double db = linear_to_db(linear, 1.0);  // 结果: -6.02 dB
+
+// 分贝转线性值
+double db_value = -20.0;  // -20 dB
+double linear_value = db_to_linear(db_value, 1.0);  // 结果: 0.1 (10%)
+```
+
+## 数据结构
+
+```c
+typedef struct {
+    double rms;              // RMS值 (0.0 ~ 1.0)
+    double peak;             // 峰值 (0.0 ~ 1.0)
+    double rms_db;           // RMS分贝值 (dB)
+    double peak_db;          // 峰值分贝值 (dB)
+    int16_t max_sample;      // 最大样本值
+    int16_t min_sample;      // 最小样本值
+    uint32_t sample_count;   // 样本数量
+} pcm_volume_result_t;
+```
+
+## API参考
+
+### pcm_calculate_volume()
+
+计算PCM数据的完整音量信息。
+
+**参数:**
+- `pcm_data`: PCM数据指针 (int16_t数组)
+- `sample_count`: 样本数量
+- `result`: 输出结果结构体指针
+
+**返回值:**
+- `0`: 成功
+- `-1`: 失败(参数无效)
+
+### pcm_calculate_rms()
+
+计算PCM数据的RMS值。
+
+**返回值:**
+- RMS值 (0.0 ~ 1.0)
+- `-1.0`: 失败
+
+### pcm_calculate_peak()
+
+计算PCM数据的峰值。
+
+**返回值:**
+- 峰值 (0.0 ~ 1.0)
+- `-1.0`: 失败
+
+### linear_to_db()
+
+将线性值转换为分贝值。
+
+**参数:**
+- `linear_value`: 线性值 (0.0 ~ 1.0)
+- `reference`: 参考值(默认1.0)
+
+**返回值:**
+- 分贝值 (dB),范围约 -120.0 ~ 0.0
+
+### db_to_linear()
+
+将分贝值转换为线性值。
+
+**参数:**
+- `db_value`: 分贝值 (dB)
+- `reference`: 参考值(默认1.0)
+
+**返回值:**
+- 线性值 (0.0 ~ 1.0)
+
+### pcm_get_volume_level()
+
+获取音量等级描述。
+
+**参数:**
+- `rms_db`: RMS分贝值
+
+**返回值:**
+- 音量等级字符串:"静音"、"极低"、"低"、"中"、"高"、"最大"
+
+## 音量等级参考
+
+| 分贝范围 | 等级 | 说明 |
+|---------|------|------|
+| < -60 dB | 静音 | 几乎听不到 |
+| -60 ~ -40 dB | 极低 | 非常安静 |
+| -40 ~ -20 dB | 低 | 较低音量 |
+| -20 ~ -6 dB | 中 | 中等音量 |
+| -6 ~ 0 dB | 高 | 较高音量 |
+| ≥ 0 dB | 最大 | 最大音量(可能削波) |
+
+## 编译示例
+
+```bash
+# 编译测试程序
+gcc -o pcm_volume_test pcm_volume_calculator.c pcm_volume_test.c -lm
+
+# 运行测试
+./pcm_volume_test
+```
+
+## 注意事项
+
+1. **数据格式**: 目前支持16位有符号PCM (int16_t)
+2. **分贝范围**: 最小分贝值限制为-120 dB(接近静音)
+3. **性能**: 对于大量数据,建议分批计算或使用滑动窗口
+4. **精度**: 使用double类型保证计算精度
+
+## 实际应用场景
+
+- **音频分析**: 分析音频文件的音量特征
+- **音量归一化**: 调整音频到目标音量级别
+- **削波检测**: 通过峰值检测判断是否削波
+- **音量显示**: 实时显示音频播放音量
+- **自动增益控制**: 根据RMS值调整增益
+
diff --git a/README_PCM_VOLUME.txt b/README_PCM_VOLUME.txt
new file mode 100644 (file)
index 0000000..2cd40f8
--- /dev/null
@@ -0,0 +1,36 @@
+PCM音量计算函数库
+==================
+
+已创建的文件:
+--------------
+1. pcm_volume_calculator.h    - 头文件(函数声明和数据结构)
+2. pcm_volume_calculator.c    - 实现文件
+3. pcm_volume_test.c          - C语言测试示例
+4. test_pcm_volume.py         - Python测试脚本
+5. PCM_VOLUME_USAGE.md        - 详细使用文档
+6. Makefile.pcm_volume        - 编译Makefile
+
+快速测试:
+----------
+# Python测试(无需编译)
+python3 test_pcm_volume.py
+
+# C语言测试(需要编译)
+make -f Makefile.pcm_volume
+./pcm_volume_test
+
+主要功能:
+----------
+✓ RMS (均方根) 值计算
+✓ 峰值 (Peak) 计算  
+✓ 分贝 (dB) 转换
+✓ 音量等级判断
+✓ 最大/最小样本值检测
+
+使用示例:
+----------
+#include "pcm_volume_calculator.h"
+
+pcm_volume_result_t result;
+pcm_calculate_volume(pcm_data, sample_count, &result);
+printf("RMS: %.2f dB\n", result.rms_db);
diff --git a/Serial Debug 2025-11-27 205022.txt b/Serial Debug 2025-11-27 205022.txt
new file mode 100644 (file)
index 0000000..9d9f477
--- /dev/null
@@ -0,0 +1,2330 @@
+« mount outer.
+APP|formate filesystem devinfo: index = 0 , dev_name = /dev/nandblk0, folder_name = /user/,               part_start_sector = 0, part_count_sector = 2048\r
+APP|yaffs filesystem init end!
+APP|nandflash init success\r
+APP|Succ read lcd id! Lcd id: 0x5598\r
+get nv local_addr : ******4f71f0
+CALLENDAR:year = 1970, month = 1, day = 1, hour = 0, minute = 0, second = 0 \r
+callendar timestamp = 0 \r
+sync time timestamp 0, timezone_in_quarters 0 \r
+[A][aw88082_i2c_init:353]aw88082 i2c init success
+[osal_msg_queue_create:25]:qName:sap_msg qID=0x1 \r
+APP|audio init OK\r
+APP|**********startup info**********\r
+APP|os init class is liteos.\r
+APP|store init class is nandflash.\r
+APP|display init class is MIPI.\r
+APP|board init class is E0B4.\r
+APP|psram density is 32MB.\r
+APP|**********startup info**********\r
+APP|No need to upgrade...\r
+[osal_msg_queue_create:25]:qName:at_queue qID=0x2 \r
+[osal_msg_queue_create:25]:qName:graphic_at_service_queue qID=0x3 \r
+[osal_msg_queue_create:25]:qName:app_at_service_queue qID=0x4 \r
+[osal_msg_queue_create:25]:qName:audio_at_service_queue qID=0x5 \r
+[osal_msg_queue_create:25]:qName:bt_cmd_queue qID=0x6 \r
+[osal_msg_queue_create:25]:qName:media_at_service_queue qID=0x7 \r
+[osal_msg_queue_create:25]:qName:dfx_msg qID=0x8 \r
+[osal_msg_queue_create:25]:qName:transmit qID=0x9 \r
+APP|Turning on LCD backlight...
+kvPath: /kvstore
+dataPath: 
+Set value ret: -1
+brightness:0
+Brightness: 0% → Fall Edge: 7 → LED Current: 2.5mA
+APP|LCD backlight turned on (CUSTOM_UTILS + BOARD_LEINIAO)
+[DISPLAY I/] GrallocInitialize: gralloc initialize success
+[DISPLAY I/] LayerInitialize: layer initialize success
+[DISPLAY I/] PrintLayerInfo: layerInfo:
+[DISPLAY I/] PrintLayerInfo: type = 0
+[DISPLAY I/] PrintLayerInfo: width = 360
+[DISPLAY I/] PrintLayerInfo: height = 360
+[DISPLAY I/] PrintLayerInfo: bpp = 24
+[DISPLAY I/] PrintLayerInfo: pixFormat = 17
+[DISPLAY I/] VGUInitialize: VGU initializes successfully
+[DISPLAY I/] InitMemPool: Memory Pool has been inited.
+[DISPLAY I/] GrallocInitialize: gralloc initialize success
+====InitDfxCmd===
+[Graphic Error] [ResumeSlice: 225]No valid slice to resume
+APP|[POWER_MANAGER E/] filter_timer_execute_system_rule: filter timer, current default timeout:5000, keepon time:25000, event:5.\r
+APP|No need to upgrade...\r
+APP|SET DSP freq=3, div=6, codec freq=3, div=36\r
+[VAU_ERROR][vau_api_check_surface 108]input phy_addr is null!
+[VAU_ERROR][vau_api_check_surface_list 144]vau check src surface[0] failed!
+[VAU_ERROR][uapi_vau_compose 861]call vau_check_surface_list fail ret = 0x80004000!
+[DISPLAY E/] BlitMultiImgOnce: uapi_vau_compose failure, ret = 0x80004000!
+[DISPLAY E/] BlitMultiImgOnce: src[0] w:360 h:360 str:1472 fmt:0 cmp:0 rect:[0,0,360,360] outRect:[0,0,360,360]
+[Graphic Error] [BlitImages: 889]RenderBlit failed!
+[A][ALERT][sys_cmd_check_cmd_done:164] wait_time_us = 600
+[A][ALERT][drv_sys_pon:297] DSP0 power on
+APP|lwip_main run start.\r
+APP|audio manager init ok\r
+APP|app_main run start.\r
+[osal_msg_queue_create:25]:qName:app_queue qID=0xb \r
+APP|button 1 is BUTTON_PRESSED\r
+PM_ID_BUTTON:1884268648\r
+APP|uapi_battery_init !\r
+[osal_msg_queue_create:25]:qName:battery_queue qID=0xc \r
+APP|charger not plugged ,disable charge !\r
+APP|charger not plugged ,disable charge !\r
+APP|uapi_custom_cmd_service_init !\r
+[osal_msg_queue_create:25]:qName:custom_cmd_service_queue qID=0xd \r
+APP|uapi_custom_fileoperate_service_init !\r
+[osal_msg_queue_create:25]:qName:custom_fileoperate_service_queue qID=0xe \r
+APP|No need to upgrade...\r
+[WEARABLE I/] InitBroadcastService start!
+[WEARABLE I/] start! topicSubscriberInfo=0x0x6c104e68
+[WEARABLE I/] InitBroadcastService end!
+APP|[POWER_MANAGER E/] filter_timer_execute_system_rule: filter timer, current default timeout:5000, keepon time:0, event:5.\r
+[WEARABLE E/] LoadManagementFromFile open fail
+[WEARABLE E/] SaveManagementToFile open fail
+I ams starts successfully
+I bms starts successfully
+[00:00:08:137][I][Init:37]Locator service starts successfully 
+[00:00:08:138][D][Init:56][SERVICE:sensor_service]: Init begin 
+[WEARABLE I/] WatchConnectCmdRegister
+I ams feature init success
+I [BMS] bms feature init success
+[00:00:08:142][I][Init:56]Locator feature init success 
+[00:00:08:143][D][GetTaskConfig:80][SERVICE:sensor_service]: GetTaskConfig begin 
+[WEARABLE I/] BroadcastService featureId=4294967295, queueId=536924516, serviceId=2
+[WEARABLE I/] BroadcastFeature featureId=0, queueId=536924516, serviceId=2
+[WEARABLE I/] NativeAbility InstallAbility
+D MemUtils::InitPSRam g_psramMemory = 6c200000
+[WEARABLE I/] InitNativeLauncher: Minimal startup - Blue window only
+[WEARABLE I/] Cleared all existing views from RootView
+[WEARABLE I/] Blue window created and displayed: 360x360
+I AbilityMgrSliteFeature::OnFeatureInitialize featureId = 0, queueId = 536924708, serviceId = 6
+[WEARABLE I/] NativeAbility OnActive
+[WEARABLE E/] NativeAbility ResumeAbility 0 failed
+I BundleMgrService::ServiceMessageHandle
+[00:00:08:158][I][OnFeatureInitialize:85]Locator feature init 
+[00:00:08:159][I][InitAbility:84]initAbility start 
+[00:00:08:160][I][Initialize:71]ability constructed. 
+[00:00:08:161][E][InitAbility:90]Initialize gps ability, result 1 
+[00:00:08:162][I][Initialize:54]LocatorAbility Initialize. 
+[00:00:08:163][I][OnFeatureInitialize:89]LocatorAbility initialize success 
+[00:00:08:167][D][Initialize:62][SERVICE:sensor_service]: Initialize begin 
+[00:00:08:168][D][NewSensorInterfaceInstance:47]Get sensor device instance success 
+I The public key already exists!
+E [BMporting_button_remove_veto:1884268744\r
+S] GetJsonStream IsFile fail
+I [BMS] InstallPreBundle uninstallRecord is nullptr!
+[A][ALERT][sys_cmd_check_cmd_done:164] wait_time_us = 900
+[A][ALERT][drv_sys_pd:331] DSP0 power down
+APP|app_main run start.\r
+APP|sys_slp: 0x1\r
+APP|M core run time 12545, deepsleep time:1460, lightsleep time:6018, m sleep flag:1\r
+APP|M core deepsleep cnt:137, lightsleep cnt:17561\r
+APP|M core last veto id:7, last veto count:0, total_counts=0\r
+[Graphic Error] [PauseSlice: 236]No valid slice to pause
+» AT^PMADDVOTE\r
+« \r
+MCU WAKEUP SUCCESS\r
+\r
+OK~\r
+APP|uapi_lcd_backlight_off\r
+Output RESET_LCD_GPIO 1 , VCI_LCD_GPIO 0\r
+APP|app_main run start.\r
+APP|sys_slp: 0x1\r
+APP|M core run time 17599, deepsleep time:1872, lightsleep time:10070, m sleep flag:1\r
+APP|M core deepsleep cnt:176, lightsleep cnt:21910\r
+APP|M core last veto id:7, last veto count:0, total_counts=1\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 22597, deepsleep time:1872, lightsleep time:14659, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:26910\r
+APP|M core last veto id:7, last veto count:0, total_counts=1\r
+» AT^AUDIOTEST=5\r
+« APP|[AudioTest] Starting audio test...\r
+[00:00:24:611][W]{ai_media_service_init():808} AI media service already initialized 
+[00:00:24:612][I]{ai_media_record_start():306} Starting AI media recording with format: pcm 
+APP|SET DSP freq=3, div=5, codec freq=3, div=36\r
+APP|set hifi mode=2.\r
+APP|SET DSP freq=3, div=5, codec freq=3, div=36\r
+[A][ALERT][sys_cmd_check_cmd_done:164] wait_time_us = 400
+[A][ALERT][drv_sys_pon:297] DSP0 power on
+[00:00:24:764][I]{ai_media_record_start():459} AI media recording started successfully 
+[00:00:24:764][I]{ai_media_set_record_callback():523} Recording callback set 
+[00:00:24:766][I]{ai_media_play_start():593} Starting AI media playback with format: pcm 
+[00:00:24:769][I]{OnInterrupt():90} AI Record OnInterrupt, type:1, hint:2 
+[00:00:24:769][I]{OnInterrupt():99} AI record stop begin signal 
+[00:00:24:771][I]{OnInterrupt():90} AI Record OnInterrupt, type:1, hint:2 
+[00:00:24:772][I]{OnInterrupt():99} AI record stop begin signal 
+[00:00:24:776][I]{RecordingThreadFunc():269} Recording thread started 
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+aw_sysst_check succed
+aw_pa_start 
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+[00:00:24:956][I]{ai_media_play_start():710} AI media playback started successfully 
+APP|[AudioTest] Play thread started\r
+APP|[AudioTest] Audio test started successfully\r
+APP|[AudioTest] Playing 1kHz tone, monitoring volume every 0.5s...\r
+AUDIO TEST START: Success
+  Playing 1kHz tone, monitoring volume every 0.5s...
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 9.04% (-20.87 dB), Peak: 23.28% (-12.66 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 11.49% (-18.80 dB), Peak: 21.36% (-13.41 dB), Level: 中\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer err\r
+» AT^AUDIOTEST=6\r
+« or\r
+APP|[AudioTest] Stopping audio test...\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Play thread stopped\r
+[00:00:26:959][I]{ai_media_record_stop():467} Stopping AI media recording 
+[00:00:26:962][I]{RecordingThreadFunc():295} Recording thread stopped 
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 27596, deepsleep time:1872, lightsleep time:18960, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:31730\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 32593, deepsleep time:1872, lightsleep time:23630, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:36730\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 37590, deepsleep time:1872, lightsleep time:28246, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:41730\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 42588, deepsleep time:1872, lightsleep time:32927, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:46730\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 47585, deepsleep time:1872, lightsleep time:37556, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:51730\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+» AT^AUDIOTEST=5\r
+« APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 52582, deepsleep time:1872, lightsleep time:42120, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:56664\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+» AT^AUDIOTEST=5\r
+« APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 57579, deepsleep time:1872, lightsleep time:46770, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:61664\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+» AT^PMADDVOTE\r
+» AT^PMADDVOTE\r
+« APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 62576, deepsleep time:1872, lightsleep time:51416, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:1130\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+PM_ID_BUTTON:1884268648\r
+fac:id : 0
+APP|mipi_tx has been enable!\r
+APP|Succ read lcd id! Lcd id: 0x5598\r
+APP|timeout when wait phy ready \r
+porting_button_remove_veto:1884268744\r
+kvPath: /kvstore
+dataPath: 
+Set value ret: -1
+brightness:0
+Brightness: 0% → Fall Edge: 7 → LED Current: 2.5mA
+[Graphic Error] [ResumeSlice: 225]No valid slice to resume
+fac:id : 0
+» AT^SETUART=1\r
+« APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 67577, deepsleep time:1872, lightsleep time:56032, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:5896\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+[Graphic Error] [PauseSlice: 236]No valid slice to pause
+APP|uapi_lcd_backlight_off\r
+Output RESET_LCD_GPIO 1 , VCI_LCD_GPIO 0\r
+PM_ID_BUTTON:1884268648\r
+fac:id : 0
+APP|mipi_tx has been enable!\r
+APP|Succ read lcd id! Lcd id: 0x5598\r
+APP|timeout when wait phy ready \r
+porting_button_remove_veto:1884268744\r
+kvPath: /kvstore
+dataPath: 
+Set value ret: -1
+brightness:0
+Brightness: 0% → Fall Edge: 7 → LED Current: 2.5mA
+[Graphic Error] [ResumeSlice: 225]No valid slice to resume
+fac:id : 0
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 72575, deepsleep time:1872, lightsleep time:60352, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:10535\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+» AT^PMADDVOTE\r
+» AT^PMADDVOTE\r
+» AT^PMADDVOTE\r
+» AT^PMADDVOTE\r
+« [Graphic Error] [PauseSlice: 236]No valid slice to pause
+APP|uapi_lcd_backlight_off\r
+Output RESET_LCD_GPIO 1 , VCI_LCD_GPIO 0\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 77576, deepsleep time:1872, lightsleep time:65120, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:15415\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+» AT^AUDIOTEST=6\r
+« PM_ID_BUTTON:1884268648\r
+fac:id : 0
+APP|mipi_tx has been enable!\r
+APP|Succ read lcd id! Lcd id: 0x5598\r
+APP|timeout when wait phy ready \r
+porting_button_remove_veto:1884268744\r
+kvPath: /kvstore
+dataPath: 
+Set value ret: -1
+brightness:0
+Brightness: 0% → Fall Edge: 7 → LED Current: 2.5mA
+[Graphic Error] [ResumeSlice: 225]No valid slice to resume
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 82588, deepsleep time:1872, lightsleep time:69559, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:20184\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+fac:id : 0
+» AT^AUDIOTEST=5\r
+» AT^AUDIOTEST=5\r
+» AT^AUDIOTEST=5\r
+» AT^AUDIOTEST=5\r
+« PM_ID_BUTTON:1884268648\r
+fac:id : 0
+porting_button_remove_veto:1884268744\r
+fac:id : 0
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 87590, deepsleep time:1872, lightsleep time:74420, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:25216\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+[Graphic Error] [PauseSlice: 236]No valid slice to pause
+APP|charger not plugged ,disable charge !\r
+APP|uapi_lcd_backlight_off\r
+Output RESET_LCD_GPIO 1 , VCI_LCD_GPIO 0\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 92589, deepsleep time:1872, lightsleep time:79021, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:30027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 97585, deepsleep time:1872, lightsleep time:83649, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:35027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 102581, deepsleep time:1872, lightsleep time:88290, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:40027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 107577, deepsleep time:1872, lightsleep time:92938, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:45027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 112573, deepsleep time:1872, lightsleep time:97580, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:50027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 117570, deepsleep time:1872, lightsleep time:102223, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:55027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 122566, deepsleep time:1872, lightsleep time:106867, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:60027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 127562, deepsleep time:1872, lightsleep time:111513, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:65027\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 132558, deepsleep time:1872, lightsleep time:116138, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:4425\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 137554, deepsleep time:1872, lightsleep time:120754, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:9425\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 142549, deepsleep time:1872, lightsleep time:125411, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:14425\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 147545, deepsleep time:1872, lightsleep time:130068, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:19427\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 152541, deepsleep time:1872, lightsleep time:134725, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:24427\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 157536, deepsleep time:1872, lightsleep time:139334, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:29427\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 162532, deepsleep time:1872, lightsleep time:144000, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:34427\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 167528, deepsleep time:1872, lightsleep time:148619, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:39427\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 172523, deepsleep time:1872, lightsleep time:153225, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:44361\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 177519, deepsleep time:1872, lightsleep time:157872, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:49361\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 182514, deepsleep time:1872, lightsleep time:162513, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:54361\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 187510, deepsleep time:1872, lightsleep time:167179, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:59361\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 192505, deepsleep time:1872, lightsleep time:171800, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:64361\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 197501, deepsleep time:1872, lightsleep time:176461, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:3825\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 202496, deepsleep time:1872, lightsleep time:181100, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:8825\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 207491, deepsleep time:1872, lightsleep time:185724, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:13827\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 212487, deepsleep time:1872, lightsleep time:190399, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:18827\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 217482, deepsleep time:1872, lightsleep time:194961, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:23761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 222477, deepsleep time:1872, lightsleep time:199592, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:28761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 227473, deepsleep time:1872, lightsleep time:204242, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:33761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 232468, deepsleep time:1872, lightsleep time:208906, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:38761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 237463, deepsleep time:1872, lightsleep time:213534, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:43761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 242458, deepsleep time:1872, lightsleep time:218177, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:48761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 247453, deepsleep time:1872, lightsleep time:222820, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:53761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 252449, deepsleep time:1872, lightsleep time:227455, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:58761\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 257444, deepsleep time:1872, lightsleep time:232069, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:63695\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 262439, deepsleep time:1872, lightsleep time:236699, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:3159\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 267434, deepsleep time:1872, lightsleep time:241332, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:8161\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 272430, deepsleep time:1872, lightsleep time:245960, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:13161\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 277425, deepsleep time:1872, lightsleep time:250642, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:18161\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 282420, deepsleep time:1872, lightsleep time:255274, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:23161\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 287415, deepsleep time:1872, lightsleep time:259909, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:28161\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 292411, deepsleep time:1872, lightsleep time:264538, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:33161\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 297406, deepsleep time:1872, lightsleep time:269100, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:38049\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 302401, deepsleep time:1872, lightsleep time:273731, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:43049\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 307396, deepsleep time:1872, lightsleep time:278365, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:48049\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 312392, deepsleep time:1872, lightsleep time:283044, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:53049\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 317387, deepsleep time:1872, lightsleep time:287672, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:58049\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 322382, deepsleep time:1872, lightsleep time:292301, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:63049\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 327378, deepsleep time:1872, lightsleep time:296976, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:2513\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 332373, deepsleep time:1872, lightsleep time:301608, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:7513\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 337368, deepsleep time:1872, lightsleep time:306175, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:12447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 342364, deepsleep time:1872, lightsleep time:310854, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:17447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 347359, deepsleep time:1872, lightsleep time:315476, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:22447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 352355, deepsleep time:1872, lightsleep time:320142, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:27447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 357350, deepsleep time:1872, lightsleep time:324758, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:32447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 362346, deepsleep time:1872, lightsleep time:329427, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:37447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 367342, deepsleep time:1872, lightsleep time:334046, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:42447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 372337, deepsleep time:1872, lightsleep time:338708, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:47447\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 377333, deepsleep time:1872, lightsleep time:343319, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:52381\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 382328, deepsleep time:1872, lightsleep time:347936, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:57381\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 387324, deepsleep time:1872, lightsleep time:352601, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:62381\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 392320, deepsleep time:1872, lightsleep time:357220, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:1845\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 397315, deepsleep time:1872, lightsleep time:361880, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:6845\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 402311, deepsleep time:1872, lightsleep time:366545, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:11845\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 407307, deepsleep time:1872, lightsleep time:371158, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:16845\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 412302, deepsleep time:1872, lightsleep time:375814, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:21845\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 417298, deepsleep time:1872, lightsleep time:380473, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:26845\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 422294, deepsleep time:1872, lightsleep time:385067, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:31779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 427289, deepsleep time:1872, lightsleep time:389676, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:36779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 432285, deepsleep time:1872, lightsleep time:394343, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:41779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 437281, deepsleep time:1872, lightsleep time:398958, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:46779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 442276, deepsleep time:1872, lightsleep time:403624, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:51779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 447272, deepsleep time:1872, lightsleep time:408239, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:56779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 452267, deepsleep time:1872, lightsleep time:412898, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:61779\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 457263, deepsleep time:1872, lightsleep time:417563, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:1243\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 462259, deepsleep time:1872, lightsleep time:422109, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:6177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 467254, deepsleep time:1872, lightsleep time:426770, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:11177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 472250, deepsleep time:1872, lightsleep time:431431, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:16177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 477246, deepsleep time:1872, lightsleep time:436038, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:21177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 482242, deepsleep time:1872, lightsleep time:440678, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:26177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 487237, deepsleep time:1872, lightsleep time:445324, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:31177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 492233, deepsleep time:1872, lightsleep time:449981, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:36177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 497229, deepsleep time:1872, lightsleep time:454640, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:41177\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 502225, deepsleep time:1872, lightsleep time:459244, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:46111\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 507221, deepsleep time:1872, lightsleep time:463856, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:51111\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 512216, deepsleep time:1872, lightsleep time:468510, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:56111\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 517212, deepsleep time:1872, lightsleep time:473169, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:61111\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 522208, deepsleep time:1872, lightsleep time:477824, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:575\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 527204, deepsleep time:1872, lightsleep time:482431, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:5575\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 532199, deepsleep time:1872, lightsleep time:487095, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:10575\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 537195, deepsleep time:1872, lightsleep time:491747, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:15575\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|charger not plugged ,disable charge !\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 542191, deepsleep time:1872, lightsleep time:496329, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:20509\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 547187, deepsleep time:1872, lightsleep time:500985, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:25509\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 552183, deepsleep time:1872, lightsleep time:505591, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:30509\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 557178, deepsleep time:1872, lightsleep time:510248, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:35509\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 562174, deepsleep time:1872, lightsleep time:514898, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:40509\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 567170, deepsleep time:1872, lightsleep time:519547, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:45511\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 572166, deepsleep time:1872, lightsleep time:524197, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:50511\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 577162, deepsleep time:1872, lightsleep time:528801, m sleep flag:0\r
+APP|M core deepsleep cnt:176, lightsleep cnt:55511\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+[Graphic Error] [PauseSlice: 236]No valid slice to pause
+APP|uapi_lcd_backlight_off\r
+Output RESET_LCD_GPIO 1 , VCI_LCD_GPIO 0\r
+PM_ID_BUTTON:1884268648\r
+fac:id : 0
+APP|mipi_tx has been enable!\r
+APP|Succ read lcd id! Lcd id: 0x5598\r
+APP|timeout when wait phy ready \r
+porting_button_remove_veto:1884268744\r
+kvPath: /kvstore
+dataPath: 
+Set value ret: -1
+brightness:0
+Brightness: 0% → Fall Edge: 7 → LED Current: 2.5mA
+[Graphic Error] [ResumeSlice: 225]No valid slice to resume
+fac:id : 0
+» AT^PMADDVOTE\r
+» AT^PMADDVOTE\r
+« MCU has got pm_id_debug vote\r
+\r
+MCU WAKEUP SUCCESS\r
+\r
+OK~\r
+APP|app_main run start.\r
+APP|sys_slp: 0x1\r
+APP|M core run time 11792, deepsleep time:3562, lightsleep time:5083, m sleep flag:0\r
+APP|M core deepsleep cnt:361, lightsleep cnt:5542\r
+APP|M core last veto id:7, last veto count:0, total_counts=1\r
+[Graphic Error] [PauseSlice: 236]No valid slice to pause
+APP|uapi_lcd_backlight_off\r
+Output RESET_LCD_GPIO 1 , VCI_LCD_GPIO 0\r
+» AT^AUDIOTEST=5\r
+« APP|[AudioTest] Starting audio test...\r
+[00:00:16:226][W]{ai_media_service_init():808} AI media service already initialized 
+[00:00:16:227][I]{ai_media_record_start():306} Starting AI media recording with format: pcm 
+APP|SET DSP freq=3, div=5, codec freq=3, div=36\r
+APP|set hifi mode=2.\r
+APP|SET DSP freq=3, div=5, codec freq=3, div=36\r
+[A][ALERT][sys_cmd_check_cmd_done:164] wait_time_us = 400
+[A][ALERT][drv_sys_pon:297] DSP0 power on
+[00:00:16:378][I]{ai_media_record_start():459} AI media recording started successfully 
+[00:00:16:378][I]{ai_media_set_record_callback():523} Recording callback set 
+[00:00:16:380][I]{ai_media_play_start():593} Starting AI media playback with format: pcm 
+[00:00:16:383][I]{OnInterrupt():90} AI Record OnInterrupt, type:1, hint:2 
+[00:00:16:383][I]{OnInterrupt():99} AI record stop begin signal 
+[00:00:16:385][I]{OnInterrupt():90} AI Record OnInterrupt, type:1, hint:2 
+[00:00:16:386][I]{OnInterrupt():99} AI record stop begin signal 
+[00:00:16:390][I]{RecordingThreadFunc():269} Recording thread started 
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+aw_sysst_check succed
+aw_pa_start 
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+[00:00:16:570][I]{ai_media_play_start():710} AI media playback started successfully 
+APP|[AudioTest] Play thread started\r
+APP|[AudioTest] Audio test started successfully\r
+APP|[AudioTest] Playing 1kHz tone, monitoring volume every 0.5s...\r
+AUDIO TEST START: Success
+  Playing 1kHz tone, monitoring volume every 0.5s...
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 16793, deepsleep time:3562, lightsleep time:9625, m sleep flag:0\r
+APP|M core deepsleep cnt:361, lightsleep cnt:10300\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 8.75% (-21.16 dB), Peak: 22.57% (-12.93 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 8.90% (-21.02 dB), Peak: 13.25% (-17.56 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 9.50% (-20.45 dB), Peak: 21.07% (-13.53 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 3.26% (-29.73 dB), Peak: 10.62% (-19.47 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 5.43% (-25.31 dB), Peak: 18.10% (-14.85 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 1.97% (-34.13 dB), Peak: 3.43% (-29.30 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 3.76% (-28.48 dB), Peak: 11.69% (-18.64 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 4.07% (-27.80 dB), Peak: 10.10% (-19.91 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 7.63% (-22.35 dB), Peak: 21.16% (-13.49 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 5.20% (-25.68 dB), Peak: 9.80% (-20.17 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 21791, deepsleep time:3562, lightsleep time:13732, m sleep flag:0\r
+APP|M core deepsleep cnt:361, lightsleep cnt:15121\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 5.45% (-25.28 dB), Peak: 20.87% (-13.61 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 8.45% (-21.46 dB), Peak: 14.92% (-16.53 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 7.19% (-22.87 dB), Peak: 20.44% (-13.79 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 2.91% (-30.74 dB), Peak: 6.13% (-24.25 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 3.60% (-28.89 dB), Peak: 10.81% (-19.33 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 3.31% (-29.59 dB), Peak: 13.29% (-17.53 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 3.47% (-29.20 dB), Peak: 18.98% (-14.43 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 4.23% (-27.47 dB), Peak: 14.31% (-16.89 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 4.44% (-27.05 dB), Peak: 13.72% (-17.25 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 6.40% (-23.87 dB), Peak: 16.36% (-15.72 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 26790, deepsleep time:3562, lightsleep time:17898, m sleep flag:0\r
+APP|M core deepsleep cnt:361, lightsleep cnt:19923\r
+APP|M core last veto id:7, last veto count:0, total_counts=2\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Volume - RMS: 3.27% (-29.72 dB), Peak: 10.20% (-19.83 dB), Level: 低\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamIn\r
+» AT^AUDIOTEST=6\r
+« ObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Stopping audio test...\r
+[00:00:27:638][I]{ai_media_set_record_callback():523} Recording callback set 
+AudioStreamInObtainBuffer error\r
+APP|[AudioTest] Play thread stopped\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+AudioStreamInObtainBuffer error\r
+[00:00:28:639][I]{ai_media_record_stop():467} Stopping AI media recording 
+[00:00:28:640][I]{RecordingThreadFunc():295} Recording thread stopped 
+[A][ALERT][core_adp_destroy:414] adp = 0x6D000001
+[A][ALERT][core_mod_free:316] mod_node->mid.u32 = 0x6D000001
+APP|SET DSP freq=3, div=6, codec freq=3, div=36\r
+APP|set hifi mode=1.\r
+[00:00:28:698] E/InterruptMgr :{RemoveInterruptInternal():844} Remove sessionID:1 streamType:(0x80004)not found
+[00:00:28:700] E/InterruptMgr :{RemoveInterruptInternal():844} Remove sessionID:1 streamType:(0x80004)not found
+[00:00:28:702] E/PolicyMgr :{RemoveInterruptMgrEntry():275} InterruptMgrRemove failed 
+[00:00:28:704] E/AudioService :{AudioServiceDeactivateAudioInterrupt():308} policy manager deactive fail, 0xffffffff != 0 
+[00:00:28:706][I]{ai_media_record_stop():499} AI media recording stopped successfully 
+[00:00:28:708][I]{ai_media_play_stop():718} Stopping AI media playback 
+[A][ALERT][core_adp_destroy:414] adp = 0x6D000101
+[A][ALERT][core_mod_free:316] mod_node->mid.u32 = 0x6D000101
+[A][aw88082_i2c_deinit:373]aw88082 i2c deinit success
+[00:00:28:843][I]{ai_media_play_stop():747} AI media playback stopped successfully 
+[A][ALERT][sys_cmd_check_cmd_done:164] wait_time_us = 800
+[A][ALERT][drv_sys_pd:331] DSP0 power down
+APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 31789, deepsleep time:3562, lightsleep time:22331, m sleep flag:0\r
+APP|M core deepsleep cnt:361, lightsleep cnt:24865\r
+APP|M core last veto id:7, last veto count:0, total_counts=1\r
+» AT^GETIDS\r
+» AT^GETIDS\r
+» AT^GETIDS\r
+» AT^GETIDS\r
+» AT^GETIDS\r
+« APP|app_main run start.\r
+APP|sys_slp: 0x0\r
+APP|M core run time 36787, deepsleep time:3562, lightsleep time:26969, m sleep flag:0\r
+APP|M core deepsleep cnt:361, lightsleep cnt:29869\r
+APP|M core last veto id:7, last veto count:0, total_counts=1\r
+PM_ID_BUTTON:1884268648\r
+fac:id : 0
+APP|mipi_tx has been enable!\r
+APP|Succ read lcd id! Lcd id: 0x5598\r
+APP|timeout when wait phy ready \r
+porting_button_remove_veto:1884268744\r
+kvPath: /kvstore
+dataPath: 
+Set value ret: -1
+brightness:0
+Brightness: 0% → Fall Edge: 7 → LED Current: 2.5mA
+[Graphic Error] [ResumeSlice: 225]No valid slice to resume
+fac:id : 0
+» AT^GETIDS\r
+» AT^GETIDS\r
index ae22bfa..9dd2598 100644 (file)
@@ -38,8 +38,8 @@ version=HEAD
 DATE=$(date  +%Y%m%d_%H%M%S)
 HOMEDIR=$PWD
 DEFAULT_BUILD_TYPE=release
-DEFAULT_TARGET_PACK_NAME=pack_brandy_native_js_fd230
-DEFAULT_APPLICATION_NAME=brandy-native-js-fd230
+DEFAULT_TARGET_PACK_NAME=pack_brandy_target3
+DEFAULT_APPLICATION_NAME=brandy-target3
 DEFAULT_RECOVERY_NAME=$DEFAULT_APPLICATION_NAME-r
 DEFAULT_SSB_NAME=$DEFAULT_APPLICATION_NAME-ssb
 
index 5782dfb..f86073a 100644 (file)
@@ -512,6 +512,9 @@ static void thread_main(const void *unused)
      * ConfigModel 初始化\r
      * \r
     */\r
+#ifdef CUSTOM_ZHIHUI\r
+    ConfigModelInit();\r
+#endif\r
 // #ifdef CUSTOM_UTILS\r
 //     uapi_runtime_log_service_init();\r
     init_btaddr_btname();\r
index 1c99cd3..63d5e44 100644 (file)
@@ -72,7 +72,7 @@ struct nand_driver_struct *get_nand_flash(void)
         }\r
     }\r
 \r
-    cached_driver = &g_ds35x1g_driver;\r
+    cached_driver = &g_xt26q02d_driver;\r
     return cached_driver;\r
 #else\r
     #if defined(NANDFLASH_DS35X) \r
index 173f722..6ba0f1a 100644 (file)
@@ -104,8 +104,8 @@ struct nand_driver_struct *get_nand_flash(void)
         }\r
     }\r
 \r
-    PRINT("No matching nand flash chip id 0x%04X found, using default driver DS35X1G\r\n", chip_id);\r
-    cached_driver = &g_ds35x1g_driver;\r
+    PRINT("No matching nand flash chip id 0x%04X found, using default driver NANDFLASH_XT26Q02D\r\n", chip_id);\r
+    cached_driver = &g_xt26q02d_driver;\r
     return cached_driver;\r
 #else\r
     #if defined(NANDFLASH_DS35X) \r
@@ -168,17 +168,17 @@ static int formate_filesystem(uint32_t total_block_num)
 }\r
 static void nandflash_yaffs_mount(void)\r
 {\r
-    if (has_nandflash_init != 1) {\r
-        PRINT("\r\nnandflash not init skip mount.\r\n");\r
-        return ;\r
-    }\r
+    // if (has_nandflash_init != 1) {\r
+    //     PRINT("\r\nnandflash not init skip mount.\r\n");\r
+    //     return ;\r
+    // }\r
     struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
     \r
     PRINT("yaffs filesystem init start!\n");\r
     int ret = formate_filesystem(freertos_nandflash_driver->total_block);\r
     PRINT("yaffs filesystem init end!\n");\r
 #ifdef CUSTOM_ZHIHUI\r
-    ConfigModelInit();\r
+    // ConfigModelInit();\r
 #endif\r
 }\r
 /* 使用约束:中断和异常中,禁止sync操作 */\r
@@ -313,8 +313,12 @@ int nandflash_filesystem_init(void)
         PRINT("get_mtd_info faild!\n");\r
     }\r
     // INSERT_YOUR_CODE\r
+    #if 0\r
     pthread_t yaffs_mount_thread;\r
     pthread_create(&yaffs_mount_thread, NULL, nandflash_yaffs_mount, NULL);\r
+    #else\r
+    // nandflash_yaffs_mount();\r
+    #endif\r
     has_nandflash_init = 1;\r
     return 0;\r
 }\r
index 577ca80..e74b6a2 100644 (file)
@@ -43,7 +43,7 @@ typedef struct {
 static StreamTypeMap g_mapStreamType[] = {\r
     { AUDIO_STREAM_MUSIC, AUDIO_IN_MEDIA },\r
     { AUDIO_STREAM_NOTIFICATION, AUDIO_IN_MEDIA },\r
-    { AUDIO_STREAM_VOICE_ASSISTANT, AUDIO_IN_COMMUNICATION },\r
+    { AUDIO_STREAM_VOICE_ASSISTANT, AUDIO_IN_MEDIA },\r
     { AUDIO_STREAM_VOICE_RECORD, AUDIO_IN_MEDIA },\r
     { AUDIO_STREAM_A2DP_MUSIC, AUDIO_IN_MEDIA },\r
     { AUDIO_STREAM_VOICE_CALL, AUDIO_IN_COMMUNICATION },\r
index b59e458..6024812 100644 (file)
@@ -792,11 +792,13 @@ static int32_t CheckInputParam(SampleParam *sampleParam, int32_t argc, const cha
     if (strncpy_s(sampleParam->format.formatType, sizeof(sampleParam->format.formatType),\r
         argv[0x3], strlen(argv[0x3])) != 0) { /* 3: format */\r
         MEDIA_ERR_LOG("strncpy_s argv[0x3] failed");\r
+    }else{\r
+        MEDIA_ERR_LOG("CheckInputParam formatType %s", sampleParam->format.formatType);\r
     }\r
     sampleParam->format.sampleRate = atoi(argv[0x4]); /* 4: samplerate */\r
-    MEDIA_INFO_LOG("CheckInputParam sampleRate:%d", sampleParam->format.sampleRate);\r
+    MEDIA_ERR_LOG("CheckInputParam sampleRate:%d", sampleParam->format.sampleRate);\r
     sampleParam->format.channel = atoi(argv[0x5]); /* 5: channel */\r
-    MEDIA_INFO_LOG("CheckInputParam channel:%d", sampleParam->format.channel);\r
+    MEDIA_ERR_LOG("CheckInputParam channel:%d", sampleParam->format.channel);\r
     return 0;\r
 }\r
 \r
index 8c7f3a9..8a0e870 100644 (file)
@@ -377,10 +377,10 @@ lwip_init(void)
 #endif /* LWIP_DNS */
 
 #if LWIP_SLIP
-  slip_test_init();
+  // slip_test_init();
 #endif /* LWIP_SLIP */
 #if PPP_SUPPORT
-  ppp_init();
+  // ppp_init();
 #endif
 
 #if LWIP_TIMERS
index f7e6ec0..3fc5984 100644 (file)
@@ -287,7 +287,7 @@ static void RecordingThreadFunc(void *data)
             }
         } else {
             // Sleep briefly if no data available
-            printf("AudioStreamInObtainBuffer error\r\n");
+            // printf("AudioStreamInObtainBuffer error\r\n");
             usleep(10000);  // 10ms
         }
     }
index f10d4c0..62a9a0a 100644 (file)
@@ -1725,15 +1725,28 @@ static uint32_t custom_audio_test(uint8_t *para, uint32_t paraLen, char *strComm
         return ERRCODE_FAIL;
     }
 
-    if (argc != 1) {
-        wstp_print("AUDIO TEST ATCMD Set Parameter Failed argc %d\n", argc);
-        wstp_print("Usage: AT^AUDIOTEST=cmd\n");
-        wstp_print("  cmd: 1=start record, 2=stop record, 3=start play, 4=stop play\n");
-        return ERRCODE_FAIL;
-    }
-
     uint8_t cmd = (uint8_t)atoi((char*)argv[0]);
     
+    // 音量设置命令需要2个参数
+    if (cmd == 7) {
+        if (argc != 2) {
+            wstp_print("AUDIO TEST ATCMD Set Parameter Failed argc %d\n", argc);
+            wstp_print("Usage: AT^AUDIOTEST=7,volume\n");
+            wstp_print("  volume: 0.0-2.0 (1.0 = 100%%, 0.5 = 50%%, 2.0 = 200%%)\n");
+            return ERRCODE_FAIL;
+        }
+    } else {
+        if (argc != 1) {
+            wstp_print("AUDIO TEST ATCMD Set Parameter Failed argc %d\n", argc);
+            wstp_print("Usage: AT^AUDIOTEST=cmd\n");
+            wstp_print("  cmd: 1=start record, 2=stop record, 3=start play, 4=stop play\n");
+            wstp_print("       5=start audio test (play 1kHz + monitor volume), 6=stop audio test\n");
+            wstp_print("       7=set play volume (requires volume parameter: 0.0-2.0)\n");
+            wstp_print("       8=get play volume\n");
+            return ERRCODE_FAIL;
+        }
+    }
+    
     switch (cmd) {
         case 1: // 开始录音
             {
@@ -1778,10 +1791,152 @@ static uint32_t custom_audio_test(uint8_t *para, uint32_t paraLen, char *strComm
                 }
             }
             break;
+        case 5: // 启动音频测试(播放1kHz + 监控音量)
+            {
+                extern int custom_audio_test_start(void);
+                int ret = custom_audio_test_start();
+                if (ret == 0) {
+                    wstp_print("AUDIO TEST START: Success\n");
+                    wstp_print("  Playing 1kHz tone, monitoring volume every 0.5s...\n");
+                } else {
+                    wstp_print("AUDIO TEST START: Failed, ret=%d\n", ret);
+                }
+            }
+            break;
+        case 6: // 停止音频测试
+            {
+                extern int custom_audio_test_stop(void);
+                int ret = custom_audio_test_stop();
+                if (ret == 0) {
+                    wstp_print("AUDIO TEST STOP: Success\n");
+                } else {
+                    wstp_print("AUDIO TEST STOP: Failed, ret=%d\n", ret);
+                }
+            }
+            break;
+        case 7: // 设置播放音量
+            {
+                float volume = (float)atof((char*)argv[1]);
+                extern int custom_audio_test_set_volume(float);
+                int ret = custom_audio_test_set_volume(volume);
+                if (ret == 0) {
+                    wstp_print("AUDIO TEST SET VOLUME: Success (%.2f, %.0f%%)\n", volume, volume * 100.0f);
+                } else {
+                    wstp_print("AUDIO TEST SET VOLUME: Failed, ret=%d\n", ret);
+                }
+            }
+            break;
+        case 8: // 获取播放音量
+            {
+                extern float custom_audio_test_get_volume(void);
+                float volume = custom_audio_test_get_volume();
+                wstp_print("AUDIO TEST GET VOLUME: %.2f (%.0f%%)\n", volume, volume * 100.0f);
+            }
+            break;
         default:
             wstp_print("AUDIO TEST ATCMD Unknown command %d\n", cmd);
             wstp_print("Usage: AT^AUDIOTEST=cmd\n");
             wstp_print("  cmd: 1=start record, 2=stop record, 3=start play, 4=stop play\n");
+            wstp_print("       5=start audio test (play 1kHz + monitor volume), 6=stop audio test\n");
+            wstp_print("       7=set play volume (requires volume parameter: 0.0-2.0)\n");
+            wstp_print("       8=get play volume\n");
+            return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+// GPIO测试AT指令实现
+// 用法:
+//   AT^GPIOTEST=1,总大小,包号,本包字节数,hex字串  - 添加配置数据(分包)
+//   AT^GPIOTEST=2                                    - 开始测试
+//   AT^GPIOTEST=3                                    - 停止测试
+// 注意:AT指令缓冲区限制约256字节,hex字串长度=本包字节数*2
+static uint32_t custom_gpio_test(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+    UNUSED(strCommonCmd);
+    uint8_t argv[CUSTOM_UTILS_MAX_ARGC][CUSTOM_UTILS_MAX_ARGV_LEN] = { 0 };
+    uint32_t argc = 0;
+
+    int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+    if (ret != CUSTOM_UTILS_SUCCESS) {
+        wstp_print("GPIO TEST ATCMD Convert Command Failed\n");
+        return ERRCODE_FAIL;
+    }
+
+    if (argc < 1) {
+        wstp_print("GPIO TEST ATCMD Set Parameter Failed argc %d\n", argc);
+        wstp_print("Usage: AT^GPIOTEST=cmd\n");
+        wstp_print("  cmd: 1=add config (requires total_size,packet_num,packet_bytes,hexstr), 2=start test, 3=stop test\n");
+        return ERRCODE_FAIL;
+    }
+
+    uint8_t cmd = (uint8_t)atoi((char*)argv[0]);
+    
+    switch (cmd) {
+        case 1: // 添加配置数据(分包接收)
+            {
+                if (argc != 5) {
+                    wstp_print("GPIO TEST ATCMD Add Config Failed: argc=%d (need 5)\n", argc);
+                    wstp_print("Usage: AT^GPIOTEST=1,total_size,packet_num,packet_bytes,hexstr\n");
+                    wstp_print("  total_size: JSON file total size in bytes\n");
+                    wstp_print("  packet_num: current packet number (0-based)\n");
+                    wstp_print("  packet_bytes: bytes in this packet\n");
+                    wstp_print("  hexstr: hex string (length = packet_bytes * 2)\n");
+                    wstp_print("Example: AT^GPIOTEST=1,100,0,50,7b227061697273223a5b...\n");
+                    return ERRCODE_FAIL;
+                }
+                
+                uint32_t total_size = (uint32_t)atoi((char*)argv[1]);
+                uint32_t packet_num = (uint32_t)atoi((char*)argv[2]);
+                uint32_t packet_bytes = (uint32_t)atoi((char*)argv[3]);
+                const char* hex_str = (char*)argv[4];
+                
+                // 验证hex字符串长度
+                size_t hex_len = strlen((char*)hex_str);
+                if (hex_len != packet_bytes * 2) {
+                    wstp_print("GPIO TEST ADD CONFIG: Hex string length mismatch: expected %u, got %zu\n",
+                              packet_bytes * 2, hex_len);
+                    return ERRCODE_FAIL;
+                }
+                
+                extern int custom_gpio_test_add_config(uint32_t total_size, uint32_t packet_num, 
+                                                        uint32_t packet_bytes, const char* hex_data);
+                int ret = custom_gpio_test_add_config(total_size, packet_num, packet_bytes, hex_str);
+                if (ret == 0) {
+                    wstp_print("GPIO TEST ADD CONFIG: Success (packet %u/%u, %u bytes)\n",
+                              packet_num, (total_size + packet_bytes - 1) / packet_bytes, packet_bytes);
+                } else {
+                    wstp_print("GPIO TEST ADD CONFIG: Failed, ret=%d\n", ret);
+                }
+            }
+            break;
+        case 2: // 开始测试
+            {
+                extern int custom_gpio_test_start(void);
+                int ret = custom_gpio_test_start();
+                if (ret == 0) {
+                    wstp_print("GPIO TEST START: Success\n");
+                } else {
+                    wstp_print("GPIO TEST START: Failed, ret=%d\n", ret);
+                }
+            }
+            break;
+        case 3: // 停止测试
+            {
+                extern int custom_gpio_test_stop(void);
+                int ret = custom_gpio_test_stop();
+                if (ret == 0) {
+                    wstp_print("GPIO TEST STOP: Success\n");
+                } else {
+                    wstp_print("GPIO TEST STOP: Failed, ret=%d\n", ret);
+                }
+            }
+            break;
+        default:
+            wstp_print("GPIO TEST ATCMD Unknown command %d\n", cmd);
+            wstp_print("Usage: AT^GPIOTEST=cmd\n");
+            wstp_print("  cmd: 1=add config (requires hexstr,is_last), 2=start test, 3=stop test\n");
             return ERRCODE_FAIL;
     }
 
@@ -2014,6 +2169,8 @@ static const at_cmd_table_t g_custom_utils_cmd[] = {
     
     // 录音相关AT指令
     { (char *)"AT^AUDIOTEST",      custom_audio_test, (char *)" " },
+    // GPIO测试AT指令
+    { (char *)"AT^GPIOTEST",      custom_gpio_test, (char *)" " },
     { (char *)"AT^FACTORY",      custom_enter_factory_test_mode, (char *)" " },
     { (char *)"AT^SETUART",      custom_set_uart_status, (char *)" " },
     { (char *)"AT^GETBTMAC",      custom_get_btmac, (char *)" " },
diff --git a/code/sdk/zhihui/utilscpp/AUDIO_TEST_README.md b/code/sdk/zhihui/utilscpp/AUDIO_TEST_README.md
new file mode 100644 (file)
index 0000000..32da072
--- /dev/null
@@ -0,0 +1,179 @@
+# 音频测试程序使用说明
+
+## 功能概述
+
+音频测试程序实现了以下功能:
+1. **启动测试**: 启动AI录音放音服务,循环播放1kHz PCM信号
+2. **实时音量监控**: 通过录音回调收集数据,每0.5秒计算并打印一次音量
+3. **停止测试**: 停止AI录音放音服务并清理资源
+
+## AT命令使用
+
+### 启动音频测试
+
+```
+AT^AUDIOTEST=5
+```
+
+**功能:**
+- 初始化AI媒体服务
+- 启动录音服务(PCM格式,16kHz采样率)
+- 启动播放服务(PCM格式,16kHz采样率)
+- 创建播放线程,循环播放1kHz正弦波
+- 设置录音回调,每0.5秒计算并打印音量
+
+**响应:**
+```
+AUDIO TEST START: Success
+  Playing 1kHz tone, monitoring volume every 0.5s...
+```
+
+### 停止音频测试
+
+```
+AT^AUDIOTEST=6
+```
+
+**功能:**
+- 停止播放线程
+- 停止录音服务
+- 停止播放服务
+- 清理所有资源
+
+**响应:**
+```
+AUDIO TEST STOP: Success
+```
+
+## 音量输出示例
+
+测试运行时会每0.5秒输出一次音量信息:
+
+```
+[AudioTest] Volume - RMS: 56.57% (-4.95 dB), Peak: 80.00% (-1.94 dB), Level: 高
+[AudioTest] Volume - RMS: 55.23% (-5.15 dB), Peak: 79.85% (-1.96 dB), Level: 高
+[AudioTest] Volume - RMS: 57.12% (-4.86 dB), Peak: 80.12% (-1.93 dB), Level: 高
+```
+
+## 技术实现
+
+### 播放机制
+
+- **PCM数据**: 使用 `pcm_1khz_period.h` 中的1kHz正弦波数据
+- **数据格式**: 16样本/周期,16kHz采样率,16位PCM,单声道
+- **播放方式**: 每100ms发送100个周期(100ms音频数据)
+- **循环播放**: 持续循环播放直到停止
+
+### 录音和音量计算
+
+- **录音格式**: PCM,16kHz采样率,16位,单声道
+- **数据缓冲**: 使用16KB循环缓冲区存储录音数据
+- **音量计算**: 每0.5秒使用最近8000个样本(0.5秒数据)计算音量
+- **计算指标**: RMS值、峰值、分贝值、音量等级
+
+### 音量等级
+
+| 分贝范围 | 等级 | 说明 |
+|---------|------|------|
+| < -60 dB | 静音 | 几乎听不到 |
+| -60 ~ -40 dB | 极低 | 非常安静 |
+| -40 ~ -20 dB | 低 | 较低音量 |
+| -20 ~ -6 dB | 中 | 中等音量 |
+| -6 ~ 0 dB | 高 | 较高音量 |
+| ≥ 0 dB | 最大 | 最大音量(可能削波) |
+
+## 文件结构
+
+```
+code/sdk/zhihui/utilscpp/
+├── audio_test.cpp              # 音频测试程序实现
+├── include/
+│   ├── pcm_1khz_period.h      # 1kHz PCM数据(最小周期)
+│   └── pcm_volume_calculator.h # 音量计算函数头文件
+├── pcm_volume_calculator.c     # 音量计算函数实现
+├── custom_utilscpp.h           # 导出函数声明
+└── CMakeLists.txt              # 构建配置(已更新)
+```
+
+## 代码接口
+
+### C函数接口
+
+```c
+// 启动音频测试
+int custom_audio_test_start(void);
+
+// 停止音频测试
+int custom_audio_test_stop(void);
+
+// 获取测试状态
+bool custom_audio_test_is_running(void);
+```
+
+### 使用示例
+
+```c
+#include "custom_utilscpp.h"
+
+// 启动测试
+if (custom_audio_test_start() == 0) {
+    printf("Audio test started\n");
+}
+
+// ... 运行一段时间 ...
+
+// 停止测试
+if (custom_audio_test_stop() == 0) {
+    printf("Audio test stopped\n");
+}
+```
+
+## 注意事项
+
+1. **资源管理**: 
+   - 确保在停止测试时正确清理资源
+   - 不要重复启动测试(会返回错误)
+
+2. **线程安全**: 
+   - 使用互斥锁保护共享数据
+   - 录音回调和主线程之间的数据访问是线程安全的
+
+3. **性能**: 
+   - 音量计算会消耗一定CPU资源,但影响较小
+   - 播放线程优先级为28,确保及时发送数据
+
+4. **音频参数**: 
+   - 固定使用16kHz采样率,PCM格式
+   - 如需修改,需要修改代码中的参数
+
+## 故障排查
+
+### 测试无法启动
+
+- 检查AI媒体服务是否可用
+- 查看日志输出获取详细错误信息
+- 确认系统资源充足
+
+### 没有音量输出
+
+- 确认录音服务已启动
+- 检查录音回调是否被调用
+- 确认麦克风正常工作
+- 检查缓冲区是否正确分配
+
+### 播放无声音
+
+- 确认播放服务已启动
+- 检查音频输出设备
+- 确认PCM数据格式正确
+- 检查播放线程是否正常运行
+
+## 扩展功能建议
+
+1. **多频率测试**: 支持播放不同频率的信号
+2. **音量调整**: 动态调整播放音量
+3. **数据记录**: 将音量数据保存到文件
+4. **实时图表**: 显示音量波形图
+5. **自动测试**: 自动运行测试序列
+6. **频率响应测试**: 测试不同频率的响应
+
diff --git a/code/sdk/zhihui/utilscpp/AUDIO_TEST_USAGE.md b/code/sdk/zhihui/utilscpp/AUDIO_TEST_USAGE.md
new file mode 100644 (file)
index 0000000..816eaac
--- /dev/null
@@ -0,0 +1,180 @@
+# 音频测试程序使用说明
+
+## 功能概述
+
+音频测试程序提供以下功能:
+1. **启动测试**: 启动AI录音放音服务,循环播放1kHz PCM信号
+2. **实时音量监控**: 每0.5秒计算并打印一次录音音量
+3. **停止测试**: 停止AI录音放音服务
+
+## API接口
+
+### custom_audio_test_start()
+
+启动音频测试。
+
+**功能:**
+- 初始化AI媒体服务
+- 启动录音服务(PCM格式,16kHz采样率)
+- 启动播放服务(PCM格式,16kHz采样率)
+- 创建播放线程,循环播放1kHz正弦波
+- 设置录音回调,收集数据并计算音量
+
+**返回值:**
+- `0`: 成功
+- `-1`: 失败
+
+**示例:**
+```c
+int ret = custom_audio_test_start();
+if (ret == 0) {
+    printf("Audio test started successfully\n");
+}
+```
+
+### custom_audio_test_stop()
+
+停止音频测试。
+
+**功能:**
+- 停止播放线程
+- 停止录音服务
+- 停止播放服务
+- 清理资源
+
+**返回值:**
+- `0`: 成功
+- `-1`: 失败
+
+**示例:**
+```c
+int ret = custom_audio_test_stop();
+if (ret == 0) {
+    printf("Audio test stopped successfully\n");
+}
+```
+
+### custom_audio_test_is_running()
+
+获取测试状态。
+
+**返回值:**
+- `true`: 测试正在运行
+- `false`: 测试未运行
+
+**示例:**
+```c
+if (custom_audio_test_is_running()) {
+    printf("Test is running\n");
+}
+```
+
+## 工作原理
+
+### 播放机制
+
+1. **PCM数据**: 使用 `pcm_1khz_period.h` 中的1kHz正弦波数据(16样本,1ms周期)
+2. **循环播放**: 播放线程每100ms发送100个周期(100ms音频数据)
+3. **采样率**: 16kHz,单声道,16位PCM
+
+### 录音和音量计算
+
+1. **录音回调**: `AudioRecordCallback` 函数接收录音数据
+2. **数据缓冲**: 使用循环缓冲区存储最近的录音数据
+3. **音量计算**: 每0.5秒使用 `pcm_calculate_volume` 计算一次音量
+4. **输出信息**: 打印RMS值、峰值、分贝值和音量等级
+
+### 音量输出格式
+
+```
+[AudioTest] Volume - RMS: 56.57% (-4.95 dB), Peak: 80.00% (-1.94 dB), Level: 高
+```
+
+## 使用场景
+
+### 1. 通过函数调用
+
+```c
+#include "custom_utilscpp.h"
+
+// 启动测试
+custom_audio_test_start();
+
+// ... 运行一段时间 ...
+
+// 停止测试
+custom_audio_test_stop();
+```
+
+### 2. 通过AT命令(需要注册)
+
+如果需要通过AT命令控制,可以在AT命令系统中注册:
+
+```c
+// 在AT命令注册表中添加
+{ "AT^AUDIOTESTSTART", custom_audio_test_start_cmd, "00 00" },
+{ "AT^AUDIOTESTSTOP", custom_audio_test_stop_cmd, "00 01" },
+```
+
+### 3. 集成到现有系统
+
+可以在现有的测试框架或诊断系统中调用这些函数。
+
+## 技术细节
+
+### 音频参数
+
+- **采样率**: 16kHz
+- **位深**: 16位
+- **声道**: 单声道
+- **格式**: PCM
+- **播放信号**: 1kHz正弦波(80%幅度)
+
+### 线程配置
+
+- **播放线程**: 优先级28,栈大小8KB
+- **播放间隔**: 每100ms发送一次数据
+- **音量检查**: 每500ms计算一次
+
+### 内存使用
+
+- **录音缓冲区**: 16KB(1秒数据@16kHz)
+- **播放缓冲区**: 临时分配,每次100ms数据
+
+## 注意事项
+
+1. **资源管理**: 确保在停止测试时正确清理资源
+2. **线程安全**: 使用互斥锁保护共享数据
+3. **错误处理**: 检查返回值,处理可能的错误
+4. **性能**: 音量计算会消耗一定CPU资源,但影响较小
+
+## 故障排查
+
+### 测试无法启动
+
+- 检查AI媒体服务是否已初始化
+- 检查是否有足够的系统资源
+- 查看日志输出获取详细错误信息
+
+### 没有音量输出
+
+- 确认录音服务已启动
+- 检查录音回调是否被调用
+- 确认麦克风正常工作
+
+### 播放无声音
+
+- 确认播放服务已启动
+- 检查音频输出设备
+- 确认PCM数据格式正确
+
+## 扩展功能
+
+可以基于此程序扩展以下功能:
+
+1. **多频率测试**: 支持播放不同频率的信号
+2. **音量调整**: 动态调整播放音量
+3. **数据记录**: 将音量数据保存到文件
+4. **实时图表**: 显示音量波形图
+5. **自动测试**: 自动运行测试序列
+
index 2c25884..f6ce112 100644 (file)
@@ -8,10 +8,14 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/custom_utilscpp.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/7zFile.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/7zStream.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/audio_test.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/pcm_volume_calculator.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/gpio_test.cpp
 )
 
 set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/include
 )
 
 set(PRIVATE_HEADER
@@ -22,6 +26,7 @@ set(PRIVATE_HEADER
     ${CMAKE_SOURCE_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
     ${CMAKE_SOURCE_DIR}/middleware/services/media/foundation/player/interfaces/kits
     ${CMAKE_SOURCE_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
+    ${CMAKE_SOURCE_DIR}/open_source/openharmony/third_party/cJSON
 )
 
 set(PRIVATE_DEFINES
diff --git a/code/sdk/zhihui/utilscpp/M1_pins.xlsx b/code/sdk/zhihui/utilscpp/M1_pins.xlsx
new file mode 100644 (file)
index 0000000..089114f
Binary files /dev/null and b/code/sdk/zhihui/utilscpp/M1_pins.xlsx differ
diff --git a/code/sdk/zhihui/utilscpp/audio_test.cpp b/code/sdk/zhihui/utilscpp/audio_test.cpp
new file mode 100644 (file)
index 0000000..c201fa5
--- /dev/null
@@ -0,0 +1,504 @@
+/**
+ * @file audio_test.cpp
+ * @brief 音频测试程序 - 播放1kHz PCM信号并实时计算录音音量
+ * 
+ * 功能:
+ * 1. 启动AI语音服务(使用old_Start_AIVoice)
+ * 2. 在独立线程中循环播放1kHz PCM信号(使用AI_WriteAudioData)
+ * 3. 通过录音回调收集数据,每0.5秒计算并打印一次音量
+ * 4. 支持开始/停止测试指令(使用StopAIVoice)
+ */
+
+#include "custom_utilscpp.h"
+#include "debug_print.h"
+#include "securec.h"
+#include "media_thread_adapt.h"
+#include "cmsis_os2.h"
+#include "los_base.h"
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <unistd.h>
+#include <time.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// 包含AI媒体服务
+#include "../../ai/include/ai_media.h"
+
+// 包含PCM数据和音量计算函数
+#include "pcm_1khz_period.h"
+#include "pcm_volume_calculator.h"
+
+// 测试状态
+typedef struct {
+    bool is_running;                    // 测试是否正在运行
+    MediaThreadIdHandle play_thread;    // 播放线程句柄
+    MediaMutexHandle mutex;             // 互斥锁
+    
+    // 播放音量调节(0.0-2.0,1.0为原始音量)
+    float play_volume;                  // 播放音量增益
+    MediaMutexHandle volume_mutex;      // 音量互斥锁
+    
+    // 录音数据缓冲区(用于音量计算)
+    int16_t* record_buffer;             // 录音数据缓冲区
+    uint32_t buffer_size;               // 缓冲区大小
+    uint32_t buffer_write_pos;          // 写入位置
+    MediaMutexHandle buffer_mutex;      // 缓冲区互斥锁
+    
+    // 音量计算相关
+    uint32_t last_volume_check_time;    // 上次音量检查时间(毫秒)
+    uint32_t volume_check_interval_ms;  // 音量检查间隔(500ms)
+} AudioTestContext;
+
+static AudioTestContext g_audio_test_ctx = {0};
+
+// 前向声明
+static void* AudioPlayThread(void* arg);
+static void AudioTestDataCallback(const uint8_t* data, uint32_t size, void* userData);
+static uint32_t GetCurrentTimeMs(void);
+
+/**
+ * @brief 获取当前时间(毫秒)
+ */
+static uint32_t GetCurrentTimeMs(void)
+{
+    // 使用CMSIS OS2的tick计数
+    uint32_t tick_count = osKernelGetTickCount();
+    uint32_t tick_freq = osKernelGetTickFreq();
+    return (tick_count * 1000) / tick_freq;
+}
+
+/**
+ * @brief AI语音数据回调函数 - 收集录音数据用于音量计算
+ * @param data 音频数据
+ * @param size 数据大小
+ * @param userData 用户数据
+ */
+static void AudioTestDataCallback(const uint8_t* data, uint32_t size, void* userData)
+{
+    (void)userData;
+    
+    if (data == nullptr || size == 0 || !g_audio_test_ctx.is_running) {
+        return;
+    }
+    
+    // 将uint8_t数据转换为int16_t PCM数据
+    uint32_t sample_count = size / 2;  // 16位PCM,每样本2字节
+    
+    MediaMutexLock(g_audio_test_ctx.buffer_mutex);
+    
+    // 确保缓冲区足够大
+    if (g_audio_test_ctx.buffer_size < sample_count * 2) {
+        // 重新分配缓冲区(保留2倍空间)
+        if (g_audio_test_ctx.record_buffer != nullptr) {
+            free(g_audio_test_ctx.record_buffer);
+        }
+        g_audio_test_ctx.buffer_size = sample_count * 2;
+        g_audio_test_ctx.record_buffer = (int16_t*)malloc(g_audio_test_ctx.buffer_size * sizeof(int16_t));
+        if (g_audio_test_ctx.record_buffer == nullptr) {
+            PRINT("[AudioTest] Failed to allocate record buffer\r\n");
+            MediaMutexUnLock(g_audio_test_ctx.buffer_mutex);
+            return;
+        }
+        g_audio_test_ctx.buffer_write_pos = 0;
+    }
+    
+    // 复制数据到缓冲区(循环缓冲区)
+    const int16_t* pcm_data = (const int16_t*)data;
+    for (uint32_t i = 0; i < sample_count; i++) {
+        g_audio_test_ctx.record_buffer[g_audio_test_ctx.buffer_write_pos] = pcm_data[i];
+        g_audio_test_ctx.buffer_write_pos = (g_audio_test_ctx.buffer_write_pos + 1) % g_audio_test_ctx.buffer_size;
+    }
+    
+    // 检查是否需要计算音量(每0.5秒)
+    uint32_t current_time = GetCurrentTimeMs();
+    bool should_calculate = (current_time - g_audio_test_ctx.last_volume_check_time >= g_audio_test_ctx.volume_check_interval_ms);
+    
+    if (should_calculate) {
+        g_audio_test_ctx.last_volume_check_time = current_time;
+        
+        // 计算音量(使用最近0.5秒的数据,约8000样本@16kHz)
+        const uint32_t samples_for_volume = 8000;  // 0.5秒数据@16kHz
+        uint32_t samples_to_use = (g_audio_test_ctx.buffer_write_pos > samples_for_volume) ? 
+                                   samples_for_volume : g_audio_test_ctx.buffer_write_pos;
+        
+        if (samples_to_use > 0) {
+            // 分配临时缓冲区用于计算(简化循环缓冲区处理)
+            int16_t* temp_buffer = (int16_t*)malloc(samples_to_use * sizeof(int16_t));
+            if (temp_buffer != nullptr) {
+                // 从循环缓冲区复制最近的数据
+                if (g_audio_test_ctx.buffer_write_pos >= samples_to_use) {
+                    // 直接从buffer_write_pos往前取
+                    memcpy(temp_buffer, 
+                           g_audio_test_ctx.record_buffer + (g_audio_test_ctx.buffer_write_pos - samples_to_use),
+                           samples_to_use * sizeof(int16_t));
+                } else {
+                    // 需要从缓冲区末尾开始取(循环缓冲区)
+                    uint32_t part1 = g_audio_test_ctx.buffer_write_pos;
+                    uint32_t part2 = samples_to_use - part1;
+                    memcpy(temp_buffer, 
+                           g_audio_test_ctx.record_buffer + (g_audio_test_ctx.buffer_size - part2),
+                           part2 * sizeof(int16_t));
+                    memcpy(temp_buffer + part2,
+                           g_audio_test_ctx.record_buffer,
+                           part1 * sizeof(int16_t));
+                }
+                
+                pcm_volume_result_t result;
+                if (pcm_calculate_volume(temp_buffer, samples_to_use, &result) == 0) {
+                    PRINT("[AudioTest] Volume - RMS: %.2f%% (%.2f dB), Peak: %.2f%% (%.2f dB), Level: %s\r\n",
+                          result.rms * 100.0, result.rms_db,
+                          result.peak * 100.0, result.peak_db,
+                          pcm_get_volume_level(result.rms_db));
+                }
+                
+                free(temp_buffer);
+            }
+        }
+    }
+    MediaMutexUnLock(g_audio_test_ctx.buffer_mutex);
+}
+
+/**
+ * @brief 播放线程 - 循环播放1kHz PCM信号
+ */
+static void* AudioPlayThread(void* arg)
+{
+    (void)arg;
+    
+    PRINT("[AudioTest] Play thread started\r\n");
+    
+    // 16kHz采样率,16样本 = 1ms,所以每1ms发送一个周期
+    // 为了最大程度减少卡顿,采用最小的数据包和最高的发送频率
+    // 每次发送5个周期(5ms数据,160字节),usleep(40*160) = 6.4ms,非常接近实时
+    const uint32_t periods_per_send = 5;   // 每次发送5个周期(5ms数据,160字节)
+    
+    // 预先准备数据缓冲区(避免在循环中重复分配)
+    uint32_t buffer_size = PCM_1KHZ_DATA_BYTES * periods_per_send;
+    uint8_t* pcm_buffer = (uint8_t*)malloc(buffer_size);
+    if (pcm_buffer == nullptr) {
+        PRINT("[AudioTest] Failed to allocate play buffer\r\n");
+        return nullptr;
+    }
+    
+    int16_t* pcm_samples = (int16_t*)pcm_buffer;
+    
+    // 预先填充原始数据缓冲区(不应用音量)
+    int16_t* raw_pcm_samples = (int16_t*)malloc(buffer_size);
+    if (raw_pcm_samples == nullptr) {
+        PRINT("[AudioTest] Failed to allocate raw buffer\r\n");
+        free(pcm_buffer);
+        return nullptr;
+    }
+    
+    for (uint32_t period = 0; period < periods_per_send; period++) {
+        for (uint32_t i = 0; i < PCM_1KHZ_DATA_SIZE; i++) {
+            raw_pcm_samples[period * PCM_1KHZ_DATA_SIZE + i] = pcm_1khz_data[i];
+        }
+    }
+    
+    PRINT("[AudioTest] Pre-filled %u periods (%u bytes, %.1f ms) of PCM data\r\n", 
+          periods_per_send, buffer_size, (float)periods_per_send * PCM_1KHZ_DATA_PERIOD_DURATION_MS);
+    
+    // 计算发送间隔:5ms数据,但AI_WriteAudioData内部会sleep(40*size) = 6.4ms
+    // 所以实际间隔约为6.4ms,非常接近实时播放速度
+    // 采用连续发送策略,不等待,让AI_WriteAudioData内部的sleep自然控制节奏
+    
+    float last_volume = 1.0f;  // 记录上次音量,避免重复计算
+    
+    while (true) {
+        // 检查是否需要停止(在循环开始就检查,避免不必要的处理)
+        MediaMutexLock(g_audio_test_ctx.mutex);
+        bool should_stop = !g_audio_test_ctx.is_running;
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        
+        if (should_stop) {
+            break;
+        }
+        
+        // 获取当前音量设置(只在音量改变时重新计算)
+        MediaMutexLock(g_audio_test_ctx.volume_mutex);
+        float volume = g_audio_test_ctx.play_volume;
+        MediaMutexUnLock(g_audio_test_ctx.volume_mutex);
+        
+        // 如果音量改变,重新应用音量增益到数据
+        if (volume != last_volume) {
+            uint32_t sample_count = buffer_size / sizeof(int16_t);
+            for (uint32_t i = 0; i < sample_count; i++) {
+                int32_t sample = (int32_t)raw_pcm_samples[i];
+                sample = (int32_t)(sample * volume);
+                // 限制在int16_t范围内,避免削波
+                if (sample > 32767) sample = 32767;
+                if (sample < -32768) sample = -32768;
+                pcm_samples[i] = (int16_t)sample;
+            }
+            last_volume = volume;
+        }
+        
+        // 连续发送数据,保持缓冲区充足
+        // 每次循环发送40批,总共200ms的数据
+        // 由于AI_WriteAudioData内部有usleep(40*size),每批会等待约6.4ms
+        // 40批总共约256ms,这样可以保持缓冲区有足够数据
+        // 不额外等待,让AI_WriteAudioData内部的sleep自然控制节奏
+        for (int batch = 0; batch < 40; batch++) {
+            // 检查停止标志(每批检查一次,保持响应性)
+            MediaMutexLock(g_audio_test_ctx.mutex);
+            bool should_stop_now = !g_audio_test_ctx.is_running;
+            MediaMutexUnLock(g_audio_test_ctx.mutex);
+            
+            if (should_stop_now) {
+                goto exit_loop;
+            }
+            
+            // 使用AI_WriteAudioData发送到播放服务
+            // 注意:AI_WriteAudioData内部有usleep(40*size),5个周期(160字节)会sleep约6.4ms
+            // 这个sleep会自然控制播放节奏,我们不需要额外等待
+            int32_t ret = AI_WriteAudioData(pcm_buffer, buffer_size);
+            if (ret != 0) {
+                // 如果发送失败,短暂等待后继续
+                usleep(500);
+            }
+        }
+    }
+    
+exit_loop:
+    // 释放缓冲区
+    free(pcm_buffer);
+    free(raw_pcm_samples);
+    
+    PRINT("[AudioTest] Play thread stopped\r\n");
+    return nullptr;
+}
+
+/**
+ * @brief 启动音频测试
+ * @return 0 成功, -1 失败
+ */
+int custom_audio_test_start(void)
+{
+    PRINT("[AudioTest] Starting audio test...\r\n");
+    
+    // 检查是否已经在运行
+    MediaMutexLock(g_audio_test_ctx.mutex);
+    if (g_audio_test_ctx.is_running) {
+        PRINT("[AudioTest] Test already running\r\n");
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        return -1;
+    }
+    
+    // 初始化互斥锁
+    if (g_audio_test_ctx.mutex == nullptr) {
+        g_audio_test_ctx.mutex = MediaMutexCreate(nullptr);
+        if (g_audio_test_ctx.mutex == nullptr) {
+            PRINT("[AudioTest] Failed to create mutex\r\n");
+            return -1;
+        }
+    }
+    
+    if (g_audio_test_ctx.buffer_mutex == nullptr) {
+        g_audio_test_ctx.buffer_mutex = MediaMutexCreate(nullptr);
+        if (g_audio_test_ctx.buffer_mutex == nullptr) {
+            PRINT("[AudioTest] Failed to create buffer mutex\r\n");
+            MediaMutexUnLock(g_audio_test_ctx.mutex);
+            return -1;
+        }
+    }
+    
+    if (g_audio_test_ctx.volume_mutex == nullptr) {
+        g_audio_test_ctx.volume_mutex = MediaMutexCreate(nullptr);
+        if (g_audio_test_ctx.volume_mutex == nullptr) {
+            PRINT("[AudioTest] Failed to create volume mutex\r\n");
+            MediaMutexUnLock(g_audio_test_ctx.mutex);
+            return -1;
+        }
+    }
+    
+    // 初始化播放音量(默认1.0,即原始音量)
+    g_audio_test_ctx.play_volume = 1.0f;
+    
+    // 初始化AI媒体服务
+    int32_t ret = ai_media_service_init();
+    if (ret != 0) {
+        PRINT("[AudioTest] Failed to init AI media service: %d\r\n", ret);
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        return -1;
+    }
+    
+    // 设置输入和输出音频参数(PCM格式,16kHz,单声道)
+    // PCM = 1 (根据audio_base_type.h定义)
+    AIVoiceAudioParams inputParams = {
+        .audioFormat = 1,  // PCM格式
+        .channelCount = 1,
+        .sampleRate = 16000
+    };
+    
+    AIVoiceAudioParams outputParams = {
+        .audioFormat = 1,  // PCM格式
+        .channelCount = 1,
+        .sampleRate = 16000
+    };
+    
+    // 启动AI语音服务(使用old_Start_AIVoice)
+    // 不使用OGG封装
+    ret = old_Start_AIVoice(AudioTestDataCallback, nullptr, &inputParams, &outputParams, false);
+    if (ret != 0) {
+        PRINT("[AudioTest] Failed to start AI voice service: %d\r\n", ret);
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        return -1;
+    }
+    
+    // 初始化缓冲区
+    g_audio_test_ctx.buffer_size = 16000;  // 16kHz采样率,1秒数据
+    g_audio_test_ctx.record_buffer = (int16_t*)malloc(g_audio_test_ctx.buffer_size * sizeof(int16_t));
+    if (g_audio_test_ctx.record_buffer == nullptr) {
+        PRINT("[AudioTest] Failed to allocate record buffer\r\n");
+        StopAIVoice();
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        return -1;
+    }
+    g_audio_test_ctx.buffer_write_pos = 0;
+    g_audio_test_ctx.last_volume_check_time = GetCurrentTimeMs();
+    g_audio_test_ctx.volume_check_interval_ms = 500;  // 0.5秒
+    
+    // 启动播放线程
+    g_audio_test_ctx.is_running = true;
+    MediaMutexUnLock(g_audio_test_ctx.mutex);
+    
+    MediaThreadattr attr = {
+        "AudioTestPlay",
+        0x2000,  // 8KB栈
+        THREAD_SCHED_INVALID,
+        0,
+        false
+    };
+    
+    g_audio_test_ctx.play_thread = MediaThreadCreate(AudioPlayThread, nullptr, &attr);
+    if (g_audio_test_ctx.play_thread == nullptr) {
+        PRINT("[AudioTest] Failed to create play thread\r\n");
+        g_audio_test_ctx.is_running = false;
+        StopAIVoice();
+        free(g_audio_test_ctx.record_buffer);
+        g_audio_test_ctx.record_buffer = nullptr;
+        return -1;
+    }
+    
+    PRINT("[AudioTest] Audio test started successfully\r\n");
+    PRINT("[AudioTest] Playing 1kHz tone, monitoring volume every 0.5s...\r\n");
+    
+    return 0;
+}
+
+/**
+ * @brief 停止音频测试
+ * @return 0 成功, -1 失败
+ */
+int custom_audio_test_stop(void)
+{
+    PRINT("[AudioTest] Stopping audio test...\r\n");
+    
+    MediaMutexLock(g_audio_test_ctx.mutex);
+    
+    if (!g_audio_test_ctx.is_running) {
+        PRINT("[AudioTest] Test not running\r\n");
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        return 0;  // 已经停止,返回成功
+    }
+    
+    // 设置停止标志,让回调和播放线程知道要停止
+    g_audio_test_ctx.is_running = false;
+    MediaMutexUnLock(g_audio_test_ctx.mutex);
+    
+    // 给播放线程一点时间退出(最多等待500ms)
+    MediaThreadIdHandle thread_to_join = nullptr;
+    for (int i = 0; i < 5; i++) {  // 最多等待500ms
+        MediaMutexLock(g_audio_test_ctx.mutex);
+        thread_to_join = g_audio_test_ctx.play_thread;
+        bool has_thread = (thread_to_join != nullptr);
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        
+        if (!has_thread) {
+            break;  // 线程已经退出
+        }
+        
+        usleep(100000);  // 等待100ms
+    }
+    
+    // 清理播放线程句柄(如果还在)
+    if (thread_to_join != nullptr) {
+        MediaMutexLock(g_audio_test_ctx.mutex);
+        if (g_audio_test_ctx.play_thread == thread_to_join) {
+            g_audio_test_ctx.play_thread = nullptr;  // 清空句柄,避免重复join
+        }
+        MediaMutexUnLock(g_audio_test_ctx.mutex);
+        // 不等待线程结束,避免阻塞
+    }
+    
+    // 清理缓冲区
+    MediaMutexLock(g_audio_test_ctx.buffer_mutex);
+    if (g_audio_test_ctx.record_buffer != nullptr) {
+        free(g_audio_test_ctx.record_buffer);
+        g_audio_test_ctx.record_buffer = nullptr;
+    }
+    g_audio_test_ctx.buffer_size = 0;
+    g_audio_test_ctx.buffer_write_pos = 0;
+    MediaMutexUnLock(g_audio_test_ctx.buffer_mutex);
+    
+    // 停止AI语音服务(使用StopAIVoice)
+    PRINT("[AudioTest] Calling StopAIVoice()...\r\n");
+    StopAIVoice();
+    
+    PRINT("[AudioTest] Audio test stopped\r\n");
+    
+    return 0;
+}
+
+/**
+ * @brief 获取测试状态
+ * @return true 正在运行, false 未运行
+ */
+bool custom_audio_test_is_running(void)
+{
+    MediaMutexLock(g_audio_test_ctx.mutex);
+    bool is_running = g_audio_test_ctx.is_running;
+    MediaMutexUnLock(g_audio_test_ctx.mutex);
+    return is_running;
+}
+
+/**
+ * @brief 设置播放音量
+ * @param volume 音量值,范围0.0-2.0,1.0为原始音量
+ * @return 0 成功, -1 失败
+ */
+int custom_audio_test_set_volume(float volume)
+{
+    if (volume < 0.0f || volume > 2.0f) {
+        PRINT("[AudioTest] Invalid volume: %.2f (range: 0.0-2.0)\r\n", volume);
+        return -1;
+    }
+    
+    MediaMutexLock(g_audio_test_ctx.volume_mutex);
+    g_audio_test_ctx.play_volume = volume;
+    MediaMutexUnLock(g_audio_test_ctx.volume_mutex);
+    
+    PRINT("[AudioTest] Play volume set to %.2f (%.0f%%)\r\n", volume, volume * 100.0f);
+    return 0;
+}
+
+/**
+ * @brief 获取播放音量
+ * @return 当前音量值(0.0-2.0)
+ */
+float custom_audio_test_get_volume(void)
+{
+    MediaMutexLock(g_audio_test_ctx.volume_mutex);
+    float volume = g_audio_test_ctx.play_volume;
+    MediaMutexUnLock(g_audio_test_ctx.volume_mutex);
+    return volume;
+}
+
+#ifdef __cplusplus
+}
+#endif
index 47b1593..f806f1b 100644 (file)
@@ -46,6 +46,72 @@ int custom_stop_play_audio(void);
 */
 errcode_t post_func_to_graphic(void (*func)(void));
 
+/**
+ * @brief 启动音频测试
+ * 启动AI录音放音服务,播放1kHz PCM信号,并每0.5秒打印一次录音音量
+ * @return 0 成功, -1 失败
+ */
+int custom_audio_test_start(void);
+
+/**
+ * @brief 停止音频测试
+ * 停止AI录音放音服务
+ * @return 0 成功, -1 失败
+ */
+int custom_audio_test_stop(void);
+
+/**
+ * @brief 获取音频测试状态
+ * @return true 正在运行, false 未运行
+ */
+bool custom_audio_test_is_running(void);
+
+/**
+ * @brief 设置播放音量
+ * @param volume 音量值,范围0.0-2.0,1.0为原始音量
+ * @return 0 成功, -1 失败
+ */
+int custom_audio_test_set_volume(float volume);
+
+/**
+ * @brief 获取播放音量
+ * @return 当前音量值(0.0-2.0)
+ */
+float custom_audio_test_get_volume(void);
+
+/**
+ * @brief 初始化GPIO测试模块
+ */
+void custom_gpio_test_init(void);
+
+/**
+ * @brief 添加GPIO测试配置数据(分包接收)
+ * @param total_size JSON文件总大小(字节)
+ * @param packet_num 当前包号(从0开始)
+ * @param packet_bytes 本包字节数
+ * @param hex_data hex字符串数据(长度为packet_bytes*2)
+ * @return 0成功,-1失败
+ */
+int custom_gpio_test_add_config(uint32_t total_size, uint32_t packet_num, uint32_t packet_bytes, const char* hex_data);
+
+/**
+ * @brief 启动GPIO测试
+ * @return 0成功,-1失败
+ */
+int custom_gpio_test_start(void);
+
+/**
+ * @brief 停止GPIO测试
+ * @return 0成功,-1失败
+ */
+int custom_gpio_test_stop(void);
+
+/**
+ * @brief 获取GPIO测试状态
+ * @return true正在运行,false未运行
+ */
+bool custom_gpio_test_is_running(void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/code/sdk/zhihui/utilscpp/generate_gpio_test_config.py b/code/sdk/zhihui/utilscpp/generate_gpio_test_config.py
new file mode 100644 (file)
index 0000000..ebc050b
--- /dev/null
@@ -0,0 +1,290 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+从Excel文件生成GPIO测试JSON配置
+读取sheet1中的"GPIO测试配对关系"列和"定义"列,生成JSON配置
+"""
+
+import json
+import sys
+import openpyxl
+from openpyxl import load_workbook
+
+def find_column_by_header(worksheet, header_text):
+    """查找包含指定文本的列号(从1开始)"""
+    for col in range(1, worksheet.max_column + 1):
+        cell_value = worksheet.cell(row=1, column=col).value
+        if cell_value and header_text in str(cell_value):
+            return col
+    return None
+
+def parse_gpio_pair(pair_str):
+    """解析配对字符串,如 "1-out,1-in" 返回 (1, 1)"""
+    if not pair_str:
+        return None
+    
+    pair_str = str(pair_str).strip()
+    parts = pair_str.split(',')
+    if len(parts) != 2:
+        return None
+    
+    out_num = None
+    in_num = None
+    
+    for part in parts:
+        part = part.strip()
+        if '-out' in part.lower():
+            try:
+                # 处理复用情况,如 "32-out / 33-out"
+                out_str = part.replace('-out', '').replace('-OUT', '').strip()
+                # 如果有"/",取第一个数字
+                if '/' in out_str:
+                    out_str = out_str.split('/')[0].strip()
+                out_num = int(out_str)
+            except ValueError:
+                pass
+        elif '-in' in part.lower():
+            try:
+                # 处理复用情况,如 "32-in / 33-in"
+                in_str = part.replace('-in', '').replace('-IN', '').strip()
+                # 如果有"/",取第一个数字
+                if '/' in in_str:
+                    in_str = in_str.split('/')[0].strip()
+                in_num = int(in_str)
+            except ValueError:
+                pass
+    
+    if out_num is not None and in_num is not None:
+        return (out_num, in_num)
+    return None
+
+def parse_group_numbers(value_str, suffix):
+    """解析组号,支持复用情况,如 "32-out / 33-out" 返回 [32, 33]"""
+    if not value_str:
+        return []
+    
+    value_str = str(value_str).strip()
+    # 移除后缀(-out 或 -in)
+    value_str = value_str.replace(f'-{suffix}', '').replace(f'-{suffix.upper()}', '').strip()
+    
+    # 处理"/"分隔的复用情况
+    if '/' in value_str:
+        groups = []
+        for part in value_str.split('/'):
+            part = part.strip()
+            try:
+                groups.append(int(part))
+            except ValueError:
+                pass
+        return groups
+    else:
+        # 单个组号
+        try:
+            return [int(value_str)]
+        except ValueError:
+            return []
+
+def main():
+    excel_file = "M1_pins.xlsx"
+    
+    try:
+        # 加载Excel文件
+        wb = load_workbook(excel_file, data_only=True)
+        
+        # 列出所有sheet名称
+        print(f"Available sheets: {wb.sheetnames}")
+        
+        # 使用第一个sheet
+        sheet_name = wb.sheetnames[0]
+        ws = wb[sheet_name]
+        
+        print(f"Loaded Excel file: {excel_file}")
+        print(f"Using sheet: {sheet_name}, Rows: {ws.max_row}, Columns: {ws.max_column}")
+        
+        # 打印前几行数据以便调试
+        print("\nFirst 5 rows of data:")
+        for row in range(1, min(6, ws.max_row + 1)):
+            row_data = []
+            for col in range(1, min(10, ws.max_column + 1)):
+                cell_value = ws.cell(row=row, column=col).value
+                row_data.append(str(cell_value)[:20] if cell_value else "")
+            print(f"Row {row}: {row_data}")
+        
+        # 查找"GPIO测试配对关系"列
+        pair_col = find_column_by_header(ws, "GPIO测试配对关系")
+        if pair_col is None:
+            print("Error: Cannot find 'GPIO测试配对关系' column")
+            return 1
+        
+        # 查找"定义"列
+        def_col = find_column_by_header(ws, "定义")
+        if def_col is None:
+            print("Error: Cannot find '定义' column")
+            return 1
+        
+        print(f"Found 'GPIO测试配对关系' column: {pair_col}")
+        print(f"Found '定义' column: {def_col}")
+        
+        # 读取数据(从第2行开始,第1行是标题)
+        gpio_definitions = {}  # 行号 -> GPIO名称
+        gpio_pairs = []  # 配对列表
+        
+        # 首先读取所有GPIO定义
+        for row in range(2, ws.max_row + 1):
+            def_value = ws.cell(row=row, column=def_col).value
+            if def_value:
+                gpio_definitions[row] = str(def_value).strip()
+        
+        print(f"Found {len(gpio_definitions)} GPIO definitions")
+        
+        # 首先建立配对关系映射:组号 -> (out_gpio, in_gpio)
+        # 遍历所有行,找到包含"X-out"和"X-in"标记的行
+        # 支持复用情况,如 "32-out / 33-out" 表示同时是32组和33组的输出
+        pair_map = {}  # 组号 -> {"out": gpio_name, "in": gpio_name}
+        
+        for row in range(2, ws.max_row + 1):
+            pair_value = ws.cell(row=row, column=pair_col).value
+            if not pair_value:
+                continue
+            
+            pair_str = str(pair_value).strip()
+            gpio_name = gpio_definitions.get(row, "")
+            
+            if not gpio_name:
+                continue
+            
+            # 检查是否是out标记(支持复用)
+            if '-out' in pair_str.lower():
+                # 解析所有组号(可能多个,用"/"分隔)
+                group_nums = parse_group_numbers(pair_str, 'out')
+                for group_num in group_nums:
+                    if group_num not in pair_map:
+                        pair_map[group_num] = {}
+                    pair_map[group_num]['out'] = gpio_name
+                    print(f"Found output GPIO for group {group_num}: {gpio_name} (row {row}, pair: {pair_str})")
+            
+            # 检查是否是in标记(支持复用)
+            if '-in' in pair_str.lower():
+                # 解析所有组号(可能多个,用"/"分隔)
+                group_nums = parse_group_numbers(pair_str, 'in')
+                for group_num in group_nums:
+                    if group_num not in pair_map:
+                        pair_map[group_num] = {}
+                    pair_map[group_num]['in'] = gpio_name
+                    print(f"Found input GPIO for group {group_num}: {gpio_name} (row {row}, pair: {pair_str})")
+        
+        # 现在处理完整的配对关系(格式如"1-out,1-in")
+        # 查找包含完整配对关系的行
+        processed_groups = set()
+        
+        print("\nProcessing complete pair relationships:")
+        for row in range(2, ws.max_row + 1):
+            pair_value = ws.cell(row=row, column=pair_col).value
+            if not pair_value:
+                continue
+            
+            pair_str = str(pair_value).strip()
+            
+            # 检查是否包含完整的配对关系(同时包含out和in)
+            if ',' in pair_str and '-out' in pair_str.lower() and '-in' in pair_str.lower():
+                # 解析配对关系(格式:X-out,Y-in)
+                pair_info = parse_gpio_pair(pair_str)
+                if pair_info is None:
+                    continue
+                
+                out_num, in_num = pair_info
+                
+                # 检查是否已经处理过这个组
+                group_key = (out_num, in_num)
+                if group_key in processed_groups:
+                    continue
+                processed_groups.add(group_key)
+                
+                # 从pair_map中获取GPIO名称
+                out_gpio = pair_map.get(out_num, {}).get('out')
+                in_gpio = pair_map.get(in_num, {}).get('in')
+                
+                if out_gpio and in_gpio:
+                    gpio_pairs.append({
+                        "output": out_gpio,
+                        "input": in_gpio
+                    })
+                    print(f"Pair {len(gpio_pairs)}: {out_gpio} (out, group {out_num}) <-> {in_gpio} (in, group {in_num})")
+                else:
+                    print(f"Warning: Cannot find GPIO for pair {pair_str} (out_num={out_num}, in_num={in_num})")
+                    if not out_gpio:
+                        print(f"  Missing output GPIO for group {out_num}")
+                    if not in_gpio:
+                        print(f"  Missing input GPIO for group {in_num}")
+        
+        # 如果没找到完整配对关系,尝试根据组号自动配对
+        if len(gpio_pairs) == 0:
+            print("\nNo complete pair relationships found, trying to auto-pair by group number:")
+            for group_num in sorted(pair_map.keys()):
+                if 'out' in pair_map[group_num] and 'in' in pair_map[group_num]:
+                    out_gpio = pair_map[group_num]['out']
+                    in_gpio = pair_map[group_num]['in']
+                    gpio_pairs.append({
+                        "output": out_gpio,
+                        "input": in_gpio
+                    })
+                    print(f"Pair {len(gpio_pairs)}: {out_gpio} (out) <-> {in_gpio} (in) - Group {group_num}")
+        
+        # 生成JSON配置
+        config = {
+            "pairs": gpio_pairs
+        }
+        
+        # 输出JSON
+        json_str = json.dumps(config, indent=2, ensure_ascii=False)
+        print("\n" + "="*60)
+        print("Generated JSON Configuration:")
+        print("="*60)
+        print(json_str)
+        print("="*60)
+        
+        # 保存到文件
+        output_file = "gpio_test_config.json"
+        with open(output_file, 'w', encoding='utf-8') as f:
+            f.write(json_str)
+        print(f"\nSaved to: {output_file}")
+        
+        # 生成hex字符串(用于AT命令)
+        json_bytes = json_str.encode('utf-8')
+        hex_str = json_bytes.hex()
+        print(f"\nHex string (for AT command):")
+        print(f"Total size: {len(json_bytes)} bytes")
+        print(f"Hex string length: {len(hex_str)} characters")
+        print(f"\nNote: AT command buffer limit is ~256 bytes")
+        print(f"      This config requires {len(json_bytes)} bytes")
+        
+        if len(json_bytes) > 200:
+            # 需要分包
+            packet_size = 50  # 每包50字节(留出空间给AT命令前缀)
+            packet_count = (len(json_bytes) + packet_size - 1) // packet_size
+            print(f"\nThis config needs to be sent in {packet_count} packets (50 bytes each):")
+            print(f"Example AT commands:")
+            for i in range(packet_count):
+                start = i * packet_size
+                end = min(start + packet_size, len(json_bytes))
+                packet_hex = json_bytes[start:end].hex()
+                print(f"  AT^GPIOTEST=1,{len(json_bytes)},{i},{end-start},{packet_hex}")
+        else:
+            # 可以单包发送
+            print(f"\nThis config can be sent in a single packet:")
+            print(f"  AT^GPIOTEST=1,{len(json_bytes)},0,{len(json_bytes)},{hex_str}")
+        
+        return 0
+        
+    except FileNotFoundError:
+        print(f"Error: File '{excel_file}' not found")
+        return 1
+    except Exception as e:
+        print(f"Error: {e}")
+        import traceback
+        traceback.print_exc()
+        return 1
+
+if __name__ == "__main__":
+    sys.exit(main())
+
diff --git a/code/sdk/zhihui/utilscpp/gpio_test.cpp b/code/sdk/zhihui/utilscpp/gpio_test.cpp
new file mode 100644 (file)
index 0000000..644d29f
--- /dev/null
@@ -0,0 +1,837 @@
+/**
+ * @file gpio_test.cpp
+ * @brief GPIO测试程序
+ * @description 通过AT指令接收JSON配置,测试GPIO输入输出配对
+ */
+
+#include "custom_utilscpp.h"
+#include "debug_print.h"
+#include "securec.h"
+#include "media_thread_adapt.h"
+#include "gpio.h"
+#include "pinctrl.h"
+#include "platform_core.h"
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <unistd.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static const char* gpio_test_config_json_data ="{\n"
+"  \"pairs\": [\n"
+"    { \"output\": \"S_AGPIO_L12\", \"input\": \"S_AGPIO_L23\" },\n"
+"    { \"output\": \"S_AGPIO_L31\", \"input\": \"S_AGPIO_L13\" },\n"
+"    { \"output\": \"S_AGPIO_L2\", \"input\": \"S_AGPIO_L3\" },\n"
+"    { \"output\": \"S_AGPIO_L4\", \"input\": \"S_AGPIO_L1\" },\n"
+"    { \"output\": \"S_AGPIO_R4\", \"input\": \"S_AGPIO_L0\" },\n"
+"    { \"output\": \"HSUART_RTS\", \"input\": \"HSUART_CTS\" },\n"
+"    { \"output\": \"S_MGPIO14\", \"input\": \"S_AGPIO_R5\" },\n"
+"    { \"output\": \"S_AGPIO_R10\", \"input\": \"S_MGPIO13\" },\n"
+"    { \"output\": \"S_MGPIO12\", \"input\": \"S_MGPIO11\" },\n"
+"    { \"output\": \"S_AGPIO_R1\", \"input\": \"S_AGPIO_R2\" },\n"
+"    { \"output\": \"S_AGPIO_L17\", \"input\": \"S_AGPIO_L24\" },\n"
+"    { \"output\": \"S_AGPIO_L11\", \"input\": \"S_AGPIO_L21\" },\n"
+"    { \"output\": \"S_AGPIO_R0\", \"input\": \"S_AGPIO_L19\" },\n"
+"    { \"output\": \"S_AGPIO_R3\", \"input\": \"S_HGPIO13\" },\n"
+"    { \"output\": \"S_MGPIO25\", \"input\": \"S_AGPIO_R6\" },\n"
+"    { \"output\": \"S_MGPIO23\", \"input\": \"S_MGPIO26\" },\n"
+"    { \"output\": \"S_MGPIO31\", \"input\": \"S_MGPIO24\" },\n"
+"    { \"output\": \"S_MGPIO30\", \"input\": \"S_MGPIO29\" },\n"
+"    { \"output\": \"S_MGPIO28\", \"input\": \"S_MGPIO32\" },\n"
+"    { \"output\": \"S_MGPIO22\", \"input\": \"S_MGPIO27\" },\n"
+"    { \"output\": \"S_MGPIO19\", \"input\": \"S_MGPIO21\" },\n"
+"    { \"output\": \"S_AGPIO_R7\", \"input\": \"S_MGPIO20\" },\n"
+"    { \"output\": \"S_AGPIO_R9\", \"input\": \"S_AGPIO_R8\" },\n"
+"    { \"output\": \"S_AGPIO_L29\", \"input\": \"S_AGPIO_L30\" },\n"
+"    { \"output\": \"S_AGPIO_L20\", \"input\": \"S_AGPIO_L32\" },\n"
+"    { \"output\": \"S_HGPIO5\", \"input\": \"S_AGPIO_L15\" },\n"
+"    { \"output\": \"S_HGPIO0\", \"input\": \"S_HGPIO4\" },\n"
+"    { \"output\": \"S_HGPIO2\", \"input\": \"S_HGPIO1\" },\n"
+"    { \"output\": \"S_MGPIO3\", \"input\": \"S_HGPIO3\" },\n"
+"    { \"output\": \"S_MGPIO2\", \"input\": \"S_MGPIO1\" },\n"
+"    { \"output\": \"S_MGPIO6\", \"input\": \"S_MGPIO0\" },\n"
+"    { \"output\": \"S_MGPIO8\", \"input\": \"S_MGPIO9\" },\n"
+"    { \"output\": \"S_MGPIO8\", \"input\": \"S_MGPIO7\" },\n"
+"    { \"output\": \"S_AGPIO_L18\", \"input\": \"S_AGPIO_L28\" },\n"
+"    { \"output\": \"S_AGPIO_L26\", \"input\": \"S_HGPIO9\" }\n"
+"  ]\n"
+"}\n";
+
+// 使用cJSON库解析JSON
+#include "cJSON.h"
+
+// GPIO配对配置结构
+typedef struct {
+    char input_pin[32];   // 输入引脚名称,如 "S_AGPIO_L01"
+    char output_pin[32];  // 输出引脚名称,如 "S_AGPIO_L02"
+} gpio_pair_t;
+
+// GPIO测试上下文
+typedef struct {
+    bool is_running;                    // 测试是否正在运行
+    gpio_pair_t* pairs;                 // GPIO配对数组
+    uint32_t pair_count;                // 配对数量
+    uint32_t* failed_pairs;             // 失败的配对索引
+    uint32_t failed_count;              // 失败数量
+    MediaMutexHandle mutex;              // 互斥锁
+    
+    // 分包接收JSON配置
+    char* json_buffer;                   // JSON缓冲区
+    uint32_t json_buffer_size;          // 缓冲区大小
+    uint32_t json_received_size;        // 已接收大小
+    bool json_receiving;                 // 是否正在接收
+    
+    // 分包信息
+    uint32_t json_total_size;           // JSON文件总大小(字节)
+    uint32_t current_packet_num;        // 当前包号(从0开始)
+    uint32_t expected_packet_num;       // 期望的下一包号
+    bool packet_received[256];          // 记录已接收的包(最多支持256包)
+} GpioTestContext;
+
+static GpioTestContext g_gpio_test_ctx = {0};
+
+// GPIO名称到pin_t的映射表
+typedef struct {
+    const char* name;
+    pin_t pin;
+} gpio_name_map_t;
+
+// 创建GPIO名称映射表(包含所有常见的GPIO引脚)
+static const gpio_name_map_t g_gpio_name_map[] = {
+    // EGPIO
+    {"S_EGPIO0", S_EGPIO0}, {"S_EGPIO1", S_EGPIO1}, {"S_EGPIO2", S_EGPIO2},
+    {"S_EGPIO3", S_EGPIO3}, {"S_EGPIO4", S_EGPIO4}, {"S_EGPIO5", S_EGPIO5},
+    {"S_EGPIO6", S_EGPIO6}, {"S_EGPIO7", S_EGPIO7}, {"S_EGPIO8", S_EGPIO8},
+    {"S_EGPIO9", S_EGPIO9}, {"S_EGPIO10", S_EGPIO10}, {"S_EGPIO11", S_EGPIO11},
+    {"S_EGPIO12", S_EGPIO12}, {"S_EGPIO13", S_EGPIO13}, {"S_EGPIO14", S_EGPIO14},
+    {"S_EGPIO15", S_EGPIO15}, {"S_EGPIO16", S_EGPIO16}, {"S_EGPIO17", S_EGPIO17},
+    {"S_EGPIO18", S_EGPIO18}, {"S_EGPIO19", S_EGPIO19}, {"S_EGPIO20", S_EGPIO20},
+    {"S_EGPIO21", S_EGPIO21}, {"S_EGPIO22", S_EGPIO22}, {"S_EGPIO23", S_EGPIO23},
+    {"S_EGPIO24", S_EGPIO24}, {"S_EGPIO25", S_EGPIO25},
+    
+    // HGPIO
+    {"S_HGPIO0", S_HGPIO0}, {"S_HGPIO1", S_HGPIO1}, {"S_HGPIO2", S_HGPIO2},
+    {"S_HGPIO3", S_HGPIO3}, {"S_HGPIO4", S_HGPIO4}, {"S_HGPIO5", S_HGPIO5},
+    {"S_HGPIO6", S_HGPIO6}, {"S_HGPIO7", S_HGPIO7}, {"S_HGPIO8", S_HGPIO8},
+    {"S_HGPIO9", S_HGPIO9}, {"S_HGPIO10", S_HGPIO10}, {"S_HGPIO11", S_HGPIO11},
+    {"S_HGPIO12", S_HGPIO12}, {"S_HGPIO13", S_HGPIO13}, {"S_HGPIO14", S_HGPIO14},
+    {"S_HGPIO15", S_HGPIO15},
+    
+    // MGPIO
+    {"S_MGPIO0", S_MGPIO0}, {"S_MGPIO1", S_MGPIO1}, {"S_MGPIO2", S_MGPIO2},
+    {"S_MGPIO3", S_MGPIO3}, {"S_MGPIO4", S_MGPIO4}, {"S_MGPIO5", S_MGPIO5},
+    {"S_MGPIO6", S_MGPIO6}, {"S_MGPIO7", S_MGPIO7}, {"S_MGPIO8", S_MGPIO8},
+    {"S_MGPIO9", S_MGPIO9}, {"S_MGPIO10", S_MGPIO10}, {"S_MGPIO11", S_MGPIO11},
+    {"S_MGPIO12", S_MGPIO12}, {"S_MGPIO13", S_MGPIO13}, {"S_MGPIO14", S_MGPIO14},
+    {"S_MGPIO15", S_MGPIO15}, {"S_MGPIO16", S_MGPIO16}, {"S_MGPIO17", S_MGPIO17},
+    {"S_MGPIO18", S_MGPIO18}, {"S_MGPIO19", S_MGPIO19}, {"S_MGPIO20", S_MGPIO20},
+    {"S_MGPIO21", S_MGPIO21}, {"S_MGPIO22", S_MGPIO22}, {"S_MGPIO23", S_MGPIO23},
+    {"S_MGPIO24", S_MGPIO24}, {"S_MGPIO25", S_MGPIO25}, {"S_MGPIO26", S_MGPIO26},
+    {"S_MGPIO27", S_MGPIO27}, {"S_MGPIO28", S_MGPIO28}, {"S_MGPIO29", S_MGPIO29},
+    {"S_MGPIO30", S_MGPIO30}, {"S_MGPIO31", S_MGPIO31}, {"S_MGPIO32", S_MGPIO32},
+    {"S_MGPIO33", S_MGPIO33}, {"S_MGPIO34", S_MGPIO34}, {"S_MGPIO35", S_MGPIO35},
+    {"S_MGPIO36", S_MGPIO36}, {"S_MGPIO37", S_MGPIO37}, {"S_MGPIO38", S_MGPIO38},
+    
+    // AGPIO_L
+    {"S_AGPIO_L0", S_AGPIO_L0}, {"S_AGPIO_L1", S_AGPIO_L1}, {"S_AGPIO_L2", S_AGPIO_L2},
+    {"S_AGPIO_L3", S_AGPIO_L3}, {"S_AGPIO_L4", S_AGPIO_L4}, {"S_AGPIO_L5", S_AGPIO_L5},
+    {"S_AGPIO_L6", S_AGPIO_L6}, {"S_AGPIO_L7", S_AGPIO_L7}, {"S_AGPIO_L8", S_AGPIO_L8},
+    {"S_AGPIO_L9", S_AGPIO_L9}, {"S_AGPIO_L10", S_AGPIO_L10}, {"S_AGPIO_L11", S_AGPIO_L11},
+    {"S_AGPIO_L12", S_AGPIO_L12}, {"S_AGPIO_L13", S_AGPIO_L13}, {"S_AGPIO_L14", S_AGPIO_L14},
+    {"S_AGPIO_L15", S_AGPIO_L15}, {"S_AGPIO_L16", S_AGPIO_L16}, {"S_AGPIO_L17", S_AGPIO_L17},
+    {"S_AGPIO_L18", S_AGPIO_L18}, {"S_AGPIO_L19", S_AGPIO_L19}, {"S_AGPIO_L20", S_AGPIO_L20},
+    {"S_AGPIO_L21", S_AGPIO_L21}, {"S_AGPIO_L22", S_AGPIO_L22}, {"S_AGPIO_L23", S_AGPIO_L23},
+    {"S_AGPIO_L24", S_AGPIO_L24}, {"S_AGPIO_L25", S_AGPIO_L25}, {"S_AGPIO_L26", S_AGPIO_L26},
+    {"S_AGPIO_L27", S_AGPIO_L27}, {"S_AGPIO_L28", S_AGPIO_L28}, {"S_AGPIO_L29", S_AGPIO_L29},
+    {"S_AGPIO_L30", S_AGPIO_L30}, {"S_AGPIO_L31", S_AGPIO_L31}, {"S_AGPIO_L32", S_AGPIO_L32},
+    
+    // AGPIO_R
+    {"S_AGPIO_R0", S_AGPIO_R0}, {"S_AGPIO_R1", S_AGPIO_R1}, {"S_AGPIO_R2", S_AGPIO_R2},
+    {"S_AGPIO_R3", S_AGPIO_R3}, {"S_AGPIO_R4", S_AGPIO_R4}, {"S_AGPIO_R5", S_AGPIO_R5},
+    {"S_AGPIO_R6", S_AGPIO_R6}, {"S_AGPIO_R7", S_AGPIO_R7}, {"S_AGPIO_R8", S_AGPIO_R8},
+    {"S_AGPIO_R9", S_AGPIO_R9}, {"S_AGPIO_R10", S_AGPIO_R10},
+    
+    // ULP_GPIO
+    {"ULP_GPIO0", ULP_GPIO0}, {"ULP_GPIO1", ULP_GPIO1}, {"ULP_GPIO2", ULP_GPIO2},
+    {"ULP_GPIO3", ULP_GPIO3}, {"ULP_GPIO4", ULP_GPIO4}, {"ULP_GPIO5", ULP_GPIO5},
+    {"ULP_GPIO6", ULP_GPIO6},
+    
+    {NULL, PIN_NONE}  // 结束标记
+};
+
+/**
+ * @brief 将GPIO名称字符串转换为pin_t
+ * @param name GPIO名称,如 "S_AGPIO_L01"
+ * @return pin_t值,如果未找到返回PIN_NONE
+ */
+static pin_t gpio_name_to_pin(const char* name)
+{
+    if (name == NULL) {
+        return PIN_NONE;
+    }
+    
+    // 处理S_AGPIO_L01这种格式(带前导0)
+    char normalized_name[32] = {0};
+    if (strncmp(name, "S_AGPIO_L0", 10) == 0 && strlen(name) > 10) {
+        // 处理S_AGPIO_L01 -> S_AGPIO_L1
+        int num = atoi(name + 10);
+        snprintf_s(normalized_name, sizeof(normalized_name), sizeof(normalized_name) - 1, "S_AGPIO_L%d", num);
+    } else if (strncmp(name, "S_AGPIO_R0", 10) == 0 && strlen(name) > 10) {
+        // 处理S_AGPIO_R01 -> S_AGPIO_R1
+        int num = atoi(name + 10);
+        snprintf_s(normalized_name, sizeof(normalized_name), sizeof(normalized_name) - 1, "S_AGPIO_R%d", num);
+    } else {
+        strncpy_s(normalized_name, sizeof(normalized_name), name, sizeof(normalized_name) - 1);
+    }
+    
+    // 在映射表中查找
+    for (uint32_t i = 0; g_gpio_name_map[i].name != NULL; i++) {
+        if (strcmp(normalized_name, g_gpio_name_map[i].name) == 0) {
+            return g_gpio_name_map[i].pin;
+        }
+    }
+    
+    // 如果没找到,尝试直接匹配原始名称
+    for (uint32_t i = 0; g_gpio_name_map[i].name != NULL; i++) {
+        if (strcmp(name, g_gpio_name_map[i].name) == 0) {
+            return g_gpio_name_map[i].pin;
+        }
+    }
+    
+    return PIN_NONE;
+}
+
+/**
+ * @brief 将hex字符串转换为二进制数据
+ * @param hex_str hex字符串,如 "7b22696e707574223a22535f414750494f5f4c3031222c226f7574707574223a22535f414750494f5f4c3032227d"
+ * @param output 输出缓冲区
+ * @param output_size 输出缓冲区大小
+ * @return 实际转换的字节数,失败返回-1
+ */
+static int hex_string_to_binary(const char* hex_str, uint8_t* output, size_t output_size)
+{
+    if (hex_str == NULL || output == NULL || output_size == 0) {
+        return -1;
+    }
+    
+    size_t hex_len = strlen(hex_str);
+    if (hex_len % 2 != 0) {
+        PRINT("[GpioTest] Invalid hex string length: %zu\r\n", hex_len);
+        return -1;
+    }
+    
+    size_t binary_len = hex_len / 2;
+    if (binary_len > output_size) {
+        PRINT("[GpioTest] Output buffer too small: need %zu, have %zu\r\n", binary_len, output_size);
+        return -1;
+    }
+    
+    for (size_t i = 0; i < binary_len; i++) {
+        char hex_byte[3] = {hex_str[i * 2], hex_str[i * 2 + 1], '\0'};
+        char* endptr = NULL;
+        unsigned long val = strtoul(hex_byte, &endptr, 16);
+        if (endptr == hex_byte || *endptr != '\0') {
+            PRINT("[GpioTest] Invalid hex byte at position %zu: %s\r\n", i, hex_byte);
+            return -1;
+        }
+        output[i] = (uint8_t)val;
+    }
+    
+    return (int)binary_len;
+}
+
+/**
+ * @brief 将二进制数据转换为hex字符串
+ * @param data 二进制数据
+ * @param data_len 数据长度
+ * @param hex_str 输出hex字符串缓冲区
+ * @param hex_str_size 缓冲区大小
+ * @return 0成功,-1失败
+ */
+static int binary_to_hex_string(const uint8_t* data, size_t data_len, char* hex_str, size_t hex_str_size)
+{
+    if (data == NULL || hex_str == NULL || hex_str_size == 0) {
+        return -1;
+    }
+    
+    if (hex_str_size < (data_len * 2 + 1)) {
+        PRINT("[GpioTest] Hex string buffer too small: need %zu, have %zu\r\n", data_len * 2 + 1, hex_str_size);
+        return -1;
+    }
+    
+    for (size_t i = 0; i < data_len; i++) {
+        snprintf_s(hex_str + i * 2, hex_str_size - i * 2, hex_str_size - i * 2 - 1, "%02x", data[i]);
+    }
+    hex_str[data_len * 2] = '\0';
+    
+    return 0;
+}
+
+/**
+ * @brief 解析JSON配置
+ * @param json_str JSON字符串
+ * @return 0成功,-1失败
+ */
+static int gpio_test_parse_config(const char* json_str)
+{
+    if (json_str == NULL) {
+        PRINT("[GpioTest] JSON string is NULL\r\n");
+        return -1;
+    }
+    
+    cJSON* root = cJSON_Parse(json_str);
+    if (root == NULL) {
+        PRINT("[GpioTest] Failed to parse JSON: %s\r\n", cJSON_GetErrorPtr());
+        return -1;
+    }
+    
+    // 检查是否有pairs数组
+    cJSON* pairs = cJSON_GetObjectItem(root, "pairs");
+    if (pairs == NULL || !cJSON_IsArray(pairs)) {
+        PRINT("[GpioTest] Missing or invalid 'pairs' array in JSON\r\n");
+        cJSON_Delete(root);
+        return -1;
+    }
+    
+    int pair_count = cJSON_GetArraySize(pairs);
+    if (pair_count <= 0) {
+        PRINT("[GpioTest] Empty pairs array\r\n");
+        cJSON_Delete(root);
+        return -1;
+    }
+    
+    // 分配内存
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    
+    // 释放旧数据
+    if (g_gpio_test_ctx.pairs != NULL) {
+        free(g_gpio_test_ctx.pairs);
+        g_gpio_test_ctx.pairs = NULL;
+    }
+    if (g_gpio_test_ctx.failed_pairs != NULL) {
+        free(g_gpio_test_ctx.failed_pairs);
+        g_gpio_test_ctx.failed_pairs = NULL;
+    }
+    
+    // 分配新内存
+    g_gpio_test_ctx.pairs = (gpio_pair_t*)malloc(pair_count * sizeof(gpio_pair_t));
+    if (g_gpio_test_ctx.pairs == NULL) {
+        PRINT("[GpioTest] Failed to allocate memory for pairs\r\n");
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        cJSON_Delete(root);
+        return -1;
+    }
+    
+    g_gpio_test_ctx.failed_pairs = (uint32_t*)malloc(pair_count * sizeof(uint32_t));
+    if (g_gpio_test_ctx.failed_pairs == NULL) {
+        PRINT("[GpioTest] Failed to allocate memory for failed_pairs\r\n");
+        free(g_gpio_test_ctx.pairs);
+        g_gpio_test_ctx.pairs = NULL;
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        cJSON_Delete(root);
+        return -1;
+    }
+    
+    memset_s(g_gpio_test_ctx.pairs, pair_count * sizeof(gpio_pair_t), 0, pair_count * sizeof(gpio_pair_t));
+    g_gpio_test_ctx.pair_count = 0;
+    g_gpio_test_ctx.failed_count = 0;
+    
+    // 解析每个配对
+    for (int i = 0; i < pair_count; i++) {
+        cJSON* pair_item = cJSON_GetArrayItem(pairs, i);
+        if (pair_item == NULL || !cJSON_IsObject(pair_item)) {
+            PRINT("[GpioTest] Invalid pair at index %d\r\n", i);
+            continue;
+        }
+        
+        cJSON* input = cJSON_GetObjectItem(pair_item, "input");
+        cJSON* output = cJSON_GetObjectItem(pair_item, "output");
+        
+        if (input == NULL || output == NULL || !cJSON_IsString(input) || !cJSON_IsString(output)) {
+            PRINT("[GpioTest] Missing or invalid 'input'/'output' in pair %d\r\n", i);
+            continue;
+        }
+        
+        const char* input_name = cJSON_GetStringValue(input);
+        const char* output_name = cJSON_GetStringValue(output);
+        
+        if (input_name == NULL || output_name == NULL) {
+            PRINT("[GpioTest] NULL pin name in pair %d\r\n", i);
+            continue;
+        }
+        
+        // 验证GPIO名称
+        pin_t input_pin = gpio_name_to_pin(input_name);
+        pin_t output_pin = gpio_name_to_pin(output_name);
+        
+        if (input_pin == PIN_NONE) {
+            PRINT("[GpioTest] Invalid input pin name: %s\r\n", input_name);
+            continue;
+        }
+        if (output_pin == PIN_NONE) {
+            PRINT("[GpioTest] Invalid output pin name: %s\r\n", output_name);
+            continue;
+        }
+        
+        // 保存配对
+        strncpy_s(g_gpio_test_ctx.pairs[g_gpio_test_ctx.pair_count].input_pin, 
+                  sizeof(g_gpio_test_ctx.pairs[g_gpio_test_ctx.pair_count].input_pin),
+                  input_name, sizeof(g_gpio_test_ctx.pairs[g_gpio_test_ctx.pair_count].input_pin) - 1);
+        strncpy_s(g_gpio_test_ctx.pairs[g_gpio_test_ctx.pair_count].output_pin,
+                  sizeof(g_gpio_test_ctx.pairs[g_gpio_test_ctx.pair_count].output_pin),
+                  output_name, sizeof(g_gpio_test_ctx.pairs[g_gpio_test_ctx.pair_count].output_pin) - 1);
+        
+        g_gpio_test_ctx.pair_count++;
+    }
+    
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    cJSON_Delete(root);
+    
+    PRINT("[GpioTest] Parsed %u GPIO pairs from JSON\r\n", g_gpio_test_ctx.pair_count);
+    
+    return (g_gpio_test_ctx.pair_count > 0) ? 0 : -1;
+}
+
+/**
+ * @brief 执行GPIO测试
+ * @return 0成功,-1失败
+ */
+static int gpio_test_execute(void)
+{
+    if (g_gpio_test_ctx.pair_count == 0) {
+        PRINT("[GpioTest] No GPIO pairs configured\r\n");
+        return -1;
+    }
+    
+    PRINT("[GpioTest] Starting GPIO test with %u pairs...\r\n", g_gpio_test_ctx.pair_count);
+    
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    g_gpio_test_ctx.failed_count = 0;
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    // 初始化GPIO
+    uapi_gpio_init();
+    
+    // 遍历所有配对进行测试
+    for (uint32_t i = 0; i < g_gpio_test_ctx.pair_count; i++) {
+        const char* input_name = g_gpio_test_ctx.pairs[i].input_pin;
+        const char* output_name = g_gpio_test_ctx.pairs[i].output_pin;
+        
+        pin_t input_pin = gpio_name_to_pin(input_name);
+        pin_t output_pin = gpio_name_to_pin(output_name);
+        
+        if (input_pin == PIN_NONE || output_pin == PIN_NONE) {
+            PRINT("[GpioTest] Pair %u: Invalid pin names (input=%s, output=%s)\r\n", 
+                  i, input_name, output_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        PRINT("[GpioTest] Testing pair %u: %s (input) <-> %s (output)\r\n", 
+              i, input_name, output_name);
+        
+        // 设置引脚模式为GPIO
+        errcode_t ret = uapi_pin_set_mode(input_pin, (pin_mode_t)HAL_PIO_FUNC_GPIO);
+        if (ret != ERRCODE_SUCC) {
+            PRINT("[GpioTest] Pair %u: Failed to set input pin mode: %s\r\n", i, input_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        ret = uapi_pin_set_mode(output_pin, (pin_mode_t)HAL_PIO_FUNC_GPIO);
+        if (ret != ERRCODE_SUCC) {
+            PRINT("[GpioTest] Pair %u: Failed to set output pin mode: %s\r\n", i, output_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        // 设置输入/输出方向
+        ret = uapi_gpio_set_dir(input_pin, GPIO_DIRECTION_INPUT);
+        if (ret != ERRCODE_SUCC) {
+            PRINT("[GpioTest] Pair %u: Failed to set input direction: %s\r\n", i, input_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        ret = uapi_gpio_set_dir(output_pin, GPIO_DIRECTION_OUTPUT);
+        if (ret != ERRCODE_SUCC) {
+            PRINT("[GpioTest] Pair %u: Failed to set output direction: %s\r\n", i, output_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        // 测试1:输出设置为HIGH,输入应该读取到HIGH
+        ret = uapi_gpio_set_val(output_pin, GPIO_LEVEL_HIGH);
+        if (ret != ERRCODE_SUCC) {
+            PRINT("[GpioTest] Pair %u: Failed to set output HIGH: %s\r\n", i, output_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        // 等待一小段时间让信号稳定
+        usleep(10000);  // 10ms
+        
+        gpio_level_t input_level = uapi_gpio_get_val(input_pin);
+        if (input_level != GPIO_LEVEL_HIGH) {
+            PRINT("[GpioTest] Pair %u: FAILED - Output HIGH but input read %d (expected HIGH)\r\n", 
+                  i, input_level);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        // 测试2:输出设置为LOW,输入应该读取到LOW
+        ret = uapi_gpio_set_val(output_pin, GPIO_LEVEL_LOW);
+        if (ret != ERRCODE_SUCC) {
+            PRINT("[GpioTest] Pair %u: Failed to set output LOW: %s\r\n", i, output_name);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        // 等待一小段时间让信号稳定
+        usleep(10000);  // 10ms
+        
+        input_level = uapi_gpio_get_val(input_pin);
+        if (input_level != GPIO_LEVEL_LOW) {
+            PRINT("[GpioTest] Pair %u: FAILED - Output LOW but input read %d (expected LOW)\r\n", 
+                  i, input_level);
+            MediaMutexLock(g_gpio_test_ctx.mutex);
+            g_gpio_test_ctx.failed_pairs[g_gpio_test_ctx.failed_count++] = i;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            continue;
+        }
+        
+        PRINT("[GpioTest] Pair %u: PASSED - %s <-> %s\r\n", i, input_name, output_name);
+    }
+    
+    // 打印测试结果
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    uint32_t failed_count = g_gpio_test_ctx.failed_count;
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    PRINT("[GpioTest] Test completed: %u passed, %u failed\r\n", 
+          g_gpio_test_ctx.pair_count - failed_count, failed_count);
+    
+    if (failed_count > 0) {
+        PRINT("[GpioTest] Failed pairs:\r\n");
+        for (uint32_t i = 0; i < failed_count; i++) {
+            uint32_t pair_idx = g_gpio_test_ctx.failed_pairs[i];
+            PRINT("[GpioTest]   Pair %u: %s (input) <-> %s (output)\r\n",
+                  pair_idx, 
+                  g_gpio_test_ctx.pairs[pair_idx].input_pin,
+                  g_gpio_test_ctx.pairs[pair_idx].output_pin);
+        }
+    }
+    
+    PRINT("[GpioTest] Test finished\r\n");
+    
+    return 0;
+}
+
+/**
+ * @brief 添加JSON配置数据(分包接收)
+ * @param total_size JSON文件总大小(字节)
+ * @param packet_num 当前包号(从0开始)
+ * @param packet_bytes 本包字节数
+ * @param hex_data hex字符串数据(长度为packet_bytes*2)
+ * @return 0成功,-1失败
+ */
+int custom_gpio_test_add_config(uint32_t total_size, uint32_t packet_num, uint32_t packet_bytes, const char* hex_data)
+{
+    if (hex_data == NULL) {
+        PRINT("[GpioTest] hex_data is NULL\r\n");
+        return -1;
+    }
+    
+    if (packet_bytes == 0 || total_size == 0) {
+        PRINT("[GpioTest] Invalid packet_bytes or total_size: bytes=%u, total=%u\r\n", packet_bytes, total_size);
+        return -1;
+    }
+    
+    // 验证hex字符串长度(应该是packet_bytes * 2)
+    size_t hex_len = strlen(hex_data);
+    if (hex_len != packet_bytes * 2) {
+        PRINT("[GpioTest] Hex string length mismatch: expected %u, got %zu\r\n", packet_bytes * 2, hex_len);
+        return -1;
+    }
+    
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    
+    // 如果是第一包(packet_num == 0),初始化缓冲区
+    if (packet_num == 0) {
+        // 释放旧缓冲区
+        if (g_gpio_test_ctx.json_buffer != NULL) {
+            free(g_gpio_test_ctx.json_buffer);
+        }
+        
+        // 分配缓冲区(总大小+1用于字符串结束符)
+        g_gpio_test_ctx.json_buffer = (char*)malloc(total_size + 1);
+        if (g_gpio_test_ctx.json_buffer == NULL) {
+            PRINT("[GpioTest] Failed to allocate JSON buffer: %u bytes\r\n", total_size);
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            return -1;
+        }
+        
+        g_gpio_test_ctx.json_buffer_size = total_size + 1;
+        g_gpio_test_ctx.json_received_size = 0;
+        g_gpio_test_ctx.json_receiving = true;
+        g_gpio_test_ctx.json_total_size = total_size;
+        g_gpio_test_ctx.current_packet_num = 0;
+        g_gpio_test_ctx.expected_packet_num = 0;
+        
+        // 清空包接收记录
+        memset_s(g_gpio_test_ctx.packet_received, sizeof(g_gpio_test_ctx.packet_received), 
+                  0, sizeof(g_gpio_test_ctx.packet_received));
+    } else {
+        // 检查是否与第一包的总大小一致
+        if (g_gpio_test_ctx.json_total_size != total_size) {
+            PRINT("[GpioTest] Total size mismatch: first=%u, current=%u\r\n", 
+                  g_gpio_test_ctx.json_total_size, total_size);
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            return -1;
+        }
+    }
+    
+    // 检查包号是否重复
+    if (packet_num < sizeof(g_gpio_test_ctx.packet_received) && 
+        g_gpio_test_ctx.packet_received[packet_num]) {
+        PRINT("[GpioTest] Packet %u already received, ignoring\r\n", packet_num);
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        return 0;  // 重复包,返回成功但不处理
+    }
+    
+    // 检查缓冲区是否足够
+    if (g_gpio_test_ctx.json_received_size + packet_bytes > g_gpio_test_ctx.json_buffer_size - 1) {
+        PRINT("[GpioTest] Buffer overflow: received=%u, adding=%u, size=%u\r\n",
+              g_gpio_test_ctx.json_received_size, packet_bytes, g_gpio_test_ctx.json_buffer_size);
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        return -1;
+    }
+    
+    // 转换hex字符串为二进制
+    uint8_t* binary_data = (uint8_t*)(g_gpio_test_ctx.json_buffer + g_gpio_test_ctx.json_received_size);
+    int converted_len = hex_string_to_binary(hex_data, binary_data, packet_bytes);
+    if (converted_len < 0 || (uint32_t)converted_len != packet_bytes) {
+        PRINT("[GpioTest] Failed to convert hex string to binary: expected %u, got %d\r\n", 
+              packet_bytes, converted_len);
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        return -1;
+    }
+    
+    g_gpio_test_ctx.json_received_size += packet_bytes;
+    g_gpio_test_ctx.json_buffer[g_gpio_test_ctx.json_received_size] = '\0';
+    
+    // 标记包已接收
+    if (packet_num < sizeof(g_gpio_test_ctx.packet_received)) {
+        g_gpio_test_ctx.packet_received[packet_num] = true;
+    }
+    
+    // 更新期望的下一包号(找到最小的未接收包号)
+    for (uint32_t i = g_gpio_test_ctx.expected_packet_num; 
+         i < sizeof(g_gpio_test_ctx.packet_received); i++) {
+        if (!g_gpio_test_ctx.packet_received[i]) {
+            g_gpio_test_ctx.expected_packet_num = i;
+            break;
+        }
+    }
+    
+    PRINT("[GpioTest] Packet %u/%u received: %u bytes, total received: %u/%u bytes\r\n",
+          packet_num, (total_size + packet_bytes - 1) / packet_bytes, packet_bytes,
+          g_gpio_test_ctx.json_received_size, total_size);
+    
+    // 检查是否所有数据都已接收
+    bool all_received = (g_gpio_test_ctx.json_received_size >= total_size);
+    
+    if (all_received) {
+        g_gpio_test_ctx.json_receiving = false;
+        
+        PRINT("[GpioTest] All packets received, parsing JSON...\r\n");
+        
+        // 解析JSON配置
+        int ret = gpio_test_parse_config(g_gpio_test_ctx.json_buffer);
+        if (ret != 0) {
+            PRINT("[GpioTest] Failed to parse JSON config\r\n");
+            // 清理缓冲区
+            free(g_gpio_test_ctx.json_buffer);
+            g_gpio_test_ctx.json_buffer = NULL;
+            g_gpio_test_ctx.json_buffer_size = 0;
+            g_gpio_test_ctx.json_received_size = 0;
+            g_gpio_test_ctx.json_total_size = 0;
+            MediaMutexUnLock(g_gpio_test_ctx.mutex);
+            return -1;
+        }
+        
+        // 清理JSON缓冲区
+        free(g_gpio_test_ctx.json_buffer);
+        g_gpio_test_ctx.json_buffer = NULL;
+        g_gpio_test_ctx.json_buffer_size = 0;
+        g_gpio_test_ctx.json_received_size = 0;
+        g_gpio_test_ctx.json_total_size = 0;
+        
+        PRINT("[GpioTest] JSON config parsed successfully, ready for test\r\n");
+    }
+    
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    return 0;
+}
+
+/**
+ * @brief 启动GPIO测试
+ * @return 0成功,-1失败
+ */
+int custom_gpio_test_start(void)
+{
+    PRINT("[GpioTest] Starting GPIO test...\r\n");
+    
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    
+    if (g_gpio_test_ctx.is_running) {
+        PRINT("[GpioTest] Test already running\r\n");
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        return -1;
+    }
+    
+    if (g_gpio_test_ctx.pair_count == 0) {
+        PRINT("[GpioTest] No GPIO pairs configured. Please add config first.\r\n");
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        return -1;
+    }
+    
+    // 初始化互斥锁(如果还没有)
+    if (g_gpio_test_ctx.mutex == NULL) {
+        g_gpio_test_ctx.mutex = MediaMutexCreate(NULL);
+        if (g_gpio_test_ctx.mutex == NULL) {
+            PRINT("[GpioTest] Failed to create mutex\r\n");
+            return -1;
+        }
+    }
+    
+    g_gpio_test_ctx.is_running = true;
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    // 执行测试
+    int ret = gpio_test_execute();
+    
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    g_gpio_test_ctx.is_running = false;
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    return ret;
+}
+
+/**
+ * @brief 停止GPIO测试
+ * @return 0成功,-1失败
+ */
+int custom_gpio_test_stop(void)
+{
+    PRINT("[GpioTest] Stopping GPIO test...\r\n");
+    
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    
+    if (!g_gpio_test_ctx.is_running) {
+        PRINT("[GpioTest] Test not running\r\n");
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        return 0;
+    }
+    
+    g_gpio_test_ctx.is_running = false;
+    
+    // 清理配置数据
+    if (g_gpio_test_ctx.pairs != NULL) {
+        free(g_gpio_test_ctx.pairs);
+        g_gpio_test_ctx.pairs = NULL;
+    }
+    if (g_gpio_test_ctx.failed_pairs != NULL) {
+        free(g_gpio_test_ctx.failed_pairs);
+        g_gpio_test_ctx.failed_pairs = NULL;
+    }
+    if (g_gpio_test_ctx.json_buffer != NULL) {
+        free(g_gpio_test_ctx.json_buffer);
+        g_gpio_test_ctx.json_buffer = NULL;
+    }
+    
+    g_gpio_test_ctx.pair_count = 0;
+    g_gpio_test_ctx.failed_count = 0;
+    g_gpio_test_ctx.json_buffer_size = 0;
+    g_gpio_test_ctx.json_received_size = 0;
+    g_gpio_test_ctx.json_receiving = false;
+    g_gpio_test_ctx.json_total_size = 0;
+    g_gpio_test_ctx.current_packet_num = 0;
+    g_gpio_test_ctx.expected_packet_num = 0;
+    memset_s(g_gpio_test_ctx.packet_received, sizeof(g_gpio_test_ctx.packet_received), 
+              0, sizeof(g_gpio_test_ctx.packet_received));
+    
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    
+    PRINT("[GpioTest] GPIO test stopped\r\n");
+    
+    return 0;
+}
+
+/**
+ * @brief 获取测试状态
+ * @return true正在运行,false未运行
+ */
+bool custom_gpio_test_is_running(void)
+{
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    bool is_running = g_gpio_test_ctx.is_running;
+    MediaMutexUnLock(g_gpio_test_ctx.mutex);
+    return is_running;
+}
+
+/**
+ * @brief 初始化GPIO测试模块
+ */
+void custom_gpio_test_init(void)
+{
+    if (g_gpio_test_ctx.mutex == NULL) {
+        g_gpio_test_ctx.mutex = MediaMutexCreate(NULL);
+    }
+    
+    // 使用默认配置初始化
+    MediaMutexLock(g_gpio_test_ctx.mutex);
+    
+    // 如果已经有配置(通过AT指令设置),则不使用默认配置
+    if (g_gpio_test_ctx.pair_count == 0 && gpio_test_config_json_data != NULL) {
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        PRINT("[GpioTest] Initializing with default config...\r\n");
+        int ret = gpio_test_parse_config(gpio_test_config_json_data);
+        if (ret == 0) {
+            PRINT("[GpioTest] Default config initialized successfully\r\n");
+        } else {
+            PRINT("[GpioTest] Failed to initialize default config\r\n");
+        }
+    } else {
+        MediaMutexUnLock(g_gpio_test_ctx.mutex);
+        if (g_gpio_test_ctx.pair_count > 0) {
+            PRINT("[GpioTest] Config already exists, skipping default init\r\n");
+        }
+    }
+}
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/code/sdk/zhihui/utilscpp/gpio_test_config.json b/code/sdk/zhihui/utilscpp/gpio_test_config.json
new file mode 100644 (file)
index 0000000..948b2a3
--- /dev/null
@@ -0,0 +1,144 @@
+{
+  "pairs": [
+    {
+      "output": "S_AGPIO_L12",
+      "input": "S_AGPIO_L23"
+    },
+    {
+      "output": "S_AGPIO_L31",
+      "input": "S_AGPIO_L13"
+    },
+    {
+      "output": "S_AGPIO_L2",
+      "input": "S_AGPIO_L3"
+    },
+    {
+      "output": "S_AGPIO_L4",
+      "input": "S_AGPIO_L1"
+    },
+    {
+      "output": "S_AGPIO_R4",
+      "input": "S_AGPIO_L0"
+    },
+    {
+      "output": "HSUART_RTS",
+      "input": "HSUART_CTS"
+    },
+    {
+      "output": "S_MGPIO14",
+      "input": "S_AGPIO_R5"
+    },
+    {
+      "output": "S_AGPIO_R10",
+      "input": "S_MGPIO13"
+    },
+    {
+      "output": "S_MGPIO12",
+      "input": "S_MGPIO11"
+    },
+    {
+      "output": "S_AGPIO_R1",
+      "input": "S_AGPIO_R2"
+    },
+    {
+      "output": "S_AGPIO_L17",
+      "input": "S_AGPIO_L24"
+    },
+    {
+      "output": "S_AGPIO_L11",
+      "input": "S_AGPIO_L21"
+    },
+    {
+      "output": "S_AGPIO_R0",
+      "input": "S_AGPIO_L19"
+    },
+    {
+      "output": "S_AGPIO_R3",
+      "input": "S_HGPIO13"
+    },
+    {
+      "output": "S_MGPIO25",
+      "input": "S_AGPIO_R6"
+    },
+    {
+      "output": "S_MGPIO23",
+      "input": "S_MGPIO26"
+    },
+    {
+      "output": "S_MGPIO31",
+      "input": "S_MGPIO24"
+    },
+    {
+      "output": "S_MGPIO30",
+      "input": "S_MGPIO29"
+    },
+    {
+      "output": "S_MGPIO28",
+      "input": "S_MGPIO32"
+    },
+    {
+      "output": "S_MGPIO22",
+      "input": "S_MGPIO27"
+    },
+    {
+      "output": "S_MGPIO19",
+      "input": "S_MGPIO21"
+    },
+    {
+      "output": "S_AGPIO_R7",
+      "input": "S_MGPIO20"
+    },
+    {
+      "output": "S_AGPIO_R9",
+      "input": "S_AGPIO_R8"
+    },
+    {
+      "output": "S_AGPIO_L29",
+      "input": "S_AGPIO_L30"
+    },
+    {
+      "output": "S_AGPIO_L20",
+      "input": "S_AGPIO_L32"
+    },
+    {
+      "output": "S_HGPIO5",
+      "input": "S_AGPIO_L15"
+    },
+    {
+      "output": "S_HGPIO0",
+      "input": "S_HGPIO4"
+    },
+    {
+      "output": "S_HGPIO2",
+      "input": "S_HGPIO1"
+    },
+    {
+      "output": "S_MGPIO3",
+      "input": "S_HGPIO3"
+    },
+    {
+      "output": "S_MGPIO2",
+      "input": "S_MGPIO1"
+    },
+    {
+      "output": "S_MGPIO6",
+      "input": "S_MGPIO0"
+    },
+    {
+      "output": "S_MGPIO8",
+      "input": "S_MGPIO9"
+    },
+    {
+      "output": "S_MGPIO8",
+      "input": "S_MGPIO7"
+    },
+    {
+      "output": "S_AGPIO_L18",
+      "input": "S_AGPIO_L28"
+    },
+    {
+      "output": "S_AGPIO_L26",
+      "input": "S_HGPIO9"
+    }
+  ]
+}
\ No newline at end of file
diff --git a/code/sdk/zhihui/utilscpp/include/pcm_1khz_period.h b/code/sdk/zhihui/utilscpp/include/pcm_1khz_period.h
new file mode 100644 (file)
index 0000000..c5cd349
--- /dev/null
@@ -0,0 +1,14 @@
+// 1000Hz正弦波PCM数据
+// 采样率: 16000Hz, 位深: 16位, 声道: 单声道
+// 数据长度: 16 样本 (32 字节) - 一个完整周期
+// 周期时长: 1.00 ms
+// 注意: 此数据可以循环播放来生成连续的正弦波
+
+#define PCM_1KHZ_DATA_SIZE 16
+#define PCM_1KHZ_DATA_BYTES (16 * 2)
+#define PCM_1KHZ_DATA_PERIOD_SAMPLES 16
+#define PCM_1KHZ_DATA_PERIOD_DURATION_MS (1)
+
+static const int16_t pcm_1khz_data[] = {
+         0,  10031,  18535,  24218,  26213,  24218,  18535,  10031,      0, -10031, -18535, -24218, -26213, -24218, -18535, -10031
+};
diff --git a/code/sdk/zhihui/utilscpp/include/pcm_volume_calculator.h b/code/sdk/zhihui/utilscpp/include/pcm_volume_calculator.h
new file mode 100644 (file)
index 0000000..f2567cb
--- /dev/null
@@ -0,0 +1,104 @@
+/**
+ * @file pcm_volume_calculator.h
+ * @brief PCM音频数据音量计算函数
+ * @version 1.0
+ * 
+ * 提供多种PCM音频数据音量计算方法:
+ * - RMS (均方根) 值
+ * - 峰值 (Peak)
+ * - 分贝 (dB) 转换
+ * - 归一化音量
+ */
+
+#ifndef PCM_VOLUME_CALCULATOR_H
+#define PCM_VOLUME_CALCULATOR_H
+
+#include <stdint.h>
+#include <stddef.h>
+#include <math.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief PCM音量计算结果结构体
+ */
+typedef struct {
+    double rms;              ///< RMS (均方根) 值,范围 0.0 ~ 1.0
+    double peak;             ///< 峰值,范围 0.0 ~ 1.0
+    double rms_db;           ///< RMS 分贝值 (dB)
+    double peak_db;          ///< 峰值分贝值 (dB)
+    int16_t max_sample;      ///< 最大样本值
+    int16_t min_sample;      ///< 最小样本值
+    uint32_t sample_count;   ///< 样本数量
+} pcm_volume_result_t;
+
+/**
+ * @brief 计算PCM数据的音量信息
+ * 
+ * @param pcm_data PCM数据指针 (16位有符号整数)
+ * @param sample_count 样本数量
+ * @param result 输出结果结构体指针
+ * 
+ * @return 0 成功, -1 失败
+ * 
+ * @note 支持的格式: 16位有符号PCM (int16_t)
+ */
+int pcm_calculate_volume(const int16_t *pcm_data, size_t sample_count, pcm_volume_result_t *result);
+
+/**
+ * @brief 计算PCM数据的RMS值
+ * 
+ * @param pcm_data PCM数据指针
+ * @param sample_count 样本数量
+ * 
+ * @return RMS值 (0.0 ~ 1.0), 失败返回 -1.0
+ */
+double pcm_calculate_rms(const int16_t *pcm_data, size_t sample_count);
+
+/**
+ * @brief 计算PCM数据的峰值
+ * 
+ * @param pcm_data PCM数据指针
+ * @param sample_count 样本数量
+ * 
+ * @return 峰值 (0.0 ~ 1.0), 失败返回 -1.0
+ */
+double pcm_calculate_peak(const int16_t *pcm_data, size_t sample_count);
+
+/**
+ * @brief 将线性值转换为分贝值
+ * 
+ * @param linear_value 线性值 (0.0 ~ 1.0)
+ * @param reference 参考值,默认为1.0
+ * 
+ * @return 分贝值 (dB)
+ */
+double linear_to_db(double linear_value, double reference);
+
+/**
+ * @brief 将分贝值转换为线性值
+ * 
+ * @param db_value 分贝值 (dB)
+ * @param reference 参考值,默认为1.0
+ * 
+ * @return 线性值 (0.0 ~ 1.0)
+ */
+double db_to_linear(double db_value, double reference);
+
+/**
+ * @brief 获取音量等级描述(用于显示)
+ * 
+ * @param rms_db RMS分贝值
+ * 
+ * @return 音量等级字符串指针
+ */
+const char* pcm_get_volume_level(double rms_db);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PCM_VOLUME_CALCULATOR_H */
+
diff --git a/code/sdk/zhihui/utilscpp/pcm_volume_calculator.cpp b/code/sdk/zhihui/utilscpp/pcm_volume_calculator.cpp
new file mode 100644 (file)
index 0000000..20e364c
--- /dev/null
@@ -0,0 +1,147 @@
+/**
+ * @file pcm_volume_calculator.c
+ * @brief PCM音频数据音量计算函数实现
+ */
+
+#include "pcm_volume_calculator.h"
+#include <string.h>
+#include <stdlib.h>
+
+#define PCM_MAX_VALUE 32767.0
+#define PCM_MIN_VALUE -32768.0
+#define DB_MIN_VALUE -120.0  // 最小分贝值(接近静音)
+
+int pcm_calculate_volume(const int16_t *pcm_data, size_t sample_count, pcm_volume_result_t *result)
+{
+    if (pcm_data == NULL || sample_count == 0 || result == NULL) {
+        return -1;
+    }
+
+    // 初始化结果结构
+    memset(result, 0, sizeof(pcm_volume_result_t));
+    result->sample_count = sample_count;
+
+    // 计算RMS和峰值
+    double sum_squares = 0.0;
+    int16_t max_val = PCM_MIN_VALUE;
+    int16_t min_val = PCM_MAX_VALUE;
+
+    for (size_t i = 0; i < sample_count; i++) {
+        int16_t sample = pcm_data[i];
+        
+        // 计算平方和(用于RMS)
+        double normalized = (double)sample / PCM_MAX_VALUE;
+        sum_squares += normalized * normalized;
+        
+        // 查找最大值和最小值
+        if (sample > max_val) {
+            max_val = sample;
+        }
+        if (sample < min_val) {
+            min_val = sample;
+        }
+    }
+
+    // 计算RMS
+    result->rms = sqrt(sum_squares / sample_count);
+    
+    // 计算峰值(取绝对值较大的)
+    double max_abs = (abs(max_val) > abs(min_val)) ? abs(max_val) : abs(min_val);
+    result->peak = max_abs / PCM_MAX_VALUE;
+    
+    // 保存最大最小样本值
+    result->max_sample = max_val;
+    result->min_sample = min_val;
+    
+    // 计算分贝值
+    result->rms_db = linear_to_db(result->rms, 1.0);
+    result->peak_db = linear_to_db(result->peak, 1.0);
+
+    return 0;
+}
+
+double pcm_calculate_rms(const int16_t *pcm_data, size_t sample_count)
+{
+    if (pcm_data == NULL || sample_count == 0) {
+        return -1.0;
+    }
+
+    double sum_squares = 0.0;
+    
+    for (size_t i = 0; i < sample_count; i++) {
+        double normalized = (double)pcm_data[i] / PCM_MAX_VALUE;
+        sum_squares += normalized * normalized;
+    }
+
+    return sqrt(sum_squares / sample_count);
+}
+
+double pcm_calculate_peak(const int16_t *pcm_data, size_t sample_count)
+{
+    if (pcm_data == NULL || sample_count == 0) {
+        return -1.0;
+    }
+
+    int16_t max_abs = 0;
+    
+    for (size_t i = 0; i < sample_count; i++) {
+        int16_t abs_val = abs(pcm_data[i]);
+        if (abs_val > max_abs) {
+            max_abs = abs_val;
+        }
+    }
+
+    return (double)max_abs / PCM_MAX_VALUE;
+}
+
+double linear_to_db(double linear_value, double reference)
+{
+    if (linear_value <= 0.0) {
+        return DB_MIN_VALUE;
+    }
+    
+    if (reference <= 0.0) {
+        reference = 1.0;
+    }
+    
+    double ratio = linear_value / reference;
+    double db = 20.0 * log10(ratio);
+    
+    // 限制最小分贝值
+    if (db < DB_MIN_VALUE) {
+        db = DB_MIN_VALUE;
+    }
+    
+    return db;
+}
+
+double db_to_linear(double db_value, double reference)
+{
+    if (reference <= 0.0) {
+        reference = 1.0;
+    }
+    
+    if (db_value <= DB_MIN_VALUE) {
+        return 0.0;
+    }
+    
+    return reference * pow(10.0, db_value / 20.0);
+}
+
+const char* pcm_get_volume_level(double rms_db)
+{
+    if (rms_db < -60.0) {
+        return "静音";
+    } else if (rms_db < -40.0) {
+        return "极低";
+    } else if (rms_db < -20.0) {
+        return "低";
+    } else if (rms_db < -6.0) {
+        return "中";
+    } else if (rms_db < 0.0) {
+        return "高";
+    } else {
+        return "最大";
+    }
+}
+
diff --git a/generate_pcm_1khz.py b/generate_pcm_1khz.py
new file mode 100644 (file)
index 0000000..79366db
--- /dev/null
@@ -0,0 +1,191 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+生成1kHz正弦波PCM数据(C数组格式)
+- 信号频率: 1kHz
+- 采样率: 48kHz (可配置)
+- 时长: 1秒
+- 位深: 16位
+- 声道: 单声道
+"""
+
+import math
+import sys
+
+def calculate_period_samples(sample_rate, frequency):
+    """
+    计算信号的一个完整周期需要多少样本
+    
+    参数:
+        sample_rate: 采样率
+        frequency: 信号频率
+    
+    返回:
+        周期样本数(整数)
+    """
+    period_samples = sample_rate / frequency
+    # 如果是整数周期,直接返回
+    if period_samples == int(period_samples):
+        return int(period_samples)
+    # 否则返回最接近的整数
+    return int(round(period_samples))
+
+def generate_pcm_1khz(sample_rate=16000, frequency=1000, duration=1.0, bits_per_sample=16, channels=1, one_period_only=False):
+    """
+    生成1kHz正弦波PCM数据
+    
+    参数:
+        sample_rate: 采样率 (默认16kHz)
+        frequency: 信号频率 (默认1kHz)
+        duration: 时长,秒 (默认1秒,如果one_period_only=True则忽略)
+        bits_per_sample: 位深 (默认16位)
+        channels: 声道数 (默认单声道)
+        one_period_only: 如果为True,只生成一个周期的数据(最小重复单位)
+    
+    返回:
+        PCM数据列表
+    """
+    if one_period_only:
+        # 只生成一个周期
+        num_samples = calculate_period_samples(sample_rate, frequency)
+    else:
+        num_samples = int(sample_rate * duration)
+    
+    pcm_data = []
+    
+    # 生成正弦波
+    for i in range(num_samples):
+        # 计算当前时间点
+        t = i / sample_rate
+        
+        # 生成1kHz正弦波,幅度为最大值的80%(避免削波)
+        amplitude = 0.8
+        sample_value = amplitude * math.sin(2 * math.pi * frequency * t)
+        
+        # 转换为16位整数
+        if bits_per_sample == 16:
+            # 16位PCM范围: -32768 到 32767
+            pcm_sample = int(sample_value * 32767)
+            # 限制范围
+            pcm_sample = max(-32768, min(32767, pcm_sample))
+            pcm_data.append(pcm_sample)
+        else:
+            raise ValueError(f"不支持的位深: {bits_per_sample}")
+    
+    return pcm_data
+
+def output_c_array(pcm_data, array_name="pcm_1khz_data", samples_per_line=16, sample_rate=16000, frequency=1000, one_period=False):
+    """
+    输出C数组格式
+    
+    参数:
+        pcm_data: PCM数据列表
+        array_name: 数组名称
+        samples_per_line: 每行显示的样本数
+        sample_rate: 采样率
+        frequency: 信号频率
+        one_period: 是否为单个周期数据
+    """
+    period_samples = calculate_period_samples(sample_rate, frequency)
+    period_duration = period_samples / sample_rate
+    
+    print(f"// {frequency}Hz正弦波PCM数据")
+    print(f"// 采样率: {sample_rate}Hz, 位深: 16位, 声道: 单声道")
+    if one_period:
+        print(f"// 数据长度: {len(pcm_data)} 样本 ({len(pcm_data) * 2} 字节) - 一个完整周期")
+        print(f"// 周期时长: {period_duration*1000:.2f} ms")
+        print(f"// 注意: 此数据可以循环播放来生成连续的正弦波")
+    else:
+        print(f"// 数据长度: {len(pcm_data)} 样本 ({len(pcm_data) * 2} 字节)")
+        print(f"// 时长: {len(pcm_data) / sample_rate:.3f} 秒")
+        print(f"// 周期长度: {period_samples} 样本 (每{period_samples}个样本重复一次)")
+    print(f"")
+    print(f"#define {array_name.upper()}_SIZE {len(pcm_data)}")
+    print(f"#define {array_name.upper()}_BYTES ({len(pcm_data)} * 2)")
+    if one_period:
+        print(f"#define {array_name.upper()}_PERIOD_SAMPLES {period_samples}")
+        print(f"#define {array_name.upper()}_PERIOD_DURATION_MS ({period_duration*1000:.0f})")
+    print(f"")
+    print(f"static const int16_t {array_name}[] = {{")
+    
+    for i in range(0, len(pcm_data), samples_per_line):
+        line_samples = pcm_data[i:i + samples_per_line]
+        line_str = ", ".join([f"{sample:6d}" for sample in line_samples])
+        if i + samples_per_line < len(pcm_data):
+            print(f"    {line_str},")
+        else:
+            print(f"    {line_str}")
+    
+    print(f"}};")
+
+def main():
+    """主函数"""
+    # 默认参数
+    sample_rate = 16000
+    frequency = 1000  # 1kHz
+    duration = 1.0    # 1秒
+    bits_per_sample = 16
+    channels = 1
+    one_period_only = False
+    
+    # 解析命令行参数
+    if len(sys.argv) > 1:
+        if sys.argv[1] == "--period" or sys.argv[1] == "-p":
+            # 只生成一个周期
+            one_period_only = True
+            if len(sys.argv) > 2:
+                try:
+                    sample_rate = int(sys.argv[2])
+                except ValueError:
+                    print(f"警告: 无效的采样率参数 '{sys.argv[2]}', 使用默认值 16000", file=sys.stderr)
+            if len(sys.argv) > 3:
+                try:
+                    frequency = int(sys.argv[3])
+                except ValueError:
+                    print(f"警告: 无效的频率参数 '{sys.argv[3]}', 使用默认值 1000", file=sys.stderr)
+        else:
+            try:
+                sample_rate = int(sys.argv[1])
+            except ValueError:
+                print(f"警告: 无效的采样率参数 '{sys.argv[1]}', 使用默认值 16000", file=sys.stderr)
+    
+    if not one_period_only:
+        if len(sys.argv) > 2:
+            try:
+                frequency = int(sys.argv[2])
+            except ValueError:
+                print(f"警告: 无效的频率参数 '{sys.argv[2]}', 使用默认值 1000", file=sys.stderr)
+        
+        if len(sys.argv) > 3:
+            try:
+                duration = float(sys.argv[3])
+            except ValueError:
+                print(f"警告: 无效的时长参数 '{sys.argv[3]}', 使用默认值 1.0", file=sys.stderr)
+    
+    # 计算周期信息
+    period_samples = calculate_period_samples(sample_rate, frequency)
+    period_duration = period_samples / sample_rate
+    
+    # 生成PCM数据
+    print(f"正在生成PCM数据...", file=sys.stderr)
+    print(f"  采样率: {sample_rate} Hz", file=sys.stderr)
+    print(f"  信号频率: {frequency} Hz", file=sys.stderr)
+    if one_period_only:
+        print(f"  模式: 单个周期 (最小重复单位)", file=sys.stderr)
+        print(f"  周期长度: {period_samples} 样本", file=sys.stderr)
+        print(f"  周期时长: {period_duration*1000:.2f} ms", file=sys.stderr)
+    else:
+        print(f"  时长: {duration} 秒", file=sys.stderr)
+        print(f"  周期长度: {period_samples} 样本 (每{period_samples}个样本重复一次)", file=sys.stderr)
+    print(f"  位深: {bits_per_sample} 位", file=sys.stderr)
+    print(f"  声道: {channels}", file=sys.stderr)
+    print(f"", file=sys.stderr)
+    
+    pcm_data = generate_pcm_1khz(sample_rate, frequency, duration, bits_per_sample, channels, one_period_only)
+    
+    # 输出C数组
+    output_c_array(pcm_data, sample_rate=sample_rate, frequency=frequency, one_period=one_period_only)
+
+if __name__ == "__main__":
+    main()
+
diff --git a/pcm_volume_test.c b/pcm_volume_test.c
new file mode 100644 (file)
index 0000000..991e879
--- /dev/null
@@ -0,0 +1,65 @@
+/**
+ * @file pcm_volume_test.c
+ * @brief PCM音量计算函数测试示例
+ */
+
+#include <stdio.h>
+#include "pcm_volume_calculator.h"
+
+// 测试用的PCM数据(1kHz正弦波的一个周期)
+static const int16_t test_pcm_data[] = {
+    0, 10031, 18535, 24218, 26213, 24218, 18535, 10031,
+    0, -10031, -18535, -24218, -26213, -24218, -18535, -10031
+};
+
+int main(void)
+{
+    pcm_volume_result_t result;
+    
+    printf("=== PCM音量计算测试 ===\n\n");
+    
+    // 计算音量
+    if (pcm_calculate_volume(test_pcm_data, sizeof(test_pcm_data) / sizeof(test_pcm_data[0]), &result) == 0) {
+        printf("样本数量: %u\n", result.sample_count);
+        printf("最大样本值: %d\n", result.max_sample);
+        printf("最小样本值: %d\n", result.min_sample);
+        printf("\n");
+        
+        printf("RMS值: %.6f (%.2f%%)\n", result.rms, result.rms * 100.0);
+        printf("峰值: %.6f (%.2f%%)\n", result.peak, result.peak * 100.0);
+        printf("\n");
+        
+        printf("RMS分贝: %.2f dB\n", result.rms_db);
+        printf("峰值分贝: %.2f dB\n", result.peak_db);
+        printf("\n");
+        
+        printf("音量等级: %s\n", pcm_get_volume_level(result.rms_db));
+    } else {
+        printf("计算失败!\n");
+        return -1;
+    }
+    
+    printf("\n=== 单独函数测试 ===\n\n");
+    
+    // 单独测试RMS
+    double rms = pcm_calculate_rms(test_pcm_data, sizeof(test_pcm_data) / sizeof(test_pcm_data[0]));
+    printf("RMS值: %.6f\n", rms);
+    
+    // 单独测试峰值
+    double peak = pcm_calculate_peak(test_pcm_data, sizeof(test_pcm_data) / sizeof(test_pcm_data[0]));
+    printf("峰值: %.6f\n", peak);
+    
+    printf("\n=== 分贝转换测试 ===\n\n");
+    
+    // 测试分贝转换
+    double test_values[] = {1.0, 0.5, 0.1, 0.01, 0.001, 0.0001};
+    for (int i = 0; i < sizeof(test_values) / sizeof(test_values[0]); i++) {
+        double db = linear_to_db(test_values[i], 1.0);
+        double back = db_to_linear(db, 1.0);
+        printf("线性值: %.4f -> 分贝: %.2f dB -> 线性值: %.4f\n", 
+               test_values[i], db, back);
+    }
+    
+    return 0;
+}
+
diff --git a/test_pcm_volume.py b/test_pcm_volume.py
new file mode 100644 (file)
index 0000000..6578bb5
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+PCM音量计算函数测试脚本(Python版本)
+用于验证C函数的计算结果
+"""
+
+import math
+import struct
+
+def pcm_calculate_volume(pcm_data):
+    """
+    计算PCM数据的音量信息
+    
+    参数:
+        pcm_data: PCM数据列表 (16位有符号整数)
+    
+    返回:
+        包含音量信息的字典
+    """
+    if not pcm_data or len(pcm_data) == 0:
+        return None
+    
+    PCM_MAX_VALUE = 32767.0
+    
+    # 计算RMS和峰值
+    sum_squares = 0.0
+    max_val = max(pcm_data)
+    min_val = min(pcm_data)
+    max_abs = max(abs(max_val), abs(min_val))
+    
+    for sample in pcm_data:
+        normalized = sample / PCM_MAX_VALUE
+        sum_squares += normalized * normalized
+    
+    rms = math.sqrt(sum_squares / len(pcm_data))
+    peak = max_abs / PCM_MAX_VALUE
+    
+    # 计算分贝值
+    def linear_to_db(linear_value, reference=1.0):
+        if linear_value <= 0.0:
+            return -120.0
+        ratio = linear_value / reference
+        db = 20.0 * math.log10(ratio)
+        return max(db, -120.0)
+    
+    rms_db = linear_to_db(rms)
+    peak_db = linear_to_db(peak)
+    
+    return {
+        'rms': rms,
+        'peak': peak,
+        'rms_db': rms_db,
+        'peak_db': peak_db,
+        'max_sample': max_val,
+        'min_sample': min_val,
+        'sample_count': len(pcm_data)
+    }
+
+def get_volume_level(rms_db):
+    """获取音量等级描述"""
+    if rms_db < -60.0:
+        return "静音"
+    elif rms_db < -40.0:
+        return "极低"
+    elif rms_db < -20.0:
+        return "低"
+    elif rms_db < -6.0:
+        return "中"
+    elif rms_db < 0.0:
+        return "高"
+    else:
+        return "最大"
+
+def main():
+    # 测试数据(1kHz正弦波的一个周期)
+    test_pcm_data = [
+        0, 10031, 18535, 24218, 26213, 24218, 18535, 10031,
+        0, -10031, -18535, -24218, -26213, -24218, -18535, -10031
+    ]
+    
+    print("=== PCM音量计算测试 (Python) ===\n")
+    
+    result = pcm_calculate_volume(test_pcm_data)
+    
+    if result:
+        print(f"样本数量: {result['sample_count']}")
+        print(f"最大样本值: {result['max_sample']}")
+        print(f"最小样本值: {result['min_sample']}")
+        print()
+        
+        print(f"RMS值: {result['rms']:.6f} ({result['rms'] * 100.0:.2f}%)")
+        print(f"峰值: {result['peak']:.6f} ({result['peak'] * 100.0:.2f}%)")
+        print()
+        
+        print(f"RMS分贝: {result['rms_db']:.2f} dB")
+        print(f"峰值分贝: {result['peak_db']:.2f} dB")
+        print()
+        
+        print(f"音量等级: {get_volume_level(result['rms_db'])}")
+    
+    # 测试不同音量级别的数据
+    print("\n=== 不同音量级别测试 ===\n")
+    
+    test_cases = [
+        ("满音量 (80%)", [int(0.8 * 32767) for _ in range(16)]),
+        ("50%音量", [int(0.5 * 32767) for _ in range(16)]),
+        ("10%音量", [int(0.1 * 32767) for _ in range(16)]),
+        ("1%音量", [int(0.01 * 32767) for _ in range(16)]),
+    ]
+    
+    for name, data in test_cases:
+        result = pcm_calculate_volume(data)
+        if result:
+            print(f"{name}:")
+            print(f"  RMS: {result['rms']:.4f} ({result['rms_db']:.2f} dB) - {get_volume_level(result['rms_db'])}")
+            print(f"  峰值: {result['peak']:.4f} ({result['peak_db']:.2f} dB)")
+            print()
+
+if __name__ == "__main__":
+    main()
+