Initial Support for Orange pi 5 pro board (#8348)

* Add initial support for Orangepi 5 Pro

Tested and Working:
Wireless & Bluetooth
USB 2.0 + USB 3.1
HDMI 2.1
Gigabit Ethernet (PCIe to RJ45 - Need drivers YT6801)
NVMe PCIe 2.0
MicroSD
Audio Controller es8388 - Audio Out
FAN PWM
LEDs PWM

Not Working:
Onboard Microphone
HDMI 2.0 (DP-HDMI - rockchip,rk3588-dp No Driver)

Not Tested:
Camera 1,2
eMMC

* OPi 5 Pro: Ethernet Driver Installation on First Boot

Implemented a simple script to install the driver
during first boot using the installation headers
included in the image. Takes just a few seconds
on first boot.

Disclaimer: Attempted installation in a chroot env but failed.

* fix: Make first-boot Ethernet driver install more robust

The `eth-driver-firstboot.service` would sometimes fail on first boot with a "Resource temporarily unavailable" error. This happened when another process had a lock on `dpkg`.

To fix this, the installation script now waits for any `dpkg` locks to be released before attempting to install the driver package. It also includes a retry mechanism (3 attempts) in case of a transient failure.

This ensures the network driver is successfully installed, providing a better out-of-box experience.
This commit is contained in:
c127
2025-07-11 07:57:29 -07:00
committed by GitHub
parent fa8604ee1a
commit 15e454b2c5
3 changed files with 1368 additions and 2 deletions

View File

@@ -5,7 +5,7 @@ BOARD_MAINTAINER=""
BOOTCONFIG="orangepi_5_pro_defconfig" # vendor name, not standard, see hook below, set BOOT_SOC below to compensate
BOOTCONFIG_SATA="orangepi_5_pro_sata_defconfig"
BOOT_SOC="rk3588"
KERNEL_TARGET="vendor"
KERNEL_TARGET="vendor,edge"
FULL_DESKTOP="yes"
BOOT_LOGO="desktop"
BOOT_FDT_FILE="rockchip/rk3588s-orangepi-5-pro.dtb"
@@ -49,9 +49,151 @@ function post_uboot_custom_postprocess__create_sata_spi_image() {
dd if=u-boot.itb of=rkspi_loader_sata.img seek=16384 conv=notrunc
}
function post_family_config_branch_edge__orangepi5pro_use_mainline_uboot() {
display_alert "$BOARD" "Mainline U-Boot overrides for $BOARD - $BRANCH" "info"
declare -g BOOTCONFIG="orangepi-5-pro-rk3588s_defconfig"
declare -g BOOTDELAY=1
declare -g BOOTSOURCE="https://github.com/u-boot/u-boot.git"
declare -g BOOTBRANCH="tag:v2024.04"
declare -g BOOTPATCHDIR="v2024.04"
declare -g BOOTDIR="u-boot-${BOARD}"
declare -g UBOOT_TARGET_MAP="BL31=${RKBIN_DIR}/${BL31_BLOB} ROCKCHIP_TPL=${RKBIN_DIR}/${DDR_BLOB};;u-boot-rockchip.bin u-boot-rockchip-spi.bin"
declare -g INSTALL_HEADERS="yes"
unset uboot_custom_postprocess write_uboot_platform write_uboot_platform_mtd
function write_uboot_platform() {
dd "if=$1/u-boot-rockchip.bin" "of=$2" bs=32k seek=1 conv=notrunc status=none
}
function write_uboot_platform_mtd() {
flashcp -v -p "$1/u-boot-rockchip-spi.bin" /dev/mtd0
}
}
# Install Ethernet Driver during first boot
function pre_customize_image__orangepi5pro_add_phy_driver() {
local deb_file="tuxedo-yt6801_1.0.28-1_all.deb"
local service_name="eth-driver-firstboot.service"
display_alert "Setting up Ethernet driver build for first boot" "$BOARD" "info"
# Pre-install dependencies
chroot_sdcard apt-get update
chroot_sdcard apt-get install -y dkms build-essential
# Create directory and download .deb (Not installing due to chroot issue with dkms and kernel headers)
chroot_sdcard mkdir -p /usr/local/share/eth-driver
chroot_sdcard wget "https://github.com/dante1613/Motorcomm-YT6801/raw/main/tuxedo-yt6801/${deb_file}" -O "/usr/local/share/eth-driver/${deb_file}"
# Make script to Auto-Install Ethernet Driver Only on first boot
cat << 'EOF' > "${SDCARD}/usr/local/bin/install-eth-driver.sh"
#!/bin/bash
set -e
DEB_FILE="/usr/local/share/eth-driver/tuxedo-yt6801_1.0.28-1_all.deb"
LOG_FILE="/var/log/eth-driver-install.log"
# Wait for dpkg locks to be released
wait_for_dpkg() {
echo "Checking package manager locks..." >> $LOG_FILE
# Wait for up to 1 minute
local timeout=60
local start_time=$(date +%s)
while true; do
# Check if we've exceeded timeout
local current_time=$(date +%s)
if [ $((current_time - start_time)) -gt $timeout ]; then
echo "Timeout waiting for locks to be released. Continuing anyway..." >> $LOG_FILE
break
fi
# Check for dpkg locks
if lsof /var/lib/dpkg/lock >/dev/null 2>&1 || \
lsof /var/lib/apt/lists/lock >/dev/null 2>&1 || \
lsof /var/cache/apt/archives/lock >/dev/null 2>&1 || \
lsof /var/cache/debconf/config.dat >/dev/null 2>&1; then
echo "Waiting for package manager locks to be released... ($(date))" >> $LOG_FILE
sleep 1
continue
else
echo "All package manager locks are available" >> $LOG_FILE
break
fi
done
}
# Install driver package without internet
install_driver() {
echo "Starting driver install" >> $LOG_FILE
local max_attempts=3
local attempt=1
local success=false
while [ $attempt -le $max_attempts ]; do
echo "Installation attempt $attempt of $max_attempts" >> $LOG_FILE
# Always wait for dpkg locks before attempting
wait_for_dpkg
# Try to install the package
if dpkg -i $DEB_FILE >> $LOG_FILE 2>&1; then
echo "Installation successful on attempt $attempt" >> $LOG_FILE
success=true
break
else
echo "Installation attempt $attempt failed" >> $LOG_FILE
sleep 5
attempt=$((attempt + 1))
fi
done
if [ "$success" = true ]; then
echo "Ethernet driver installed correctly." >> $LOG_FILE
# Clean up files
rm -f $DEB_FILE
# Disable service
systemctl disable eth-driver-firstboot.service
return 0
else
echo "Failed to install driver after $max_attempts attempts." >> $LOG_FILE
# Don't exit with error to avoid service failure
return 0
fi
}
# Execute installation
install_driver
EOF
# Make executable script
chmod +x "${SDCARD}/usr/local/bin/install-eth-driver.sh"
# Creating the service
cat << EOF > "${SDCARD}/etc/systemd/system/${service_name}"
[Unit]
Description=Install YT6801 Ethernet driver on first boot
After=systemd-modules-load.service
Before=network.target network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/install-eth-driver.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
EOF
# Enable service for First Boot
chroot_sdcard systemctl enable "${service_name}"
display_alert "Ethernet driver setup complete" "Will be installed on first boot (offline)" "info"
}
# Override family config for this board; let's avoid conditionals in family config.
function post_family_config__orangepi5pro_use_vendor_uboot() {
BOOTSOURCE='https://github.com/orangepi-xunlong/u-boot-orangepi.git'
BOOTBRANCH='branch:v2017.09-rk3588'
BOOTPATCHDIR="legacy"
}
}

View File

@@ -0,0 +1,402 @@
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/dts-v1/;
#include "rk3588s-orangepi-5.dtsi"
/ {
model = "Xunlong Orange Pi 5 Pro";
compatible = "xunlong,orangepi-5-pro", "rockchip,rk3588s";
vcc3v3_pcie_eth: vcc3v3-pcie-eth {
compatible = "regulator-fixed";
regulator-name = "vcc3v3_pcie_eth";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-boot-on;
regulator-always-on;
enable-active-high;
gpios = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>;
vin-supply = <&vcc_3v3_s3>;
};
vcc5v0_otg: vcc5v0-otg {
compatible = "regulator-fixed";
regulator-name = "vcc5v0_otg";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
enable-active-high;
gpio = <&gpio0 RK_PC4 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc5v0_otg_en>;
vin-supply = <&vcc5v0_sys>;
regulator-boot-on;
regulator-always-on;
};
sdio_pwrseq: sdio-pwrseq {
compatible = "mmc-pwrseq-simple";
clocks = <&hym8563>;
clock-names = "ext_clock";
pinctrl-names = "default";
pinctrl-0 = <&wifi_enable_h>;
post-power-on-delay-ms = <200>;
reset-gpios = <&gpio0 RK_PD0 GPIO_ACTIVE_LOW>;
};
/* The DP0 controller lacks driver support.
dp_en: dp-en {
compatible = "regulator-fixed";
regulator-name = "dp_en";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
enable-active-high;
regulator-boot-on;
regulator-always-on;
gpios = <&gpio3 RK_PC2 GPIO_ACTIVE_HIGH>;
vin-supply = <&vcc_3v3_s3>;
};
*/
/delete-node/ pwm-leds;
pwm-leds {
compatible = "pwm-leds";
led-g {
color = <LED_COLOR_ID_GREEN>;
function = LED_FUNCTION_STATUS;
linux,default-trigger = "heartbeat";
max-brightness = <255>;
pwms = <&pwm3 0 25000 0>;
};
led-b {
color = <LED_COLOR_ID_BLUE>;
function = LED_FUNCTION_STATUS;
linux,default-trigger = "none";
max-brightness = <0>; // Desync compared with Green LED
pwms = <&pwm15 0 25000 0>;
};
};
fan: pwm-fan {
compatible = "pwm-fan";
#cooling-cells = <2>;
pwms = <&pwm2 0 20000000 0>;
cooling-levels = <0 50 100 150 200 255>;
rockchip,temp-trips = <
50000 1
55000 2
60000 3
65000 4
70000 5
>;
status = "okay";
};
/delete-node/ regulator-vcc-3v3-sd-s0;
/delete-node/ analog-sound;
headphone_amp: headphones-audio-amplifier {
compatible = "simple-audio-amplifier";
sound-name-prefix = "Headphones Amp";
enable-gpios = <&gpio4 RK_PB5 GPIO_ACTIVE_HIGH>;
};
es8388-sound {
compatible = "simple-audio-card";
pinctrl-names = "default";
pinctrl-0 = <&hp_detect>;
simple-audio-card,name = "rockchip,es8388";
simple-audio-card,bitclock-master = <&daicpu>;
simple-audio-card,format = "i2s";
simple-audio-card,frame-master = <&daicpu>;
simple-audio-card,aux-devs = <&headphone_amp>;
simple-audio-card,hp-det-gpios = <&gpio1 RK_PD5 GPIO_ACTIVE_LOW>;
simple-audio-card,mclk-fs = <256>;
simple-audio-card,pin-switches = "Headphones";
simple-audio-card,routing =
"Headphones", "LOUT1",
"Headphones", "ROUT1",
"Headphones", "Headphones Amp OUTL",
"Headphones", "Headphones Amp OUTR",
"Headphones Amp INL", "LOUT1",
"Headphones Amp INR", "ROUT1",
"LINPUT1", "Microphone Jack",
"RINPUT1", "Microphone Jack",
"LINPUT2", "Onboard Microphone",
"RINPUT2", "Onboard Microphone";
simple-audio-card,widgets =
"Microphone", "Microphone Jack",
"Microphone", "Onboard Microphone",
"Headphone", "Headphones";
daicpu: simple-audio-card,cpu {
sound-dai = <&i2s2_2ch>;
system-clock-frequency = <12288000>;
};
masterdai: simple-audio-card,codec {
sound-dai = <&es8388_sound>;
system-clock-frequency = <12288000>;
};
};
};
&pinctrl {
sdio-pwrseq {
wifi_enable_h: wifi-enable-h {
rockchip,pins = <0 RK_PD0 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
wireless-bluetooth {
bt_reg_on: bt-reset-gpio { // BT_REG_ON_H
rockchip,pins = <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>;
};
host_wake_bt: bt-wake-gpio { // HOST_WAKE_BT_H
rockchip,pins = <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>;
};
bt_wake_host: bt-irq-gpio { // BT_WAKE_HOST_H
rockchip,pins = <0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_down>;
};
};
wireless-wlan {
wifi_host_wake_irq: wifi-host-wake-irq {
rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_down>;
};
};
usb {
vcc5v0_otg_en: vcc5v0-otg-en {
rockchip,pins = <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
dp0 {
dp0_hpd: dp0-hpd {
rockchip,pins = <4 RK_PB4 RK_FUNC_GPIO &pcfg_pull_none>;
};
};
i2s2 {
/omit-if-no-ref/
i2s2m1_idle: i2s2m1-idle {
rockchip,pins =
/* i2s2m1_lrck_gpio */
<3 RK_PB6 0 &pcfg_pull_none>,
/* i2s2m1_sclk_gpio */
<3 RK_PB5 0 &pcfg_pull_none>;
};
};
};
&pcie2x1l1 {
reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>;
status = "okay";
};
&pcie2x1l2 {
reset-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_HIGH>;
status = "okay";
};
&sfc {
status = "okay";
};
&gmac1 {
status = "disabled";
};
&sdio {
max-frequency = <150000000>;
no-sd;
no-mmc;
bus-width = <4>;
disable-wp;
cap-sd-highspeed;
cap-sdio-irq;
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
non-removable;
pinctrl-names = "default";
pinctrl-0 = <&sdiom1_pins>;
sd-uhs-sdr104;
status = "okay";
ap6256: wifi@1 {
compatible = "brcm,bcm43456-fmac", "brcm,bcm4329-fmac";
reg = <1>;
interrupt-parent = <&gpio0>;
interrupts = <RK_PA0 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "host-wake";
pinctrl-names = "default";
pinctrl-0 = <&wifi_host_wake_irq>;
};
};
&sdhci {
status = "okay";
};
&uart9 {
status = "okay";
uart-has-rtscts;
pinctrl-0 = <&uart9m2_xfer &uart9m2_ctsn>;
bluetooth {
compatible = "brcm,bcm4345c5";
clocks = <&hym8563>;
clock-names = "lpo";
interrupt-parent = <&gpio0>;
interrupts = <RK_PC5 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "host-wakeup";
device-wakeup-gpios = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>;
shutdown-gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>;
max-speed = <1500000>;
pinctrl-names = "default";
pinctrl-0 = <&bt_reg_on &bt_wake_host &host_wake_bt>;
vbat-supply = <&vcc_3v3_s3>;
vddio-supply = <&vcc_1v8_s3>;
};
};
&pwm0 {
status = "disabled";
};
&pwm2 {
status = "okay";
};
&pwm3 {
pinctrl-0 = <&pwm3m2_pins>;
pinctrl-names = "default";
status = "okay";
};
&pwm15 {
pinctrl-0 = <&pwm15m2_pins>;
pinctrl-names = "default";
status = "okay";
};
&sdmmc {
/delete-property/ vmmc-supply;
/delete-property/ vqmmc-supply;
};
// Bluetooth i2S
&i2s0_8ch {
status = "okay";
};
&i2s1_8ch {
status = "disabled";
};
&i2s2_2ch {
pinctrl-names = "default";
pinctrl-0 = <&i2s2m1_lrck
&i2s2m1_mclk
&i2s2m1_sclk
&i2s2m1_sdi
&i2s2m1_sdo>;
status = "okay";
};
&i2c2 {
status = "okay";
};
&i2c3 {
status = "okay";
es8388_sound: audio-codec@11 {
compatible = "everest,es8388", "everest,es8328";
reg = <0x11>;
clocks = <&cru I2S2_2CH_MCLKOUT>;
AVDD-supply = <&vcc_3v3_s0>;
DVDD-supply = <&vcc_1v8_s0>;
HPVDD-supply = <&vcc_3v3_s0>;
PVDD-supply = <&vcc_1v8_s0>;
assigned-clocks = <&cru I2S2_2CH_MCLKOUT>;
assigned-clock-rates = <12288000>;
#sound-dai-cells = <0>;
status = "okay";
};
};
&i2c6 {
/delete-node/ es8388;
};
&hdmi0_sound {
simple-audio-card,cpu {
sound-dai = <&i2s5_8ch>;
};
};
&usbc0 {
status = "disabled";
};
&usb_host0_xhci {
/delete-property/ usb-role-switch;
dr_mode = "host";
vbus-supply = <&vcc5v0_otg>;
snps,parkmode-disable-hs-quirk;
snps,parkmode-disable-ss-quirk;
quirk-skip-phy-init;
/delete-node/ port;
};
&usb_con {
/delete-node/ ports;
};
&usbdp_phy0 {
/delete-property/ sbu1-dc-gpios;
/delete-property/ sbu2-dc-gpios;
/delete-property/ mode-switch;
/delete-property/ orientation-switch;
rockchip,dp-lane-mux = <0 1>;
};
&usbdp_phy0_typec_ss {
/delete-property/ remote-endpoint;
};
&usbdp_phy0_typec_sbu {
/delete-property/ remote-endpoint;
};
&usb_host2_xhci {
snps,parkmode-disable-hs-quirk;
snps,parkmode-disable-ss-quirk;
};
&hym8563 {
status = "okay";
};
&hym8563_int {
rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_up>;
};
/* The DP0 controller lacks driver support.
&vp1 {
vp1_out_dp0: endpoint@ROCKCHIP_VOP2_EP_DP0 {
reg = <ROCKCHIP_VOP2_EP_DP0>;
remote-endpoint = <&dp0_in_vp1>;
};
};
*/

File diff suppressed because it is too large Load Diff