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