Update RK3326 Game Console Device Tree and related configurations

- Modify joypad compatibility to include "archr-joypad" in the device tree source.
- Adjust internal display settings to use the same reset GPIO and add enable GPIO.
- Remove SDIO card detect GPIO and mark it as non-removable.
- Update the joypad driver in the MIPI generator to use "archr-joypad".
- Fix Vulkan custom dispatchers to restrict header version checks.
- Add system manager timeout overrides for improved shutdown performance.
- Update kernel configuration to version 6.12.79 and enable BFQ I/O scheduler.
- Clean up GPU governor settings in post-update scripts.
- Update PPSSPP emulator to version 1.20.2 and apply necessary patches.
- Adjust SDL2 and Mesa package dependencies and versions.
- Update Vulkan headers and loader to version 1.4.347.
- Add udev rules for BFQ scheduler and systemd configuration for shutdown timeout.
- Implement input sense adjustments for better button mapping.
- Add clock speed settings to EmulationStation configuration.
- Disable rumble motor on boot to prevent unwanted vibrations.
This commit is contained in:
Douglas Teles
2026-04-02 12:23:19 -03:00
parent d56a9c4f7f
commit c7017775b1
33 changed files with 164 additions and 82 deletions
@@ -42,7 +42,7 @@
};
joypad: odroidgo3-joypad {
compatible = "odroidgo3-joypad";
compatible = "archr-joypad", "odroidgo3-joypad";
pwms = <&pwm0 0 200000000 0>;
pwm-names = "enable";
rumble-boost-weak = <0x0000>;
@@ -176,13 +176,18 @@
};
};
/* Soysauce panel: different reset GPIO + additional enable GPIO */
/* Soysauce panel: same reset GPIO as base (GPIO3_PC0), add enable GPIO */
&internal_display {
compatible = "archr,generic-dsi", "rocknix,generic-dsi";
reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
enable-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>;
};
/* Soysauce uses GPIO3_PB6 for BTN-A, not sdio card detect */
&sdio {
/delete-property/ cd-gpios;
non-removable;
};
&rk817_codec {
spk-ctl-gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
};
@@ -215,9 +220,6 @@
};
panel {
panel_reset: panel-reset {
rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
};
panel_enable: panel-enable {
rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
};
+1 -1
View File
@@ -281,7 +281,7 @@ def add_gpio_vol_keys(dt, overlay, gpio_keys_ovl):
def switch_joypad_to_mymini(overlay, jp_ovl):
# My mini has separate ADC channels for axis, so we need another driver
jp_ovl.set_property('compatible', "rocknix-joypad")
jp_ovl.set_property('compatible', "archr-joypad")
jp_ovl.set_property('io-channel-names', ["key-RY", "key-RX", "key-LY", "key-LX"])
jp_ovl.set_property('io-channels', [0xffffffff, 3, 0xffffffff, 3, 0xffffffff, 2, 0xffffffff, 1])
add_fixup(overlay, 'saradc', jp_ovl.path+'/__overlay__:io-channels:0')
@@ -17,7 +17,7 @@ index a36b299..8470951 100644
}
+#if VK_HEADER_VERSION >= 333
+#if VK_HEADER_VERSION >= 333 && VK_HEADER_VERSION <= 337
+namespace vk::detail {
+
+template <>
@@ -54,7 +54,7 @@ index 4bf7838..1bc0458 100644
+}
+
+#if VK_HEADER_VERSION >= 333
+#if VK_HEADER_VERSION >= 333 && VK_HEADER_VERSION <= 337
+namespace vk::detail {
+
+template <>
+1
View File
@@ -0,0 +1 @@
ACTION=="add|change", KERNEL=="mmcbl*", ATTR{queue/scheduler}="bfq"
@@ -0,0 +1,7 @@
[Manager]
# Reduce default service stop timeout from 90s to 5s.
# ArchR uses ext4 root with persistent storage at /storage/.
# Network services don't need graceful shutdown — only filesystem sync matters,
# which is handled by systemd's built-in shutdown ordering.
DefaultTimeoutStopSec=5s
DefaultTimeoutAbortSec=5s
+4
View File
@@ -274,6 +274,10 @@ post_makeinstall_target() {
safe_remove ${INSTALL}/etc/udev/rules.d
ln -sf /storage/.config/udev.rules.d ${INSTALL}/etc/udev/rules.d
# system manager timeout overrides
mkdir -p ${INSTALL}/etc/systemd/system.conf.d
cp -PR ${PKG_DIR}/config/system.conf.d/* ${INSTALL}/etc/systemd/system.conf.d/
# journald
ln -sf /storage/.cache/journald.conf.d ${INSTALL}/usr/lib/systemd/journald.conf.d
}
@@ -42,7 +42,7 @@
};
joypad: odroidgo3-joypad {
compatible = "odroidgo3-joypad";
compatible = "archr-joypad", "odroidgo3-joypad";
pwms = <&pwm0 0 200000000 0>;
pwm-names = "enable";
rumble-boost-weak = <0x0000>;
@@ -176,13 +176,18 @@
};
};
/* Soysauce panel: different reset GPIO + additional enable GPIO */
/* Soysauce panel: same reset GPIO as base (GPIO3_PC0), add enable GPIO */
&internal_display {
compatible = "archr,generic-dsi", "rocknix,generic-dsi";
reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
enable-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_HIGH>;
};
/* Soysauce uses GPIO3_PB6 for BTN-A, not sdio card detect */
&sdio {
/delete-property/ cd-gpios;
non-removable;
};
&rk817_codec {
spk-ctl-gpios = <&gpio3 RK_PC4 GPIO_ACTIVE_HIGH>;
};
@@ -215,9 +220,6 @@
};
panel {
panel_reset: panel-reset {
rockchip,pins = <3 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
};
panel_enable: panel-enable {
rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>;
};
@@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm64 6.12.61 Kernel Configuration
# Linux/arm64 6.12.79 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="aarch64-archr-linux-gnu-gcc-14.2.0 (GCC) 14.2.0"
CONFIG_CC_IS_GCC=y
@@ -818,7 +818,8 @@ CONFIG_BLK_PM=y
#
CONFIG_MQ_IOSCHED_DEADLINE=y
CONFIG_MQ_IOSCHED_KYBER=y
# CONFIG_IOSCHED_BFQ is not set
CONFIG_IOSCHED_BFQ=y
CONFIG_BFQ_GROUP_IOSCHED=y
# end of IO Schedulers
CONFIG_PADATA=y
@@ -105,14 +105,15 @@ get_gpu_performance_level() {
gpu_performance_level() {
case ${1} in
profile_peak)
set_gpu_gov performance
;;
auto|profile_standard)
auto|default)
set_gpu_gov ondemand
;;
low)
set_gpu_gov powersave
*)
set_gpu_gov ${1}
;;
esac
}
get_available_gpu_governors() {
echo "default"; tr " " "\n" < $GPU_FREQ/available_governors | grep \[a-z\]
}
@@ -293,3 +293,8 @@ if [ -e "/storage/.config/duckstation/settings.ini" ]; then
# no confirmation popup
sed -i 's/ConfirmPowerOff = true/ConfirmPowerOff = false/' /storage/.config/duckstation/settings.ini
fi
# Clean old GPU 'governor' values
sed -i '/gpuperf=low/d' /storage/.config/system/configs/system.cfg
sed -i '/gpuperf=profile_standard/d' /storage/.config/system/configs/system.cfg
sed -i '/gpuperf=profile_peak/d' /storage/.config/system/configs/system.cfg
@@ -20,7 +20,7 @@
################################################################################
PKG_NAME="ppsspp-lr"
PKG_VERSION="e49c0bd8836a8a8f678565357773386f1174d3f5"
PKG_VERSION="afbc66a318b86432642b532c575241f3716642ef" # v1.20.2
PKG_LICENSE="GPLv2"
PKG_SITE="https://github.com/hrydgard/ppsspp"
PKG_URL="https://github.com/hrydgard/ppsspp.git"
@@ -1,8 +1,7 @@
diff --git a/Core/System.cpp b/Core/System.cpp
index cb6fc34fa..829a5795a 100644
--- a/Core/System.cpp
+++ b/Core/System.cpp
@@ -619,12 +619,7 @@ std::string PSP_GetLoading() {
diff --git a/Core/Util/PathUtil.cpp b/Core/Util/PathUtil.cpp
--- a/Core/Util/PathUtil.cpp
+++ b/Core/Util/PathUtil.cpp
@@ -45,12 +45,7 @@
Path GetSysDirectory(PSPDirectories directoryType) {
const Path &memStickDirectory = g_Config.memStickDirectory;
Path pspDirectory;
@@ -13,6 +12,6 @@ index cb6fc34fa..829a5795a 100644
- pspDirectory = memStickDirectory / "PSP";
- }
+ pspDirectory = memStickDirectory / "PSP";
switch (directoryType) {
case DIRECTORY_PSP:
@@ -1,10 +1,10 @@
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -395,6 +395,7 @@
@@ -413,6 +413,7 @@
# NEON optimizations in libpng17 seem to cause PNG load errors, see #14485.
add_compile_definitions(PNG_ARM_NEON_OPT=0)
+ add_compile_options(-Ofast -fno-tree-slp-vectorize)
add_compile_options(-Wall -Werror=return-type -Wno-unused-function -Wno-sign-compare -Wno-unused-but-set-variable "$<$<COMPILE_LANGUAGE:CXX>:-Wno-reorder>" -Wno-unknown-pragmas -Wno-unused-value -Wno-unused-variable)
add_compile_options(-Wall -Werror=return-type -Wno-unused-function -Wno-sign-compare -Wno-unused-but-set-variable "$<$<COMPILE_LANGUAGE:CXX>:-Wno-reorder>" -Wno-unknown-pragmas -Wno-unused-value -Wno-unused-variable -Wno-error=incompatible-pointer-types)
if(NOT CLANG)
# This one is very useful but has many false positives.
@@ -1,10 +1,10 @@
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -396,6 +396,7 @@
@@ -414,6 +414,7 @@
add_compile_definitions(PNG_ARM_NEON_OPT=0)
add_compile_options(-Ofast -fno-tree-slp-vectorize)
+ add_compile_options(-mno-outline-atomics)
add_compile_options(-Wall -Werror=return-type -Wno-unused-function -Wno-sign-compare -Wno-unused-but-set-variable "$<$<COMPILE_LANGUAGE:CXX>:-Wno-reorder>" -Wno-unknown-pragmas -Wno-unused-value -Wno-unused-variable)
add_compile_options(-Wall -Werror=return-type -Wno-unused-function -Wno-sign-compare -Wno-unused-but-set-variable "$<$<COMPILE_LANGUAGE:CXX>:-Wno-reorder>" -Wno-unknown-pragmas -Wno-unused-value -Wno-unused-variable -Wno-error=incompatible-pointer-types)
if(NOT CLANG)
# This one is very useful but has many false positives.
@@ -0,0 +1,45 @@
--- a/libretro/libretro_vulkan.cpp
+++ b/libretro/libretro_vulkan.cpp
@@ -109,27 +109,34 @@ static VKAPI_ATTR VkResult VKAPI_CALL vkCreateDevice_libretro(VkPhysicalDevice p
newInfo.enabledExtensionCount = (uint32_t)enabledExtensionNames.size();
newInfo.ppEnabledExtensionNames = newInfo.enabledExtensionCount ? enabledExtensionNames.data() : nullptr;
- // Then check for VkPhysicalDeviceFeatures2 chaining or pEnabledFeatures to enable required features. Note that when both
- // structs are present Features2 takes precedence. vkCreateDevice parameters don't give us a simple way to detect
- // VK_KHR_get_physical_device_properties2 usage so we'll always try both paths.
+ // Check for VkPhysicalDeviceFeatures2 in pNext chain. Per Vulkan spec, pEnabledFeatures
+ // must be NULL when VkPhysicalDeviceFeatures2 is present in pNext.
std::unordered_map<VkPhysicalDeviceFeatures *, VkPhysicalDeviceFeatures> originalFeaturePointers;
VkPhysicalDeviceFeatures placeholderEnabledFeatures{};
+ bool hasFeatures2InChain = false;
for (const VkBaseOutStructure *next = (const VkBaseOutStructure *)pCreateInfo->pNext; next != nullptr;) {
if (next->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2) {
VkPhysicalDeviceFeatures *enabledFeatures = &((VkPhysicalDeviceFeatures2 *)next)->features;
originalFeaturePointers.try_emplace(enabledFeatures, *enabledFeatures);
+ hasFeatures2InChain = true;
}
next = (const VkBaseOutStructure *)next->pNext;
}
- if (newInfo.pEnabledFeatures) {
- placeholderEnabledFeatures = *newInfo.pEnabledFeatures;
- }
+ if (!hasFeatures2InChain) {
+ // Only use pEnabledFeatures when VkPhysicalDeviceFeatures2 is NOT in pNext chain.
+ if (newInfo.pEnabledFeatures) {
+ placeholderEnabledFeatures = *newInfo.pEnabledFeatures;
+ }
- newInfo.pEnabledFeatures = &placeholderEnabledFeatures;
- originalFeaturePointers.try_emplace((VkPhysicalDeviceFeatures *)newInfo.pEnabledFeatures, *newInfo.pEnabledFeatures);
+ newInfo.pEnabledFeatures = &placeholderEnabledFeatures;
+ originalFeaturePointers.try_emplace((VkPhysicalDeviceFeatures *)newInfo.pEnabledFeatures, *newInfo.pEnabledFeatures);
+ } else {
+ // Ensure pEnabledFeatures is NULL when features2 is used (Vulkan spec requirement).
+ newInfo.pEnabledFeatures = nullptr;
+ }
for (const auto& pair : originalFeaturePointers) {
for (uint32_t i = 0; i < sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32); i++) {
@@ -4,7 +4,7 @@
# Copyright (C) 2022-present JELOS (https://github.com/JustEnoughLinuxOS)
. /etc/profile
set_kill set "-9 duckstation-mini"
set_kill set "-9 AppRun.wrapped"
# Filesystem vars
IMMUTABLE_CONF_DIR="/usr/config/duckstation"
@@ -120,7 +120,10 @@ fi
fi
#Retroachievements
/usr/bin/cheevos_duckstation.sh
# Disabled, not working. Seems like Duckstation changed the token encruption...
# /usr/bin/cheevos_duckstation.sh
sed -i '/\[Cheevos\]/,/^\s*$/s/Enabled =.*/Enabled = false/' ${CONF_FILE}
#Run Duckstation
${EMUPERF} duckstation-sa -fullscreen -bigpicture -nogui -- "${1}" > /dev/null 2>&1
@@ -5,7 +5,7 @@
PKG_NAME="ppsspp-sa"
PKG_SITE="https://github.com/hrydgard/ppsspp"
PKG_URL="${PKG_SITE}.git"
PKG_VERSION="eb859735feddf88dbe651763f366a7705612113a" # v1.20.1
PKG_VERSION="afbc66a318b86432642b532c575241f3716642ef" # v1.20.2
CHEAT_DB_VERSION="7c9fe1ae71155626cea767aed53f968de9f4051f" # Update cheat.db (17/01/2026)
PKG_LICENSE="GPLv2"
PKG_DEPENDS_TARGET="toolchain libzip SDL2 zlib zip"
@@ -74,26 +74,22 @@ index 04c16ca7a0..cecc4b7f0f 100644
g_display.pixel_yres = g_DesktopHeight;
}
diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp
index d7a97347b1..531997fba0 100644
--- a/UI/MainScreen.cpp
+++ b/UI/MainScreen.cpp
@@ -1454,19 +1454,6 @@ void MainScreen::CreateViews() {
@@ -1459,18 +1459,6 @@
LinearLayout *rightColumnItems = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(FILL_PARENT, WRAP_CONTENT));
rightColumnItems->SetSpacing(0.0f);
ViewGroup *logo = new LogoView(false, new LinearLayoutParams(FILL_PARENT, 80.0f));
-#if !defined(MOBILE_DEVICE)
- auto gr = GetI18NCategory(I18NCat::GRAPHICS);
- ImageID icon(g_Config.bFullScreen ? "I_RESTORE" : "I_FULLSCREEN");
- UI::Button *fullscreenButton = logo->Add(new Button("", icon, new AnchorLayoutParams(48, 48, NONE, 0, 0, NONE, Centering::None)));
- Button *fullscreenButton = logo->Add(new Button("", ImageID(), new AnchorLayoutParams(48, 48, NONE, 0, 0, NONE, Centering::None)));
- fullscreenButton->SetIgnoreText(true);
- fullscreenButton->OnClick.Add([fullscreenButton](UI::EventParams &e) {
- if (fullscreenButton) {
- fullscreenButton->SetImageID(ImageID(!g_Config.bFullScreen ? "I_RESTORE" : "I_FULLSCREEN"));
- }
- fullscreenButton->OnClick.Add([](UI::EventParams &e) {
- g_Config.bFullScreen = !g_Config.bFullScreen;
- System_ApplyFullscreenState();
- });
- fullscreenButton->SetImageIDFunc([]() {
- return g_Config.bFullScreen ? ImageID("I_RESTORE") : ImageID("I_FULLSCREEN");
- });
-#endif
rightColumnItems->Add(logo);
LinearLayout *rightColumnChoices = rightColumnItems;
@@ -29,6 +29,7 @@ IRES=$(get_setting internal_resolution "${PLATFORM}" "${GAME}")
GRENDERER=$(get_setting graphics_backend "${PLATFORM}" "${GAME}")
SKIPB=$(get_setting skip_buffer_effects "${PLATFORM}" "${GAME}")
VSYNC=$(get_setting vsync "${PLATFORM}" "${GAME}")
CLOCK_SPEED=$(get_setting clock_speed "${PLATFORM}" "${GAME}")
#Set the cores to use
CORES=$(get_setting "cores" "${PLATFORM}" "${GAME}")
@@ -89,6 +90,15 @@ fi
sed -i '/^VSyncInterval =/c\VSyncInterval = False' ${CONF_DIR}/${PPSSPP_INI}
fi
#Clock Speed
if [ "${CLOCK_SPEED}" = "222" ]; then
sed -i '/^CPUSpeed =/c\CPUSpeed = 222' ${CONF_DIR}/${PPSSPP_INI}
elif [ "${CLOCK_SPEED}" = "333" ]; then
sed -i '/^CPUSpeed =/c\CPUSpeed = 333' ${CONF_DIR}/${PPSSPP_INI}
else
sed -i '/^CPUSpeed =/c\CPUSpeed = 0' ${CONF_DIR}/${PPSSPP_INI}
fi
#Retroachievements
/usr/bin/cheevos_ppsspp.sh
@@ -10,7 +10,7 @@ PKG_URL="https://www.libsdl.org/release/SDL2-${PKG_VERSION}.tar.gz"
PKG_DEPENDS_TARGET="toolchain alsa-lib systemd dbus pulseaudio libdrm SDL2:host"
PKG_LONGDESC="Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware."
PKG_BUILD_FLAGS="+speed"
PKG_DEPENDS_HOST="toolchain:host distutilscross:host"
PKG_DEPENDS_HOST="toolchain:host distutilscross:host libX11:host"
if [ ! "${OPENGL_SUPPORT}" = "no" ]; then
PKG_DEPENDS_TARGET+=" ${OPENGL} glu"

Some files were not shown because too many files have changed in this diff Show More