LLMモジュールのFWを上げる -1-

 だいぶ前にバージョン上がっているし、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 .python-version from 3.12 -> 3.14a6

 % 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]

name = "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",
]

 スクリプトを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時間くらいかかったみたいだけど、速度はだいぶ改善されている。

 自動で再起動はされないので、使用するには電源を再投入する必要がある。


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