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) 29*c663fc9fSStrahinja 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