From 7058f6eaa85ce2b92df4f15d7f1b820f6ac25b9e Mon Sep 17 00:00:00 2001 From: chenjintao Date: Tue, 29 Sep 2026 16:11:52 +0800 Subject: [PATCH] feat: add cross-platform customer fs generator --- .gitignore | 2 + audio_prompts/customer_fs/ai_active_zh.mp3 | Bin 0 -> 12465 bytes audio_prompts/customer_fs/barge_in_cute.mp3 | Bin 0 -> 2240 bytes .../customer_fs/device_sleep_mode_zh.mp3 | Bin 0 -> 7425 bytes .../customer_fs/device_wake_up_zh.mp3 | Bin 0 -> 6993 bytes audio_prompts/customer_fs/have_rest_zh.mp3 | Bin 0 -> 8001 bytes .../customer_fs/low_power_off_zh.mp3 | Bin 0 -> 9297 bytes audio_prompts/customer_fs/low_power_zh.mp3 | Bin 0 -> 3537 bytes audio_prompts/customer_fs/network_check.mp3 | Bin 0 -> 10160 bytes .../customer_fs/network_connect_zh.mp3 | Bin 0 -> 11025 bytes audio_prompts/customer_fs/network_ok_zh.mp3 | Bin 0 -> 15633 bytes audio_prompts/customer_fs/tts_error.mp3 | Bin 0 -> 12321 bytes audio_prompts/customer_fs/upgrading.mp3 | Bin 0 -> 9873 bytes audio_prompts/customer_fs/volume_down_zh.mp3 | Bin 0 -> 5697 bytes audio_prompts/customer_fs/volume_up_zh.mp3 | Bin 0 -> 5985 bytes tools/customer_fs/README.md | 215 ++++++++++++++++++ tools/customer_fs/build_macos.sh | 38 ++++ tools/customer_fs/build_windows.bat | 56 +++++ tools/customer_fs/generate_macos.py | 76 +++++++ tools/customer_fs/requirements.txt | 1 + tools/customer_fs/verify_customer_fs.py | 121 ++++++++++ 21 files changed, 509 insertions(+) create mode 100644 audio_prompts/customer_fs/ai_active_zh.mp3 create mode 100644 audio_prompts/customer_fs/barge_in_cute.mp3 create mode 100644 audio_prompts/customer_fs/device_sleep_mode_zh.mp3 create mode 100644 audio_prompts/customer_fs/device_wake_up_zh.mp3 create mode 100644 audio_prompts/customer_fs/have_rest_zh.mp3 create mode 100644 audio_prompts/customer_fs/low_power_off_zh.mp3 create mode 100644 audio_prompts/customer_fs/low_power_zh.mp3 create mode 100644 audio_prompts/customer_fs/network_check.mp3 create mode 100644 audio_prompts/customer_fs/network_connect_zh.mp3 create mode 100644 audio_prompts/customer_fs/network_ok_zh.mp3 create mode 100644 audio_prompts/customer_fs/tts_error.mp3 create mode 100644 audio_prompts/customer_fs/upgrading.mp3 create mode 100644 audio_prompts/customer_fs/volume_down_zh.mp3 create mode 100644 audio_prompts/customer_fs/volume_up_zh.mp3 create mode 100644 tools/customer_fs/README.md create mode 100755 tools/customer_fs/build_macos.sh create mode 100644 tools/customer_fs/build_windows.bat create mode 100755 tools/customer_fs/generate_macos.py create mode 100644 tools/customer_fs/requirements.txt create mode 100755 tools/customer_fs/verify_customer_fs.py diff --git a/.gitignore b/.gitignore index 36e7a39..976ceab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # Firmware build and release output. /target/ /version/ +/output/ +/.venv-customer-fs/ # Local legacy-board packages retained when switching to the new-board branch. /artifacts/legacy-no-gnss/ diff --git a/audio_prompts/customer_fs/ai_active_zh.mp3 b/audio_prompts/customer_fs/ai_active_zh.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..88a766935308db8a38c1d07632cf6274a5c72d85 GIT binary patch literal 12465 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 O&$a)*``G{MJ^veg;p2_~ literal 0 HcmV?d00001 diff --git a/audio_prompts/customer_fs/barge_in_cute.mp3 b/audio_prompts/customer_fs/barge_in_cute.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..c9cd9f727dcfeb0e97c898102ecbcc6208a341c2 GIT binary patch literal 2240 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 b=w$oXL;v5N(7$_(aLjhwzgvm_!~6aN>YEu( literal 0 HcmV?d00001 diff --git a/audio_prompts/customer_fs/device_wake_up_zh.mp3 b/audio_prompts/customer_fs/device_wake_up_zh.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bac7deb4dae4d3c83512ba00296ed9a16c065a39 GIT binary patch literal 6993 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 G_5T2ZLWt=A literal 0 HcmV?d00001 diff --git a/audio_prompts/customer_fs/low_power_off_zh.mp3 b/audio_prompts/customer_fs/low_power_off_zh.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..aa70eaade375b8f0d5c7aba418f32f4265ea7c25 GIT binary patch literal 9297 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 R--l55K%oDY2>jnO`5*EEkhTB- literal 0 HcmV?d00001 diff --git a/audio_prompts/customer_fs/network_ok_zh.mp3 b/audio_prompts/customer_fs/network_ok_zh.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a39c8e817efe12584055bc90878efafca09fbd85 GIT binary patch literal 15633 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%0D7|kH;I!mQ+OW2mp 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

ZGWU$Eb6#o!tVzf@eSmfj1!0CD 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 EAELAXmH+?% literal 0 HcmV?d00001 diff --git a/audio_prompts/customer_fs/volume_down_zh.mp3 b/audio_prompts/customer_fs/volume_down_zh.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5d5bd1ac832229a79de4d90e53cfd11c4a50941a GIT binary patch literal 5697 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 literal 0 HcmV?d00001 diff --git a/tools/customer_fs/README.md b/tools/customer_fs/README.md new file mode 100644 index 0000000..7912d3d --- /dev/null +++ b/tools/customer_fs/README.md @@ -0,0 +1,215 @@ +# customer_fs.bin 双系统生成工具 + +本目录提供 `EG800AKCN_11LG` 项目的 `customer_fs.bin` 自动生成和校验工具,支持 +Windows 与 macOS。 + +当前 `customer_fs` 分区大小为 576 KiB,设备 kernel 只支持 LittleFS 磁盘格式 +`0x00020000`(disk 2.0)。所有生成入口都会在输出前执行兼容性检查,避免再次生成 +kernel 无法挂载的 disk 2.1 镜像。 + +## 1. 源文件目录 + +文件系统的源文件统一存放在: + +```text +audio_prompts/customer_fs/ +``` + +当前目录中的 14 个音频文件,全部从已经过实机验证、能够正常挂载的 Windows +`customer_fs.bin` 中提取,并经过重新打包和逐文件回读验证。 + +设备代码从 `U:/` 根目录访问文件,因此所有文件必须直接放在上述目录中。例如: + +```text +正确:audio_prompts/customer_fs/network_connect_zh.mp3 +错误:audio_prompts/customer_fs/subdir/network_connect_zh.mp3 +``` + +生成工具会拒绝隐藏文件和子目录,避免把 `.DS_Store` 等无关文件打进正式镜像。 + +## 2. 如何增删改文件 + +生成工具采用“根据源目录全量重建”的方式,不是在旧 bin 上追加内容。 + +- 添加:把新文件直接放进 `audio_prompts/customer_fs/`; +- 替换:用新文件覆盖同名文件; +- 编辑:使用音频工具修改原文件并保存到原位置; +- 删除:从源目录删除文件,下一次生成的 bin 中将不再包含该文件; +- 改名:直接修改源文件名,但必须同步确认业务代码使用的新文件名。 + +部分音频文件名已经写入业务代码。删除或改名后,如果代码仍然播放原文件,串口会打印: + +```text +tips file missing +``` + +因此,生成工具允许删减文件,但删减前仍需确认业务代码不再使用它。 + +## 3. Windows 一键生成 + +在项目根目录执行: + +```bat +tools\customer_fs\build_windows.bat +``` + +Windows 版本使用项目自带并已通过实机验证的工具: + +```text +ql-cross-tool\win32\mklfs-v2.exe +``` + +同时使用 SDK 自带的 Python 执行兼容性校验,不需要另外安装 Python 依赖。 + +也可以指定自定义源目录和输出文件: + +```bat +tools\customer_fs\build_windows.bat 源目录 输出文件 +``` + +例如: + +```bat +tools\customer_fs\build_windows.bat ^ + audio_prompts\customer_fs ^ + output\customer_fs\customer_fs.bin +``` + +## 4. macOS 一键生成 + +在项目根目录执行: + +```bash +./tools/customer_fs/build_macos.sh +``` + +首次运行时,脚本会自动创建: + +```text +.venv-customer-fs +``` + +并安装项目固定的依赖版本: + +```text +littlefs-python==0.19.0 +``` + +新版 `littlefs-python` 默认会生成 disk 2.1 镜像,不能直接使用它自带的命令行生成。 +本项目的 `generate_macos.py` 会显式设置: + +```text +disk_version = 0x00020000 +``` + +从而生成当前设备 kernel 可以识别的 disk 2.0 镜像。 + +也可以指定自定义源目录和输出文件: + +```bash +./tools/customer_fs/build_macos.sh 源目录 输出文件 +``` + +例如: + +```bash +./tools/customer_fs/build_macos.sh \ + audio_prompts/customer_fs \ + output/customer_fs/customer_fs.bin +``` + +## 5. 默认输出位置 + +Windows 和 macOS 默认都输出到: + +```text +output/customer_fs/customer_fs.bin +``` + +生成时会先写入临时文件: + +```text +customer_fs.bin.tmp +``` + +只有生成和全部校验成功后,临时文件才会替换正式输出。生成或校验失败时,已有正式输出 +不会被覆盖。 + +## 6. 自动门禁检查 + +每次生成都会检查: + +| 检查项 | 要求 | +| --- | ---: | +| 镜像大小 | 589824 字节 | +| LittleFS 磁盘格式 | `0x00020000` | +| Block Size | 4096 字节 | +| Block Count | 144 | +| 第一个 superblock | 必须存在且参数正确 | +| 第二个 superblock | 必须存在且参数正确 | +| 源目录 | 不能为空 | +| 源文件层级 | 只能是根目录文件 | +| 隐藏文件 | 不允许 | +| 文件名 | 必须能在生成镜像中找到 | + +也可以单独校验一个镜像: + +```bash +python3 tools/customer_fs/verify_customer_fs.py \ + --image output/customer_fs/customer_fs.bin \ + --source audio_prompts/customer_fs +``` + +校验成功会输出镜像大小、LittleFS 版本、块参数、源文件数量和 SHA-256。 + +## 7. 放入正式固件工程 + +生成并校验成功后,需要显式复制到 SDK 打包位置。 + +macOS: + +```bash +cp output/customer_fs/customer_fs.bin \ + ql-config/config/EG800AKCN_11LG/customer_fs.bin +``` + +Windows: + +```bat +copy /Y output\customer_fs\customer_fs.bin ^ + ql-config\config\EG800AKCN_11LG\customer_fs.bin +``` + +替换前建议备份原文件并记录新镜像的 SHA-256。 + +`customer_fs.bin` 不是当前 APP-only OTA 的升级内容。修改该镜像后,需要重新生成并烧录 +包含分区表、kernel、customer_app 和 customer_fs 的完整工厂包,不能只下发 APP OTA。 + +## 8. 实机验收 + +Windows 生成工具已经过实机验证。macOS 工具已经通过结构校验、重新挂载和逐文件回读, +首次用于正式版本前仍应至少烧录一台设备验收。 + +启动日志应直接出现: + +```text +[U] mount successfully +``` + +不能出现: + +```text +[U] mount failed (-22), will format fs partition +``` + +还需要逐一验证镜像中的音频能够通过 `U:/文件名` 正常读取和播放,并记录本次发布使用的 +`customer_fs.bin` SHA-256。 + +## 9. 注意事项 + +- 不要用十六进制工具把 disk 2.1 镜像的版本字段直接改成 disk 2.0; +- 不要直接使用 `python -m littlefs create`,它当前默认生成 disk 2.1; +- 不要把 `.venv-customer-fs`、`output` 或 `.DS_Store` 提交到仓库; +- Windows 和 macOS 生成镜像的整体 SHA-256 可能不同,这是块分配顺序不同造成的; +- 两个平台产物必须满足相同的 disk 2.0、4096 字节块和 144 块约束; +- 修改、删除或重命名业务音频前,必须同步检查代码中的文件名引用。 diff --git a/tools/customer_fs/build_macos.sh b/tools/customer_fs/build_macos.sh new file mode 100755 index 0000000..1af58c0 --- /dev/null +++ b/tools/customer_fs/build_macos.sh @@ -0,0 +1,38 @@ +#!/bin/sh +set -eu + +SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) +ROOT_DIR=$(CDPATH= cd -- "$SCRIPT_DIR/../.." && pwd) +SOURCE_DIR=${1:-"$ROOT_DIR/audio_prompts/customer_fs"} +OUTPUT_IMAGE=${2:-"$ROOT_DIR/output/customer_fs/customer_fs.bin"} +VENV_DIR=${CUSTOMER_FS_VENV:-"$ROOT_DIR/.venv-customer-fs"} +PYTHON_BOOTSTRAP=${PYTHON3:-python3} +TEMP_IMAGE="${OUTPUT_IMAGE}.tmp" + +cleanup() { + rm -f -- "$TEMP_IMAGE" +} +trap cleanup EXIT INT TERM + +if [ ! -x "$VENV_DIR/bin/python" ]; then + "$PYTHON_BOOTSTRAP" -m venv "$VENV_DIR" +fi + +if ! "$VENV_DIR/bin/python" -c 'import littlefs; raise SystemExit(0 if littlefs.__version__ == "0.19.0" else 1)' 2>/dev/null; then + "$VENV_DIR/bin/python" -m pip install --requirement "$SCRIPT_DIR/requirements.txt" +fi + +mkdir -p -- "$(dirname -- "$OUTPUT_IMAGE")" +rm -f -- "$TEMP_IMAGE" + +"$VENV_DIR/bin/python" "$SCRIPT_DIR/generate_macos.py" \ + --source "$SOURCE_DIR" \ + --output "$TEMP_IMAGE" + +"$VENV_DIR/bin/python" "$SCRIPT_DIR/verify_customer_fs.py" \ + --image "$TEMP_IMAGE" \ + --source "$SOURCE_DIR" + +mv -f -- "$TEMP_IMAGE" "$OUTPUT_IMAGE" +trap - EXIT INT TERM +printf 'customer_fs ready: %s\n' "$OUTPUT_IMAGE" diff --git a/tools/customer_fs/build_windows.bat b/tools/customer_fs/build_windows.bat new file mode 100644 index 0000000..3ddee71 --- /dev/null +++ b/tools/customer_fs/build_windows.bat @@ -0,0 +1,56 @@ +@echo off +setlocal EnableExtensions + +set "SCRIPT_DIR=%~dp0" +for %%I in ("%SCRIPT_DIR%..\..") do set "ROOT_DIR=%%~fI" + +if "%~1"=="" ( + set "SOURCE_DIR=%ROOT_DIR%\audio_prompts\customer_fs" +) else ( + set "SOURCE_DIR=%~f1" +) + +if "%~2"=="" ( + set "OUTPUT_IMAGE=%ROOT_DIR%\output\customer_fs\customer_fs.bin" +) else ( + set "OUTPUT_IMAGE=%~f2" +) + +set "TEMP_IMAGE=%OUTPUT_IMAGE%.tmp" +set "MKLFS=%ROOT_DIR%\ql-cross-tool\win32\mklfs-v2.exe" +set "PYTHON=%ROOT_DIR%\ql-cross-tool\win32\owtoolchain\Python\python.exe" + +if not exist "%MKLFS%" ( + echo customer_fs generation failed: mklfs-v2.exe not found at "%MKLFS%" + exit /b 1 +) +if not exist "%PYTHON%" ( + echo customer_fs generation failed: bundled Python not found at "%PYTHON%" + exit /b 1 +) +if not exist "%SOURCE_DIR%\" ( + echo customer_fs generation failed: source directory not found at "%SOURCE_DIR%" + exit /b 1 +) + +for %%I in ("%OUTPUT_IMAGE%") do if not exist "%%~dpI" mkdir "%%~dpI" +if exist "%TEMP_IMAGE%" del /q "%TEMP_IMAGE%" + +"%MKLFS%" -c "%SOURCE_DIR%" -s 589824 -i "%TEMP_IMAGE%" +if errorlevel 1 goto :failed + +"%PYTHON%" "%SCRIPT_DIR%verify_customer_fs.py" ^ + --image "%TEMP_IMAGE%" ^ + --source "%SOURCE_DIR%" +if errorlevel 1 goto :failed + +move /Y "%TEMP_IMAGE%" "%OUTPUT_IMAGE%" >nul +if errorlevel 1 goto :failed + +echo customer_fs ready: "%OUTPUT_IMAGE%" +exit /b 0 + +:failed +if exist "%TEMP_IMAGE%" del /q "%TEMP_IMAGE%" +echo customer_fs generation failed; existing output was not changed. +exit /b 1 diff --git a/tools/customer_fs/generate_macos.py b/tools/customer_fs/generate_macos.py new file mode 100755 index 0000000..d86f975 --- /dev/null +++ b/tools/customer_fs/generate_macos.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 +"""Generate a disk-2.0 LittleFS customer_fs image on macOS.""" + +from __future__ import annotations + +import argparse +import sys +from pathlib import Path + +from littlefs import LittleFS, UserContext + + +IMAGE_SIZE = 589824 +BLOCK_SIZE = 4096 +BLOCK_COUNT = 144 +DISK_VERSION = 0x00020000 + + +def fail(message: str) -> None: + raise SystemExit(f"customer_fs generation failed: {message}") + + +def collect_source_files(source: Path) -> list[Path]: + if not source.is_dir(): + fail(f"source directory does not exist: {source}") + entries = sorted(source.iterdir(), key=lambda path: path.name.encode("utf-8")) + if not entries: + fail(f"source directory is empty: {source}") + invalid = [entry.name for entry in entries if not entry.is_file() or entry.name.startswith(".")] + if invalid: + fail( + "source must contain only visible root-level files; invalid entries: " + + ", ".join(invalid) + ) + return entries + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument("--source", required=True, type=Path) + parser.add_argument("--output", required=True, type=Path) + args = parser.parse_args() + + files = collect_source_files(args.source) + context = UserContext(buffsize=IMAGE_SIZE) + fs = LittleFS( + context=context, + mount=False, + block_size=BLOCK_SIZE, + block_count=BLOCK_COUNT, + read_size=16, + prog_size=16, + cache_size=256, + lookahead_size=32, + block_cycles=500, + disk_version=DISK_VERSION, + ) + fs.format() + fs.mount() + try: + for source_file in files: + with source_file.open("rb") as source_handle: + with fs.open("/" + source_file.name, "wb") as image_handle: + while chunk := source_handle.read(64 * 1024): + image_handle.write(chunk) + finally: + fs.unmount() + + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_bytes(context.buffer) + print(f"generated {args.output} from {len(files)} files") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/customer_fs/requirements.txt b/tools/customer_fs/requirements.txt new file mode 100644 index 0000000..caebc13 --- /dev/null +++ b/tools/customer_fs/requirements.txt @@ -0,0 +1 @@ +littlefs-python==0.19.0 diff --git a/tools/customer_fs/verify_customer_fs.py b/tools/customer_fs/verify_customer_fs.py new file mode 100755 index 0000000..2df56df --- /dev/null +++ b/tools/customer_fs/verify_customer_fs.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +"""Validate a customer_fs LittleFS image for the EG800AKCN_11LG kernel.""" + +from __future__ import annotations + +import argparse +import hashlib +import struct +import sys +from pathlib import Path + + +DEFAULT_SIZE = 589824 +DEFAULT_DISK_VERSION = 0x00020000 +DEFAULT_BLOCK_SIZE = 4096 +DEFAULT_BLOCK_COUNT = 144 +SUPERBLOCK_MAGIC_OFFSETS = (8, DEFAULT_BLOCK_SIZE + 8) + + +def fail(message: str) -> None: + raise SystemExit(f"customer_fs verification failed: {message}") + + +def source_files(source: Path) -> list[Path]: + if not source.is_dir(): + fail(f"source directory does not exist: {source}") + + entries = sorted(source.iterdir(), key=lambda path: path.name.encode("utf-8")) + if not entries: + fail(f"source directory is empty: {source}") + + invalid = [entry.name for entry in entries if not entry.is_file() or entry.name.startswith(".")] + if invalid: + fail( + "source must contain only visible root-level files; invalid entries: " + + ", ".join(invalid) + ) + return entries + + +def verify_superblock( + image: bytes, + magic_offset: int, + disk_version: int, + block_size: int, + block_count: int, +) -> None: + if image[magic_offset : magic_offset + 8] != b"littlefs": + fail(f"LittleFS magic is missing at 0x{magic_offset:X}") + + actual_version, actual_block_size, actual_block_count = struct.unpack_from( + " int: + parser = argparse.ArgumentParser() + parser.add_argument("--image", required=True, type=Path) + parser.add_argument("--source", type=Path, help="also check root-level source filenames") + parser.add_argument("--size", type=int, default=DEFAULT_SIZE) + parser.add_argument( + "--disk-version", type=lambda value: int(value, 0), default=DEFAULT_DISK_VERSION + ) + parser.add_argument("--block-size", type=int, default=DEFAULT_BLOCK_SIZE) + parser.add_argument("--block-count", type=int, default=DEFAULT_BLOCK_COUNT) + args = parser.parse_args() + + if not args.image.is_file(): + fail(f"image does not exist: {args.image}") + image = args.image.read_bytes() + if len(image) != args.size: + fail(f"image size is {len(image)}; expected {args.size}") + if args.block_size * args.block_count != args.size: + fail("block size multiplied by block count does not equal image size") + + for magic_offset in (8, args.block_size + 8): + verify_superblock( + image, + magic_offset, + args.disk_version, + args.block_size, + args.block_count, + ) + + files: list[Path] = [] + if args.source: + files = source_files(args.source) + missing = [path.name for path in files if path.name.encode("utf-8") not in image] + if missing: + fail("source filenames missing from image: " + ", ".join(missing)) + + digest = hashlib.sha256(image).hexdigest() + print("customer_fs verified") + print(f" image: {args.image}") + print(f" size: {len(image)}") + print(f" disk_version: 0x{args.disk_version:08X}") + print(f" block_size: {args.block_size}") + print(f" block_count: {args.block_count}") + if files: + print(f" source_files: {len(files)}") + print(f" sha256: {digest}") + return 0 + + +if __name__ == "__main__": + sys.exit(main())