18d7f954aSqianfan ZhaoBanana Pi BPI-M2U (``bpim2u``) 28d7f954aSqianfan Zhao^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 38d7f954aSqianfan Zhao 48d7f954aSqianfan ZhaoBanana Pi BPI-M2 Ultra is a quad-core mini single board computer built with 58d7f954aSqianfan ZhaoAllwinner A40i/R40/V40 SoC. It features 2GB of RAM and 8GB eMMC. It also 68d7f954aSqianfan Zhaohas onboard WiFi and BT. On the ports side, the BPI-M2 Ultra has 2 USB A 78d7f954aSqianfan Zhao2.0 ports, 1 USB OTG port, 1 HDMI port, 1 audio jack, a DC power port, 88d7f954aSqianfan Zhaoand last but not least, a SATA port. 98d7f954aSqianfan Zhao 108d7f954aSqianfan ZhaoSupported devices 118d7f954aSqianfan Zhao""""""""""""""""" 128d7f954aSqianfan Zhao 138d7f954aSqianfan ZhaoThe Banana Pi M2U machine supports the following devices: 148d7f954aSqianfan Zhao 158d7f954aSqianfan Zhao * SMP (Quad Core Cortex-A7) 168d7f954aSqianfan Zhao * Generic Interrupt Controller configuration 178d7f954aSqianfan Zhao * SRAM mappings 188d7f954aSqianfan Zhao * SDRAM controller 198d7f954aSqianfan Zhao * Timer device (re-used from Allwinner A10) 208d7f954aSqianfan Zhao * UART 218d7f954aSqianfan Zhao * SD/MMC storage controller 228d7f954aSqianfan Zhao * EMAC ethernet 238d7f954aSqianfan Zhao * GMAC ethernet 248d7f954aSqianfan Zhao * Clock Control Unit 258d7f954aSqianfan Zhao * TWI (I2C) 26*43eef24fSGuenter Roeck * USB 2.0 278d7f954aSqianfan Zhao 288d7f954aSqianfan ZhaoLimitations 298d7f954aSqianfan Zhao""""""""""" 308d7f954aSqianfan Zhao 318d7f954aSqianfan ZhaoCurrently, Banana Pi M2U does *not* support the following features: 328d7f954aSqianfan Zhao 338d7f954aSqianfan Zhao- Graphical output via HDMI, GPU and/or the Display Engine 348d7f954aSqianfan Zhao- Audio output 358d7f954aSqianfan Zhao- Hardware Watchdog 368d7f954aSqianfan Zhao- Real Time Clock 378d7f954aSqianfan Zhao 388d7f954aSqianfan ZhaoAlso see the 'unimplemented' array in the Allwinner R40 SoC module 398d7f954aSqianfan Zhaofor a complete list of unimplemented I/O devices: ``./hw/arm/allwinner-r40.c`` 408d7f954aSqianfan Zhao 418d7f954aSqianfan ZhaoBoot options 428d7f954aSqianfan Zhao"""""""""""" 438d7f954aSqianfan Zhao 448d7f954aSqianfan ZhaoThe Banana Pi M2U machine can start using the standard -kernel functionality 458d7f954aSqianfan Zhaofor loading a Linux kernel or ELF executable. Additionally, the Banana Pi M2U 468d7f954aSqianfan Zhaomachine can also emulate the BootROM which is present on an actual Allwinner R40 478d7f954aSqianfan Zhaobased SoC, which loads the bootloader from a SD card, specified via the -sd 488d7f954aSqianfan Zhaoargument to qemu-system-arm. 498d7f954aSqianfan Zhao 508d7f954aSqianfan ZhaoRunning mainline Linux 518d7f954aSqianfan Zhao"""""""""""""""""""""" 528d7f954aSqianfan Zhao 538d7f954aSqianfan ZhaoTo build a Linux mainline kernel that can be booted by the Banana Pi M2U machine, 548d7f954aSqianfan Zhaosimply configure the kernel using the sunxi_defconfig configuration: 558d7f954aSqianfan Zhao 568d7f954aSqianfan Zhao.. code-block:: bash 578d7f954aSqianfan Zhao 588d7f954aSqianfan Zhao $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper 598d7f954aSqianfan Zhao $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make sunxi_defconfig 608d7f954aSqianfan Zhao 618d7f954aSqianfan ZhaoTo boot the newly build linux kernel in QEMU with the Banana Pi M2U machine, use: 628d7f954aSqianfan Zhao 638d7f954aSqianfan Zhao.. code-block:: bash 648d7f954aSqianfan Zhao 658d7f954aSqianfan Zhao $ qemu-system-arm -M bpim2u -nographic \ 668d7f954aSqianfan Zhao -kernel /path/to/linux/arch/arm/boot/zImage \ 678d7f954aSqianfan Zhao -append 'console=ttyS0,115200' \ 688d7f954aSqianfan Zhao -dtb /path/to/linux/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dtb 698d7f954aSqianfan Zhao 708d7f954aSqianfan ZhaoBanana Pi M2U images 718d7f954aSqianfan Zhao"""""""""""""""""""" 728d7f954aSqianfan Zhao 738d7f954aSqianfan ZhaoNote that the mainline kernel does not have a root filesystem. You can choose 748d7f954aSqianfan Zhaoto build you own image with buildroot using the bananapi_m2_ultra_defconfig. 758d7f954aSqianfan ZhaoAlso see https://buildroot.org for more information. 768d7f954aSqianfan Zhao 778d7f954aSqianfan ZhaoAnother possibility is to run an OpenWrt image for Banana Pi M2U which 788d7f954aSqianfan Zhaocan be downloaded from: 798d7f954aSqianfan Zhao 808d7f954aSqianfan Zhao https://downloads.openwrt.org/releases/22.03.3/targets/sunxi/cortexa7/ 818d7f954aSqianfan Zhao 828d7f954aSqianfan ZhaoWhen using an image as an SD card, it must be resized to a power of two. This can be 838d7f954aSqianfan Zhaodone with the ``qemu-img`` command. It is recommended to only increase the image size 848d7f954aSqianfan Zhaoinstead of shrinking it to a power of two, to avoid loss of data. For example, 858d7f954aSqianfan Zhaoto prepare a downloaded Armbian image, first extract it and then increase 868d7f954aSqianfan Zhaoits size to one gigabyte as follows: 878d7f954aSqianfan Zhao 888d7f954aSqianfan Zhao.. code-block:: bash 898d7f954aSqianfan Zhao 908d7f954aSqianfan Zhao $ qemu-img resize \ 918d7f954aSqianfan Zhao openwrt-22.03.3-sunxi-cortexa7-sinovoip_bananapi-m2-ultra-ext4-sdcard.img \ 928d7f954aSqianfan Zhao 1G 938d7f954aSqianfan Zhao 948d7f954aSqianfan ZhaoInstead of providing a custom Linux kernel via the -kernel command you may also 958d7f954aSqianfan Zhaochoose to let the Banana Pi M2U machine load the bootloader from SD card, just like 968d7f954aSqianfan Zhaoa real board would do using the BootROM. Simply pass the selected image via the -sd 978d7f954aSqianfan Zhaoargument and remove the -kernel, -append, -dbt and -initrd arguments: 988d7f954aSqianfan Zhao 998d7f954aSqianfan Zhao.. code-block:: bash 1008d7f954aSqianfan Zhao 1018d7f954aSqianfan Zhao $ qemu-system-arm -M bpim2u -nic user -nographic \ 1028d7f954aSqianfan Zhao -sd openwrt-22.03.3-sunxi-cortexa7-sinovoip_bananapi-m2-ultra-ext4-sdcard.img 1038d7f954aSqianfan Zhao 1048d7f954aSqianfan ZhaoRunning U-Boot 1058d7f954aSqianfan Zhao"""""""""""""" 1068d7f954aSqianfan Zhao 1078d7f954aSqianfan ZhaoU-Boot mainline can be build and configured using the Bananapi_M2_Ultra_defconfig 1088d7f954aSqianfan Zhaousing similar commands as describe above for Linux. Note that it is recommended 1098d7f954aSqianfan Zhaofor development/testing to select the following configuration setting in U-Boot: 1108d7f954aSqianfan Zhao 1118d7f954aSqianfan Zhao Device Tree Control > Provider for DTB for DT Control > Embedded DTB 1128d7f954aSqianfan Zhao 1138d7f954aSqianfan ZhaoThe BootROM of allwinner R40 loading u-boot from the 8KiB offset of sdcard. 1148d7f954aSqianfan ZhaoLet's create an bootable disk image: 1158d7f954aSqianfan Zhao 1168d7f954aSqianfan Zhao.. code-block:: bash 1178d7f954aSqianfan Zhao 1188d7f954aSqianfan Zhao $ dd if=/dev/zero of=sd.img bs=32M count=1 1198d7f954aSqianfan Zhao $ dd if=u-boot-sunxi-with-spl.bin of=sd.img bs=1k seek=8 conv=notrunc 1208d7f954aSqianfan Zhao 1218d7f954aSqianfan ZhaoAnd then boot it. 1228d7f954aSqianfan Zhao 1238d7f954aSqianfan Zhao.. code-block:: bash 1248d7f954aSqianfan Zhao 1258d7f954aSqianfan Zhao $ qemu-system-arm -M bpim2u -nographic -sd sd.img 1268d7f954aSqianfan Zhao 1278d7f954aSqianfan ZhaoBanana Pi M2U integration tests 1288d7f954aSqianfan Zhao""""""""""""""""""""""""""""""" 1298d7f954aSqianfan Zhao 1308d7f954aSqianfan ZhaoThe Banana Pi M2U machine has several integration tests included. 1318d7f954aSqianfan ZhaoTo run the whole set of tests, build QEMU from source and simply 1328d7f954aSqianfan Zhaoprovide the following command: 1338d7f954aSqianfan Zhao 1348d7f954aSqianfan Zhao.. code-block:: bash 1358d7f954aSqianfan Zhao 1368d7f954aSqianfan Zhao $ cd qemu-build-dir 1378d7f954aSqianfan Zhao $ AVOCADO_ALLOW_LARGE_STORAGE=yes tests/venv/bin/avocado \ 1388d7f954aSqianfan Zhao --verbose --show=app,console run -t machine:bpim2u \ 1398d7f954aSqianfan Zhao ../tests/avocado/boot_linux_console.py 140