diff --git a/README.md b/README.md index 342f8b56f..9064a84bf 100644 --- a/README.md +++ b/README.md @@ -340,6 +340,7 @@ See code for all available configurations. | [Omen 15-en1007sa](omen/15-en1007sa) | `` | | [Omen 15-en0002np](omen/15-en0002np) | `` | | [One-Netbook OneNetbook 4](onenetbook/4) | `` | +| [Orange Pi 5 Max](orange-pi/5-max) | `` | | [Panasonic Let's Note CF-LX4](panasonic/letsnote/cf-lx4) | `` | | [PC Engines APU](pcengines/apu) | `` | | [PINE64 Pinebook Pro](pine64/pinebook-pro/) | `` | diff --git a/flake.nix b/flake.nix index 0a0f505fc..7129e3d2b 100644 --- a/flake.nix +++ b/flake.nix @@ -292,6 +292,7 @@ omen-15-en0002np = import ./omen/15-en0002np; onenetbook-4 = import ./onenetbook/4; olimex-teres_i = import ./olimex/teres_i; + orange-pi-5-max = import ./orange-pi/5-max; pcengines-apu = import ./pcengines/apu; pine64-pinebook-pro = import ./pine64/pinebook-pro; pine64-rockpro64 = import ./pine64/rockpro64; diff --git a/orange-pi/5-max/README.md b/orange-pi/5-max/README.md new file mode 100644 index 000000000..c6f7af70c --- /dev/null +++ b/orange-pi/5-max/README.md @@ -0,0 +1,85 @@ +# Creating an installation SD card image + +Create and customize a `flake.nix` file: + +```nix +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + nixos-hardware.url = "github:nixos/nixos-hardware"; + }; + + outputs = { nixpkgs, nixos-hardware, ... }: + let + supportedSystems = [ + "x86_64-linux" + "aarch64-linux" + "riscv64-linux" + "x86_64-darwin" + "aarch64-darwin" + ]; + forAllSupportedSystems = nixpkgs.lib.genAttrs supportedSystems; + in + { + packages = forAllSupportedSystems (system: rec { + default = sd-image; + sd-image = (import "${nixpkgs}/nixos" { + configuration = { + imports = [ + "${nixos-hardware}/orange-pi/5-max/sd-image-installer.nix" + ]; + + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (nixpkgs.lib.getName pkg) [ + "orangepi-firmware" + "mali-g610-firmware" + ]; + + # If you want to use ssh set a password + # users.users.nixos.password = "super secure password"; + # OR add your public ssh key + # users.users.nixos.openssh.authorizedKeys.keys = [ "ssh-rsa ..." ]; + + nixpkgs.buildPlatform.system = system; + nixpkgs.hostPlatform.system = "aarch64-linux"; + + system.stateVersion = "24.11"; + }; + inherit system; + }).config.system.build.sdImage; + }); + }; +} +``` + +Then build the image by running `nix build .#` in the same folder. + +## Flashing image +Replace `/dev/sdX` with the device name of your sd card. +```sh +zstdcat result/sd-image/nixos-sd-image-*-orange-pi-5-max.img.zst | sudo dd status=progress bs=8M of=/dev/sdX +``` + +# Updating the bootloader +Install the enable the update scripts +```nix +hardware.orange-pi."5-max".uboot.updater.enable = true; +``` + +uart debugging options are applied to the bootloader installed by the firmware update script +```nix +hardware.orange-pi."5-max".uartDebug = { + enable = true; # enabled by default for debugging + baudRate = 57600; # default is 1500000 +}; +``` + +## SD-Card +Run as root +``` sh +orangepi5max-firmware-update-sd +``` +## SPI Flash +Run as root +``` sh +orangepi5max-firmware-update-flash +``` diff --git a/orange-pi/5-max/audio.nix b/orange-pi/5-max/audio.nix new file mode 100644 index 000000000..ab6b50c44 --- /dev/null +++ b/orange-pi/5-max/audio.nix @@ -0,0 +1,42 @@ +{ config, lib, ... }: +let + cfg = config.hardware.orange-pi."5-max".audio; +in +{ + options.hardware = { + orange-pi."5-max".audio = { + enable = lib.mkEnableOption "audio device configuration" // { + default = true; + }; + }; + }; + + config = lib.mkIf cfg.enable { + services.pipewire.wireplumber.extraConfig = { + "orange-pi-5-max-descriptions" = { + "monitor.alsa.rules" = + let + makeRule = name: description: { + matches = [{ "device.name" = name; }]; + actions = { + update-props = { + "device.description" = description; + }; + }; + }; + in + [ + (makeRule "alsa_card.platform-hdmi0-sound" "HDMI0 Audio") + (makeRule "alsa_card.platform-hdmi1-sound" "HDMI1 Audio") + (makeRule "alsa_card.platform-sound" "ES8388 Audio") + ]; + }; + }; + + services.udev.extraRules = '' + SUBSYSTEM=="sound", ENV{ID_PATH}=="platform-hdmi0-sound", ENV{SOUND_DESCRIPTION}="HDMI0 Audio" + SUBSYSTEM=="sound", ENV{ID_PATH}=="platform-hdmi1-sound", ENV{SOUND_DESCRIPTION}="HDMI1 Audio" + SUBSYSTEM=="sound", ENV{ID_PATH}=="platform-sound", ENV{SOUND_DESCRIPTION}="ES8388 Audio" + ''; + }; +} diff --git a/orange-pi/5-max/bcmdhd_sdio.nix b/orange-pi/5-max/bcmdhd_sdio.nix new file mode 100644 index 000000000..e44637729 --- /dev/null +++ b/orange-pi/5-max/bcmdhd_sdio.nix @@ -0,0 +1,52 @@ +{ fetchFromGitHub +, kernel +, lib +, stdenv +, ... +}: +let + rev = "101.10.591.52.27-4"; +in +stdenv.mkDerivation rec { + pname = "bcmdhd_sdio"; + version = "${rev}-${kernel.version}"; + + passthru.moduleName = "bcmdhd_sdio"; + + src = fetchFromGitHub { + owner = "armbian"; + repo = "bcmdhd-dkms"; + inherit rev; + hash = "sha256-e9oWorovZrsqm7qZjXygVluahTCIxi4yJy2Pp6lwdl8="; + }; + + sourceRoot = "${src.name}/src"; + + hardeningDisable = [ "pic" ]; + + nativeBuildInputs = kernel.moduleBuildDependencies; + + postPatch = '' + substituteInPlace include/linuxver.h \ + --replace-fail 'del_timer(&((t)->timer))' 'timer_delete(&((t)->timer))' + substituteInPlace include/linuxver.h \ + --replace-fail 'del_timer_sync(&((t)->timer))' 'timer_delete_sync(&((t)->timer))' + ''; + + buildPhase = '' + make \ + LINUXDIR=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build \ + ARCH=arm64 \ + CROSS_COMPILE=${stdenv.cc.targetPrefix} \ + bcmdhd_sdio \ + CONFIG_BCMDHD_SDIO=y \ + CONFIG_BCMDHD_DTS=y + ''; + + installPhase = '' + install -D bcmdhd_sdio.ko $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/bcmdhd_sdio.ko + install -D dhd_static_buf_sdio.ko $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/dhd_static_buf_sdio.ko + ''; + + meta.license = lib.licenses.gpl2Only; +} diff --git a/orange-pi/5-max/bluetooth.nix b/orange-pi/5-max/bluetooth.nix new file mode 100644 index 000000000..8f16a8b9d --- /dev/null +++ b/orange-pi/5-max/bluetooth.nix @@ -0,0 +1,183 @@ +{ config +, pkgs +, lib +, ... +}: +let + cfg = config.hardware.orange-pi."5-max".bluetooth; + bcmdhd_sdio = config.boot.kernelPackages.callPackage ./bcmdhd_sdio.nix { }; + brcm_patchram_plus = pkgs.callPackage ./brcm_patchram_plus.nix { }; + orangepi-firmware = pkgs.callPackage ./orangepi-firmware.nix { }; +in +{ + options.hardware = { + orange-pi."5-max".bluetooth = { + enable = lib.mkEnableOption "configuration for bluetooth" // { + default = config.hardware.bluetooth.enable; + }; + }; + }; + + config = lib.mkIf cfg.enable { + boot = { + kernelParams = [ "8250.nr_uarts=8" ]; + kernelModules = [ "bcmdhd_sdio" "btbcm" ]; + blacklistedKernelModules = [ + "bcmdhd" + "dhd_static_buf" + ]; + extraModulePackages = [ bcmdhd_sdio ]; + extraModprobeConfig = + let + options = [ + "firmware_path=${orangepi-firmware}/lib/firmware/fw_syn43711a0_sdio.bin" + "nvram_path=${orangepi-firmware}/lib/firmware/nvram_ap6611s.txt" + "clm_path=${orangepi-firmware}/lib/firmware/clm_syn43711a0.blob" + ]; + in + '' + options bcmdhd_sdio ${lib.concatStringsSep " " options} + ''; + }; + + hardware = { + deviceTree = { + overlays = [ + { + name = "orangepi-5-max-bt"; + dtsText = '' + /dts-v1/; + /plugin/; + + #include + #include + #include + + / { + compatible = "xunlong,orangepi-5-max"; + }; + / { + fragment@0 { + target = <&pinctrl>; + __overlay__ { + wireless-bluetooth { + bt_reg_on: bt-reg-on { + rockchip,pins = <4 RK_PC4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + host_wake_bt: host-wake-bt { + rockchip,pins = <4 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + bt_wake_host: bt-wake-host { + rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + }; + }; + fragment@1 { + target = <&uart7>; + __overlay__ { + pinctrl-names = "default"; + pinctrl-0 = <&uart7m0_xfer &uart7m0_ctsn &uart7m0_rtsn>; + uart-has-rtscts; + status = "okay"; + bluetooth { + compatible = "brcm,bcm43438-bt"; + clocks = <&hym8563>; + clock-names = "lpo"; + device-wakeup-gpios = <&gpio4 RK_PC5 GPIO_ACTIVE_HIGH>; + interrupt-parent = <&gpio0>; + interrupts = ; + interrupt-names = "host-wakeup"; + pinctrl-names = "default"; + pinctrl-0 = <&bt_reg_on>, <&host_wake_bt>, <&bt_wake_host>; + shutdown-gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; + vbat-supply = <&vcc_3v3_s3>; + vddio-supply = <&vcc_1v8_s3>; + }; + }; + }; + }; + ''; + } + { + name = "orangepi-5-max-wlan"; + dtsText = '' + /dts-v1/; + /plugin/; + + #include + #include + + / { + compatible = "xunlong,orangepi-5-max"; + }; + / { + fragment@0 { + target = <&pinctrl>; + __overlay__ { + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <2 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + wireless-wlan { + wifi_host_wake_irq: wifi-host-wake-irq { + rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + }; + }; + fragment@1 { + target-path = "/"; + __overlay__ { + 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 = <&gpio2 RK_PC5 GPIO_ACTIVE_LOW>; + }; + wireless_wlan: wireless-wlan { + compatible = "wlan-platdata"; + wifi_chip_type = "ap6611"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_host_wake_irq>; + WIFI,host_wake_irq = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>; + WIFI,poweren_gpio = <&gpio2 RK_PC5 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + }; + }; + fragment@2 { + target = <&sdio>; + __overlay__ { + 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 = <&sdiom0_pins>; + sd-uhs-sdr104; + status = "okay"; + bcmdhd_wlan { + compatible = "android,bcmdhd_wlan"; + gpio_wl_host_wake = <&gpio0 RK_PB0 GPIO_ACTIVE_HIGH>; + }; + }; + }; + }; + ''; + } + ]; + }; + }; + }; +} diff --git a/orange-pi/5-max/brcm_patchram_plus.nix b/orange-pi/5-max/brcm_patchram_plus.nix new file mode 100644 index 000000000..29f3ce4e5 --- /dev/null +++ b/orange-pi/5-max/brcm_patchram_plus.nix @@ -0,0 +1,28 @@ +{ fetchFromGitHub +, lib +, stdenv +, ... +}: +stdenv.mkDerivation rec { + pname = "brcm_patchram_plus"; + version = "2024.11.26"; + + src = fetchFromGitHub { + owner = "orangepi-xunlong"; + repo = "orangepi-build"; + rev = "5f17bb471115d2764b66eeb40b99cd1a885b8be4"; + sha256 = "sha256-gn/y8HVb4pZZNZyQXqhkI3NqNKAfnprfvIp1oSaT05I="; + }; + + sourceRoot = "${src.name}/external/cache/sources/brcm_patchram_plus"; + + prePatch = '' + sed -i 's/#include /#include \n#include /' brcm_patchram_plus.c + ''; + + installPhase = '' + install -Dm755 brcm_patchram_plus -t $out/bin + ''; + + meta.license = lib.licenses.asl20; +} diff --git a/orange-pi/5-max/default.nix b/orange-pi/5-max/default.nix new file mode 100644 index 000000000..995aa9016 --- /dev/null +++ b/orange-pi/5-max/default.nix @@ -0,0 +1,73 @@ +{ lib, pkgs, ... }: +let + orangepi-firmware = pkgs.callPackage ./orangepi-firmware.nix { }; +in +{ + imports = [ + ./audio.nix + ./bluetooth.nix + ./graphics.nix + ./leds.nix + ./uart.nix + ./uboot + ../../common/gpu/24.05-compat.nix + ]; + + powerManagement.cpuFreqGovernor = lib.mkDefault "ondemand"; + + boot = { + kernelPackages = + if (lib.versionOlder pkgs.linuxPackages_latest.kernel.version "6.15") then + lib.mkDefault pkgs.linuxPackages_testing + else if (lib.versionOlder pkgs.linux.version "6.15") then + lib.mkDefault pkgs.linuxPackages_latest + else + lib.mkDefault pkgs.linuxPackages; + supportedFilesystems.zfs = false; + + kernelParams = [ + "rootwait" + "consoleblank=0" + "console=tty1" + ]; + + initrd.includeDefaultModules = false; + initrd.availableKernelModules = [ + "nvme" + "mmc_block" + "usbhid" + "hid_generic" + "dm_mod" + "input_leds" + ]; + + loader = { + grub.enable = lib.mkDefault false; + generic-extlinux-compatible.enable = lib.mkDefault true; + }; + }; + + disabledModules = [ "profiles/all-hardware.nix" ]; + + hardware = { + deviceTree = { + enable = lib.mkDefault true; + name = lib.mkDefault "rockchip/rk3588-orangepi-5-max.dtb"; + }; + + firmware = [ orangepi-firmware ]; + + enableRedistributableFirmware = lib.mkDefault true; + }; + + networking.networkmanager.wifi.scanRandMacAddress = lib.mkDefault false; + + systemd.services."orangepi5-usb2-init" = { + description = "Initialize USB2 on Orange Pi 5"; + wantedBy = [ "default.target" ]; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${pkgs.bash}/bin/sh -c 'echo host > /sys/kernel/debug/usb/fc000000.usb/mode'"; + }; + }; +} diff --git a/orange-pi/5-max/graphics.nix b/orange-pi/5-max/graphics.nix new file mode 100644 index 000000000..538320be7 --- /dev/null +++ b/orange-pi/5-max/graphics.nix @@ -0,0 +1,26 @@ +{ config, pkgs, lib, ... }: +let + cfg = config.hardware.orange-pi."5-max".graphics; + mali-firmware = pkgs.callPackage ./mali-firmware.nix { }; +in +{ + options.hardware = { + orange-pi."5-max".graphics = { + enable = lib.mkEnableOption "gpu configuration" // { + default = config.hardware.graphics.enable; + }; + }; + }; + + config = lib.mkIf cfg.enable { + hardware = { + firmware = [ + mali-firmware + ]; + }; + # VK_KHR_sampler_ycbcr_conversion is not available for g610 in older mesa versions + environment.sessionVariables = lib.optionalAttrs (lib.versionOlder pkgs.mesa.verion "25.1.0") { + GDK_VULKAN_DISABLE = "ycbcr"; + }; + }; +} diff --git a/orange-pi/5-max/leds.nix b/orange-pi/5-max/leds.nix new file mode 100644 index 000000000..5fa24b914 --- /dev/null +++ b/orange-pi/5-max/leds.nix @@ -0,0 +1,38 @@ +{ config, lib, ... }: +let + cfg = config.hardware.orange-pi."5-max".leds; +in +{ + options.hardware.orange-pi."5-max".leds = { + enable = lib.mkEnableOption "heartbeat leds" // { + default = true; + }; + }; + + config = lib.mkIf (!cfg.enable) { + hardware = { + deviceTree = { + overlays = [ + { + name = "orangepi-5-max-enable-leds"; + dtsText = '' + /dts-v1/; + /plugin/; + / { + compatible = "xunlong,orangepi-5-max"; + }; + / { + fragment@0 { + target = <&led_blue_pwm>; + __overlay__ { + status = "disabled"; + }; + }; + }; + ''; + } + ]; + }; + }; + }; +} diff --git a/orange-pi/5-max/mali-firmware.nix b/orange-pi/5-max/mali-firmware.nix new file mode 100644 index 000000000..969176416 --- /dev/null +++ b/orange-pi/5-max/mali-firmware.nix @@ -0,0 +1,22 @@ +{ fetchurl +, lib +, stdenv +, ... +}: +stdenv.mkDerivation { + pname = "mali-g610-firmware"; + version = "g18p0-01eac0"; + + src = fetchurl { + url = "https://github.com/JeffyCN/mirrors/raw/e08ced3e0235b25a7ba2a3aeefd0e2fcbd434b68/firmware/g610/mali_csffw.bin"; + hash = "sha256-jnyCGlXKHDRcx59hJDYW3SX8NbgfCQlG8wKIbWdxLfU="; + }; + + buildCommand = '' + install -Dm444 $src $out/lib/firmware/mali_csffw.bin + ''; + + compressFirmware = false; + + meta.license = lib.licenses.unfreeRedistributableFirmware; +} diff --git a/orange-pi/5-max/orangepi-firmware.nix b/orange-pi/5-max/orangepi-firmware.nix new file mode 100644 index 000000000..ff7a4013e --- /dev/null +++ b/orange-pi/5-max/orangepi-firmware.nix @@ -0,0 +1,34 @@ +{ fetchFromGitHub +, lib +, stdenvNoCC +, ... +}: +stdenvNoCC.mkDerivation { + pname = "orangepi-firmware"; + version = "2024.10.09"; + dontBuild = true; + dontFixup = true; + compressFirmware = false; + + src = fetchFromGitHub { + owner = "orangepi-xunlong"; + repo = "firmware"; + rev = "75ea6fc5f3c454861b39b33823cb6876f3eca598"; + hash = "sha256-X+n0voO3HRtPPAQsajGPIN9LOfDKBxF+8l9wFwGAFSQ="; + }; + + installPhase = '' + runHook preInstall + + mkdir -p $out/lib/firmware + cp -a * $out/lib/firmware/ + + mkdir -p $out/lib/firmware/brcm + ln -sf ../SYN43711A0.hcd $out/lib/firmware/brcm/SYN43711A0.hcd + ln -sf ../SYN43711A0.hcd $out/lib/firmware/brcm/BCM.xunlong,orangepi-5-max.hcd + + runHook postInstall + ''; + + meta.license = lib.licenses.unfreeRedistributableFirmware; +} diff --git a/orange-pi/5-max/sd-image-installer.nix b/orange-pi/5-max/sd-image-installer.nix new file mode 100644 index 000000000..22394ff9d --- /dev/null +++ b/orange-pi/5-max/sd-image-installer.nix @@ -0,0 +1,11 @@ +{ modulesPath, ... }: +{ + imports = [ + "${modulesPath}/profiles/installation-device.nix" + ./sd-image.nix + ]; + + # the installation media is also the installation target, + # so we don't want to provide the installation configuration.nix. + installer.cloneConfig = false; +} diff --git a/orange-pi/5-max/sd-image.nix b/orange-pi/5-max/sd-image.nix new file mode 100644 index 000000000..7df867172 --- /dev/null +++ b/orange-pi/5-max/sd-image.nix @@ -0,0 +1,37 @@ +{ modulesPath +, config +, pkgs +, ... +}: +let + uboot = config.hardware.orange-pi."5-max".uboot.package; +in +{ + imports = [ + "${modulesPath}/profiles/base.nix" + "${modulesPath}/installer/sd-card/sd-image.nix" + ./default.nix + ]; + + sdImage = { + imageName = + "${config.sdImage.imageBaseName}-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}-orange-pi-5-max.img"; + + firmwarePartitionOffset = 16; + firmwarePartitionName = "BOOT"; + + compressImage = true; + expandOnBoot = true; + + populateFirmwareCommands = "dd if=${uboot}/u-boot-rockchip.bin of=$img seek=64 conv=notrunc"; + + postBuildCommands = '' + cp ${uboot}/u-boot-rockchip.bin firmware/ + ''; + + populateRootCommands = '' + mkdir -p ./files/boot + ${config.boot.loader.generic-extlinux-compatible.populateCmd} -c ${config.system.build.toplevel} -d ./files/boot + ''; + }; +} diff --git a/orange-pi/5-max/uart.nix b/orange-pi/5-max/uart.nix new file mode 100644 index 000000000..b52bdee9f --- /dev/null +++ b/orange-pi/5-max/uart.nix @@ -0,0 +1,23 @@ +{ config, lib, ... }: +let + cfg = config.hardware.orange-pi."5-max".uartDebug; +in +{ + options.hardware.orange-pi."5-max".uartDebug = { + enable = lib.mkEnableOption "UART2 serial console" // { + default = true; + }; + baudRate = lib.mkOption { + type = lib.types.int; + default = 1500000; + description = "Baud rate for the UART2 serial console"; + }; + }; + + config = lib.mkIf cfg.enable { + boot.kernelParams = [ + "earlycon=uart8250,mmio32,0xfeb50000" + "console=ttyS2,${toString cfg.baudRate}" + ]; + }; +} diff --git a/orange-pi/5-max/uboot/default.nix b/orange-pi/5-max/uboot/default.nix new file mode 100644 index 000000000..c8f772be4 --- /dev/null +++ b/orange-pi/5-max/uboot/default.nix @@ -0,0 +1,41 @@ +{ config, pkgs, lib, ... }: +let + cfg = config.hardware.orange-pi."5-max".uboot; + uboot = pkgs.callPackage ./package.nix { + enableUart = config.hardware.orange-pi."5-max".uartDebug.enable; + baudRate = config.hardware.orange-pi."5-max".uartDebug.baudRate; + }; + updater-flash = pkgs.writeShellApplication { + name = "orangepi5max-firmware-update-flash"; + runtimeInputs = [ pkgs.mtdutils ]; + text = '' + flashcp -v ${cfg.package}/u-boot-rockchip-spi.bin /dev/mtd0 + ''; + }; + updater-sd = pkgs.writeShellApplication { + name = "orangepi5max-firmware-update-sd"; + runtimeInputs = [ ]; + text = '' + dd if=${cfg.package}/u-boot-rockchip.bin of=/dev/mmcblk1 seek=64 conv=notrunc + ''; + }; +in +{ + options.hardware = { + orange-pi."5-max".uboot = { + package = lib.mkOption { + type = lib.types.package; + default = uboot; + description = "uboot package to use in sd image and updater scripts"; + }; + updater.enable = lib.mkEnableOption "updater program installation"; + }; + }; + + config = lib.mkIf cfg.updater.enable { + environment.systemPackages = [ + updater-flash + updater-sd + ]; + }; +} diff --git a/orange-pi/5-max/uboot/orangepi-5-max-dtb.patch b/orange-pi/5-max/uboot/orangepi-5-max-dtb.patch new file mode 100644 index 000000000..94d2e6324 --- /dev/null +++ b/orange-pi/5-max/uboot/orangepi-5-max-dtb.patch @@ -0,0 +1,16 @@ +diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile +index 6ad59aeed5..36442cf0f5 100644 +--- a/arch/arm/dts/Makefile ++++ b/arch/arm/dts/Makefile +@@ -85,7 +85,10 @@ dtb-$(CONFIG_ROCKCHIP_RK3288) += \ + dtb-$(CONFIG_ROCKCHIP_RK3368) += \ + rk3368-sheep.dtb \ + rk3368-geekbox.dtb \ +- rk3368-px5-evb.dtb \ ++ rk3368-px5-evb.dtb ++ ++dtb-$(CONFIG_ROCKCHIP_RK3588) += \ ++ rk3588-orangepi-5-max.dtb + + dtb-$(CONFIG_ARCH_S5P4418) += \ + s5p4418-nanopi2.dtb diff --git a/orange-pi/5-max/uboot/orangepi-5-max-rk3588_defconfig b/orange-pi/5-max/uboot/orangepi-5-max-rk3588_defconfig new file mode 100644 index 000000000..318006eb7 --- /dev/null +++ b/orange-pi/5-max/uboot/orangepi-5-max-rk3588_defconfig @@ -0,0 +1,90 @@ +CONFIG_ARM=y +CONFIG_SKIP_LOWLEVEL_INIT=y +CONFIG_SYS_HAS_NONCACHED_MEMORY=y +CONFIG_COUNTER_FREQUENCY=24000000 +CONFIG_ARCH_ROCKCHIP=y +CONFIG_SF_DEFAULT_SPEED=24000000 +CONFIG_SF_DEFAULT_MODE=0x2000 +CONFIG_DEFAULT_DEVICE_TREE="rk3588-orangepi-5-max" +CONFIG_ROCKCHIP_RK3588=y +CONFIG_ROCKCHIP_SPI_IMAGE=y +CONFIG_SPL_SERIAL=y +CONFIG_TARGET_EVB_RK3588=y +CONFIG_DEBUG_UART_BASE=0xFEB50000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_SPL_SPI_FLASH_SUPPORT=y +CONFIG_SPL_SPI=y +CONFIG_SYS_LOAD_ADDR=0xc00800 +CONFIG_PCI=y +CONFIG_DEBUG_UART=y +CONFIG_AHCI=y +CONFIG_FIT=y +CONFIG_FIT_VERBOSE=y +CONFIG_SPL_FIT_SIGNATURE=y +CONFIG_SPL_LOAD_FIT=y +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_DEFAULT_FDT_FILE="rockchip/rk3588-orangepi-5-max.dtb" +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_DISPLAY_BOARDINFO_LATE=y +CONFIG_SPL_MAX_SIZE=0x40000 +CONFIG_SPL_PAD_TO=0x7f8000 +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +CONFIG_SPL_SPI_LOAD=y +CONFIG_SYS_SPI_U_BOOT_OFFS=0x60000 +CONFIG_SPL_ATF=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_GPT=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MMC=y +CONFIG_CMD_PCI=y +CONFIG_CMD_USB=y +# CONFIG_CMD_SETEXPR is not set +CONFIG_CMD_REGULATOR=y +# CONFIG_SPL_DOS_PARTITION is not set +CONFIG_SPL_OF_CONTROL=y +CONFIG_OF_LIVE=y +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" +# CONFIG_OF_UPSTREAM is not set +CONFIG_SPL_DM_SEQ_ALIAS=y +CONFIG_SPL_REGMAP=y +CONFIG_SPL_SYSCON=y +CONFIG_AHCI_PCI=y +CONFIG_DWC_AHCI=y +CONFIG_SPL_CLK=y +CONFIG_ROCKCHIP_GPIO=y +CONFIG_SYS_I2C_ROCKCHIP=y +CONFIG_MISC=y +CONFIG_SUPPORT_EMMC_RPMB=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_ROCKCHIP=y +CONFIG_SF_DEFAULT_BUS=5 +CONFIG_SPI_FLASH_SFDP_SUPPORT=y +CONFIG_SPI_FLASH_XMC=y +CONFIG_PHYLIB=y +CONFIG_RTL8169=y +CONFIG_NVME_PCI=y +CONFIG_PCIE_DW_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y +CONFIG_PHY_ROCKCHIP_USBDP=y +CONFIG_SPL_PINCTRL=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_SPL_RAM=y +CONFIG_SCSI=y +CONFIG_BAUDRATE=1500000 +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_SYS_NS16550_MEM32=y +CONFIG_ROCKCHIP_SFC=y +CONFIG_SYSRESET=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_GENERIC=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_GENERIC=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_GENERIC=y +CONFIG_ERRNO_STR=y \ No newline at end of file diff --git a/orange-pi/5-max/uboot/package.nix b/orange-pi/5-max/uboot/package.nix new file mode 100644 index 000000000..5d418cc8e --- /dev/null +++ b/orange-pi/5-max/uboot/package.nix @@ -0,0 +1,30 @@ +{ armTrustedFirmwareRK3588 +, buildUBoot +, lib +, rkbin +, enableUart ? true +, baudRate ? 1500000 +, ... +}: +(buildUBoot { + defconfig = "orangepi-5-max-rk3588_defconfig"; + BL31 = "${armTrustedFirmwareRK3588}/bl31.elf"; + ROCKCHIP_TPL = rkbin.TPL_RK3588; + + extraPatches = [ + ./orangepi-5-max-dtb.patch + ]; + + preConfigure = '' + cp --no-preserve=mode ${./orangepi-5-max-rk3588_defconfig} configs/orangepi-5-max-rk3588_defconfig + cp --no-preserve=mode ${./rk3588-orangepi-5-max.dts} arch/arm/dts/rk3588-orangepi-5-max.dts + cp --no-preserve=mode ${./rk3588-orangepi-5-max-u-boot.dtsi} arch/arm/dts/rk3588-orangepi-5-max-u-boot.dtsi + + sed -i "s/^CONFIG_BAUDRATE=1500000/CONFIG_BAUDRATE=${toString baudRate}/" configs/orangepi-5-max-rk3588_defconfig + sed -i "s/serial2:1500000n8/serial2:${toString baudRate}n8/" arch/arm/dts/rk3588-orangepi-5-max.dts + '' + lib.optionalString (!enableUart) '' + sed -i "s/^CONFIG_DEBUG_UART=y/# CONFIG_DEBUG_UART is not set/" configs/orangepi-5-max-rk3588_defconfig + ''; + + filesToInstall = [ "u-boot.itb" "idbloader.img" "u-boot-rockchip.bin" "u-boot-rockchip-spi.bin" ]; +}) diff --git a/orange-pi/5-max/uboot/rk3588-orangepi-5-max-u-boot.dtsi b/orange-pi/5-max/uboot/rk3588-orangepi-5-max-u-boot.dtsi new file mode 100644 index 000000000..1ab31a4ec --- /dev/null +++ b/orange-pi/5-max/uboot/rk3588-orangepi-5-max-u-boot.dtsi @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +#include "rk3588-u-boot.dtsi" + +&fspim1_pins { + bootph-pre-ram; + bootph-some-ram; +}; + +&sdhci { + cap-mmc-highspeed; + mmc-hs200-1_8v; +}; + +&sfc { + flash@0 { + bootph-pre-ram; + bootph-some-ram; + }; +}; diff --git a/orange-pi/5-max/uboot/rk3588-orangepi-5-max.dts b/orange-pi/5-max/uboot/rk3588-orangepi-5-max.dts new file mode 100644 index 000000000..dccea5ec4 --- /dev/null +++ b/orange-pi/5-max/uboot/rk3588-orangepi-5-max.dts @@ -0,0 +1,847 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2023 Ondřej Jirman + */ + +/dts-v1/; + +#include +#include +#include +#include +#include +#include "rk3588.dtsi" + +/ { + model = "Xunlong Orange Pi 5 Max"; + compatible = "xunlong,orangepi-5-max", "rockchip,rk3588"; + + aliases { + mmc0 = &sdhci; + mmc1 = &sdmmc; + }; + + chosen { + stdout-path = "serial2:1500000n8"; + }; + + adc-keys-0 { + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + poll-interval = <100>; + + button-maskrom { + label = "Mask Rom"; + linux,code = ; + press-threshold-microvolt = <2000>; + }; + }; + + adc-keys-1 { + compatible = "adc-keys"; + io-channels = <&saradc 1>; + io-channel-names = "buttons"; + keyup-threshold-microvolt = <1800000>; + poll-interval = <100>; + + button-recovery { + label = "Recovery"; + linux,code = ; + press-threshold-microvolt = <2000>; + }; + }; + + speaker_amp: speaker-audio-amplifier { + compatible = "simple-audio-amplifier"; + enable-gpios = <&gpio3 RK_PC0 GPIO_ACTIVE_HIGH>; + sound-name-prefix = "Speaker Amp"; + }; + + headphone_amp: headphones-audio-amplifier { + compatible = "simple-audio-amplifier"; + enable-gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>; + sound-name-prefix = "Headphones Amp"; + }; + + ir-receiver { + compatible = "gpio-ir-receiver"; + gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&ir_receiver_pin>; + }; + + gpio-leds { + compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&blue_led_pin>; + + led { + color = ; + function = LED_FUNCTION_INDICATOR; + function-enumerator = <1>; + gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_HIGH>; + }; + }; + + fan: pwm-fan { + compatible = "pwm-fan"; + cooling-levels = <0 70 75 80 100>; + fan-supply = <&vcc5v0_sys>; + pwms = <&pwm3 0 50000 0>; + #cooling-cells = <2>; + }; + + pwm-leds { + compatible = "pwm-leds"; + + led { + color = ; + function = LED_FUNCTION_INDICATOR; + function-enumerator = <2>; + max-brightness = <255>; + pwms = <&pwm2 0 25000 0>; + }; + }; + + sound { + compatible = "simple-audio-card"; + pinctrl-names = "default"; + pinctrl-0 = <&hp_detect>; + simple-audio-card,name = "Analog"; + simple-audio-card,aux-devs = <&speaker_amp>, <&headphone_amp>; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,hp-det-gpio = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>; + simple-audio-card,bitclock-master = <&daicpu>; + simple-audio-card,frame-master = <&daicpu>; + /*TODO: SARADC_IN3 is used as MIC detection / key input */ + + simple-audio-card,widgets = + "Microphone", "Onboard Microphone", + "Microphone", "Microphone Jack", + "Speaker", "Speaker", + "Headphone", "Headphones"; + + simple-audio-card,routing = + "Headphones", "LOUT1", + "Headphones", "ROUT1", + "Speaker", "LOUT2", + "Speaker", "ROUT2", + + "Headphones", "Headphones Amp OUTL", + "Headphones", "Headphones Amp OUTR", + "Headphones Amp INL", "LOUT1", + "Headphones Amp INR", "ROUT1", + + "Speaker", "Speaker Amp OUTL", + "Speaker", "Speaker Amp OUTR", + "Speaker Amp INL", "LOUT2", + "Speaker Amp INR", "ROUT2", + + /* single ended signal to LINPUT1 */ + "LINPUT1", "Microphone Jack", + "RINPUT1", "Microphone Jack", + /* differential signal */ + "LINPUT2", "Onboard Microphone", + "RINPUT2", "Onboard Microphone"; + + daicpu: simple-audio-card,cpu { + sound-dai = <&i2s0_8ch>; + system-clock-frequency = <12288000>; + }; + + daicodec: simple-audio-card,codec { + sound-dai = <&es8388>; + system-clock-frequency = <12288000>; + }; + }; + + vcc3v3_pcie30: vcc3v3-pcie30-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpios = <&gpio2 RK_PB6 GPIO_ACTIVE_HIGH>; + regulator-name = "vcc3v3_pcie30"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + startup-delay-us = <5000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc3v3_pcie_eth: vcc3v3-pcie-eth-regulator { + compatible = "regulator-fixed"; + gpios = <&gpio3 RK_PB4 GPIO_ACTIVE_LOW>; + regulator-name = "vcc3v3_pcie_eth"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + startup-delay-us = <50000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc3v3_wf: vcc3v3-wf-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpios = <&gpio2 RK_PC5 GPIO_ACTIVE_HIGH>; + regulator-name = "vcc3v3_wf"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + startup-delay-us = <50000>; + vin-supply = <&vcc5v0_sys>; + }; + + vcc5v0_sys: vcc5v0-sys-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + + vcc5v0_usb20: vcc5v0-usb20-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio3 RK_PD5 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_usb20_en>; + regulator-name = "vcc5v0_usb20"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc5v0_sys>; + }; +}; + +&combphy0_ps { + status = "okay"; +}; + +&combphy1_ps { + status = "okay"; +}; + +&combphy2_psu { + status = "okay"; +}; + +&cpu_b0 { + cpu-supply = <&vdd_cpu_big0_s0>; +}; + +&cpu_b1 { + cpu-supply = <&vdd_cpu_big0_s0>; +}; + +&cpu_b2 { + cpu-supply = <&vdd_cpu_big1_s0>; +}; + +&cpu_b3 { + cpu-supply = <&vdd_cpu_big1_s0>; +}; + +&cpu_l0 { + cpu-supply = <&vdd_cpu_lit_s0>; +}; + +&cpu_l1 { + cpu-supply = <&vdd_cpu_lit_s0>; +}; + +&cpu_l2 { + cpu-supply = <&vdd_cpu_lit_s0>; +}; + +&cpu_l3 { + cpu-supply = <&vdd_cpu_lit_s0>; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c0m2_xfer>; + status = "okay"; + + vdd_cpu_big0_s0: regulator@42 { + compatible = "rockchip,rk8602"; + reg = <0x42>; + fcs,suspend-voltage-selector = <1>; + regulator-name = "vdd_cpu_big0_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <550000>; + regulator-max-microvolt = <1050000>; + regulator-ramp-delay = <2300>; + vin-supply = <&vcc5v0_sys>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_cpu_big1_s0: regulator@43 { + compatible = "rockchip,rk8603", "rockchip,rk8602"; + reg = <0x43>; + fcs,suspend-voltage-selector = <1>; + regulator-name = "vdd_cpu_big1_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <550000>; + regulator-max-microvolt = <1050000>; + regulator-ramp-delay = <2300>; + vin-supply = <&vcc5v0_sys>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; +}; + +&i2c6 { + clock-frequency = <400000>; + status = "okay"; + + hym8563: rtc@51 { + compatible = "haoyu,hym8563"; + reg = <0x51>; + interrupt-parent = <&gpio0>; + interrupts = ; + #clock-cells = <0>; + clock-output-names = "hym8563"; + pinctrl-names = "default"; + pinctrl-0 = <&hym8563_int>; + wakeup-source; + }; +}; + +&i2c7 { + status = "okay"; + + /* PLDO2 vcca 1.8V, BUCK8 gated by PLDO2 being enabled */ + es8388: audio-codec@11 { + compatible = "everest,es8388"; + reg = <0x11>; + clocks = <&cru I2S0_8CH_MCLKOUT>; + clock-names = "mclk"; + AVDD-supply = <&vcc_1v8_s0>; + DVDD-supply = <&vcc_1v8_s0>; + HPVDD-supply = <&vcc_3v3_s0>; + PVDD-supply = <&vcc_3v3_s0>; + assigned-clocks = <&cru I2S0_8CH_MCLKOUT>; + assigned-clock-rates = <12288000>; + #sound-dai-cells = <0>; + }; +}; + +&i2s0_8ch { + pinctrl-names = "default"; + pinctrl-0 = <&i2s0_lrck + &i2s0_mclk + &i2s0_sclk + &i2s0_sdi0 + &i2s0_sdo0>; + status = "okay"; +}; + +&i2s2_2ch { + pinctrl-names = "default"; + pinctrl-0 = <&i2s2m0_lrck + &i2s2m0_sclk + &i2s2m0_sdi + &i2s2m0_sdo>; + status = "okay"; +}; + +/* phy1 - M.KEY socket */ +&pcie2x1l0 { + reset-gpios = <&gpio4 RK_PA5 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_wf>; + status = "okay"; +}; + +/* phy2 - right ethernet port */ +&pcie2x1l1 { + reset-gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie_eth>; + status = "okay"; +}; + +/* phy0 - left ethernet port */ +&pcie2x1l2 { + reset-gpios = <&gpio4 RK_PA2 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie_eth>; + status = "okay"; +}; + +&pcie30phy { + status = "okay"; +}; + +&pcie3x4 { + reset-gpios = <&gpio4 RK_PB6 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie30>; + status = "okay"; +}; + +&pinctrl { + hym8563 { + hym8563_int: hym8563-int { + rockchip,pins = <0 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + leds { + blue_led_pin: blue-led { + rockchip,pins = <3 RK_PA6 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + ir-receiver { + ir_receiver_pin: ir-receiver-pin { + rockchip,pins = <4 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + sound { + hp_detect: hp-detect { + rockchip,pins = <1 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + usb { + vcc5v0_usb20_en: vcc5v0-usb20-en { + rockchip,pins = <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pwm2 { + pinctrl-0 = <&pwm2m1_pins>; + pinctrl-names = "default"; + status = "okay"; +}; + +&pwm3 { + pinctrl-0 = <&pwm3m1_pins>; + status = "okay"; +}; + +&saradc { + vref-supply = <&vcc_1v8_s0>; + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + no-sdio; + no-sd; + non-removable; + max-frequency = <200000000>; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; + status = "okay"; +}; + +&sdmmc { + bus-width = <4>; + cap-sd-highspeed; + cd-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_LOW>; + disable-wp; + max-frequency = <150000000>; + no-sdio; + no-mmc; + sd-uhs-sdr104; + vmmc-supply = <&vcc_3v3_s3>; + vqmmc-supply = <&vccio_sd_s0>; + status = "okay"; +}; + +&sfc { + pinctrl-names = "default"; + pinctrl-0 = <&fspim1_pins>; + status = "okay"; + + spi_flash: flash@0 { + compatible = "jedec,spi-nor"; + reg = <0x0>; + spi-max-frequency = <100000000>; + spi-rx-bus-width = <4>; + spi-tx-bus-width = <1>; + }; +}; + +&spi2 { + assigned-clocks = <&cru CLK_SPI2>; + assigned-clock-rates = <200000000>; + num-cs = <1>; + pinctrl-names = "default"; + pinctrl-0 = <&spi2m2_cs0 &spi2m2_pins>; + status = "okay"; + + pmic@0 { + compatible = "rockchip,rk806"; + reg = <0x0>; + interrupt-parent = <&gpio0>; + interrupts = <7 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&pmic_pins>, <&rk806_dvs1_null>, + <&rk806_dvs2_null>, <&rk806_dvs3_null>; + spi-max-frequency = <1000000>; + + vcc1-supply = <&vcc5v0_sys>; + vcc2-supply = <&vcc5v0_sys>; + vcc3-supply = <&vcc5v0_sys>; + vcc4-supply = <&vcc5v0_sys>; + vcc5-supply = <&vcc5v0_sys>; + vcc6-supply = <&vcc5v0_sys>; + vcc7-supply = <&vcc5v0_sys>; + vcc8-supply = <&vcc5v0_sys>; + vcc9-supply = <&vcc5v0_sys>; + vcc10-supply = <&vcc5v0_sys>; + vcc11-supply = <&vcc_2v0_pldo_s3>; + vcc12-supply = <&vcc5v0_sys>; + vcc13-supply = <&vdd2_ddr_s3>; + vcc14-supply = <&vdd2_ddr_s3>; + vcca-supply = <&vcc5v0_sys>; + + gpio-controller; + #gpio-cells = <2>; + + rk806_dvs1_null: dvs1-null-pins { + pins = "gpio_pwrctrl2"; + function = "pin_fun0"; + }; + + rk806_dvs2_null: dvs2-null-pins { + pins = "gpio_pwrctrl2"; + function = "pin_fun0"; + }; + + rk806_dvs3_null: dvs3-null-pins { + pins = "gpio_pwrctrl3"; + function = "pin_fun0"; + }; + + regulators { + vdd_gpu_s0: dcdc-reg1 { + regulator-name = "vdd_gpu_s0"; + regulator-boot-on; + regulator-enable-ramp-delay = <400>; + regulator-min-microvolt = <550000>; + regulator-max-microvolt = <950000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_cpu_lit_s0: dcdc-reg2 { + regulator-name = "vdd_cpu_lit_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <550000>; + regulator-max-microvolt = <950000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_log_s0: dcdc-reg3 { + regulator-name = "vdd_log_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <675000>; + regulator-max-microvolt = <825000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <750000>; + }; + }; + + vdd_vdenc_s0: dcdc-reg4 { + regulator-name = "vdd_vdenc_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <550000>; + regulator-max-microvolt = <825000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_ddr_s0: dcdc-reg5 { + regulator-name = "vdd_ddr_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <675000>; + regulator-max-microvolt = <900000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <850000>; + }; + }; + + vdd2_ddr_s3: dcdc-reg6 { + regulator-name = "vdd2_ddr_s3"; + regulator-always-on; + regulator-boot-on; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vcc_2v0_pldo_s3: dcdc-reg7 { + regulator-name = "vdd_2v0_pldo_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <2000000>; + regulator-max-microvolt = <2000000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <2000000>; + }; + }; + + vcc_3v3_s3: dcdc-reg8 { + regulator-name = "vcc_3v3_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; + }; + }; + + vddq_ddr_s0: dcdc-reg9 { + regulator-name = "vddq_ddr_s0"; + regulator-always-on; + regulator-boot-on; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc_1v8_s3: dcdc-reg10 { + regulator-name = "vcc_1v8_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + avcc_1v8_s0: pldo-reg1 { + regulator-name = "avcc_1v8_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + /* shorted to avcc_1v8_s0 on the board */ + vcc_1v8_s0: pldo-reg2 { + regulator-name = "vcc_1v8_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + avdd_1v2_s0: pldo-reg3 { + regulator-name = "avdd_1v2_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1200000>; + regulator-max-microvolt = <1200000>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc_3v3_s0: pldo-reg4 { + regulator-name = "vcc_3v3_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vccio_sd_s0: pldo-reg5 { + regulator-name = "vccio_sd_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + pldo6_s3: pldo-reg6 { + regulator-name = "pldo6_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vdd_0v75_s3: nldo-reg1 { + regulator-name = "vdd_0v75_s3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <750000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <750000>; + }; + }; + + vdd_ddr_pll_s0: nldo-reg2 { + regulator-name = "vdd_ddr_pll_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <850000>; + regulator-max-microvolt = <850000>; + + regulator-state-mem { + regulator-off-in-suspend; + regulator-suspend-microvolt = <850000>; + }; + }; + + avdd_0v75_s0: nldo-reg3 { + regulator-name = "avdd_0v75_s0"; + regulator-always-on; + regulator-boot-on; + /* + * The schematic mentions that actual setting + * should be 0.8375V. RK3588 datasheet specifies + * maximum as 0.825V. So we set datasheet max + * here. + */ + regulator-min-microvolt = <825000>; + regulator-max-microvolt = <825000>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_0v85_s0: nldo-reg4 { + regulator-name = "vdd_0v85_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <850000>; + regulator-max-microvolt = <850000>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_0v75_s0: nldo-reg5 { + regulator-name = "vdd_0v75_s0"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <750000>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + }; + }; +}; + +&tsadc { + status = "okay"; +}; + +&u2phy2 { + status = "okay"; +}; + +&u2phy3 { + status = "okay"; +}; + +&u2phy2_host { + phy-supply = <&vcc5v0_usb20>; + status = "okay"; +}; + +&u2phy3_host { + phy-supply = <&vcc5v0_usb20>; + status = "okay"; +}; + +&uart2 { + pinctrl-0 = <&uart2m0_xfer>; + status = "okay"; +}; + +&uart9 { + pinctrl-0 = <&uart9m0_xfer>; + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usb_host1_ehci { + status = "okay"; +}; + +&usb_host1_ohci { + status = "okay"; +};