だいぶ前にバージョン上がっているし、Windowsを使わないアップデート手順についても、だいぶ周知されてこなれた感じ。いまさらのネタだけどやってみる。

Module LLM ファームウェアアップグレードガイド
https://docs.m5stack.switch-science.com/ja/guide/llm/llm/image

最新のイメージはこれ。ビルド日ではなくて、リリース日で出してほしいところだけど。
M5_LLM_ubuntu_v1.3_20241203-mini
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/M5_LLM_ubuntu2022-02_20241203-mini.axp
ダウンロードする。
% curl -OL https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/linux/llm/M5_LLM_ubuntu2022-02_20241203-mini.axp
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1538M 100 1538M 0 0 5196k 0 0:05:03 0:05:03 --:--:-- 4612k
これより前のFWイメージのkernelにはバグがあるという話も聞くので、上げておくのがよさげだ。
StackFlowのリリースは、このイメージに含まれるバージョンより上がっていると聞いているけど、とりあえずこれでいいか。StackFlowのaptリポジトリもできているみたいだけど、デカすぎて有効にするとうまくアップデートできない。やっぱり、こういうマイナーチェンジをaptリポジトリで提供するのは悪手だよな。
公式サイトのドキュメントには、Windows用のAXDLツールを使ったアップデートしか書かれていない。
Pythonでアップデートするには、このスクリプトを使用する。
LLM_buildroot-external-m5stack/tools/bin/axdl_tool.py at main · m5stack/LLM_buildroot-external-m5stack · GitHub
https://github.com/m5stack/LLM_buildroot-external-m5stack/blob/main/tools/bin/axdl_tool.py
依存しているライブラリは、libusb、pyusb、tqdm。
tqdmってなんだ? Pythonでループの進行状況(プログレスバー)を簡単に表示できるライブラリだそうだ。
uvで環境を整える。
% mkdir axdl_tool
% cd axdl_tool
% mv ../M5_LLM_ubuntu2022-02_20241203-mini.axp ./
あれ? このマシンはuv化してなかったか。
% python3 --version
Python 3.8.9
% uv --version
zsh: command not found: uv
uvをインストールする。
% curl -LsSf https://astral.sh/uv/install.sh | sh
downloading uv 0.7.3 aarch64-apple-darwin
no checksums to verify
installing to /Users/kinneko/.local/bin
uv
uvx
everything's installed!
To add $HOME/.local/bin to your PATH, either restart your shell or run:
source $HOME/.local/bin/env (sh, bash, zsh)
source $HOME/.local/bin/env.fish (fish)
% source $HOME/.local/bin/env
% uv --version
uv 0.7.3 (3c413f74b 2025-05-07)
% cd ..
% uv init axdl_tool
Initialized project axdl-tool at /Users/kinneko/Downloads/axdl_tool
% cd axdl_tool
Python環境も3.8.9なのでだいぶ古い。上げるか。
% uv python list
cpython-3.14.0a6-macos-aarch64-none cpython-3.14.0a6+freethreaded-macos-aarch64-none cpython-3.13.3-macos-aarch64-none cpython-3.13.3+freethreaded-macos-aarch64-none cpython-3.12.10-macos-aarch64-none cpython-3.12.1-macos-aarch64-none /opt/homebrew/bin/python3.12 -> ../Cellar/python@3.12/3.12.1/bin/python3.12 cpython-3.11.12-macos-aarch64-none cpython-3.10.17-macos-aarch64-none cpython-3.9.22-macos-aarch64-none cpython-3.8.20-macos-aarch64-none cpython-3.8.9-macos-aarch64-none /usr/bin/python3 pypy-3.11.11-macos-aarch64-none pypy-3.10.16-macos-aarch64-none pypy-3.9.19-macos-aarch64-none pypy-3.8.16-macos-aarch64-none graalpy-3.11.0-macos-aarch64-none graalpy-3.10.0-macos-aarch64-none graalpy-3.8.5-macos-aarch64-none cpython-3.14.0a6-macos-aarch64-noneを入れる。 % uv python install 3.14.0a6 Installed Python 3.14.0a6 in 4.24s + cpython-3.14.0a6-macos-aarch64-none % uv python pin 3.14.0a6 Updated % uv add libusb pyusb tqdm Using CPython 3.14.0a6 Creating virtual environment at: .venv Resolved 10 packages in 891ms Prepared 8 packages in 295ms Installed 8 packages in 21ms + importlib-metadata==8.7.0 + libusb==1.0.28.post1 + packaging==25.0 + pkg-about==1.3.3 + pyusb==1.3.1 + setuptools==80.4.0 + tqdm==4.67.1 + zipp==3.21.0 % cat pyproject.toml [project] スクリプトをgithubからコピーしておく。 % vi main.py USBデバイスのパーミッションがいるので、rootで実行する必要がある。 LLMモジュールをつながないで実行だけしてみる。オプションでFWファイルを指定しないとエラーになる。 % sudo uv run main.py Password: usage: main.py [-h] --axp AXP [--reset] [--vid VID] [--pid PID] [--debug] main.py: error: the following arguments are required: --axp FWを指定するとループでデバイス待ちをしている。 % sudo uv run main.py --axp M5_LLM_ubuntu2022-02_20241203-mini.axp 2025-05-12 16:42:59,715 [INFO] Extracting AXP: M5_LLM_ubuntu2022-02_20241203-mini.axp 2025-05-12 16:43:10,480 [INFO] Attempting to open USB device (VID=0x32C9, PID=0x1000) 2025-05-12 16:43:10,568 [INFO] Retrying... 2025-05-12 16:43:11,571 [INFO] Retrying... 2025-05-12 16:43:12,576 [INFO] Retrying... 2025-05-12 16:43:13,577 [INFO] Retrying... 2025-05-12 16:43:14,583 [INFO] Retrying... (snip) 2025-05-12 16:44:10,822 [ERROR] Device not found (VID=0x32C9, PID=0x1000). Traceback (most recent call last): File "/Users/kinneko/Downloads/axdl_tool/main.py", line 944, in main() ~~~~^^ File "/Users/kinneko/Downloads/axdl_tool/main.py", line 863, in main port.open() ~~~~~~~~~^^ File "/Users/kinneko/Downloads/axdl_tool/main.py", line 117, in open raise ValueError(msg) ValueError: Device not found (VID=0x32C9, PID=0x1000). しばらくするとタイムアウトした。 LLMモジュールのUSBコネクタの横にブートボタンがあるので、これを押しながらUSBケーブルをPCに接続してPythonスクリプトを走らせる。 2025-05-12 16:48:46,247 [INFO] USBSerialPort open: Bulk OUT=0x01, IN=0x81 claimed successfully. 2025-05-12 16:48:46,356 [INFO] ROM CODE handshake success. (romcode v1.0;raw) 2025-05-12 16:48:46,358 [INFO] BSL_CMD_CONNECT -> ACK 2025-05-12 16:48:46,359 [INFO] Downloading FDL1 from fdl_AX630C_emmc_arm64_k419_signed.bin, size=92160 bytes, base=0x3000000 FDL1: 100%|█████████████████████████████████| 92.2k/92.2k [00:00<00:00, 285kB/s] 2025-05-12 16:48:46,752 [INFO] FDL1 download complete. 2025-05-12 16:48:46,795 [INFO] FDL1 is now running. 2025-05-12 16:48:46,898 [INFO] FDL1 handshake success. (fdl1 v1.0;raw) 2025-05-12 16:48:46,899 [INFO] BSL_CMD_CONNECT -> ACK 2025-05-12 16:48:46,899 [INFO] Downloading FDL2 from fdl2_signed.bin, size=1035722 bytes, base=0x5C000000 FDL2: 100%|████████████████████████████████| 1.04M/1.04M [00:00<00:00, 2.92MB/s] 2025-05-12 16:48:47,256 [INFO] FDL2 download complete. 2025-05-12 16:48:48,223 [INFO] FDL2 is now running. 2025-05-12 16:48:48,223 [INFO] Preparing to repartition & burn images... 2025-05-12 16:48:48,317 [INFO] Repartition done. (#Partitions: 16, unit=2) 2025-05-12 16:48:48,317 [INFO] Skipping 'ERASEENV' (select=0). 2025-05-12 16:48:48,317 [INFO] Burning 'DDRINIT' => partition 'ddrinit', file='ddrinit_AX630C_emmc_arm64_k419_signed.bin', size=1024 bytes. DDRINIT: 100%|██████████████████████████████| 1.02k/1.02k [00:00<00:00, 507kB/s] 2025-05-12 16:48:48,350 [INFO] Burning 'ATF' => partition 'atf', file='atf_bl31_signed.bin', size=19816 bytes. ATF: 100%|█████████████████████████████████| 19.8k/19.8k [00:00<00:00, 10.3MB/s] 2025-05-12 16:48:48,366 [INFO] Burning 'ATF_B' => partition 'atf_b', file='atf_b_bl31_signed.bin', size=19816 bytes. ATF_B: 100%|███████████████████████████████| 19.8k/19.8k [00:00<00:00, 10.1MB/s] 2025-05-12 16:48:48,382 [INFO] Burning 'UBOOT' => partition 'uboot', file='u-boot_signed.bin', size=574264 bytes. UBOOT: 100%|█████████████████████████████████| 574k/574k [00:00<00:00, 25.0MB/s] 2025-05-12 16:48:48,434 [INFO] Burning 'UBOOT_B' => partition 'uboot_b', file='u-boot_b_signed.bin', size=574264 bytes. UBOOT_B: 100%|███████████████████████████████| 574k/574k [00:00<00:00, 24.2MB/s] 2025-05-12 16:48:48,487 [INFO] Burning 'LOGO' => partition 'logo', file='axera_logo.bmp', size=1152054 bytes. LOGO: 100%|████████████████████████████████| 1.15M/1.15M [00:00<00:00, 24.4MB/s] 2025-05-12 16:48:48,578 [INFO] Burning 'LOGO_B' => partition 'logo_b', file='axera_logo.bmp.1', size=1152054 bytes. LOGO_B: 100%|██████████████████████████████| 1.15M/1.15M [00:00<00:00, 23.5MB/s] 2025-05-12 16:48:48,674 [INFO] Burning 'OPTEE' => partition 'optee', file='optee_signed.bin', size=293608 bytes. OPTEE: 100%|█████████████████████████████████| 294k/294k [00:00<00:00, 19.5MB/s] 2025-05-12 16:48:48,709 [INFO] Burning 'OPTEE_B' => partition 'optee_b', file='optee_signed.bin.1', size=293608 bytes. OPTEE_B: 100%|███████████████████████████████| 294k/294k [00:00<00:00, 21.2MB/s] 2025-05-12 16:48:48,744 [INFO] Burning 'DTB' => partition 'dtb', file='AX630C_emmc_arm64_k419_signed.dtb', size=23016 bytes. DTB: 100%|█████████████████████████████████| 23.0k/23.0k [00:00<00:00, 9.00MB/s] 2025-05-12 16:48:48,761 [INFO] Burning 'DTB_B' => partition 'dtb_b', file='AX630C_emmc_arm64_k419_signed.dtb.1', size=23016 bytes. DTB_B: 100%|███████████████████████████████| 23.0k/23.0k [00:00<00:00, 9.78MB/s] 2025-05-12 16:48:48,777 [INFO] Burning 'KERNEL' => partition 'kernel', file='boot_signed.bin', size=5925120 bytes. KERNEL: 100%|██████████████████████████████| 5.93M/5.93M [00:00<00:00, 20.9MB/s] 2025-05-12 16:48:49,237 [INFO] Burning 'KERNEL_B' => partition 'kernel_b', file='boot_signed.bin.1', size=5925120 bytes. KERNEL_B: 100%|████████████████████████████| 5.93M/5.93M [00:00<00:00, 20.2MB/s] 2025-05-12 16:48:49,709 [INFO] Burning 'UBUNTU_ROOTFS' => partition 'ubuntu_rootfs', file='ubuntu_rootfs_sparse.ext4', size=3344194612 bytes. UBUNTU_ROOTFS: 2%|▎ | 52.2M/3.34G [00:37<02:38, 20.7MB/s] まずは、イメージファイルはzipなので、それを展開している。つまり展開スペース分のストレージがいるということだ。 なんか、255MBくらいで何回かに分けて転送している。その間には、少し待ち時間がある。 UBUNTU_ROOTFS: 39%|█████████ | 1.32G/3.34G [02:13<01:36, 21.1MB/s] 無事書き込めた模様。展開したファイルの掃除もされている。 UBUNTU_ROOTFS: 100%|███████████████████████| 3.34G/3.34G [07:01<00:00, 7.93MB/s] 2025-05-12 16:56:00,007 [INFO] Burning 'SPL' => partition 'spl', file='spl_AX630C_emmc_arm64_k419_signed.bin', size=262144 bytes. SPL: 100%|███████████████████████████████████| 262k/262k [00:00<00:00, 20.0MB/s] 2025-05-12 16:56:00,045 [INFO] All images downloaded successfully. Optionally reset device with BSL_CMD_RESET... 2025-05-12 16:56:00,047 [INFO] USBSerialPort closed. 2025-05-12 16:56:00,047 [INFO] All operations completed. Exiting. SoCベンダーから出されたコードでは、書き込み終了までに1時間くらいかかったみたいだけど、速度はだいぶ改善されている。 自動で再起動はされないので、使用するには電源を再投入する必要がある。 オリジナル投稿:.python-version from 3.12 -> 3.14a6name = "axdl-tool"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"libusb>=1.0.28.post1",
"pyusb>=1.3.1",
"tqdm>=4.67.1",
]

LLMモジュールのFWを上げる -1-|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/9870030



