RK3326: better support for EE clones

This commit is contained in:
Danil Zagoskin
2025-11-09 20:48:38 +00:00
parent 5b69187c81
commit 3aba5b0bb2
10 changed files with 276 additions and 38 deletions

View File

@@ -33,7 +33,7 @@
<file>rk3326-powkiddy-rgb10x</file>
<file>rk3326-magicx-xu10</file>
<file>rk3326-magicx-xu-mini-m</file>
<file>rk3326-gameconsole-r36max</file>
<file>rk3326-gameconsole-eeclone</file>
</b>
</RK3326>
<RK3399 mkimage_options="dtb,extlinux,uboot" fdt="device_trees/rk3399-anbernic-rg552.dtb" fdt_type="fdt" dtb_prefix="rockchip">

View File

@@ -40,7 +40,7 @@ if itest.w ${hwid_adc} > 139 && itest.w ${hwid_adc} < 191; then
elif itest.w ${hwid_adc} > 999 && itest.w ${hwid_adc} < 1051; then
setenv fdtfile "rk3326-magicx-xu-mini-m.dtb"
elif itest.w ${hwid_adc} > 489 && itest.w ${hwid_adc} < 541; then
setenv fdtfile "rk3326-gameconsole-r36max.dtb"
setenv fdtfile "rk3326-gameconsole-eeclone.dtb"
else
echo "Unexpected ADC value ${hwid_adc}, falling back to OGA dtb"
setenv fdtfile "rk3326-odroid-go2.dtb"

View File

@@ -1,7 +1,7 @@
new file mode 100644
--- /dev/null
+++ b/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-r36max.dts
@@ -0,0 +1,884 @@
+++ b/arch/arm64/boot/dts/rockchip/rk3326-gameconsole-eeclone.dts
@@ -0,0 +1,926 @@
+/// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+/*
+ * Copyright (c) 2024-present ROCKNIX (https://github.com/ROCKNIX)
@@ -16,15 +16,15 @@ new file mode 100644
+#include "rk3326.dtsi"
+
+/ {
+ model = "K36 family clone";
+ compatible = "gameconsole,r36max", "rockchip,rk3326";
+ model = "Generic EE clone";
+ compatible = "gameconsole,eeclone", "rockchip,rk3326";
+
+ aliases {
+ mmc0 = &emmc;
+ mmc1 = &sdmmc;
+ mmc2 = &sdio;
+ serial1 = &uart2;
+ serial2 = &uart1;
+ serial2 = &uart5;
+ };
+
+ backlight: backlight {
@@ -93,6 +93,9 @@ new file mode 100644
+ keyup-threshold-microvolt = <1800000>;
+ poll-interval = <100>;
+
+ /* disabled by default, dtbo may enable it when needed */
+ status = "disabled";
+
+ button-vol-up {
+ press-threshold-microvolt = <15000>;
+ label = "VOLUMEUP";
@@ -266,6 +269,30 @@ new file mode 100644
+ };
+ };
+
+ leds: gpio-leds {
+ compatible = "gpio-leds";
+ pinctrl-0 = <&led_pins>;
+ pinctrl-names = "default";
+
+ /* charge_red_gpio = <&gpio0 17 0>; */
+ led-0 {
+ color = <LED_COLOR_ID_RED>;
+ default-state = "off";
+ function = LED_FUNCTION_CHARGING;
+ linux,default-trigger = "battery-charging-blink-full-solid";
+ gpios = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
+ };
+
+ /* charge_blue_gpio = <&gpio0 0 0>; */
+ led-1 {
+ color = <LED_COLOR_ID_BLUE>;
+ default-state = "on";
+ function = LED_FUNCTION_POWER;
+ linux,default-trigger = "default-on";
+ gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
+ };
+ };
+
+ spk_amp: audio-amplifier {
+ compatible = "simple-audio-amplifier";
+ enable-gpios = <&gpio3 RK_PA7 GPIO_ACTIVE_HIGH>;
@@ -304,10 +331,11 @@ new file mode 100644
+
+ vccsys: vccsys {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc3v8_sys";
+ regulator-name = "vcc5v0_sys";
+ regulator-always-on;
+ regulator-min-microvolt = <3800000>;
+ regulator-max-microvolt = <3800000>;
+ regulator-boot-on;
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ };
+
+ vcc-phy-regulator {
@@ -331,19 +359,19 @@ new file mode 100644
+ };
+ };
+
+ vcc_host: vcc_host {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_host";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>;
+ vcc_host: vcc_host {
+ compatible = "regulator-fixed";
+ regulator-name = "vcc_host";
+ regulator-min-microvolt = <5000000>;
+ regulator-max-microvolt = <5000000>;
+ gpio = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>;
+ pinctrl-0 = <&vcc5_usb>;
+ pinctrl-names = "default";
+ enable-active-high;
+ regulator-always-on;
+ regulator-boot-on;
+ vin-supply = <&usb_midu>;
+ };
+ enable-active-high;
+ regulator-always-on;
+ regulator-boot-on;
+ vin-supply = <&usb_midu>;
+ };
+};
+
+&dmc {
@@ -451,13 +479,13 @@ new file mode 100644
+ vcc6-supply = <&vccsys>;
+ vcc7-supply = <&vcc_3v0>;
+ vcc8-supply = <&vccsys>;
+ vcc9-supply = <&usb_midu>;
+
+ regulators {
+ vdd_logic: DCDC_REG1 {
+ regulator-name = "vdd_logic";
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1150000>;
+ regulator-min-microvolt = <950000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-initial-mode = <0x02>;
+ regulator-ramp-delay = <6001>;
+ regulator-always-on;
+ regulator-boot-on;
@@ -473,6 +501,7 @@ new file mode 100644
+ regulator-min-microvolt = <850000>;
+ regulator-max-microvolt = <1350000>;
+ regulator-ramp-delay = <6001>;
+ regulator-initial-mode = <0x02>;
+ regulator-always-on;
+ regulator-boot-on;
+
@@ -486,6 +515,7 @@ new file mode 100644
+ regulator-name = "vcc_ddr";
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-initial-mode = <0x02>;
+
+ regulator-state-mem {
+ regulator-on-in-suspend;
@@ -496,6 +526,7 @@ new file mode 100644
+ regulator-name = "vcc_3v0";
+ regulator-min-microvolt = <3000000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-initial-mode = <0x02>;
+ regulator-always-on;
+ regulator-boot-on;
+
@@ -573,24 +604,24 @@ new file mode 100644
+ vcc_sd: LDO_REG6 {
+ regulator-name = "vcc_sd";
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3000000>;
+ regulator-always-on;
+ regulator-boot-on;
+ regulator-max-microvolt = <3300000>;
+
+ regulator-state-mem {
+ regulator-on-in-suspend;
+ regulator-suspend-microvolt = <3000000>;
+ regulator-suspend-microvolt = <3300000>;
+ };
+ };
+
+ vcc2v8_dvp: LDO_REG7 {
+ regulator-name = "vcc2v8_dvp";
+ regulator-min-microvolt = <2800000>;
+ regulator-max-microvolt = <2800000>;
+ regulator-min-microvolt = <1800000>;
+ regulator-max-microvolt = <3300000>;
+ regulator-always-on;
+ regulator-boot-on;
+
+ regulator-state-mem {
+ regulator-off-in-suspend;
+ regulator-suspend-microvolt = <2800000>;
+ regulator-suspend-microvolt = <3300000>;
+ };
+ };
+
@@ -611,6 +642,8 @@ new file mode 100644
+ regulator-min-microvolt = <1500000>;
+ regulator-max-microvolt = <1500000>;
+ regulator-name = "vdd1v5_dvp";
+ regulator-always-on;
+ regulator-boot-on;
+
+ regulator-state-mem {
+ regulator-off-in-suspend;
@@ -620,12 +653,13 @@ new file mode 100644
+
+ usb_midu: BOOST {
+ regulator-name = "usb_midu";
+ regulator-min-microvolt = <4700000>;
+ regulator-min-microvolt = <4900000>;
+ regulator-max-microvolt = <5400000>;
+ regulator-always-on;
+ regulator-boot-on;
+ };
+
+ /*
+ otg_switch: OTG_SWITCH {
+ regulator-name = "otg_switch";
+
@@ -633,6 +667,7 @@ new file mode 100644
+ regulator-off-in-suspend;
+ };
+ };
+ */
+ };
+
+ rk817_charger: charger {
@@ -740,7 +775,7 @@ new file mode 100644
+ };
+
+ u2phy_otg: otg-port {
+ status = "okay";
+ status = "disabled";
+ };
+};
+
@@ -799,8 +834,15 @@ new file mode 100644
+
+ vcc5-usb {
+ vcc5_usb: vcc5-usb {
+ rockchip,pins = <0x03 0x04 0x00 0x9f>;
+ phandle = <0xb2>;
+ rockchip,pins = <3 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>;
+ };
+ };
+
+ gpio-led {
+ led_pins: led-pins {
+ rockchip,pins =
+ <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>, /* charge_blue_gpio = <&gpio0 0 0>; */
+ <0 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; /* charge_red_gpio = <&gpio0 17 0>; */
+ };
+ };
+
@@ -833,7 +875,7 @@ new file mode 100644
+ };
+};
+
+&uart1 {
+&uart5 {
+ status = "okay";
+};
+&uart2 {

View File

@@ -0,0 +1,11 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX)
cat <<EOF >/storage/.config/profile.d/001-device_config
# Device Features
DEVICE_PLAYBACK_PATH_SPK="HP"
DEVICE_PLAYBACK_PATH_HP="SPK"
DEVICE_BATTERY_LED_STATUS="true"
DEVICE_TEMP_SENSOR="/sys/devices/virtual/thermal/thermal_zone0/temp"
EOF

View File

@@ -0,0 +1,46 @@
#!/bin/bash
set -e
STOCKPART="/dev/disk/by-label/EMUELEC"
DTBDIR="/flash/stock"
DTBOPATH="/flash/overlays/mipi-panel.dtbo"
TMPDIR="/tmp/flash_prepare"
# no-op if dtbo already exists
[ -f "${DTBOPATH}" ] && exit 0
# Obtain stock dtb if needed and possible
if ! ls "${DTBDIR}"/*.dtb; then
if [ ! -L "${STOCKPART}" ]; then
echo "No stock dtb nor stock firmware partition found. Skipping dtbo generation" >&2
exit 1
fi
# Prepare temporary destination
mkdir -p "${TMPDIR}/${DTBDIR}"
# Prepare source
mkdir -p /tmp/stock
mount "${STOCKPART}" /tmp/stock
# Copy all the dtbs (actually, there should be exactly one)
cp /tmp/stock/*.dtb "${TMPDIR}/${DTBDIR}"
fi
STOCKDTB=$(ls "${DTBDIR}"/*.dtb "${TMPDIR}/${DTBDIR}"/*.dtb | head -1)
mkdir -p "${TMPDIR}/$(dirname ${DTBOPATH})"
echo "Preparing dtbo. This may take about a minute"
/usr/libexec/generic-dsi/rocknix_dtbo.py "${STOCKDTB}" -o "${TMPDIR}/${DTBOPATH}"
# Modifications to be made on firmaware partition
if [ -d "${TMPDIR}/flash" ]; then
mount -o remount,rw /flash
rsync -av ${TMPDIR}/flash/ /flash || true
# Cleanup and reboot
mount -o remount,ro /flash
sync
fi
[ -f "${DTBOPATH}" ] && reboot

View File

@@ -0,0 +1,9 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX)
cat <<EOF >/storage/.config/profile.d/010-led_control
DEVICE_LED_CONTROL="false"
DEVICE_LED_BRIGHTNESS="false"
DEVICE_LED_CHARGING="false"
EOF

View File

@@ -0,0 +1,58 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX)
#Set mupen64-plus-sa config for OGA
if [ ! -d "/storage/.config/mupen64plus" ]; then
mkdir -p "/storage/.config/mupen64plus/"
cp -r /usr/local/share/mupen64plus/mupen64plus.cfg* /storage/.config/mupen64plus/
fi
if [ -f "/storage/.config/mupen64plus/mupen64plus.cfg.gen_2s" ]; then
rm /storage/.config/mupen64plus/mupen64plus.cfg
cp /storage/.config/mupen64plus/mupen64plus.cfg.gen_2s /storage/.config/mupen64plus/mupen64plus.cfg
fi
#Set drastic-sa config for OGA
if [ ! -d "/storage/.config/drastic" ]; then
mkdir -p "/storage/.config/drastic"
cp -r "/usr/config/drastic" "/storage/.config/"
fi
if [ -f "/storage/.config/drastic/config/drastic.cfg.gen_2s" ]; then
cp /storage/.config/drastic/config/drastic.cfg.gen_2s /storage/.config/drastic/config/drastic.cfg
fi
#Set ppsspp config for OGA
if [ ! -d "/storage/.config/ppsspp" ]; then
mkdir -p "/storage/.config/ppsspp"
cp -r "/usr/config/ppsspp" "/storage/.config/"
fi
#Map ppsspp controls
if grep OGABE -q "/storage/.config/ppsspp/PSP/SYSTEM/controls.ini"; then
exit 1
else
cat <<EOF >/storage/.config/ppsspp/PSP/SYSTEM/controls.ini
#OGABE
[ControlMapping]
Up = 10-19
Down = 10-20
Left = 10-21
Right = 10-22
Circle = 10-189
Cross = 10-190
Square = 10-188
Triangle = 10-191
Start = 10-197
Select = 10-196
L = 10-193
R = 10-192
An.Up = 10-4003
An.Down = 10-4002
An.Left = 10-4001
An.Right = 10-4000
Fast-forward = 1-61
Pause = 10-106
Save State = 10-4010
Load State = 10-4008
EOF
fi

View File

@@ -0,0 +1,8 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2023 JELOS (https://github.com/JustEnoughLinuxOS)
cat <<EOF >/storage/.config/profile.d/050-modifiers
DEVICE_FUNC_KEYA_MODIFIER="BTN_MODE"
DEVICE_FUNC_KEYB_MODIFIER="BTN_THUMBR"
EOF

View File

@@ -0,0 +1,54 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX)
# Simple script to watch the battery capacity and
# turn the power LED to different states:
# Blinking red when charge is less than 20%
# Blue turns off when charge is less than 10%
RED_TRIGGER=/sys/class/leds/red\:charging/trigger
BLUE_TRIGGER=/sys/class/leds/blue\:status/trigger
function red_led() {
case $1 in
none) echo none > ${RED_TRIGGER};;
blink) echo timer > ${RED_TRIGGER};;
steady) echo default-on > ${RED_TRIGGER};;
esac
}
function blue_led() {
case $1 in
none) echo none > ${BLUE_TRIGGER};;
blink) echo timer > ${BLUE_TRIGGER};;
steady) echo default-on > ${BLUE_TRIGGER};;
esac
}
while true
do
CAP=$(cat /sys/class/power_supply/battery/capacity)
STAT=$(cat /sys/class/power_supply/battery/status)
if [[ ${STAT} == "Discharging" ]]; then
if (( ${CAP} <= 10 )); then
blue_led none
red_led blink
continue
elif (( ${CAP} <= 20 )); then
blue_led steady
red_led blink
else
blue_led steady
red_led none
fi
elif (( ${CAP} <= 95 )); then
blue_led steady
red_led steady
else
blue_led steady
red_led none
fi
sleep 15
done

View File

@@ -2,12 +2,19 @@
# Copyright (C) 2024 ROCKNIX (https://github.com/ROCKNIX)
PKG_NAME="generic-dsi"
PKG_VERSION="0.1.0"
PKG_VERSION="fa1bd4c5b55bb60bfded06a1c1964328b871345d"
PKG_LICENSE="GPL"
PKG_LONGDESC="generic DSI panel driver"
PKG_LONGDESC="generic DSI panel driver and stock DTB import scripts"
PKG_DEPENDS_TARGET="pyFDT"
PKG_URL="https://github.com/stolen/overlay_server/archive/${PKG_VERSION}.zip"
PKG_TOOLCHAIN="manual"
unpack() {
mkdir -p "${PKG_BUILD}"
cd "${PKG_BUILD}"
unzip "${SOURCES}/${PKG_NAME}/${PKG_SOURCE_NAME}"
}
### For development. Easier to check if code compiles and works.
### No need for a long build-transfer-reboot-wait-reboot-check loop
make_target() {
@@ -21,6 +28,9 @@ make_target() {
makeinstall_target() {
mkdir -p "${INSTALL}/usr/libexec/generic-dsi"
# rocknix_dtbo.py is a better script handling not just panel, but also joypad, headphones, etc.
cp -v "${PKG_BUILD}/"overlay_server*"/rocknix_dtbo.py" "${INSTALL}/usr/libexec/generic-dsi/"
# importpanel.py still here because it's simple, documented in wiki and performs just one task well
cp -v "${PKG_DIR}/scripts/importpanel.py" "${INSTALL}/usr/libexec/generic-dsi/"
}