Mango Pi MQ Quad (Allwinner H616) Armbian が boot するまで

AliExpress でセールがやっていたので Mango Pi MQ Quad 買いました*1

mangopi.org

このページの FW&SDK からブートイメージがダウンロードできるという事になっていますが、

  • 直接ダウンロードできるイメージは Debian/Android 共にブートしない
  • 百度経由のだとイメージではなくダウンロードツールらしきものをインストールさせようとする(したくない)

という状態でした。なのでちょっと試行錯誤し、結論を言えばちょっと作業は必要ですがブートするまでは出来ました。

Armbian OrangePi Zero2 の boot イメージで試す

まず軽く検索してみると、同じ Allwinner H616 を使った Orange Pi Zero2 のイメージが使えるような書き込みが散見されたので

  • Armbian の Orange Pi Zero2 のイメージを入手し適当な Micro SD カードに dd 等で書き込む。
  • Mango Pi MQ Quad の UART PIN と PC とシリアルで接続してシリアルターミナルを起動する。
  • Armbian を書き込んだ Micro SD を挿して電源を投入する。

(この時点でダウンロードした Armbian は Armbian_23.8.3_Orangepizero2_bookworm_current_6.1.53.img.xz です。)

すると…

$ sudo cu
Connected to /dev/ttyUSB0 (speed 115200)

U-Boot SPL 2023.07.02-armbian (Sep 19 2023 - 18:26:21 +0000)
DRAM:This DRAM setup is currently not supported.

resetting ...

U-Boot SPL 2023.07.02-armbian (Sep 19 2023 - 18:26:21 +0000)
DRAM:This DRAM setup is currently not supported.

resetting ...

となり u-boot の段階で DRAM を認識できず reset を繰り返して boot しません。

Orange Pi Zero2 の電源制御は AXP305 というICが使われており、その前提で boot イメージの u-boot は構築されていますが、Mango Pi MQ-QUAD の電源制御は AX313A という IC が使われているというハードウェア構成の違いがあります。 u-boot の OrangePi Zero2 の設定(orangepi_zero2_defconfig)を見ると電源制御の記述は見当たりません。これは H616 であった場合 default で AXP305 が設定されるようになっており、Orange Pi Zero2 はそれで問題ないといった記述になっています。 ですので H616 と AXP313A で構成された Mango Pi MQ Quad に対応した u-boot を作る必要があります。

u-boot 構築

u-boot を作るにはまず ARM Trusted firmware と呼ばれるファームウェアを利用する環境に合わせて作成する必要があります。

github.com

H616 に対応したものを作るには PLAT=sun50i_h616 を指定します。

$ git clone https://github.com/ARM-software/arm-trusted-firmware.git
$ cd cd arm-trusted-firmware/
$ make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_h616 DEBUG=1 bl31
$ ls build/sun50i_h616/debug/bl31.bin 
build/sun50i_h616/debug/bl31.bin
$ cd ..
$

次に u-boot 本体を構築します。

source.denx.de

まず コードを clone し、Orange Pi Zero2 の設定を元に Mango Pi MQ Quad の設定(configs/mangopi_mq_quad_defconfig)を作ります。 MQ Quad の設定の内容は Orange Pi Zero2 の設定に AX313A の設定を追記し SPI_FLASHコメントアウトします。

MQ Quad の回路図を見ると AXP313A の DCDC1〜3 はそれぞれ GPU, CPU, DRAM に繋がれています。

また、H616 のデータシートの 5.2. Recommended Operating Conditions を見ると

となっているので AXP313A の電源ポートの電圧を回路図とデーターシートに合わせて指定します。

$ git clone git://git.denx.de/u-boot.git
$ cd u-boot/configs
$ cp orangepi_zero2_defconfig mangopi_mq_quad_defconfig
$ vi mangopi_mq_quad_defconfig
$ diff orangepi_zero2_defconfig mangopi_mq_quad_defconfig
19c19
< CONFIG_SPI_FLASH_MACRONIX=y
---
> # CONFIG_SPI_FLASH_MACRONIX=y
25a26,30
> 
> CONFIG_AXP313_POWER=y
> CONFIG_AXP_DCDC1_VOLT=900
> CONFIG_AXP_DCDC2_VOLT=900
> CONFIG_AXP_DCDC3_VOLT=1500
$ cd ..
$

次に作成した設定を適用して u-boot 本体を作成し

$ make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin mangopi_mq_quad_defconfig
$ make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin

Armbian が書き込まれている Micro SD に作成した u-boot を dd で書き込んで (of= で指定する出力先は個別の環境に合わせて下さい。)

$ sudo dd if=./u-boot/u-boot-sunxi-with-spl.bin of=/dev/sdxx bs=8K seek=1
102+1 records in
102+1 records out
841285 bytes (841 kB, 822 KiB) copied, 0.000470996 s, 1.8 GB/s

新しい u-boot を書き込んだ Micro SD を Mango Pi MQ Quad に差し込んで boot し、シリアルコンソールで出力を見ます。

$ sudo cu
Connected to /dev/ttyUSB0 (speed 115200)

U-Boot SPL 2024.01-rc3-00009-g9e53e45292 (Nov 24 2023 - 13:13:58 +0000)
DRAM: 1024 MiB
Trying to boot from MMC1
NOTICE:  BL31: v2.9.0   (debug):v2.10-rc0-29-gccd8c0230
NOTICE:  BL31: Built : 17:55:38, Nov 21 2023
NOTICE:  BL31: Detected Allwinner H616 SoC (1823)
NOTICE:  BL31: Found U-Boot DTB at 0x4a0b23f8, model: OrangePi Zero2
INFO:    ARM GICv2 driver initialized
INFO:    Configuring SPC Controller
INFO:    PMIC: Probing AXP305 on RSB
ERROR:   RSB: set run-time address: 0x10003
INFO:    Could not init RSB: -65539
INFO:    BL31: Platform setup done
INFO:    BL31: Initializing runtime services
INFO:    BL31: cortex_a53: CPU workaround for erratum 855873 was applied
INFO:    BL31: cortex_a53: CPU workaround for erratum 1530924 was applied
INFO:    PSCI: Suspend is unavailable
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0x4a000000
INFO:    SPSR = 0x3c9
INFO:    Changed devicetree.


U-Boot 2024.01-rc3-00009-g9e53e45292 (Nov 24 2023 - 13:13:58 +0000) Allwinner Technology

CPU:   Allwinner H616 (SUN50I)
Model: OrangePi Zero2
DRAM:  1 GiB
Core:  54 devices, 22 uclasses, devicetree: separate
WDT:   Not starting watchdog@30090a0
MMC:   mmc@4020000: 0
Loading Environment from FAT... Unable to use mmc 0:1...
In:    serial@5000000
Out:   serial@5000000
Err:   serial@5000000
Allwinner mUSB OTG (Peripheral)
Net:   Could not get PHY for ethernet@5020000: addr 1
using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC de:ad:be:ef:00:01
HOST MAC de:ad:be:ef:00:00
RNDIS ready
eth1: usb_ether
starting USB...
Bus usb@5200000: USB EHCI 1.00
Bus usb@5200400: USB OHCI 1.0
scanning bus usb@5200000 for devices... 1 USB Device(s) found
scanning bus usb@5200400 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot/boot.scr
3259 bytes read in 3 ms (1 MiB/s)
## Executing script at 4fc00000
U-boot loaded from SD
Boot script loaded from mmc
131 bytes read in 2 ms (63.5 KiB/s)
25388 bytes read in 7 ms (3.5 MiB/s)
Working FDT set to 4fa00000
Failed to load '/boot/dtb/allwinner/overlay/-fixup.scr'
11788479 bytes read in 489 ms (23 MiB/s)
22390792 bytes read in 927 ms (23 MiB/s)
Moving Image from 0x40080000 to 0x40200000, end=417d0000
## Loading init Ramdisk from Legacy Image at 4ff00000 ...
   Image Name:   uInitrd
   Image Type:   AArch64 Linux RAMDisk Image (gzip compressed)
   Data Size:    11788415 Bytes = 11.2 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 4fa00000
   Booting using the fdt blob at 0x4fa00000
Working FDT set to 4fa00000
   Loading Ramdisk to 494c1000, end 49fff07f ... OK
   Loading Device Tree to 0000000049452000, end 00000000494c0fff ... OK
Working FDT set to 49452000

Starting kernel ...

u-boot は起動して kernel の起動まで進みました。 が、Starting kernel ... のままいつまで待っても先に進みません。おそらくは u-boot の問題は解決したが、 AXP313A に変わっている事をまだ kernel は知らないためと思われます。 ですので次に kernel に構成を伝えるため MQ Quad に対応したデバイスツリーを作成し kernel に渡るようにします。

バイスツリーの対応

MQ Quad に対応したデバイスツリーを色々検索してみると過去 u-boot にパッチが送られているのを見つけました。

lore.kernel.org

これを取り込むと sun50i-h616-mangopi-mq-quad という名前でデバイスツリーが構成/生成されます。 なので先ほど作成した MQ Quad の u-boot の設定で Orange Pi Zero2 の構成(sun50i-h616-orangepi-zero2)のデバイスツリーの指定を MQ Quad の指定に変更します。

$ diff configs/mangopi_mq_quad_defconfig configs/mangopi_mq_quad_defconfig.old 
3,4c3
< # CONFIG_DEFAULT_DEVICE_TREE="sun50i-h616-orangepi-zero2"
< CONFIG_DEFAULT_DEVICE_TREE="sun50i-h616-mangopi-mq-quad"
---
> CONFIG_DEFAULT_DEVICE_TREE="sun50i-h616-orangepi-zero2"

変更したら以前と同様に設定を反映し make します。

$ make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin mangopi_mq_quad_defconfig
$ make CROSS_COMPILE=aarch64-linux-gnu- BL31=../arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin

make すると前回同様に u-boot の実体と、新たに MQ Quad に対応したデバイスリーファイルが作成されます。 なので、Micro SD に u-boot を書き込み

$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdxx bs=8K seek=1
102+1 records in
102+1 records out
841285 bytes (841 kB, 822 KiB) copied, 0.000470996 s, 1.8 GB/s

Micro SD をマウントし、Armbian の /boot/dtb/allwinner/ に新たに出来た arch/arm/dts/sun50i-h616-mangopi-mq-quad.dtb をコピーします。

$ sudo cp arch/arm/dts/sun50i-h616-mangopi-mq-quad.dtb $MICROSD/armbi_root/boot/dtb/allwinner/

Micro SD をアンマウントして MQ Quad に差し込み電源を投入しシリアルコンソールを眺めると

U-Boot SPL 2024.01-rc3-00009-g9e53e45292 (Nov 24 2023 - 13:43:20 +0000)
DRAM: 1024 MiB
Trying to boot from MMC1
NOTICE:  BL31: v2.9.0   (debug):v2.10-rc0-29-gccd8c0230
NOTICE:  BL31: Built : 17:55:38, Nov 21 2023
NOTICE:  BL31: Detected Allwinner H616 SoC (1823)
NOTICE:  BL31: Found U-Boot DTB at 0x4a0b23f8, model: MangoPi MQ-Quad
INFO:    ARM GICv2 driver initialized
INFO:    Configuring SPC Controller
INFO:    PMIC: Probing AXP305 on RSB
ERROR:   RSB: set run-time address: 0x10003
INFO:    Could not init RSB: -65539
INFO:    BL31: Platform setup done
INFO:    BL31: Initializing runtime services
INFO:    BL31: cortex_a53: CPU workaround for erratum 855873 was applied
INFO:    BL31: cortex_a53: CPU workaround for erratum 1530924 was applied
INFO:    PSCI: Suspend is unavailable
INFO:    BL31: Preparing for EL3 exit to normal world
INFO:    Entry point address = 0x4a000000
INFO:    SPSR = 0x3c9
INFO:    Changed devicetree.


U-Boot 2024.01-rc3-00009-g9e53e45292 (Nov 24 2023 - 13:43:20 +0000) Allwinner Technology

CPU:   Allwinner H616 (SUN50I)
Model: MangoPi MQ-Quad
DRAM:  1 GiB
Core:  57 devices, 22 uclasses, devicetree: separate
WDT:   Not starting watchdog@30090a0
MMC:   mmc@4020000: 0, mmc@4021000: 1
Loading Environment from FAT... Unable to use mmc 0:1...
In:    serial@5000000
Out:   serial@5000000
Err:   serial@5000000
Allwinner mUSB OTG (Peripheral)
Net:   using musb-hdrc, OUT ep1out IN ep1in STATUS ep2in
MAC de:ad:be:ef:00:01
HOST MAC de:ad:be:ef:00:00
RNDIS ready
eth0: usb_ether
starting USB...
Bus usb@5200000: USB EHCI 1.00
Bus usb@5200400: USB OHCI 1.0
scanning bus usb@5200000 for devices... 1 USB Device(s) found
scanning bus usb@5200400 for devices... 1 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0 
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot/boot.scr
3259 bytes read in 3 ms (1 MiB/s)
## Executing script at 4fc00000
U-boot loaded from SD
Boot script loaded from mmc
180 bytes read in 2 ms (87.9 KiB/s)
18984 bytes read in 5 ms (3.6 MiB/s)
Working FDT set to 4fa00000
Failed to load '/boot/dtb/allwinner/overlay/-fixup.scr'
11790322 bytes read in 489 ms (23 MiB/s)
22390792 bytes read in 927 ms (23 MiB/s)
Moving Image from 0x40080000 to 0x40200000, end=417d0000
## Loading init Ramdisk from Legacy Image at 4ff00000 ...
   Image Name:   uInitrd
   Image Type:   AArch64 Linux RAMDisk Image (gzip compressed)
   Data Size:    11790258 Bytes = 11.2 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 4fa00000
   Booting using the fdt blob at 0x4fa00000
Working FDT set to 4fa00000
   Loading Ramdisk to 494c1000, end 49fff7b2 ... OK
   Loading Device Tree to 0000000049454000, end 00000000494c0fff ... OK
Working FDT set to 49454000

Starting kernel ...

Loading, please wait...
Starting systemd-udevd version 252.17-1~deb12u1
Begin: Loading essential drivers ... done.
Begin: Running /scripts/init-premount ... done.
Begin: Mounting root file system ... Begin: Running /scripts/local-top ... done.
Begin: Running /scripts/local-premount ... Scanning for Btrfs filesystems
done.
Begin: Will now check root file system ... fsck from util-linux 2.38.1
[/sbin/fsck.ext4 (1) -- /dev/mmcblk0p1] fsck.ext4 -a -C0 /dev/mmcblk0p1 
armbi_root: clean, 45354/960992 files, 464626/3849216 blocks
done.
done.
Begin: Running /scripts/local-bottom ... done.
Begin: Running /scripts/init-bottom ... done.

Welcome to Armbian 23.8.3 bookworm!

[  OK  ] Created slice system-getty.slice - Slice /system/getty.
[  OK  ] Created slice system-modpr…lice - Slice /system/modprobe.
[  OK  ] Created slice system-seria… - Slice /system/serial-getty.
[  OK  ] Created slice user.slice - User and Session Slice.
[  OK  ] Started systemd-ask-passwo…quests to Console Directory Watch.
[  OK  ] Started systemd-ask-passwo… Requests to Wall Directory Watch.
[  OK  ] Set up automount proc-sys-…rmats File System Automount Point.
[  OK  ] Reached target cryptsetup.…get - Local Encrypted Volumes.
[  OK  ] Reached target integrityse…Local Integrity Protected Volumes.
[  OK  ] Reached target paths.target - Path Units.
[  OK  ] Reached target slices.target - Slice Units.
[  OK  ] Reached target swap.target - Swaps.
[  OK  ] Reached target time-set.target - System Time Set.

kernel が起動し Armbian が動作します。😀

*1:今となっては MQ Quad 買うなら H618 の Orange Pi Zero2W買ったほうが色々楽だと思います