1Banana Pi BPI-M2U (``bpim2u``) 2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 3 4Banana Pi BPI-M2 Ultra is a quad-core mini single board computer built with 5Allwinner A40i/R40/V40 SoC. It features 2GB of RAM and 8GB eMMC. It also 6has onboard WiFi and BT. On the ports side, the BPI-M2 Ultra has 2 USB A 72.0 ports, 1 USB OTG port, 1 HDMI port, 1 audio jack, a DC power port, 8and last but not least, a SATA port. 9 10Supported devices 11""""""""""""""""" 12 13The Banana Pi M2U machine supports the following devices: 14 15 * SMP (Quad Core Cortex-A7) 16 * Generic Interrupt Controller configuration 17 * SRAM mappings 18 * SDRAM controller 19 * Timer device (re-used from Allwinner A10) 20 * UART 21 * SD/MMC storage controller 22 * EMAC ethernet 23 * GMAC ethernet 24 * Clock Control Unit 25 * TWI (I2C) 26 27Limitations 28""""""""""" 29 30Currently, Banana Pi M2U does *not* support the following features: 31 32- Graphical output via HDMI, GPU and/or the Display Engine 33- Audio output 34- Hardware Watchdog 35- Real Time Clock 36- USB 2.0 interfaces 37 38Also see the 'unimplemented' array in the Allwinner R40 SoC module 39for a complete list of unimplemented I/O devices: ``./hw/arm/allwinner-r40.c`` 40 41Boot options 42"""""""""""" 43 44The Banana Pi M2U machine can start using the standard -kernel functionality 45for loading a Linux kernel or ELF executable. Additionally, the Banana Pi M2U 46machine can also emulate the BootROM which is present on an actual Allwinner R40 47based SoC, which loads the bootloader from a SD card, specified via the -sd 48argument to qemu-system-arm. 49 50Running mainline Linux 51"""""""""""""""""""""" 52 53To build a Linux mainline kernel that can be booted by the Banana Pi M2U machine, 54simply configure the kernel using the sunxi_defconfig configuration: 55 56.. code-block:: bash 57 58 $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper 59 $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make sunxi_defconfig 60 61To boot the newly build linux kernel in QEMU with the Banana Pi M2U machine, use: 62 63.. code-block:: bash 64 65 $ qemu-system-arm -M bpim2u -nographic \ 66 -kernel /path/to/linux/arch/arm/boot/zImage \ 67 -append 'console=ttyS0,115200' \ 68 -dtb /path/to/linux/arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dtb 69 70Banana Pi M2U images 71"""""""""""""""""""" 72 73Note that the mainline kernel does not have a root filesystem. You can choose 74to build you own image with buildroot using the bananapi_m2_ultra_defconfig. 75Also see https://buildroot.org for more information. 76 77Another possibility is to run an OpenWrt image for Banana Pi M2U which 78can be downloaded from: 79 80 https://downloads.openwrt.org/releases/22.03.3/targets/sunxi/cortexa7/ 81 82When using an image as an SD card, it must be resized to a power of two. This can be 83done with the ``qemu-img`` command. It is recommended to only increase the image size 84instead of shrinking it to a power of two, to avoid loss of data. For example, 85to prepare a downloaded Armbian image, first extract it and then increase 86its size to one gigabyte as follows: 87 88.. code-block:: bash 89 90 $ qemu-img resize \ 91 openwrt-22.03.3-sunxi-cortexa7-sinovoip_bananapi-m2-ultra-ext4-sdcard.img \ 92 1G 93 94Instead of providing a custom Linux kernel via the -kernel command you may also 95choose to let the Banana Pi M2U machine load the bootloader from SD card, just like 96a real board would do using the BootROM. Simply pass the selected image via the -sd 97argument and remove the -kernel, -append, -dbt and -initrd arguments: 98 99.. code-block:: bash 100 101 $ qemu-system-arm -M bpim2u -nic user -nographic \ 102 -sd openwrt-22.03.3-sunxi-cortexa7-sinovoip_bananapi-m2-ultra-ext4-sdcard.img 103 104Running U-Boot 105"""""""""""""" 106 107U-Boot mainline can be build and configured using the Bananapi_M2_Ultra_defconfig 108using similar commands as describe above for Linux. Note that it is recommended 109for development/testing to select the following configuration setting in U-Boot: 110 111 Device Tree Control > Provider for DTB for DT Control > Embedded DTB 112 113The BootROM of allwinner R40 loading u-boot from the 8KiB offset of sdcard. 114Let's create an bootable disk image: 115 116.. code-block:: bash 117 118 $ dd if=/dev/zero of=sd.img bs=32M count=1 119 $ dd if=u-boot-sunxi-with-spl.bin of=sd.img bs=1k seek=8 conv=notrunc 120 121And then boot it. 122 123.. code-block:: bash 124 125 $ qemu-system-arm -M bpim2u -nographic -sd sd.img 126 127Banana Pi M2U integration tests 128""""""""""""""""""""""""""""""" 129 130The Banana Pi M2U machine has several integration tests included. 131To run the whole set of tests, build QEMU from source and simply 132provide the following command: 133 134.. code-block:: bash 135 136 $ cd qemu-build-dir 137 $ AVOCADO_ALLOW_LARGE_STORAGE=yes tests/venv/bin/avocado \ 138 --verbose --show=app,console run -t machine:bpim2u \ 139 ../tests/avocado/boot_linux_console.py 140