Orange Pi PC(orangepi-pc)

迅龙 Orange Pi PC 是基于 Allwinner H3 SoC 的嵌入式计算机,U-Boot 和 Linux 主线均支持。该板配备 1.3GHz 四核 Cortex-A7、1GiB RAM、100Mbit 以太网、USB、SD/MMC、USB、HDMI 以及多种其他 I/O。

支持的设备

Orange Pi PC 机器支持以下设备:

  • SMP(四核 Cortex-A7)

  • 通用中断控制器配置

  • SRAM 映射

  • SDRAM 控制器

  • 实时时钟

  • 定时器设备(复用 Allwinner A10 实现)

  • UART

  • SD/MMC 存储控制器

  • EMAC 以太网

  • USB 2.0 接口

  • 时钟控制单元

  • 系统控制模块

  • 安全标识设备

  • TWI(I2C)

  • 看门狗定时器

限制

目前,Orange Pi PC 不 支持以下功能:

  • 通过 HDMI、GPU 和/或显示引擎输出图形

  • 音频输出

  • 硬件看门狗

完整的未实现 I/O 设备列表,还可参见 Allwinner H3 SoC 模块 ./hw/arm/allwinner-h3.c 中的 'unimplemented' 数组。

启动选项

Orange Pi PC 机器可使用标准 -kernel 功能加载 Linux 内核或 ELF 可执行文件并启动。此外,还可以模拟实际 Allwinner H3 SoC 中的 BootROM,从通过 qemu-system-arm 的 -sd 参数指定的 SD 卡加载引导加载程序。

机器专用选项

支持以下机器专用选项:

  • allwinner-rtc.base-year=YYYY

    Orange Pi PC 机器自动创建 Allwinner RTC 设备,采用默认基准年份,可通过 'base-year' 属性覆盖。基准年份是 RTC 年份值为零时代表的实际年份。如果目标操作系统驱动使用不同的基准年份,可使用此选项。基准年份最小值为 1900。

  • allwinner-sid.identifier=abcd1122-a000-b000-c000-12345678ffff

    客户机可以读取安全标识值。例如,U-Boot 使用它确定唯一 MAC 地址。

上述机器专用选项可以通过 qemu-system-arm 的 '-global' 参数指定,例如:

$ qemu-system-arm -M orangepi-pc -sd mycard.img \
     -global allwinner-rtc.base-year=2000

运行主线 Linux

已知从 4.19 到最新 master 的主线 Linux 内核可以运行。要构建可由 Orange Pi PC 机器启动的 Linux 主线内核,只需使用 sunxi_defconfig 配置:

$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make mrproper
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make sunxi_defconfig

要使用 USB 存储,需要手动启用对应配置项。启动 kconfig 配置工具:

$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make menuconfig

找到以下选项,启用并保存配置:

Device Drivers > USB support > USB Mass Storage support

构建 Linux 内核:

$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- make

在 QEMU 中使用 Orange Pi PC 机器启动新构建的 Linux 内核:

$ qemu-system-arm -M orangepi-pc -nic user -nographic \
    -kernel /path/to/linux/arch/arm/boot/zImage \
    -append 'console=ttyS0,115200' \
    -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb

Orange Pi PC 镜像

注意,主线内核不包含根文件系统。可以使用官网下载的官方 Orange Pi PC 镜像提供根文件系统:

另一种方式是运行适用于 Orange Pi PC 的 Armbian 镜像,可从以下地址下载:

也可以使用 Buildroot 的 orangepi_pc_defconfig 构建自己的镜像。更多信息请参见 https://buildroot.org。

将镜像用作 SD 卡时,必须将其大小调整为二的幂,可使用 qemu-img 命令。为避免数据丢失,建议只扩大镜像,而不要缩小到二的幂。例如,准备下载的 Armbian 镜像时,先解压,再将大小增至 1GB:

$ qemu-img resize Armbian_19.11.3_Orangepipc_bionic_current_5.3.9.img 1G

可以将选定镜像作为 SD 卡或 USB 大容量存储连接。例如,要从 SD 卡上的 Orange Pi PC Debian 镜像启动,只需添加 -sd 参数,并提供正确的 root= 内核参数:

$ qemu-system-arm -M orangepi-pc -nic user -nographic \
    -kernel /path/to/linux/arch/arm/boot/zImage \
    -append 'console=ttyS0,115200 root=/dev/mmcblk0p2' \
    -dtb /path/to/linux/arch/arm/boot/dts/sun8i-h3-orangepi-pc.dtb \
    -sd OrangePi_pc_debian_stretch_server_linux5.3.5_v1.0.img

要将镜像作为 USB 大容量存储设备连接到机器,只需追加以下命令参数:

-drive if=none,id=stick,file=myimage.img \
-device usb-storage,bus=usb-bus.0,drive=stick

除了通过 -kernel 提供自定义 Linux 内核,也可以让 Orange Pi PC 机器从 SD 卡加载引导加载程序,就像真实板通过 BootROM 所做的那样。只需通过 -sd 参数传入选定镜像,并移除 -kernel、-append、-dbt 和 -initrd 参数:

$ qemu-system-arm -M orangepi-pc -nic user -nographic \
     -sd Armbian_19.11.3_Orangepipc_buster_current_5.3.9.img

注意,官方 Orange Pi PC 镜像和 Armbian 镜像都会通过 systemd 启动大量用户空间程序。根据主机硬件和操作系统的不同,模拟可能较慢,尤其是同时模拟四个核心时。为减少模拟四核造成的性能下降,可以通过 U-Boot(或 -append)传入以下内核参数:

=> setenv extraargs 'systemd.default_timeout_start_sec=9000 loglevel=7 nosmp console=ttyS0,115200'

运行 U-Boot

可使用 orangepi_pc_defconfig 配置和构建主线 U-Boot,命令与上述 Linux 命令类似。注意,开发或测试时建议在 U-Boot 中选择以下配置:

Device Tree Control > Provider for DTB for DT Control > Embedded DTB

要使用 Orange Pi PC 机器启动 U-Boot,将 u-boot 二进制文件传给 -kernel 参数:

$ qemu-system-arm -M orangepi-pc -nic user -nographic \
    -kernel /path/to/uboot/u-boot -sd disk.img

使用以下 U-Boot 命令从 SD 卡加载并启动 Linux 内核:

=> setenv bootargs console=ttyS0,115200
=> ext2load mmc 0 0x42000000 zImage
=> ext2load mmc 0 0x43000000 sun8i-h3-orangepi-pc.dtb
=> bootz 0x42000000 - 0x43000000

运行 NetBSD

NetBSD 操作系统也支持基于 Allwinner H3 的板,包括 Orange Pi PC。已知 NetBSD 9.0 在 Orange Pi PC 上工作最好,提供具有串口控制台、网络和存储的完整可用系统。对于 Orange Pi PC 机器,从以下地址获取基于 'evbarm-earmv7hf' 的镜像:

需要手动将 U-Boot 安装到镜像中。按照上一节使用 orangepi_pc_defconfig 构建 U-Boot,然后解压 NetBSD 镜像,并写入包含 SPL 的 U-Boot 二进制文件:

$ gunzip armv7.img.gz
$ dd if=/path/to/u-boot-sunxi-with-spl.bin of=armv7.img bs=1024 seek=8 conv=notrunc

最后,启动机器前必须扩展 SD 镜像,使其大小为二的幂,并避免 NetBSD 内核判定 NetBSD 分区大于模拟 SD 卡:

$ qemu-img resize armv7.img 2G

使用以下命令启动机器:

$ qemu-system-arm -M orangepi-pc -nic user -nographic \
      -sd armv7.img -global allwinner-rtc.base-year=2000

在 U-Boot 阶段按键中断自动启动流程,并在启动前设置以下环境变量:

=> setenv bootargs root=ld0a
=> setenv kernel netbsd-GENERIC.ub
=> setenv fdtfile dtb/sun8i-h3-orangepi-pc.dtb
=> 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}'

可选择使用 'saveenv' 将环境变量保存到 SD 卡。输入 'boot' 命令即可继续启动 NetBSD。

Orange Pi PC 功能测试

Orange Pi PC 机器包含若干功能测试。要运行全部测试,从源码构建 QEMU,然后在构建目录执行:

$ QEMU_TEST_ALLOW_LARGE_STORAGE=1 \
  pyvenv/bin/meson test --suite thorough func-arm-arm_orangepi