xref: /qemu/docs/system/arm/orangepi.rst (revision c663fc9f)
10553ef42SNiek LinnenbankOrange Pi PC (``orangepi-pc``)
20553ef42SNiek Linnenbank^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
30553ef42SNiek Linnenbank
40553ef42SNiek LinnenbankThe Xunlong Orange Pi PC is an Allwinner H3 System on Chip
50553ef42SNiek Linnenbankbased embedded computer with mainline support in both U-Boot
60553ef42SNiek Linnenbankand Linux. The board comes with a Quad Core Cortex-A7 @ 1.3GHz,
70553ef42SNiek Linnenbank1GiB RAM, 100Mbit ethernet, USB, SD/MMC, USB, HDMI and
80553ef42SNiek Linnenbankvarious other I/O.
90553ef42SNiek Linnenbank
100553ef42SNiek LinnenbankSupported devices
110553ef42SNiek Linnenbank"""""""""""""""""
120553ef42SNiek Linnenbank
130553ef42SNiek LinnenbankThe Orange Pi PC machine supports the following devices:
140553ef42SNiek Linnenbank
150553ef42SNiek Linnenbank * SMP (Quad Core Cortex-A7)
160553ef42SNiek Linnenbank * Generic Interrupt Controller configuration
170553ef42SNiek Linnenbank * SRAM mappings
180553ef42SNiek Linnenbank * SDRAM controller
190553ef42SNiek Linnenbank * Real Time Clock
200553ef42SNiek Linnenbank * Timer device (re-used from Allwinner A10)
210553ef42SNiek Linnenbank * UART
220553ef42SNiek Linnenbank * SD/MMC storage controller
230553ef42SNiek Linnenbank * EMAC ethernet
240553ef42SNiek Linnenbank * USB 2.0 interfaces
250553ef42SNiek Linnenbank * Clock Control Unit
260553ef42SNiek Linnenbank * System Control module
270553ef42SNiek Linnenbank * Security Identifier device
289be8a82cSStrahinja Jankovic * TWI (I2C)
29c663fc9fSStrahinja Jankovic * Watchdog timer
300553ef42SNiek Linnenbank
310553ef42SNiek LinnenbankLimitations
320553ef42SNiek Linnenbank"""""""""""
330553ef42SNiek Linnenbank
340553ef42SNiek LinnenbankCurrently, Orange Pi PC does *not* support the following features:
350553ef42SNiek Linnenbank
360553ef42SNiek Linnenbank- Graphical output via HDMI, GPU and/or the Display Engine
370553ef42SNiek Linnenbank- Audio output
380553ef42SNiek Linnenbank- Hardware Watchdog
390553ef42SNiek Linnenbank
400553ef42SNiek LinnenbankAlso see the 'unimplemented' array in the Allwinner H3 SoC module
410553ef42SNiek Linnenbankfor a complete list of unimplemented I/O devices: ``./hw/arm/allwinner-h3.c``
420553ef42SNiek Linnenbank
430553ef42SNiek LinnenbankBoot options
440553ef42SNiek Linnenbank""""""""""""
450553ef42SNiek Linnenbank
460553ef42SNiek LinnenbankThe Orange Pi PC machine can start using the standard -kernel functionality
470553ef42SNiek Linnenbankfor loading a Linux kernel or ELF executable. Additionally, the Orange Pi PC
480553ef42SNiek Linnenbankmachine can also emulate the BootROM which is present on an actual Allwinner H3
490553ef42SNiek Linnenbankbased SoC, which loads the bootloader from a SD card, specified via the -sd argument
500553ef42SNiek Linnenbankto qemu-system-arm.
510553ef42SNiek Linnenbank
520553ef42SNiek LinnenbankMachine-specific options
530553ef42SNiek Linnenbank""""""""""""""""""""""""
540553ef42SNiek Linnenbank
550553ef42SNiek LinnenbankThe following machine-specific options are supported:
560553ef42SNiek Linnenbank
570553ef42SNiek Linnenbank- allwinner-rtc.base-year=YYYY
580553ef42SNiek Linnenbank
590553ef42SNiek Linnenbank  The Allwinner RTC device is automatically created by the Orange Pi PC machine
600553ef42SNiek Linnenbank  and uses a default base year value which can be overridden using the 'base-year' property.
610553ef42SNiek Linnenbank  The base year is the actual represented year when the RTC year value is zero.
620553ef42SNiek Linnenbank  This option can be used in case the target operating system driver uses a different
630553ef42SNiek Linnenbank  base year value. The minimum value for the base year is 1900.
640553ef42SNiek Linnenbank
650553ef42SNiek Linnenbank- allwinner-sid.identifier=abcd1122-a000-b000-c000-12345678ffff
660553ef42SNiek Linnenbank
670553ef42SNiek Linnenbank  The Security Identifier value can be read by the guest.
680553ef42SNiek Linnenbank  For example, U-Boot uses it to determine a unique MAC address.
690553ef42SNiek Linnenbank
700553ef42SNiek LinnenbankThe above machine-specific options can be specified in qemu-system-arm
710553ef42SNiek Linnenbankvia the '-global' argument, for example:
720553ef42SNiek Linnenbank
730553ef42SNiek Linnenbank.. code-block:: bash
740553ef42SNiek Linnenbank
750553ef42SNiek Linnenbank  $ qemu-system-arm -M orangepi-pc -sd mycard.img \
760553ef42SNiek Linnenbank       -global allwinner-rtc.base-year=2000
770553ef42SNiek Linnenbank
780553ef42SNiek LinnenbankRunning mainline Linux
790553ef42SNiek Linnenbank""""""""""""""""""""""
800553ef42SNiek Linnenbank
810553ef42SNiek LinnenbankMainline Linux kernels from 4.19 up to latest master are known to work.
820553ef42SNiek LinnenbankTo build a Linux mainline kernel that can be booted by the Orange Pi PC machine,
830553ef42SNiek Linnenbanksimply configure the kernel using the sunxi_defconfig configuration:
840553ef42SNiek Linnenbank
850553ef42SNiek Linnenbank.. code-block:: bash
860553ef42SNiek Linnenbank
870553ef42SNiek Linnenbank  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper
880553ef42SNiek Linnenbank  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make sunxi_defconfig
890553ef42SNiek Linnenbank
900553ef42SNiek LinnenbankTo be able to use USB storage, you need to manually enable the corresponding
910553ef42SNiek Linnenbankconfiguration item. Start the kconfig configuration tool:
920553ef42SNiek Linnenbank
930553ef42SNiek Linnenbank.. code-block:: bash
940553ef42SNiek Linnenbank
950553ef42SNiek Linnenbank  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make menuconfig
960553ef42SNiek Linnenbank
970553ef42SNiek LinnenbankNavigate to the following item, enable it and save your configuration:
980553ef42SNiek Linnenbank
990553ef42SNiek Linnenbank  Device Drivers > USB support > USB Mass Storage support
1000553ef42SNiek Linnenbank
1010553ef42SNiek LinnenbankBuild the Linux kernel with:
1020553ef42SNiek Linnenbank
1030553ef42SNiek Linnenbank.. code-block:: bash
1040553ef42SNiek Linnenbank
1050553ef42SNiek Linnenbank  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make
1060553ef42SNiek Linnenbank
1070553ef42SNiek LinnenbankTo boot the newly build linux kernel in QEMU with the Orange Pi PC machine, use:
1080553ef42SNiek Linnenbank
1090553ef42SNiek Linnenbank.. code-block:: bash
1100553ef42SNiek Linnenbank
1110553ef42SNiek Linnenbank  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
1120553ef42SNiek Linnenbank      -kernel /path/to/linux/arch/arm/boot/zImage \
1130553ef42SNiek Linnenbank      -append 'console=ttyS0,115200' \
1140553ef42SNiek Linnenbank      -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb
1150553ef42SNiek Linnenbank
1160553ef42SNiek LinnenbankOrange Pi PC images
1170553ef42SNiek Linnenbank"""""""""""""""""""
1180553ef42SNiek Linnenbank
1190553ef42SNiek LinnenbankNote that the mainline kernel does not have a root filesystem. You may provide it
1200553ef42SNiek Linnenbankwith an official Orange Pi PC image from the official website:
1210553ef42SNiek Linnenbank
1220553ef42SNiek Linnenbank  http://www.orangepi.org/downloadresources/
1230553ef42SNiek Linnenbank
1240553ef42SNiek LinnenbankAnother possibility is to run an Armbian image for Orange Pi PC which
1250553ef42SNiek Linnenbankcan be downloaded from:
1260553ef42SNiek Linnenbank
1270553ef42SNiek Linnenbank   https://www.armbian.com/orange-pi-pc/
1280553ef42SNiek Linnenbank
1290553ef42SNiek LinnenbankAlternatively, you can also choose to build you own image with buildroot
1300553ef42SNiek Linnenbankusing the orangepi_pc_defconfig. Also see https://buildroot.org for more information.
1310553ef42SNiek Linnenbank
1321c2329b5SNiek LinnenbankWhen using an image as an SD card, it must be resized to a power of two. This can be
133c5ba6219SPhilippe Mathieu-Daudédone with the ``qemu-img`` command. It is recommended to only increase the image size
1341c2329b5SNiek Linnenbankinstead of shrinking it to a power of two, to avoid loss of data. For example,
1351c2329b5SNiek Linnenbankto prepare a downloaded Armbian image, first extract it and then increase
1361c2329b5SNiek Linnenbankits size to one gigabyte as follows:
1371c2329b5SNiek Linnenbank
1381c2329b5SNiek Linnenbank.. code-block:: bash
1391c2329b5SNiek Linnenbank
1401c2329b5SNiek Linnenbank  $ qemu-img resize Armbian_19.11.3_Orangepipc_bionic_current_5.3.9.img 1G
1411c2329b5SNiek Linnenbank
1420553ef42SNiek LinnenbankYou can choose to attach the selected image either as an SD card or as USB mass storage.
1430553ef42SNiek LinnenbankFor example, to boot using the Orange Pi PC Debian image on SD card, simply add the -sd
1440553ef42SNiek Linnenbankargument and provide the proper root= kernel parameter:
1450553ef42SNiek Linnenbank
1460553ef42SNiek Linnenbank.. code-block:: bash
1470553ef42SNiek Linnenbank
1480553ef42SNiek Linnenbank  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
1490553ef42SNiek Linnenbank      -kernel /path/to/linux/arch/arm/boot/zImage \
1500553ef42SNiek Linnenbank      -append 'console=ttyS0,115200 root=/dev/mmcblk0p2' \
1510553ef42SNiek Linnenbank      -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb \
1520553ef42SNiek Linnenbank      -sd OrangePi_pc_debian_stretch_server_linux5.3.5_v1.0.img
1530553ef42SNiek Linnenbank
1540553ef42SNiek LinnenbankTo attach the image as an USB mass storage device to the machine,
1550553ef42SNiek Linnenbanksimply append to the command:
1560553ef42SNiek Linnenbank
1570553ef42SNiek Linnenbank.. code-block:: bash
1580553ef42SNiek Linnenbank
1590553ef42SNiek Linnenbank  -drive if=none,id=stick,file=myimage.img \
1600553ef42SNiek Linnenbank  -device usb-storage,bus=usb-bus.0,drive=stick
1610553ef42SNiek Linnenbank
1620553ef42SNiek LinnenbankInstead of providing a custom Linux kernel via the -kernel command you may also
1630553ef42SNiek Linnenbankchoose to let the Orange Pi PC machine load the bootloader from SD card, just like
1640553ef42SNiek Linnenbanka real board would do using the BootROM. Simply pass the selected image via the -sd
1650553ef42SNiek Linnenbankargument and remove the -kernel, -append, -dbt and -initrd arguments:
1660553ef42SNiek Linnenbank
1670553ef42SNiek Linnenbank.. code-block:: bash
1680553ef42SNiek Linnenbank
1690553ef42SNiek Linnenbank  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
1700553ef42SNiek Linnenbank       -sd Armbian_19.11.3_Orangepipc_buster_current_5.3.9.img
1710553ef42SNiek Linnenbank
1720553ef42SNiek LinnenbankNote that both the official Orange Pi PC images and Armbian images start
1730553ef42SNiek Linnenbanka lot of userland programs via systemd. Depending on the host hardware and OS,
1740553ef42SNiek Linnenbankthey may be slow to emulate, especially due to emulating the 4 cores.
1750553ef42SNiek LinnenbankTo help reduce the performance slow down due to emulating the 4 cores, you can
1760553ef42SNiek Linnenbankgive the following kernel parameters via U-Boot (or via -append):
1770553ef42SNiek Linnenbank
1780553ef42SNiek Linnenbank.. code-block:: bash
1790553ef42SNiek Linnenbank
1800553ef42SNiek Linnenbank  => setenv extraargs 'systemd.default_timeout_start_sec=9000 loglevel=7 nosmp console=ttyS0,115200'
1810553ef42SNiek Linnenbank
1820553ef42SNiek LinnenbankRunning U-Boot
1830553ef42SNiek Linnenbank""""""""""""""
1840553ef42SNiek Linnenbank
1850553ef42SNiek LinnenbankU-Boot mainline can be build and configured using the orangepi_pc_defconfig
1860553ef42SNiek Linnenbankusing similar commands as describe above for Linux. Note that it is recommended
1870553ef42SNiek Linnenbankfor development/testing to select the following configuration setting in U-Boot:
1880553ef42SNiek Linnenbank
1890553ef42SNiek Linnenbank  Device Tree Control > Provider for DTB for DT Control > Embedded DTB
1900553ef42SNiek Linnenbank
1910553ef42SNiek LinnenbankTo start U-Boot using the Orange Pi PC machine, provide the
1920553ef42SNiek Linnenbanku-boot binary to the -kernel argument:
1930553ef42SNiek Linnenbank
1940553ef42SNiek Linnenbank.. code-block:: bash
1950553ef42SNiek Linnenbank
1960553ef42SNiek Linnenbank  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
1970553ef42SNiek Linnenbank      -kernel /path/to/uboot/u-boot -sd disk.img
1980553ef42SNiek Linnenbank
1990553ef42SNiek LinnenbankUse the following U-boot commands to load and boot a Linux kernel from SD card:
2000553ef42SNiek Linnenbank
2010553ef42SNiek Linnenbank.. code-block:: bash
2020553ef42SNiek Linnenbank
2030553ef42SNiek Linnenbank  => setenv bootargs console=ttyS0,115200
2040553ef42SNiek Linnenbank  => ext2load mmc 0 0x42000000 zImage
2050553ef42SNiek Linnenbank  => ext2load mmc 0 0x43000000 sun8i-h3-orangepi-pc.dtb
2060553ef42SNiek Linnenbank  => bootz 0x42000000 - 0x43000000
2070553ef42SNiek Linnenbank
2080553ef42SNiek LinnenbankRunning NetBSD
2090553ef42SNiek Linnenbank""""""""""""""
2100553ef42SNiek Linnenbank
2110553ef42SNiek LinnenbankThe NetBSD operating system also includes support for Allwinner H3 based boards,
2120553ef42SNiek Linnenbankincluding the Orange Pi PC. NetBSD 9.0 is known to work best for the Orange Pi PC
2130553ef42SNiek Linnenbankboard and provides a fully working system with serial console, networking and storage.
2140553ef42SNiek LinnenbankFor the Orange Pi PC machine, get the 'evbarm-earmv7hf' based image from:
2150553ef42SNiek Linnenbank
2160553ef42SNiek Linnenbank  https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/evbarm-earmv7hf/binary/gzimg/armv7.img.gz
2170553ef42SNiek Linnenbank
2180553ef42SNiek LinnenbankThe image requires manually installing U-Boot in the image. Build U-Boot with
2190553ef42SNiek Linnenbankthe orangepi_pc_defconfig configuration as described in the previous section.
2200553ef42SNiek LinnenbankNext, unzip the NetBSD image and write the U-Boot binary including SPL using:
2210553ef42SNiek Linnenbank
2220553ef42SNiek Linnenbank.. code-block:: bash
2230553ef42SNiek Linnenbank
2240553ef42SNiek Linnenbank  $ gunzip armv7.img.gz
2250553ef42SNiek Linnenbank  $ dd if=/path/to/u-boot-sunxi-with-spl.bin of=armv7.img bs=1024 seek=8 conv=notrunc
2260553ef42SNiek Linnenbank
2270553ef42SNiek LinnenbankFinally, before starting the machine the SD image must be extended such
2281c2329b5SNiek Linnenbankthat the size of the SD image is a power of two and that the NetBSD kernel
2291c2329b5SNiek Linnenbankwill not conclude the NetBSD partition is larger than the emulated SD card:
2300553ef42SNiek Linnenbank
2310553ef42SNiek Linnenbank.. code-block:: bash
2320553ef42SNiek Linnenbank
2331c2329b5SNiek Linnenbank  $ qemu-img resize armv7.img 2G
2340553ef42SNiek Linnenbank
2350553ef42SNiek LinnenbankStart the machine using the following command:
2360553ef42SNiek Linnenbank
2370553ef42SNiek Linnenbank.. code-block:: bash
2380553ef42SNiek Linnenbank
2390553ef42SNiek Linnenbank  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
2400553ef42SNiek Linnenbank        -sd armv7.img -global allwinner-rtc.base-year=2000
2410553ef42SNiek Linnenbank
2420553ef42SNiek LinnenbankAt the U-Boot stage, interrupt the automatic boot process by pressing a key
2430553ef42SNiek Linnenbankand set the following environment variables before booting:
2440553ef42SNiek Linnenbank
2450553ef42SNiek Linnenbank.. code-block:: bash
2460553ef42SNiek Linnenbank
2470553ef42SNiek Linnenbank  => setenv bootargs root=ld0a
2480553ef42SNiek Linnenbank  => setenv kernel netbsd-GENERIC.ub
2490553ef42SNiek Linnenbank  => setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb
2500553ef42SNiek Linnenbank  => setenv bootcmd 'fatload mmc 0:1 ${kernel_addr_r} ${kernel}; fatload mmc 0:1 ${fdt_addr_r} ${fdtfile}; fdt addr ${fdt_addr_r}; bootm ${kernel_addr_r} - ${fdt_addr_r}'
2510553ef42SNiek Linnenbank
2520553ef42SNiek LinnenbankOptionally you may save the environment variables to SD card with 'saveenv'.
2530553ef42SNiek LinnenbankTo continue booting simply give the 'boot' command and NetBSD boots.
2540553ef42SNiek Linnenbank
255bbbd9b6eSWillian RampazzoOrange Pi PC integration tests
256bbbd9b6eSWillian Rampazzo""""""""""""""""""""""""""""""
2570553ef42SNiek Linnenbank
258bbbd9b6eSWillian RampazzoThe Orange Pi PC machine has several integration tests included.
2590553ef42SNiek LinnenbankTo run the whole set of tests, build QEMU from source and simply
2600553ef42SNiek Linnenbankprovide the following command:
2610553ef42SNiek Linnenbank
2620553ef42SNiek Linnenbank.. code-block:: bash
2630553ef42SNiek Linnenbank
2640553ef42SNiek Linnenbank  $ AVOCADO_ALLOW_LARGE_STORAGE=yes avocado --show=app,console run \
265bbbd9b6eSWillian Rampazzo     -t machine:orangepi-pc tests/avocado/boot_linux_console.py
266