xref: /openbmc/qemu/docs/system/arm/orangepi.rst (revision ed5abf46)
1Orange Pi PC (``orangepi-pc``)
2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3
4The Xunlong Orange Pi PC is an Allwinner H3 System on Chip
5based embedded computer with mainline support in both U-Boot
6and Linux. The board comes with a Quad Core Cortex-A7 @ 1.3GHz,
71GiB RAM, 100Mbit ethernet, USB, SD/MMC, USB, HDMI and
8various other I/O.
9
10Supported devices
11"""""""""""""""""
12
13The Orange Pi PC machine supports the following devices:
14
15 * SMP (Quad Core Cortex-A7)
16 * Generic Interrupt Controller configuration
17 * SRAM mappings
18 * SDRAM controller
19 * Real Time Clock
20 * Timer device (re-used from Allwinner A10)
21 * UART
22 * SD/MMC storage controller
23 * EMAC ethernet
24 * USB 2.0 interfaces
25 * Clock Control Unit
26 * System Control module
27 * Security Identifier device
28
29Limitations
30"""""""""""
31
32Currently, Orange Pi PC does *not* support the following features:
33
34- Graphical output via HDMI, GPU and/or the Display Engine
35- Audio output
36- Hardware Watchdog
37
38Also see the 'unimplemented' array in the Allwinner H3 SoC module
39for a complete list of unimplemented I/O devices: ``./hw/arm/allwinner-h3.c``
40
41Boot options
42""""""""""""
43
44The Orange Pi PC machine can start using the standard -kernel functionality
45for loading a Linux kernel or ELF executable. Additionally, the Orange Pi PC
46machine can also emulate the BootROM which is present on an actual Allwinner H3
47based SoC, which loads the bootloader from a SD card, specified via the -sd argument
48to qemu-system-arm.
49
50Machine-specific options
51""""""""""""""""""""""""
52
53The following machine-specific options are supported:
54
55- allwinner-rtc.base-year=YYYY
56
57  The Allwinner RTC device is automatically created by the Orange Pi PC machine
58  and uses a default base year value which can be overridden using the 'base-year' property.
59  The base year is the actual represented year when the RTC year value is zero.
60  This option can be used in case the target operating system driver uses a different
61  base year value. The minimum value for the base year is 1900.
62
63- allwinner-sid.identifier=abcd1122-a000-b000-c000-12345678ffff
64
65  The Security Identifier value can be read by the guest.
66  For example, U-Boot uses it to determine a unique MAC address.
67
68The above machine-specific options can be specified in qemu-system-arm
69via the '-global' argument, for example:
70
71.. code-block:: bash
72
73  $ qemu-system-arm -M orangepi-pc -sd mycard.img \
74       -global allwinner-rtc.base-year=2000
75
76Running mainline Linux
77""""""""""""""""""""""
78
79Mainline Linux kernels from 4.19 up to latest master are known to work.
80To build a Linux mainline kernel that can be booted by the Orange Pi PC machine,
81simply configure the kernel using the sunxi_defconfig configuration:
82
83.. code-block:: bash
84
85  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper
86  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make sunxi_defconfig
87
88To be able to use USB storage, you need to manually enable the corresponding
89configuration item. Start the kconfig configuration tool:
90
91.. code-block:: bash
92
93  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make menuconfig
94
95Navigate to the following item, enable it and save your configuration:
96
97  Device Drivers > USB support > USB Mass Storage support
98
99Build the Linux kernel with:
100
101.. code-block:: bash
102
103  $ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make
104
105To boot the newly build linux kernel in QEMU with the Orange Pi PC machine, use:
106
107.. code-block:: bash
108
109  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
110      -kernel /path/to/linux/arch/arm/boot/zImage \
111      -append 'console=ttyS0,115200' \
112      -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb
113
114Orange Pi PC images
115"""""""""""""""""""
116
117Note that the mainline kernel does not have a root filesystem. You may provide it
118with an official Orange Pi PC image from the official website:
119
120  http://www.orangepi.org/downloadresources/
121
122Another possibility is to run an Armbian image for Orange Pi PC which
123can be downloaded from:
124
125   https://www.armbian.com/orange-pi-pc/
126
127Alternatively, you can also choose to build you own image with buildroot
128using the orangepi_pc_defconfig. Also see https://buildroot.org for more information.
129
130You can choose to attach the selected image either as an SD card or as USB mass storage.
131For example, to boot using the Orange Pi PC Debian image on SD card, simply add the -sd
132argument and provide the proper root= kernel parameter:
133
134.. code-block:: bash
135
136  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
137      -kernel /path/to/linux/arch/arm/boot/zImage \
138      -append 'console=ttyS0,115200 root=/dev/mmcblk0p2' \
139      -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb \
140      -sd OrangePi_pc_debian_stretch_server_linux5.3.5_v1.0.img
141
142To attach the image as an USB mass storage device to the machine,
143simply append to the command:
144
145.. code-block:: bash
146
147  -drive if=none,id=stick,file=myimage.img \
148  -device usb-storage,bus=usb-bus.0,drive=stick
149
150Instead of providing a custom Linux kernel via the -kernel command you may also
151choose to let the Orange Pi PC machine load the bootloader from SD card, just like
152a real board would do using the BootROM. Simply pass the selected image via the -sd
153argument and remove the -kernel, -append, -dbt and -initrd arguments:
154
155.. code-block:: bash
156
157  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
158       -sd Armbian_19.11.3_Orangepipc_buster_current_5.3.9.img
159
160Note that both the official Orange Pi PC images and Armbian images start
161a lot of userland programs via systemd. Depending on the host hardware and OS,
162they may be slow to emulate, especially due to emulating the 4 cores.
163To help reduce the performance slow down due to emulating the 4 cores, you can
164give the following kernel parameters via U-Boot (or via -append):
165
166.. code-block:: bash
167
168  => setenv extraargs 'systemd.default_timeout_start_sec=9000 loglevel=7 nosmp console=ttyS0,115200'
169
170Running U-Boot
171""""""""""""""
172
173U-Boot mainline can be build and configured using the orangepi_pc_defconfig
174using similar commands as describe above for Linux. Note that it is recommended
175for development/testing to select the following configuration setting in U-Boot:
176
177  Device Tree Control > Provider for DTB for DT Control > Embedded DTB
178
179To start U-Boot using the Orange Pi PC machine, provide the
180u-boot binary to the -kernel argument:
181
182.. code-block:: bash
183
184  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
185      -kernel /path/to/uboot/u-boot -sd disk.img
186
187Use the following U-boot commands to load and boot a Linux kernel from SD card:
188
189.. code-block:: bash
190
191  => setenv bootargs console=ttyS0,115200
192  => ext2load mmc 0 0x42000000 zImage
193  => ext2load mmc 0 0x43000000 sun8i-h3-orangepi-pc.dtb
194  => bootz 0x42000000 - 0x43000000
195
196Running NetBSD
197""""""""""""""
198
199The NetBSD operating system also includes support for Allwinner H3 based boards,
200including the Orange Pi PC. NetBSD 9.0 is known to work best for the Orange Pi PC
201board and provides a fully working system with serial console, networking and storage.
202For the Orange Pi PC machine, get the 'evbarm-earmv7hf' based image from:
203
204  https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/evbarm-earmv7hf/binary/gzimg/armv7.img.gz
205
206The image requires manually installing U-Boot in the image. Build U-Boot with
207the orangepi_pc_defconfig configuration as described in the previous section.
208Next, unzip the NetBSD image and write the U-Boot binary including SPL using:
209
210.. code-block:: bash
211
212  $ gunzip armv7.img.gz
213  $ dd if=/path/to/u-boot-sunxi-with-spl.bin of=armv7.img bs=1024 seek=8 conv=notrunc
214
215Finally, before starting the machine the SD image must be extended such
216that the NetBSD kernel will not conclude the NetBSD partition is larger than
217the emulated SD card:
218
219.. code-block:: bash
220
221  $ dd if=/dev/zero bs=1M count=64 >> armv7.img
222
223Start the machine using the following command:
224
225.. code-block:: bash
226
227  $ qemu-system-arm -M orangepi-pc -nic user -nographic \
228        -sd armv7.img -global allwinner-rtc.base-year=2000
229
230At the U-Boot stage, interrupt the automatic boot process by pressing a key
231and set the following environment variables before booting:
232
233.. code-block:: bash
234
235  => setenv bootargs root=ld0a
236  => setenv kernel netbsd-GENERIC.ub
237  => setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb
238  => 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}'
239
240Optionally you may save the environment variables to SD card with 'saveenv'.
241To continue booting simply give the 'boot' command and NetBSD boots.
242
243Orange Pi PC acceptance tests
244"""""""""""""""""""""""""""""
245
246The Orange Pi PC machine has several acceptance tests included.
247To run the whole set of tests, build QEMU from source and simply
248provide the following command:
249
250.. code-block:: bash
251
252  $ AVOCADO_ALLOW_LARGE_STORAGE=yes avocado --show=app,console run \
253     -t machine:orangepi-pc tests/acceptance/boot_linux_console.py
254