03-Sep-2019にOrange Pi One Plus向けのU-Bootの作成を記しましたが、ATF(ARM Trusted Firmware)とU-Bootだけでなく、SCP(System Control Processor) firmwareも組み込んでおかないと困る場面があるようです。という訳で、ATF/SCP入りU-Bootの作成手順を書きます。
Debian上でも良いのですが、今回はArch Linux上でやります。というのも、SCP firmware(Orange Pi One Plusでは、crustを使います)の構築に必要なor1kのtoolchainが揃っているという理由によります。crustの推奨はor1k-linux-musl-crossではあるんですけどね。
まずはpacman -S aarch64-linux-gnu-binutils aarch64-linux-gnu-gcc or1k-elf-binutils or1k-elf-gcc or1k-newlibで必要なtoolchainを揃えます。git, swig, bc, dtc等ビルドに必要な他のツールも入れておいてください。
crustのビルドは、git clone https://github.com/crust-firmware/crust; cd crust; make CROSS_COMPILE=or1k-elf-で。とはいえ、実際のビルドが始まるまでの間に以下の質問に答える必要があります。予めOrange Pi One Plusの回路図を手に入れておくと答えやすいでしょう。
- Platform selection
- 4. H6 (PLATFORM_H6)
- CIR (infrared) receiver (CIR)
- n (default)
- OSC24M clock source
- 1. DCXO (OSC24M_SRC_DCXO) (default)
- Poll the GPIO controller for EINT IRQs (DEPRECATED) (IRQ_POLL_EINT)
- n (default)
- I2C controller pin selection
- 2. PL0/PL1 (I2C_PINS_PL0_PL1) (default)
- Multi-function driver for X-Powers PMICs (MFD_AXP20X)
- y
- X-Powers PMIC variant
- 2. AXP805 (MFD_AXP805) (default)
- GPIO-controlled CPU power supply (REGULATOR_GPIO_CPU)
- n (default)
- GPIO-controlled DRAM power supply (REGULATOR_GPIO_DRAM)
- n (default)
- GPIO-controlled VDD-SYS power supply (REGULATOR_GPIO_VDD_SYS)
- n (default)
- Silergy SY8106A voltage regulator (REGULATOR_SY8106A)
- n (default)
- Serial input/output support (SERIAL)
- y (default)
- Device
- 1. UART0 (SERIAL_DEV_UART0) (default)
- Use PMIC for full hardware shutdown (PMIC_SHUTDOWN)
- y (default)
- Enable runtime assertion checking (ASSERT)
- y (default)
- Verbose logging of assertion failures (ASSERT_VERBOSE)
- n (default)
- Allow compiling a firmware that does not run (COMPILE_TEST)
- n (default)
- Compile the firmware with debug info (DEBUG_INFO)
- y (default)
- Print additional debug-level log messages (DEBUG_LOG)
- n (default)
- Provide an interactive debug monitor while off/asleep (DEBUG_MONITOR)
- n (default)
- Print average latency after each state transition (DEBUG_PRINT_LATENCY)
- n (default)
- Print the contents of Special Purpose Registers at boot (DEBUG_PRINT_SPRS)
- n (default)
基本的にはどれもデフォルトのままなのですが、Allwinner H6を使うこと、PMICとしてAXP805を使う設定は必要です。その後aarch64-linux-musl-gcc: not foundで中断してしまいますが、build/scp/scp.binは得られているのでこれで十分です。
ATF(ARM Trusted Firmware)のビルドは、git clone https://github.com/ARM-software/arm-trusted-firmware.git; cd arm-trusted-firmware; make CROSS_COMPILE=aarch64-linux-gnu- PLAT=sun50i_h6 bl31で。build/sun50i_h6/release/bl31.binが得られていればok。
最後に、U-Bootのソースコードをダウンロードして展開し、cd u-boot-xxxx.xx; make CROSS_COMPILE=aarch64-linux-gnu- orangepi_one_plus_defconfig; make CROSS_COMPILE=aarch64-linux-gnu- BL31=/path/to/bl31.bin SCP=/path/to/scp.binでビルドします。
とりあえず、U-Boot起動前にPSCI: System suspend is unavailableと表示されていたのがPSCI: System suspend is available via SCPIに変わったため、crustを組み込めてはいるようなのですが…ArmbianだとAXP805 detected等の表示があり、crustの設定をもう少し煮詰める必要があるかもしれません。53.00kg(20:50)
08-Feb-2021補足:crustのDEBUG_LOGやDEBUG_PRINT_SPRSを有効にすると使用する領域が大きすぎて収まらないといった感じのエラーが出てしまうので、あまりオプションをいじる余地は無さそうです。また、Armbianの起動時に色々と情報が表示されるのは、ATFがreleaseではなくdebugビルドになっていたという理由でした。