From a9b9b248de6010c40ff46f7133871207041b8d52 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Thu, 25 Jul 2024 22:00:55 +0200 Subject: [PATCH 1/9] fix: forcibly remove bootloader and update files when update is complete --- package/recalbox-initramfs/init | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/package/recalbox-initramfs/init b/package/recalbox-initramfs/init index 8c4c09a227..6da6a28980 100755 --- a/package/recalbox-initramfs/init +++ b/package/recalbox-initramfs/init @@ -89,8 +89,12 @@ do_clean_safeboot() { do_clean_update() { # delete content of /boot_root/update/ - rm -rf /boot_root/update/ - mkdir /boot_root/update/ + rm -rf /boot_root/update/* + # Remove useless files + [ -f /boot_root/boot.lst ] && rm /boot_root/boot.lst + [ -f /boot_root/boot.md5 ] && rm /boot_root/boot.md5 + [ -f /boot_root/pre-upgrade.sh ] && rm /boot_root/pre-upgrade.sh + [ -d /boot_root/boot/bootloader ] && rm -rf /boot_root/boot/bootloader } do_update() { @@ -109,10 +113,6 @@ do_update() { return 1 fi - # remove useless files - rm /boot_root/boot.lst - rm /boot_root/boot.md5 - rm /boot_root/pre-upgrade.sh return 0 # mask errors } @@ -161,7 +161,6 @@ do_bootloader_update() { error=1 fi done - rm -rf "$sector_dir" done return $error } -- GitLab From 8d20baab32ef97527789b6c66f1bbe520832ae63 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Tue, 8 Oct 2024 23:05:54 +0200 Subject: [PATCH 2/9] chore(rg353x): remove useless package and files --- Config.in | 1 - package/uboot-rg353x/Config.in | 7 - package/uboot-rg353x/assets/battery_0.bmp | Bin 4712 -> 0 bytes package/uboot-rg353x/assets/battery_1.bmp | Bin 5034 -> 0 bytes package/uboot-rg353x/assets/battery_2.bmp | Bin 5260 -> 0 bytes package/uboot-rg353x/assets/battery_3.bmp | Bin 5786 -> 0 bytes package/uboot-rg353x/assets/battery_4.bmp | Bin 6214 -> 0 bytes package/uboot-rg353x/assets/battery_5.bmp | Bin 6378 -> 0 bytes package/uboot-rg353x/assets/battery_fail.bmp | Bin 5282 -> 0 bytes package/uboot-rg353x/assets/logo.bmp | Bin 1228938 -> 0 bytes package/uboot-rg353x/assets/logo2.bmp | Bin 1228938 -> 0 bytes ...-address-of-packed-member-to-warning.patch | 24 --- ...002-Remove-a-few-broken-device-trees.patch | 46 ----- .../uboot-rg353x/old/0003-Fix-scripts.patch | 179 ------------------ .../old/0004-Fixes-for-GCC-12.2.patch | 25 --- .../old/0006-fixup-path-to-dtc.patch | 33 ---- .../uboot-rg353x/old/0007-set-part-name.patch | 25 --- package/uboot-rg353x/uboot-rg353x.mk | 36 ---- package/uboot-rg353x/uboot-rg353x.mk.old | 40 ---- 19 files changed, 416 deletions(-) delete mode 100644 package/uboot-rg353x/Config.in delete mode 100644 package/uboot-rg353x/assets/battery_0.bmp delete mode 100644 package/uboot-rg353x/assets/battery_1.bmp delete mode 100644 package/uboot-rg353x/assets/battery_2.bmp delete mode 100644 package/uboot-rg353x/assets/battery_3.bmp delete mode 100644 package/uboot-rg353x/assets/battery_4.bmp delete mode 100644 package/uboot-rg353x/assets/battery_5.bmp delete mode 100644 package/uboot-rg353x/assets/battery_fail.bmp delete mode 100644 package/uboot-rg353x/assets/logo.bmp delete mode 100644 package/uboot-rg353x/assets/logo2.bmp delete mode 100644 package/uboot-rg353x/old/0001-address-of-packed-member-to-warning.patch delete mode 100644 package/uboot-rg353x/old/0002-Remove-a-few-broken-device-trees.patch delete mode 100644 package/uboot-rg353x/old/0003-Fix-scripts.patch delete mode 100644 package/uboot-rg353x/old/0004-Fixes-for-GCC-12.2.patch delete mode 100644 package/uboot-rg353x/old/0006-fixup-path-to-dtc.patch delete mode 100644 package/uboot-rg353x/old/0007-set-part-name.patch delete mode 100644 package/uboot-rg353x/uboot-rg353x.mk delete mode 100644 package/uboot-rg353x/uboot-rg353x.mk.old diff --git a/Config.in b/Config.in index af559bc07f..48cba4fdf3 100644 --- a/Config.in +++ b/Config.in @@ -31,7 +31,6 @@ menu "Recalbox" menu "u-boot" source "$BR2_EXTERNAL_RECALBOX_PATH/package/uboot-xu4/Config.in" source "$BR2_EXTERNAL_RECALBOX_PATH/package/uboot-odroidgo2/Config.in" - source "$BR2_EXTERNAL_RECALBOX_PATH/package/uboot-rg353x/Config.in" endmenu endmenu menu "Video" diff --git a/package/uboot-rg353x/Config.in b/package/uboot-rg353x/Config.in deleted file mode 100644 index adc46624c4..0000000000 --- a/package/uboot-rg353x/Config.in +++ /dev/null @@ -1,7 +0,0 @@ -config BR2_PACKAGE_UBOOT_RG353X - bool "U-Boot for Anbernic RG353x" - select BR2_PACKAGE_HOST_DTC - help - u-boot for Anbernic RG35P/V/M - - https://github.com/pkegg/RG353P_uboot diff --git a/package/uboot-rg353x/assets/battery_0.bmp b/package/uboot-rg353x/assets/battery_0.bmp deleted file mode 100644 index 06d80885a9ddf75c464f77c8346db27549e9e2ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4712 zcmZ?r%@AS$11AOs1`P%Vh6W}Eh6juc42%pc3``6R3~E9Q49a>C%*?>R0K!&$LJX@I zt}v`(xXSR4;U7Z_1H&ji8V;lBU^E|$mII^Zz-T!zS`Lhs1Eb}@XgM%i4#3L+DF!CS zDnTZJe+;h}7#O4&>I5My2?i#{I9kd!bQ4udls7`PZ1m6Q}2{xRG`OS!Ook4VcySp;8s q)dVlc5G>?!5L7;b%1Tf<2r4;iprxe@0}~^YP>B*q?#pj!3=K>S3=bF?7#JB?7?>Cs7&3$z7?kxOn3;ir0fepigcw#a zTwz$naFyX7!#{==28L03G#p0L!Dv1hEeA%+fzfhcv>X^M2S&?*(Q;t49DtVtQVdLt zRf0?c{}^5|Ffd3l)CodZ5)4d?bzt!q3=9k)UW4F21_+x&u!w;J&SMiSV_?I@H?xC4#}^w1lX6<|Q5rP0tB4UK;cC%*?>R0K!&$LJX@I zt}v`(xXSR4;U7Z_1H&ji8V;lBU^E|$mII^Zz-T!zS`Lhs1Eb}@XgM%i4#3L+DF!CS zDnTZJe+;h}7#O4&>I5My2?i#{InbA z3NSD*2njN{B7&oGkPxP3xG*trfaCEFI3BT?JgNdU z1&)TtXn6c%82tH#fs27rNlB66AHzMIc^g({W6Sp=Mvezu3kmTlF>oj{Ffa)yq18fc yAbH%i7-|jI1h4B5EabWpREL7pj!3=K>S3=bF?7#JB?7?>Cs7$U?N7?kxOn3;ir0fepigcw#a zTwz$naFyX7!#{==28L03G#p0L!Dv1hEeA%+fzfhcv>X^M2S&?*(Q;t49DtVtQVcbM z{}|pdFfd3kFfrB$G70=+cm?J)2qIV@(H9I13}OsSjBJ8T0tHa|9|J^`frC*{P@seX zLK6_>VH6Z(U|p}_Ax)4xe;7|m$Hk7cmF4#b=i!$^!2RQtRYs)Y( vHh^19kX8^fPl5r_eqv&*gSMqWtu0Vn3e>`qVPFz0QDRd3$MA0Gv_}~MiU;14 diff --git a/package/uboot-rg353x/assets/battery_4.bmp b/package/uboot-rg353x/assets/battery_4.bmp deleted file mode 100644 index daa7c88d355208f15f6a0a2ae55ea6a29029e1ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6214 zcmZ?rb(3HK11AOs1`P%Vh6W}Eh6juc42%pc3``6R3@j2149a>C%*?>R0K!&$LJX@I zt}v`(xXSR4;U7Z_1H&ji8V;lBU^E|$mII^Zz-T!zS`Lhs1Eb}@XgM%i4#3L+DTW%s ze++LJ7#JiNm>6pWnFRhZyaMwY1Q9Hd=nDo01~CREMm9kvfdVM~j{zdez`-aeC{V%x zp$UlcFbWDXFfa-TGO!6SFfa%SGO&UAH3+^Gx;b269SkCZObkqnLV`>JOh{~rQPrbi z0#2I@gwhE}UVxE-L+~HNy-^*YT!@s9(DKx1SdFFYj-j+Hh^2VkQOU4Pl5r_)@5R>gSLA?En`r-7t|V-VPFz0QDRd3$MA0G H^c@%h+HB<< diff --git a/package/uboot-rg353x/assets/battery_5.bmp b/package/uboot-rg353x/assets/battery_5.bmp deleted file mode 100644 index 734e33c36ed5598938d97f68b2dfa43cb65502f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6378 zcmZ?reI>yF22KnN3>pj!3=K>S3=bF?7#JB?7?>Cs7*0|%p^pg;)& zgeD-$!zd`oz`!UV$iODRz`!6R$iN2b*I?oE2rz)mg`39(*2y3u$i%?JC?v=vz=XzT z-~wx47}dcr8dlUyB|PAC#mFJ}kKrCT9}p3~qk04xM#Eq<3>ZX4!(cQFz;*SYE)PV& zWjuqBl9B)krTl1%1J(u{E-emN`&0?iJ{3@6;7|m$SCtqz1Q-~E1eBodRV4=W_9+{v zeOg9bD;R5wnTfFh+yaNRs*!mT42bqP6Js5;Z4PR^gWBex7P|}slVFJwlj1*ycSEOt G!w3M9;_58` diff --git a/package/uboot-rg353x/assets/battery_fail.bmp b/package/uboot-rg353x/assets/battery_fail.bmp deleted file mode 100644 index 6ec87ac73fc75ca5e9b212a4e95267931966a978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5282 zcmZ?rT_nN)22KnN3>pj!3=K>S3=bF?7#JB?7?>Cs7!pJn7?kxOn3;ir0fepigcw#a zTwz$naFyX7!#{==28L03G#p0L!Dv1hEeA%+fzfhcv>X^M2S&?*(Q;r2mIG=GOoE^` zeGCHwg9-x!8>65gI4?(m`D}tr0wCE4FpmSQ62^wegn?z47$I^Xo*DxOR96TC1A`g^ zOb*1;fXfAe`yVhl5Kjv(7r?;4AjQDM$Ro%k08+ukkN`IE6A{aofhKR8V3W3!{F|Y~3 z)UgSQK-D3{7}x{_1sFuYY9o-;Ld3cg;zgZzOhE&)~_f}tMdat=XEaVZ8a!5|FP zGGJ2zu!w_f#T1tVtM|iDF9-G&rnmxFy$^ z1PMD8u$Tt}n;>>skY8}gsxfd0y5Z0XNpmhZWkKfRl7*y6CmedU!2ZD{s{{6r0}j19 zV7<6x^}u@VaOl+o>%}E&0M=`RL$3i?FOz^34tXO6Eovlm*9xo`m#hs~uK^CdHekI>0(v;)?HITOamhJ= zP1eDo(*bNUE?FnAUM(DYoxplQvJ6}dj7mz14F4GJA>}d`ux<^Eyy?Qg#Ka+pDeeYV zuZE%C4QvmlxCdCh3WjlaPQCsOEjcz`#%e5&_rGppm-@uuMU05j*-hyVZp diff --git a/package/uboot-rg353x/assets/logo.bmp b/package/uboot-rg353x/assets/logo.bmp deleted file mode 100644 index 4c7fbae2131e5733d21ec9456d29d113cdf2270b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228938 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�}S5K@!w-jBhmA}pt)bj*dL<(2bv28 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

MoKmYff+yrj_f!csUTPFSAbn6t#p68oypZ=eA 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 diff --git a/package/uboot-rg353x/old/0001-address-of-packed-member-to-warning.patch b/package/uboot-rg353x/old/0001-address-of-packed-member-to-warning.patch deleted file mode 100644 index e605c30a2f..0000000000 --- a/package/uboot-rg353x/old/0001-address-of-packed-member-to-warning.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 5a7cce2e7326ba43982512bbddf456cf92d30c1c Mon Sep 17 00:00:00 2001 -From: fewtarius -Date: Mon, 16 May 2022 23:00:40 +0000 -Subject: [PATCH 1/6] address-of-packed-member to warning - ---- - Makefile | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/Makefile b/Makefile -index d3e3d37..663d717 100644 ---- a/Makefile -+++ b/Makefile -@@ -593,6 +593,7 @@ endif - - KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) - KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks) -+KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) - - KBUILD_CFLAGS += -g - # $(KBUILD_AFLAGS) sets -g, which causes gcc to pass a suitable -g --- -2.38.1 - diff --git a/package/uboot-rg353x/old/0002-Remove-a-few-broken-device-trees.patch b/package/uboot-rg353x/old/0002-Remove-a-few-broken-device-trees.patch deleted file mode 100644 index 493bea35a1..0000000000 --- a/package/uboot-rg353x/old/0002-Remove-a-few-broken-device-trees.patch +++ /dev/null @@ -1,46 +0,0 @@ -From cc2384e130ca4b4abedaf95e352551ecffda732a Mon Sep 17 00:00:00 2001 -From: fewtarius -Date: Mon, 16 May 2022 23:05:13 +0000 -Subject: [PATCH 2/6] Remove a few broken device trees - ---- - arch/arm/dts/Makefile | 23 ----------------------- - 1 file changed, 23 deletions(-) - -diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile -index 594614a..a7c20e1 100644 ---- a/arch/arm/dts/Makefile -+++ b/arch/arm/dts/Makefile -@@ -28,29 +28,6 @@ dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \ - exynos5422-odroidxu3.dtb - dtb-$(CONFIG_EXYNOS7420) += exynos7420-espresso7420.dtb - dtb-$(CONFIG_ARCH_ROCKCHIP) += \ -- rk3036-sdk.dtb \ -- rk3066a-mk808.dtb \ -- rk3126-evb.dtb \ -- rk3128-evb.dtb \ -- rk3188-radxarock.dtb \ -- rk3288-evb.dtb \ -- rk3288-fennec.dtb \ -- rk3288-firefly.dtb \ -- rk3288-miqi.dtb \ -- rk3288-phycore-rdk.dtb \ -- rk3288-popmetal.dtb \ -- rk3288-rock2-square.dtb \ -- rk3288-tinker.dtb \ -- rk3288-veyron-jerry.dtb \ -- rk3288-veyron-mickey.dtb \ -- rk3288-veyron-minnie.dtb \ -- rk3288-vyasa.dtb \ -- rk3308-evb.dtb \ -- rk3328-evb.dtb \ -- rk3368-lion.dtb \ -- rk3368-sheep.dtb \ -- rk3368-geekbox.dtb \ -- rk3368-px5-evb.dtb \ - rk3399-evb.dtb \ - rk3399-firefly.dtb \ - rk3399-puma-ddr1333.dtb \ --- -2.38.1 - diff --git a/package/uboot-rg353x/old/0003-Fix-scripts.patch b/package/uboot-rg353x/old/0003-Fix-scripts.patch deleted file mode 100644 index 826f782d97..0000000000 --- a/package/uboot-rg353x/old/0003-Fix-scripts.patch +++ /dev/null @@ -1,179 +0,0 @@ -From f4680fca588bd8d41ab3d00f7266ffb9e2a253f6 Mon Sep 17 00:00:00 2001 -From: fewtarius -Date: Fri, 29 Jul 2022 07:37:48 -0400 -Subject: [PATCH 3/6] Fix-scripts - ---- - arch/arm/mach-rockchip/decode_bl31.py | 2 +- - arch/arm/mach-rockchip/make_fit_atf.py | 2 +- - make.sh | 2 +- - scripts/dtc/pylibfdt/setup.py | 2 +- - scripts/fill_scrapyard.py | 2 +- - scripts/mailmapper | 2 +- - test/py/test.py | 2 +- - tools/binman/binman.py | 2 +- - tools/buildman/buildman.py | 2 +- - tools/dtoc/dtoc.py | 2 +- - tools/genboardscfg.py | 2 +- - tools/microcode-tool.py | 2 +- - tools/moveconfig.py | 2 +- - tools/patman/patman.py | 2 +- - tools/rkmux.py | 2 +- - 15 files changed, 15 insertions(+), 15 deletions(-) - -diff --git a/arch/arm/mach-rockchip/decode_bl31.py b/arch/arm/mach-rockchip/decode_bl31.py -index 301bd15..c0db739 100755 ---- a/arch/arm/mach-rockchip/decode_bl31.py -+++ b/arch/arm/mach-rockchip/decode_bl31.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Copyright (C) 2020 Rockchip Electronics Co., Ltd - # -diff --git a/arch/arm/mach-rockchip/make_fit_atf.py b/arch/arm/mach-rockchip/make_fit_atf.py -index 27b6ef7..59a2cc9 100755 ---- a/arch/arm/mach-rockchip/make_fit_atf.py -+++ b/arch/arm/mach-rockchip/make_fit_atf.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - """ - A script to generate FIT image source for rockchip boards - with ARM Trusted Firmware -diff --git a/make.sh b/make.sh -index 7e76bcb..b306c92 100755 ---- a/make.sh -+++ b/make.sh -@@ -718,7 +718,7 @@ select_ini_file - handle_args_late - sub_commands - clean_files --make PYTHON=python2 CROSS_COMPILE=${TOOLCHAIN_GCC} all --jobs=${JOB} -+make PYTHON=python3 CROSS_COMPILE=${TOOLCHAIN_GCC} all --jobs=${JOB} - pack_images - #pack_idbloader - finish -diff --git a/scripts/dtc/pylibfdt/setup.py b/scripts/dtc/pylibfdt/setup.py -index 4f7cf04..992cdec 100755 ---- a/scripts/dtc/pylibfdt/setup.py -+++ b/scripts/dtc/pylibfdt/setup.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - - """ - setup.py file for SWIG libfdt -diff --git a/scripts/fill_scrapyard.py b/scripts/fill_scrapyard.py -index 9a94354..ae76116 100755 ---- a/scripts/fill_scrapyard.py -+++ b/scripts/fill_scrapyard.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Author: Masahiro Yamada - # -diff --git a/scripts/mailmapper b/scripts/mailmapper -index 78b23d1..50e4719 100755 ---- a/scripts/mailmapper -+++ b/scripts/mailmapper -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Copyright (C) 2014, Masahiro Yamada - # -diff --git a/test/py/test.py b/test/py/test.py -index 4695079..36a7746 100755 ---- a/test/py/test.py -+++ b/test/py/test.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - - # Copyright (c) 2015 Stephen Warren - # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. -diff --git a/tools/binman/binman.py b/tools/binman/binman.py -index e75a59d..d57e6db 100755 ---- a/tools/binman/binman.py -+++ b/tools/binman/binman.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - - # Copyright (c) 2016 Google, Inc - # Written by Simon Glass -diff --git a/tools/buildman/buildman.py b/tools/buildman/buildman.py -index f5c4b04..cd40894 100755 ---- a/tools/buildman/buildman.py -+++ b/tools/buildman/buildman.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Copyright (c) 2012 The Chromium OS Authors. - # -diff --git a/tools/dtoc/dtoc.py b/tools/dtoc/dtoc.py -index 6eacfc9..d3aa7b6 100755 ---- a/tools/dtoc/dtoc.py -+++ b/tools/dtoc/dtoc.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Copyright (C) 2016 Google, Inc - # Written by Simon Glass -diff --git a/tools/genboardscfg.py b/tools/genboardscfg.py -index 2345a19..daf1498 100755 ---- a/tools/genboardscfg.py -+++ b/tools/genboardscfg.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Author: Masahiro Yamada - # -diff --git a/tools/microcode-tool.py b/tools/microcode-tool.py -index 069d961..2bc2cf3 100755 ---- a/tools/microcode-tool.py -+++ b/tools/microcode-tool.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Copyright (c) 2014 Google, Inc - # -diff --git a/tools/moveconfig.py b/tools/moveconfig.py -index 6f549a5..bfde61e 100755 ---- a/tools/moveconfig.py -+++ b/tools/moveconfig.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Author: Masahiro Yamada - # -diff --git a/tools/patman/patman.py b/tools/patman/patman.py -index 7647440..3f9855e 100755 ---- a/tools/patman/patman.py -+++ b/tools/patman/patman.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - # - # Copyright (c) 2011 The Chromium OS Authors. - # -diff --git a/tools/rkmux.py b/tools/rkmux.py -index 11c192a..e8a0424 100755 ---- a/tools/rkmux.py -+++ b/tools/rkmux.py -@@ -1,4 +1,4 @@ --#!/usr/bin/env python2 -+#!/usr/bin/env python3 - - # Script to create enums from datasheet register tables - # --- -2.38.1 - diff --git a/package/uboot-rg353x/old/0004-Fixes-for-GCC-12.2.patch b/package/uboot-rg353x/old/0004-Fixes-for-GCC-12.2.patch deleted file mode 100644 index 806dfe141c..0000000000 --- a/package/uboot-rg353x/old/0004-Fixes-for-GCC-12.2.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 3cb59bfc8fe1bcc4e3ca17c24a748d26e76bc4eb Mon Sep 17 00:00:00 2001 -From: fewtarius -Date: Tue, 1 Nov 2022 17:09:45 -0400 -Subject: [PATCH 4/6] Fixes-for-GCC-12.2 - ---- - Makefile | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/Makefile b/Makefile -index 663d717..cdb3ff9 100644 ---- a/Makefile -+++ b/Makefile -@@ -594,6 +594,8 @@ endif - KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) - KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks) - KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) -+KBUILD_CFLAGS += $(call cc-disable-warning, dangling-pointer) -+KBUILD_CFLAGS += $(call cc-disable-warning, address) - - KBUILD_CFLAGS += -g - # $(KBUILD_AFLAGS) sets -g, which causes gcc to pass a suitable -g --- -2.38.1 - diff --git a/package/uboot-rg353x/old/0006-fixup-path-to-dtc.patch b/package/uboot-rg353x/old/0006-fixup-path-to-dtc.patch deleted file mode 100644 index 461c291d26..0000000000 --- a/package/uboot-rg353x/old/0006-fixup-path-to-dtc.patch +++ /dev/null @@ -1,33 +0,0 @@ -From 57d0b869412faa2b40c5e828f33883d7ef2f769a Mon Sep 17 00:00:00 2001 -From: David Barbion -Date: Sat, 19 Nov 2022 00:55:14 +0100 -Subject: [PATCH 6/6] fixup path to dtc - ---- - make.sh | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/make.sh b/make.sh -index b306c92..521e9ed 100755 ---- a/make.sh -+++ b/make.sh -@@ -25,6 +25,7 @@ GCC_ARM32=arm-linux-gnueabihf- - GCC_ARM64=aarch64-linux-gnu- - TOOLCHAIN_ARM32=../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin - TOOLCHAIN_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin -+DTC=${TOOLCHAIN_ARM64}/dtc - - ########################################### User not touch ############################################# - # Declare global INI file searching index name for every chip, update in select_chip_info() -@@ -652,7 +653,7 @@ function pack_trust_image() - function pack_fit_image() - { - # check host tools -- if ! which dtc >/dev/null 2>&1 ; then -+ if ! which "$DTC" >/dev/null 2>&1 ; then - echo "ERROR: No 'dtc', please: apt-get install device-tree-compiler" - exit 1 - fi --- -2.38.1 - diff --git a/package/uboot-rg353x/old/0007-set-part-name.patch b/package/uboot-rg353x/old/0007-set-part-name.patch deleted file mode 100644 index 2ebb63b7dc..0000000000 --- a/package/uboot-rg353x/old/0007-set-part-name.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 1a3e974370769f9eaa11179dcde9d1f56d88de63 Mon Sep 17 00:00:00 2001 -From: David Barbion -Date: Sat, 19 Nov 2022 23:43:45 +0100 -Subject: [PATCH 7/7] set part name - ---- - include/configs/rockchip-common.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/include/configs/rockchip-common.h b/include/configs/rockchip-common.h -index 79ee3d7..4a76766 100644 ---- a/include/configs/rockchip-common.h -+++ b/include/configs/rockchip-common.h -@@ -92,7 +92,7 @@ - "uuid_disk=${uuid_gpt_disk};" \ - "name=uboot,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};" \ - "name=resource,start=12MB,size=4MB,uuid=${uuid_gpt_resource};" \ -- "name=ANBERNIC,start=16MB,size=3072M,bootable,uuid=${uuid_gpt_boot};\0" -+ "name=RECALBOX,start=16MB,size=3072M,bootable,uuid=${uuid_gpt_boot};\0" - #else - #define PARTS_DEFAULT \ - "uuid_disk=${uuid_gpt_disk};" \ --- -2.38.1 - diff --git a/package/uboot-rg353x/uboot-rg353x.mk b/package/uboot-rg353x/uboot-rg353x.mk deleted file mode 100644 index 7d054bd948..0000000000 --- a/package/uboot-rg353x/uboot-rg353x.mk +++ /dev/null @@ -1,36 +0,0 @@ -################################################################################ -# -# uboot-rg353x -# -################################################################################ - -UBOOT_RG353X_VERSION = 06ce0271ddf522f97b9150e369ebec10bf2c763b -UBOOT_RG353X_SITE = https://gitlab.com/recalbox/packages/hardware/uboot-rg353x.git -UBOOT_RG353X_SITE_METHOD = git -UBOOT_RG353X_LICENSE = unknown -UBOOT_RG353X_DEPENDENCIES = linux host-python3 - -UBOOT_RG353X_INSTALL_TARGET = NO -UBOOT_RG353X_INSTALL_IMAGES = YES - -define UBOOT_RG353X_BUILD_CMDS - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/logo.bmp $(LINUX_DIR)/logo_kernel.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/logo2.bmp $(LINUX_DIR)/logo.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_0.bmp $(LINUX_DIR)/battery_0.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_1.bmp $(LINUX_DIR)/battery_1.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_2.bmp $(LINUX_DIR)/battery_2.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_3.bmp $(LINUX_DIR)/battery_3.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_4.bmp $(LINUX_DIR)/battery_4.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_5.bmp $(LINUX_DIR)/battery_5.bmp - $(INSTALL) $(UBOOT_RG353X_PKGDIR)/assets/battery_fail.bmp $(LINUX_DIR)/battery_fail.bmp - cd $(LINUX_DIR); \ - ./scripts/mkmultidtb.py rk356x -endef - -define UBOOT_RG353X_INSTALL_IMAGES_CMDS - $(INSTALL) -D $(@D)/uboot.img $(BINARIES_DIR)/ - $(INSTALL) -D $(@D)/idbloader.img $(BINARIES_DIR)/ - $(INSTALL) -D $(LINUX_DIR)/resource.img $(BINARIES_DIR)/ -endef - -$(eval $(generic-package)) diff --git a/package/uboot-rg353x/uboot-rg353x.mk.old b/package/uboot-rg353x/uboot-rg353x.mk.old deleted file mode 100644 index d793a9d8a4..0000000000 --- a/package/uboot-rg353x/uboot-rg353x.mk.old +++ /dev/null @@ -1,40 +0,0 @@ -################################################################################ -# -# uboot-rg353x -# -################################################################################ - -UBOOT_RG353X_VERSION = 62a0e69da448ca37a8c106ff3886e8b1543ea829 -UBOOT_RG353X_SITE = $(call github,JustEnoughLinuxOS,rk356x-uboot,$(UBOOT_RG353X_VERSION)) -UBOOT_RG353X_LICENSE = GPL-2.0+ -UBOOT_RG353X_LICENSE_FILES = Licenses/gpl-2.0.txt -UBOOT_RG353X_DEPENDENCIES = host-dtc host-rockchip-rkbin - -UBOOT_RG353X_INSTALL_TARGET = NO -UBOOT_RG353X_INSTALL_IMAGES = YES - -define UBOOT_RG353X_TOOLCHAIN_PATCH - $(SED) '/^TOOLCHAIN_ARM64=/s#=.*#="$(HOST_DIR)/bin/"#' $(@D)/make.sh - $(SED) '/^ADDR2LINE_ARM64=/s#=.*#=aarch64-buildroot-linux-gnu-addr2line#' $(@D)/make.sh - $(SED) '/^OBJ_ARM64=/s#=.*#=aarch64-buildroot-linux-gnu-objdump#' $(@D)/make.sh - $(SED) '/^NM_ARM64=/s#=.*#=aarch64-buildroot-linux-gnu-nm#' $(@D)/make.sh - $(SED) '/^GCC_ARM64=/s#=.*#=aarch64-buildroot-linux-gnu-#' $(@D)/make.sh - $(SED) '/^RKBIN_TOOLS=/s#=.*#=$(HOST_DIR)/rkbin/.#' $(@D)/make.sh -endef - -define UBOOT_RG353X_BUILD_CMDS - #cd $(@D) && PATH="$(HOST_DIR)/bin:$$PATH" ./make.sh rk3566 - #cd $(@D) && ./tools/mkimage -n rk356x -T rksd -d $(HOST_DIR)/rkbin/bin/rk35/rk3566_ddr_1056MHz_v1.08.bin:$(HOST_DIR)/rkbin/bin/rk35/rk356x_spl_v1.11.bin -C bzip2 idbloader.img - echo "ok" -endef -# cd $(@D) && ./tools/mkimage -n rk356x -T rksd -d $(HOST_DIR)/rkbin/bin/rk35/rk3566_ddr_1056MHz_v1.13.bin:$(HOST_DIR)/rkbin/bin/rk35/rk356x_spl_v1.12.bin -C bzip2 idbloader.img - -define UBOOT_RG353X_INSTALL_IMAGES_CMDS -# $(INSTALL) -D $(@D)/uboot.img $(BINARIES_DIR)/ -# $(INSTALL) -D $(@D)/idbloader.img $(BINARIES_DIR)/ - echo "ok" -endef - -UBOOT_RG353X_PRE_BUILD_HOOKS += UBOOT_RG353X_TOOLCHAIN_PATCH - -$(eval $(generic-package)) -- GitLab From cf6705c74f8f9f4acdf5822fccd632c2eabe39bd Mon Sep 17 00:00:00 2001 From: David Barbion Date: Fri, 4 Oct 2024 23:38:14 +0200 Subject: [PATCH 3/9] fix: bump rg353x uboot and kernel This will fix some random crashes on newer RG353. --- board/recalbox/anbernic/rg353x/genimage.cfg | 17 +- .../kernel-6.10-defconfig-fragment.config | 31 + .../rg353x/kernel-6.10-defconfig.config | 1107 +++++++++++++++++ board/recalbox/copy-recalbox-archives.sh | 18 +- configs/recalbox-rg353x_defconfig | 26 +- package/libretro-flycast/libretro-flycast.mk | 8 +- .../libretro-mupen64plus-nx.mk | 7 +- .../libretro-parallel-n64.mk | 8 +- .../libretro-yabasanshiro.mk | 8 +- package/recalbox-system/Config.in | 7 +- package/recalbox-system/rg353x/pre-upgrade.sh | 6 + package/scummvm/Config.in | 2 +- package/scummvm/scummvm.mk | 2 +- 13 files changed, 1198 insertions(+), 49 deletions(-) create mode 100644 board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config create mode 100644 board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config diff --git a/board/recalbox/anbernic/rg353x/genimage.cfg b/board/recalbox/anbernic/rg353x/genimage.cfg index 5d933b11ba..47527005a8 100644 --- a/board/recalbox/anbernic/rg353x/genimage.cfg +++ b/board/recalbox/anbernic/rg353x/genimage.cfg @@ -30,23 +30,10 @@ image recalbox.img { partition-table-type = gpt } - partition idbloader { - in-partition-table = "no" - image = "idbloader.img" - offset = 32K - } - partition uboot { in-partition-table = "yes" - image = "uboot.img" - offset = 8M - } - - partition resource { - in-partition-table = "yes" - image = "resource.img" - offset = 12M - size = 4M + image = "u-boot-rockchip.bin" + offset = 32k } partition boot { diff --git a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config new file mode 100644 index 0000000000..a3d71e41c5 --- /dev/null +++ b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config @@ -0,0 +1,31 @@ +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +CONFIG_USB_HID=m +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_FILE_DIRECT=y +CONFIG_SQUASHFS_DECOMP_MULTI=y +CONFIG_OVERLAY_FS=y + +# add some joystick support +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_SPACEBALL=m +CONFIG_JOYSTICK_PXRC=m +CONFIG_HID_ICADE=m +CONFIG_HID_MAYFLASH=m +CONFIG_HID_RETRODE=m +CONFIG_HID_SAITEK=m +CONFIG_HID_STEELSERIES=m + +# enable force feedback +CONFIG_HID_ACRUX_FF=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HOLTEK_FF=y +CONFIG_PANTHERLORD_FF=y +CONFIG_GREENASIA_FF=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_ZEROPLUS_FF=y + +# disable module compression +CONFIG_MODULE_COMPRESS_NONE=y diff --git a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config new file mode 100644 index 0000000000..d87f3c31c0 --- /dev/null +++ b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config @@ -0,0 +1,1107 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_DEFAULT_HOSTNAME="@DEVICENAME@" +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y +CONFIG_WATCH_QUEUE=y +# CONFIG_CROSS_MEMORY_ATTACH is not set +CONFIG_USELIB=y +CONFIG_NO_HZ_IDLE=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_BPF_SYSCALL=y +CONFIG_BPF_JIT=y +CONFIG_BPF_JIT_ALWAYS_ON=y +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +CONFIG_PREEMPT=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +CONFIG_LOG_BUF_SHIFT=18 +CONFIG_MEMCG=y +CONFIG_BLK_CGROUP=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CGROUP_PIDS=y +CONFIG_CGROUP_RDMA=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_DEVICE=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_CGROUP_PERF=y +CONFIG_CGROUP_BPF=y +CONFIG_NAMESPACES=y +CONFIG_SCHED_AUTOGROUP=y +CONFIG_RELAY=y +CONFIG_INITRAMFS_SOURCE="" +CONFIG_INITRAMFS_COMPRESSION_LZO=y +CONFIG_BOOT_CONFIG=y +CONFIG_EXPERT=y +CONFIG_SGETMASK_SYSCALL=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PROFILING=y +CONFIG_ARCH_ROCKCHIP=y +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_CAVIUM_ERRATUM_30115 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_FUJITSU_ERRATUM_010001 is not set +# CONFIG_HISILICON_ERRATUM_161600802 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1003 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_1009 is not set +# CONFIG_QCOM_QDF2400_ERRATUM_0065 is not set +# CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set +# CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set +# CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +CONFIG_SCHED_MC=y +CONFIG_SCHED_SMT=y +CONFIG_NR_CPUS=4 +CONFIG_ARM64_SW_TTBR0_PAN=y +CONFIG_COMPAT=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_ARM64_PMEM=y +# CONFIG_ARM64_BTI is not set +CONFIG_RANDOMIZE_BASE=y +# CONFIG_EFI is not set +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_WQ_POWER_EFFICIENT_DEFAULT=y +CONFIG_ENERGY_MODEL=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPUFREQ_DT=y +CONFIG_ARM_SCMI_CPUFREQ=y +CONFIG_MODULES=y +CONFIG_MODULE_FORCE_LOAD=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_MAC_PARTITION=y +# CONFIG_MQ_IOSCHED_KYBER is not set +# CONFIG_IOSCHED_BFQ is not set +CONFIG_BINFMT_MISC=y +# CONFIG_SLAB_MERGE_DEFAULT is not set +# CONFIG_SLUB_CPU_PARTIAL is not set +# CONFIG_COMPAT_BRK is not set +# CONFIG_COMPACTION is not set +CONFIG_DEFAULT_MMAP_MIN_ADDR=32768 +# CONFIG_VM_EVENT_COUNTERS is not set +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_UNIX_DIAG=m +CONFIG_XFRM_USER=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_MULTIPATH=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_NET_IPIP=m +CONFIG_NET_IPGRE_DEMUX=m +CONFIG_NET_IPGRE=m +CONFIG_IP_MROUTE=y +CONFIG_IP_MROUTE_MULTIPLE_TABLES=y +CONFIG_IP_PIMSM_V1=y +CONFIG_IP_PIMSM_V2=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_DIAG is not set +CONFIG_TCP_CONG_ADVANCED=y +CONFIG_TCP_CONG_CUBIC=m +CONFIG_TCP_CONG_HSTCP=m +CONFIG_TCP_CONG_HYBLA=m +CONFIG_TCP_CONG_SCALABLE=m +CONFIG_TCP_CONG_LP=m +CONFIG_TCP_CONG_VENO=m +CONFIG_TCP_CONG_YEAH=m +CONFIG_TCP_CONG_ILLINOIS=m +CONFIG_TCP_CONG_DCTCP=m +CONFIG_TCP_CONG_CDG=m +CONFIG_TCP_MD5SIG=y +# CONFIG_IPV6 is not set +CONFIG_NETFILTER=y +CONFIG_BRIDGE_NETFILTER=y +CONFIG_NETFILTER_NETLINK_QUEUE=y +CONFIG_NETFILTER_NETLINK_LOG=y +CONFIG_NF_CONNTRACK=m +CONFIG_NF_CONNTRACK_PROCFS=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CONNTRACK_TIMEOUT=y +CONFIG_NF_CONNTRACK_TIMESTAMP=y +CONFIG_NF_CONNTRACK_AMANDA=m +CONFIG_NF_CONNTRACK_FTP=m +CONFIG_NF_CONNTRACK_H323=m +CONFIG_NF_CONNTRACK_IRC=m +CONFIG_NF_CONNTRACK_NETBIOS_NS=m +CONFIG_NF_CONNTRACK_SNMP=m +CONFIG_NF_CONNTRACK_PPTP=m +CONFIG_NF_CONNTRACK_SANE=m +CONFIG_NF_CONNTRACK_SIP=m +CONFIG_NF_CONNTRACK_TFTP=m +CONFIG_NF_CT_NETLINK=m +CONFIG_NF_CT_NETLINK_TIMEOUT=m +CONFIG_NF_TABLES=m +CONFIG_NFT_CT=m +CONFIG_NFT_LOG=m +CONFIG_NFT_LIMIT=m +CONFIG_NFT_MASQ=m +CONFIG_NFT_REDIR=m +CONFIG_NFT_QUEUE=m +CONFIG_NFT_REJECT=m +CONFIG_NFT_COMPAT=m +CONFIG_NFT_HASH=m +CONFIG_NETFILTER_XTABLES_COMPAT=y +CONFIG_NETFILTER_XT_SET=m +CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m +CONFIG_NETFILTER_XT_TARGET_CONNMARK=m +CONFIG_NETFILTER_XT_TARGET_DSCP=m +CONFIG_NETFILTER_XT_TARGET_HMARK=m +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m +CONFIG_NETFILTER_XT_TARGET_LED=m +CONFIG_NETFILTER_XT_TARGET_LOG=m +CONFIG_NETFILTER_XT_TARGET_MARK=m +CONFIG_NETFILTER_XT_TARGET_NFLOG=m +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m +CONFIG_NETFILTER_XT_TARGET_NOTRACK=m +CONFIG_NETFILTER_XT_TARGET_TEE=m +CONFIG_NETFILTER_XT_TARGET_TPROXY=m +CONFIG_NETFILTER_XT_TARGET_TRACE=m +CONFIG_NETFILTER_XT_TARGET_TCPMSS=m +CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m +CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m +CONFIG_NETFILTER_XT_MATCH_BPF=m +CONFIG_NETFILTER_XT_MATCH_CGROUP=m +CONFIG_NETFILTER_XT_MATCH_CLUSTER=m +CONFIG_NETFILTER_XT_MATCH_COMMENT=m +CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m +CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m +CONFIG_NETFILTER_XT_MATCH_CONNMARK=m +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m +CONFIG_NETFILTER_XT_MATCH_CPU=m +CONFIG_NETFILTER_XT_MATCH_DCCP=m +CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m +CONFIG_NETFILTER_XT_MATCH_DSCP=m +CONFIG_NETFILTER_XT_MATCH_ESP=m +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m +CONFIG_NETFILTER_XT_MATCH_HELPER=m +CONFIG_NETFILTER_XT_MATCH_IPCOMP=m +CONFIG_NETFILTER_XT_MATCH_IPRANGE=m +CONFIG_NETFILTER_XT_MATCH_IPVS=m +CONFIG_NETFILTER_XT_MATCH_L2TP=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NETFILTER_XT_MATCH_LIMIT=m +CONFIG_NETFILTER_XT_MATCH_MAC=m +CONFIG_NETFILTER_XT_MATCH_MARK=m +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m +CONFIG_NETFILTER_XT_MATCH_NFACCT=m +CONFIG_NETFILTER_XT_MATCH_OSF=m +CONFIG_NETFILTER_XT_MATCH_OWNER=m +CONFIG_NETFILTER_XT_MATCH_POLICY=m +CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m +CONFIG_NETFILTER_XT_MATCH_QUOTA=m +CONFIG_NETFILTER_XT_MATCH_RATEEST=m +CONFIG_NETFILTER_XT_MATCH_REALM=m +CONFIG_NETFILTER_XT_MATCH_RECENT=m +CONFIG_NETFILTER_XT_MATCH_SCTP=m +CONFIG_NETFILTER_XT_MATCH_SOCKET=m +CONFIG_NETFILTER_XT_MATCH_STATE=m +CONFIG_NETFILTER_XT_MATCH_STATISTIC=m +CONFIG_NETFILTER_XT_MATCH_STRING=m +CONFIG_NETFILTER_XT_MATCH_TCPMSS=m +CONFIG_NETFILTER_XT_MATCH_TIME=m +CONFIG_NETFILTER_XT_MATCH_U32=m +CONFIG_IP_SET=y +CONFIG_IP_SET_BITMAP_IP=m +CONFIG_IP_SET_BITMAP_IPMAC=m +CONFIG_IP_SET_BITMAP_PORT=m +CONFIG_IP_SET_HASH_IP=m +CONFIG_IP_SET_HASH_IPMARK=m +CONFIG_IP_SET_HASH_IPPORT=m +CONFIG_IP_SET_HASH_IPPORTIP=m +CONFIG_IP_SET_HASH_IPPORTNET=m +CONFIG_IP_SET_HASH_MAC=m +CONFIG_IP_SET_HASH_NETPORTNET=m +CONFIG_IP_SET_HASH_NET=m +CONFIG_IP_SET_HASH_NETNET=m +CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m +CONFIG_IP_SET_LIST_SET=m +CONFIG_IP_VS=m +CONFIG_IP_VS_PROTO_TCP=y +CONFIG_IP_VS_PROTO_UDP=y +CONFIG_IP_VS_PROTO_ESP=y +CONFIG_IP_VS_PROTO_AH=y +CONFIG_IP_VS_PROTO_SCTP=y +CONFIG_IP_VS_RR=m +CONFIG_IP_VS_WRR=m +CONFIG_IP_VS_LC=m +CONFIG_IP_VS_WLC=m +CONFIG_IP_VS_FO=m +CONFIG_IP_VS_OVF=m +CONFIG_IP_VS_LBLC=m +CONFIG_IP_VS_LBLCR=m +CONFIG_IP_VS_DH=m +CONFIG_IP_VS_SH=m +CONFIG_IP_VS_SED=m +CONFIG_IP_VS_NQ=m +CONFIG_IP_VS_NFCT=y +CONFIG_NF_LOG_ARP=m +CONFIG_NF_LOG_IPV4=m +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=m +CONFIG_IP_NF_MATCH_ECN=m +CONFIG_IP_NF_MATCH_RPFILTER=m +CONFIG_IP_NF_MATCH_TTL=m +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=m +CONFIG_IP_NF_TARGET_SYNPROXY=m +CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_TARGET_MASQUERADE=m +CONFIG_IP_NF_TARGET_NETMAP=m +CONFIG_IP_NF_TARGET_REDIRECT=m +CONFIG_IP_NF_MANGLE=m +CONFIG_IP_NF_TARGET_ECN=m +CONFIG_IP_NF_TARGET_TTL=m +CONFIG_IP_NF_RAW=m +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=m +CONFIG_IP_NF_ARPFILTER=m +CONFIG_IP_NF_ARP_MANGLE=m +CONFIG_NF_TABLES_BRIDGE=m +CONFIG_NFT_BRIDGE_META=m +CONFIG_BRIDGE_NF_EBTABLES=m +CONFIG_BRIDGE_EBT_BROUTE=m +CONFIG_BRIDGE_EBT_T_FILTER=m +CONFIG_BRIDGE_EBT_T_NAT=m +CONFIG_BRIDGE_EBT_802_3=m +CONFIG_BRIDGE_EBT_AMONG=m +CONFIG_BRIDGE_EBT_ARP=m +CONFIG_BRIDGE_EBT_IP=m +CONFIG_BRIDGE_EBT_LIMIT=m +CONFIG_BRIDGE_EBT_MARK=m +CONFIG_BRIDGE_EBT_PKTTYPE=m +CONFIG_BRIDGE_EBT_STP=m +CONFIG_BRIDGE_EBT_VLAN=m +CONFIG_BRIDGE_EBT_ARPREPLY=m +CONFIG_BRIDGE_EBT_DNAT=m +CONFIG_BRIDGE_EBT_MARK_T=m +CONFIG_BRIDGE_EBT_REDIRECT=m +CONFIG_BRIDGE_EBT_SNAT=m +CONFIG_BRIDGE_EBT_LOG=m +CONFIG_BRIDGE_EBT_NFLOG=m +CONFIG_BRIDGE=y +CONFIG_VLAN_8021Q=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_CODEL=y +CONFIG_NET_SCH_FQ_CODEL=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_CGROUP=y +CONFIG_DNS_RESOLVER=y +CONFIG_OPENVSWITCH=m +CONFIG_CGROUP_NET_PRIO=y +CONFIG_CAN=y +CONFIG_BT=m +CONFIG_BT_RFCOMM=y +CONFIG_BT_HIDP=y +CONFIG_BT_HS=y +CONFIG_BT_HCIBTUSB=m +CONFIG_BT_HCIUART=m +CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIBFUSB=m +CONFIG_BT_HCIVHCI=m +CONFIG_BT_MRVL=m +CONFIG_BT_MRVL_SDIO=m +CONFIG_CFG80211=m +# CONFIG_CFG80211_DEFAULT_PS is not set +# CONFIG_CFG80211_CRDA_SUPPORT is not set +CONFIG_MAC80211=m +CONFIG_MAC80211_MESH=y +CONFIG_RFKILL=m +CONFIG_RFKILL_INPUT=y +CONFIG_RFKILL_GPIO=m +# CONFIG_ETHTOOL_NETLINK is not set +CONFIG_PCI=y +CONFIG_PCIEPORTBUS=y +CONFIG_PCIEAER=y +CONFIG_PCIE_ROCKCHIP_HOST=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y +CONFIG_UEVENT_HELPER=y +CONFIG_DEVTMPFS=y +CONFIG_DEVTMPFS_MOUNT=y +CONFIG_DEVTMPFS_SAFE=y +CONFIG_FW_LOADER_USER_HELPER=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +# CONFIG_ALLOW_DEV_COREDUMP is not set +CONFIG_DEBUG_DEVRES=y +CONFIG_CONNECTOR=y +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_ARM_SCMI_POWER_CONTROL=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_FFA_TRANSPORT=y +CONFIG_MTD=y +CONFIG_MTD_BLOCK=y +CONFIG_MTD_SPI_NOR=y +CONFIG_OF_OVERLAY=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_DRBD=m +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=1 +CONFIG_ATA_OVER_ETH=m +CONFIG_BLK_DEV_RBD=m +CONFIG_BLK_DEV_NVME=m +CONFIG_SRAM=y +CONFIG_EEPROM_93CX6=y +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_DEV_SR=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_SPI_ATTRS=y +CONFIG_MEGARAID_SAS=m +CONFIG_SCSI_MPT2SAS=m +CONFIG_ATA=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_AHCI_PLATFORM=y +CONFIG_SATA_MV=m +CONFIG_SATA_NV=m +CONFIG_SATA_PROMISE=m +CONFIG_SATA_SIL=m +CONFIG_MD=y +CONFIG_BCACHE=m +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=m +CONFIG_DM_RAID=y +CONFIG_NETDEVICES=y +CONFIG_WIREGUARD=y +CONFIG_MACVLAN=y +CONFIG_IPVLAN=y +CONFIG_VXLAN=m +CONFIG_TUN=m +CONFIG_VETH=y +# CONFIG_NET_VENDOR_3COM is not set +# CONFIG_NET_VENDOR_ADAPTEC is not set +# CONFIG_NET_VENDOR_AGERE is not set +# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_ARC is not set +# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CHELSIO is not set +# CONFIG_NET_VENDOR_CISCO is not set +# CONFIG_NET_VENDOR_DEC is not set +# CONFIG_NET_VENDOR_DLINK is not set +# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_HISILICON is not set +CONFIG_E100=y +CONFIG_E1000=y +CONFIG_E1000E=y +CONFIG_IGB=y +CONFIG_IXGBE=y +# CONFIG_NET_VENDOR_MARVELL is not set +# CONFIG_NET_VENDOR_MELLANOX is not set +# CONFIG_NET_VENDOR_MICREL is not set +# CONFIG_NET_VENDOR_MICROCHIP is not set +# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_NET_VENDOR_NATSEMI is not set +# CONFIG_NET_VENDOR_NVIDIA is not set +# CONFIG_NET_VENDOR_OKI is not set +# CONFIG_NET_VENDOR_QLOGIC is not set +# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_QUALCOMM is not set +# CONFIG_NET_VENDOR_RDC is not set +# CONFIG_NET_VENDOR_RENESAS is not set +# CONFIG_NET_VENDOR_ROCKER is not set +# CONFIG_NET_VENDOR_SAMSUNG is not set +# CONFIG_NET_VENDOR_SEEQ is not set +# CONFIG_NET_VENDOR_SILAN is not set +# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SMSC is not set +CONFIG_STMMAC_ETH=y +# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SYNOPSYS is not set +# CONFIG_NET_VENDOR_TEHUTI is not set +# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WIZNET is not set +CONFIG_ROCKCHIP_PHY=y +CONFIG_CAN_SJA1000=y +CONFIG_CAN_PLX_PCI=y +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPPOE=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_USB_RTL8150=y +CONFIG_USB_RTL8152=y +CONFIG_USB_USBNET=y +CONFIG_USB_NET_CDC_MBIM=y +# CONFIG_USB_NET_NET1080 is not set +CONFIG_USB_NET_RNDIS_HOST=y +# CONFIG_USB_NET_CDC_SUBSET is not set +# CONFIG_USB_NET_ZAURUS is not set +CONFIG_USB_NET_QMI_WWAN=y +CONFIG_ATH5K=m +CONFIG_ATH9K=m +CONFIG_ATH6KL=m +CONFIG_ATH6KL_USB=m +CONFIG_AR5523=m +CONFIG_ATH10K=m +CONFIG_WCN36XX=m +CONFIG_AT76C50X_USB=m +CONFIG_B43=m +CONFIG_BRCMFMAC=m +# CONFIG_BRCMFMAC_SDIO is not set +CONFIG_BRCMFMAC_USB=y +CONFIG_BRCMFMAC_PCIE=y +CONFIG_LIBERTAS=m +CONFIG_LIBERTAS_USB=m +CONFIG_LIBERTAS_THINFIRM=m +CONFIG_MWIFIEX=m +CONFIG_MWIFIEX_SDIO=m +CONFIG_MWIFIEX_USB=m +CONFIG_MT7601U=m +CONFIG_RT2X00=m +CONFIG_RT2500USB=m +CONFIG_RT73USB=m +CONFIG_RT2800USB=m +CONFIG_RT2800USB_RT3573=y +CONFIG_RT2800USB_RT53XX=y +CONFIG_RT2800USB_RT55XX=y +CONFIG_RT2800USB_UNKNOWN=y +CONFIG_RTL8180=m +CONFIG_RTL8187=m +CONFIG_RTL8192CE=m +CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m +CONFIG_RTL8723AE=m +CONFIG_RTL8723BE=m +CONFIG_RTL8188EE=m +CONFIG_RTL8192EE=m +CONFIG_RTL8821AE=m +CONFIG_RTL8XXXU=m +CONFIG_RTW88=m +CONFIG_RTW88_8822BE=m +CONFIG_RTW88_8822BS=m +CONFIG_RTW88_8822BU=m +CONFIG_RTW88_8822CE=m +CONFIG_RTW88_8822CS=m +CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DE=m +CONFIG_RTW88_8723DS=m +CONFIG_RTW88_8723DU=m +CONFIG_RTW88_8821CE=m +CONFIG_RTW88_8821CS=m +CONFIG_RTW88_8821CU=m +CONFIG_RTW89=m +CONFIG_RTW89_8852AE=m +CONFIG_RTW89_8852CE=m +CONFIG_ZD1211RW=m +CONFIG_ISDN=y +CONFIG_INPUT_MATRIXKMAP=y +CONFIG_INPUT_JOYDEV=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_ADC=y +CONFIG_KEYBOARD_GPIO=y +CONFIG_KEYBOARD_GPIO_POLLED=y +# CONFIG_MOUSE_PS2 is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_ADC=y +CONFIG_JOYSTICK_XPAD=m +CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GOODIX=y +CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX=y +CONFIG_TOUCHSCREEN_USB_COMPOSITE=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_PWM_VIBRA=y +CONFIG_INPUT_RK805_PWRKEY=y +CONFIG_SERIO_SERPORT=m +CONFIG_GAMEPORT=y +# CONFIG_LEGACY_PTYS is not set +CONFIG_SERIAL_8250=y +CONFIG_SERIAL_8250_CONSOLE=y +# CONFIG_SERIAL_8250_PCI is not set +CONFIG_SERIAL_8250_NR_UARTS=5 +CONFIG_SERIAL_8250_RUNTIME_UARTS=5 +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +CONFIG_HW_RANDOM=y +CONFIG_TCG_TPM=y +# CONFIG_I2C_COMPAT is not set +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_RK3X=y +CONFIG_SPI=y +CONFIG_SPI_GPIO=y +CONFIG_SPI_ROCKCHIP=y +CONFIG_SPI_ROCKCHIP_SFC=y +CONFIG_SPI_MUX=y +CONFIG_SPI_SPIDEV=y +CONFIG_PINCTRL_RK805=y +CONFIG_PINCTRL_SINGLE=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_DWAPB=y +CONFIG_GPIO_GENERIC_PLATFORM=y +CONFIG_POWER_RESET_GPIO=y +CONFIG_POWER_RESET_GPIO_RESTART=y +CONFIG_POWER_RESET_SYSCON=y +CONFIG_POWER_RESET_SYSCON_POWEROFF=y +CONFIG_SYSCON_REBOOT_MODE=y +CONFIG_BATTERY_CW2015=y +CONFIG_BATTERY_SBS=y +CONFIG_CHARGER_GPIO=y +CONFIG_CHARGER_BQ24735=y +CONFIG_CHARGER_RK817=y +CONFIG_SENSORS_PWM_FAN=y +CONFIG_THERMAL=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y +CONFIG_THERMAL_GOV_FAIR_SHARE=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_CPU_THERMAL=y +CONFIG_DEVFREQ_THERMAL=y +CONFIG_ROCKCHIP_THERMAL=y +CONFIG_GENERIC_ADC_THERMAL=y +CONFIG_WATCHDOG=y +CONFIG_DW_WATCHDOG=y +CONFIG_SSB=y +CONFIG_BCMA=y +CONFIG_MFD_RK8XX_I2C=y +CONFIG_MFD_TPS6586X=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_DEBUG=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_VIRTUAL_CONSUMER=y +CONFIG_REGULATOR_USERSPACE_CONSUMER=y +CONFIG_REGULATOR_ACT8865=y +CONFIG_REGULATOR_ARM_SCMI=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_RK808=y +CONFIG_REGULATOR_TPS6586X=y +CONFIG_REGULATOR_VCTRL=y +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_RC_DECODERS=y +CONFIG_IR_JVC_DECODER=y +CONFIG_IR_MCE_KBD_DECODER=y +CONFIG_IR_NEC_DECODER=y +CONFIG_IR_RC5_DECODER=y +CONFIG_IR_RC6_DECODER=y +CONFIG_IR_SANYO_DECODER=y +CONFIG_IR_SHARP_DECODER=y +CONFIG_IR_SONY_DECODER=y +CONFIG_IR_XMP_DECODER=y +CONFIG_RC_DEVICES=y +CONFIG_IR_GPIO_CIR=y +CONFIG_MEDIA_CEC_RC=y +CONFIG_MEDIA_CEC_SUPPORT=y +CONFIG_USB_PULSE8_CEC=m +CONFIG_USB_RAINSHADOW_CEC=m +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_SUPPORT_FILTER=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_ANALOG_TV_SUPPORT=y +CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_SDR_SUPPORT=y +CONFIG_MEDIA_PLATFORM_SUPPORT=y +CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_DVB_MAX_ADAPTERS=8 +# CONFIG_DVB_DYNAMIC_MINORS is not set +CONFIG_MEDIA_USB_SUPPORT=y +CONFIG_VIDEO_USBTV=m +CONFIG_USB_VIDEO_CLASS=y +# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set +CONFIG_VIDEO_AU0828=m +CONFIG_VIDEO_CX231XX=m +CONFIG_VIDEO_CX231XX_ALSA=m +CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_DVB_AS102=m +CONFIG_DVB_B2C2_FLEXCOP_USB=m +CONFIG_DVB_USB_V2=m +CONFIG_DVB_USB_AF9015=m +CONFIG_DVB_USB_AF9035=m +CONFIG_DVB_USB_ANYSEE=m +CONFIG_DVB_USB_AU6610=m +CONFIG_DVB_USB_AZ6007=m +CONFIG_DVB_USB_CE6230=m +CONFIG_DVB_USB_DVBSKY=m +CONFIG_DVB_USB_EC168=m +CONFIG_DVB_USB_GL861=m +CONFIG_DVB_USB_LME2510=m +CONFIG_DVB_USB_MXL111SF=m +CONFIG_DVB_USB_RTL28XXU=m +CONFIG_DVB_USB=y +CONFIG_DVB_USB_A800=m +CONFIG_DVB_USB_AF9005=m +CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_AZ6027=m +CONFIG_DVB_USB_CINERGY_T2=m +CONFIG_DVB_USB_CXUSB=m +CONFIG_DVB_USB_DIB0700=m +CONFIG_DVB_USB_DIBUSB_MB=m +CONFIG_DVB_USB_DIBUSB_MC=m +CONFIG_DVB_USB_DIGITV=m +CONFIG_DVB_USB_DTT200U=m +CONFIG_DVB_USB_DTV5100=m +CONFIG_DVB_USB_DW2102=m +CONFIG_DVB_USB_GP8PSK=m +CONFIG_DVB_USB_M920X=m +CONFIG_DVB_USB_NOVA_T_USB2=m +CONFIG_DVB_USB_OPERA1=m +CONFIG_DVB_USB_PCTV452E=m +CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_TTUSB2=m +CONFIG_DVB_USB_UMT_010=m +CONFIG_DVB_USB_VP702X=m +CONFIG_DVB_USB_VP7045=m +CONFIG_DVB_TTUSB_BUDGET=m +CONFIG_DVB_TTUSB_DEC=m +CONFIG_VIDEO_EM28XX=m +CONFIG_VIDEO_EM28XX_V4L2=m +CONFIG_VIDEO_EM28XX_ALSA=m +CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_USB_AIRSPY=m +CONFIG_USB_HACKRF=m +CONFIG_USB_MSI2500=m +CONFIG_MEDIA_PCI_SUPPORT=y +CONFIG_VIDEO_CX23885=m +CONFIG_VIDEO_CX25821=m +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_DVB_PLATFORM_DRIVERS=y +CONFIG_V4L_MEM2MEM_DRIVERS=y +CONFIG_VIDEO_ROCKCHIP_RGA=y +CONFIG_VIDEO_HANTRO=y +# CONFIG_VIDEO_IR_I2C is not set +CONFIG_VIDEO_IMX219=y +CONFIG_VIDEO_OV5645=y +CONFIG_CXD2880_SPI_DRV=m +CONFIG_DVB_ASCOT2E=m +CONFIG_DVB_HELENE=m +CONFIG_DVB_HORUS3A=m +CONFIG_DVB_ISL6405=m +CONFIG_DVB_LGS8GL5=m +CONFIG_DVB_LNBH25=m +CONFIG_DVB_LNBH29=m +CONFIG_DVB_TDA665x=m +CONFIG_DVB_CXD2099=m +CONFIG_DRM=y +CONFIG_DRM_LOAD_EDID_FIRMWARE=y +CONFIG_DRM_MALI_DISPLAY=y +CONFIG_DRM_ROCKCHIP=y +CONFIG_ROCKCHIP_VOP2=y +CONFIG_ROCKCHIP_DW_HDMI=y +CONFIG_ROCKCHIP_DW_MIPI_DSI=y +CONFIG_DRM_PANEL_ELIDA_KD35T133=y +CONFIG_DRM_PANEL_HIMAX_HX8394=y +CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966=y +CONFIG_DRM_PANEL_NEWVISION_NV3051D=y +CONFIG_DRM_PANEL_SITRONIX_ST7701=y +CONFIG_DRM_PANEL_SITRONIX_ST7703=y +CONFIG_DRM_DISPLAY_CONNECTOR=y +CONFIG_DRM_DW_HDMI_CEC=y +CONFIG_DRM_PANEL_MIPI_DBI=y +CONFIG_DRM_PANFROST=y +CONFIG_FB=y +CONFIG_FIRMWARE_EDID=y +CONFIG_FB_MODE_HELPERS=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_BACKLIGHT_LED=y +CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_HRTIMER=y +CONFIG_SND_DYNAMIC_MINORS=y +# CONFIG_SND_SUPPORT_OLD_API is not set +# CONFIG_SND_VERBOSE_PROCFS is not set +CONFIG_SND_VERBOSE_PRINTK=y +CONFIG_SND_SEQUENCER=y +CONFIG_SND_SEQ_DUMMY=y +# CONFIG_SND_DRIVERS is not set +# CONFIG_SND_PCI is not set +# CONFIG_SND_SPI is not set +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_FSL_SAI=y +CONFIG_SND_SOC_ROCKCHIP=y +CONFIG_SND_SOC_ROCKCHIP_I2S_TDM=y +CONFIG_SND_SOC_ROCKCHIP_PDM=y +CONFIG_SND_SOC_ROCKCHIP_SPDIF=y +CONFIG_SND_SOC_RK3288_HDMI_ANALOG=y +CONFIG_SND_SOC_ES8316=y +CONFIG_SND_SOC_MAX98090=y +CONFIG_SND_SOC_RK817=y +CONFIG_SND_SOC_SIMPLE_AMPLIFIER=y +CONFIG_SND_SOC_SPDIF=y +CONFIG_SND_SOC_TS3A227E=y +CONFIG_SND_SIMPLE_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD=y +CONFIG_SND_AUDIO_GRAPH_CARD2=y +CONFIG_SND_AUDIO_GRAPH_CARD2_CUSTOM_SAMPLE=y +CONFIG_SND_TEST_COMPONENT=y +CONFIG_HID_BATTERY_STRENGTH=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_A4TECH=y +CONFIG_HID_ACRUX=y +CONFIG_HID_APPLE=y +CONFIG_HID_APPLEIR=y +CONFIG_HID_AUREAL=y +CONFIG_HID_BELKIN=y +CONFIG_HID_BETOP_FF=y +CONFIG_HID_CHERRY=y +CONFIG_HID_CHICONY=y +CONFIG_HID_CORSAIR=y +CONFIG_HID_PRODIKEYS=y +CONFIG_HID_CP2112=y +CONFIG_HID_CYPRESS=y +CONFIG_HID_DRAGONRISE=y +CONFIG_DRAGONRISE_FF=y +CONFIG_HID_EMS_FF=y +CONFIG_HID_ELECOM=y +CONFIG_HID_ELO=y +CONFIG_HID_EZKEY=y +CONFIG_HID_GEMBIRD=y +CONFIG_HID_GFRM=y +CONFIG_HID_HOLTEK=y +CONFIG_HOLTEK_FF=y +CONFIG_HID_GT683R=y +CONFIG_HID_KEYTOUCH=y +CONFIG_HID_KYE=y +CONFIG_HID_UCLOGIC=y +CONFIG_HID_WALTOP=y +CONFIG_HID_GYRATION=y +CONFIG_HID_ICADE=y +CONFIG_HID_TWINHAN=y +CONFIG_HID_KENSINGTON=y +CONFIG_HID_LCPOWER=y +CONFIG_HID_LENOVO=y +CONFIG_HID_LOGITECH=y +CONFIG_HID_LOGITECH_DJ=y +CONFIG_LOGITECH_FF=y +CONFIG_LOGIRUMBLEPAD2_FF=y +CONFIG_LOGIG940_FF=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MONTEREY=y +CONFIG_HID_MULTITOUCH=y +CONFIG_HID_NTRIG=y +CONFIG_HID_ORTEK=y +CONFIG_HID_PANTHERLORD=y +CONFIG_PANTHERLORD_FF=y +CONFIG_HID_PENMOUNT=y +CONFIG_HID_PETALYNX=y +CONFIG_HID_PLANTRONICS=y +CONFIG_HID_PRIMAX=y +CONFIG_HID_ROCCAT=y +CONFIG_HID_SAITEK=y +CONFIG_HID_SAMSUNG=y +CONFIG_HID_SONY=y +CONFIG_HID_SPEEDLINK=y +CONFIG_HID_STEELSERIES=y +CONFIG_HID_SUNPLUS=y +CONFIG_HID_RMI=y +CONFIG_HID_GREENASIA=y +CONFIG_GREENASIA_FF=y +CONFIG_HID_SMARTJOYPLUS=y +CONFIG_SMARTJOYPLUS_FF=y +CONFIG_HID_TIVO=y +CONFIG_HID_TOPSEED=y +CONFIG_HID_THINGM=y +CONFIG_HID_THRUSTMASTER=y +CONFIG_THRUSTMASTER_FF=y +CONFIG_HID_WACOM=y +CONFIG_HID_WIIMOTE=y +CONFIG_HID_XINMO=y +CONFIG_HID_ZEROPLUS=y +CONFIG_ZEROPLUS_FF=y +CONFIG_HID_ZYDACRON=y +CONFIG_HID_SENSOR_HUB=y +CONFIG_HID_SENSOR_CUSTOM_SENSOR=y +CONFIG_HID_ALPS=y +CONFIG_USB_HIDDEV=y +CONFIG_I2C_HID_OF_GOODIX=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +# CONFIG_USB_DEFAULT_PERSIST is not set +CONFIG_USB_OTG=y +CONFIG_USB_OTG_PRODUCTLIST=y +CONFIG_USB_OTG_FSM=y +CONFIG_USB_LEDS_TRIGGER_USBPORT=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_ROOT_HUB_TT=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +CONFIG_USB_OHCI_HCD=y +# CONFIG_USB_OHCI_HCD_PCI is not set +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_REALTEK=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_ONETOUCH=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_STORAGE_ENE_UB6250=y +CONFIG_USB_UAS=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC2=y +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL_GENERIC=y +CONFIG_USB_SERIAL_CH341=y +CONFIG_USB_SERIAL_CP210X=y +CONFIG_USB_SERIAL_FTDI_SIO=y +CONFIG_USB_SERIAL_KEYSPAN=y +CONFIG_USB_SERIAL_PL2303=y +CONFIG_USB_SERIAL_OTI6858=y +CONFIG_USB_SERIAL_QUALCOMM=y +CONFIG_USB_SERIAL_SIERRAWIRELESS=y +CONFIG_USB_SERIAL_OPTION=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_U_SERIAL_CONSOLE=y +CONFIG_USB_CONFIGFS=m +CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_MASS_STORAGE=y +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_UVC=y +CONFIG_USB_GADGETFS=m +CONFIG_USB_FUNCTIONFS=m +CONFIG_USB_MASS_STORAGE=m +CONFIG_USB_G_SERIAL=m +CONFIG_TYPEC=y +CONFIG_TYPEC_TCPM=y +CONFIG_TYPEC_FUSB302=y +CONFIG_TYPEC_DP_ALTMODE=y +CONFIG_MMC=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_TEST=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_HSQ=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +CONFIG_LEDS_IS31FL32XX=y +CONFIG_LEDS_SYSCON=y +CONFIG_LEDS_TRIGGER_TIMER=y +CONFIG_LEDS_TRIGGER_ONESHOT=y +CONFIG_LEDS_TRIGGER_DISK=y +CONFIG_LEDS_TRIGGER_HEARTBEAT=y +CONFIG_LEDS_TRIGGER_BACKLIGHT=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_DEFAULT_ON=y +CONFIG_RTC_CLASS=y +# CONFIG_RTC_SYSTOHC is not set +# CONFIG_RTC_INTF_PROC is not set +# CONFIG_RTC_INTF_DEV is not set +CONFIG_RTC_DRV_HYM8563=y +CONFIG_RTC_DRV_RK808=y +CONFIG_DMADEVICES=y +CONFIG_PL330_DMA=y +CONFIG_UDMABUF=y +CONFIG_DMABUF_HEAPS=y +CONFIG_DMABUF_HEAPS_SYSTEM=y +# CONFIG_VIRTIO_MENU is not set +# CONFIG_VHOST_MENU is not set +CONFIG_STAGING=y +CONFIG_RTL8723BS=m +CONFIG_R8712U=m +CONFIG_STAGING_MEDIA=y +CONFIG_VIDEO_ROCKCHIP_VDEC=y +CONFIG_CHROME_PLATFORMS=y +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_COMMON_CLK_RK808=y +CONFIG_COMMON_CLK_SCMI=y +CONFIG_COMMON_CLK_SCPI=y +CONFIG_COMMON_CLK_XGENE=y +CONFIG_COMMON_CLK_PWM=y +CONFIG_COMMON_CLK_FIXED_MMIO=y +# CONFIG_CLK_RK3308 is not set +# CONFIG_CLK_RK3328 is not set +# CONFIG_CLK_RK3368 is not set +# CONFIG_CLK_RK3399 is not set +# CONFIG_FSL_ERRATUM_A008585 is not set +# CONFIG_HISILICON_ERRATUM_161010101 is not set +# CONFIG_ARM64_ERRATUM_858921 is not set +CONFIG_MAILBOX=y +CONFIG_ARM_MHU=y +CONFIG_PLATFORM_MHU=y +CONFIG_ROCKCHIP_MBOX=y +CONFIG_ROCKCHIP_IOMMU=y +CONFIG_ARM_SMMU=y +CONFIG_ARM_SMMU_V3=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_ROCKCHIP_PM_DOMAINS=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_ARM_RK3399_DMC_DEVFREQ=y +CONFIG_MEMORY=y +CONFIG_IIO=y +CONFIG_IIO_BUFFER_HW_CONSUMER=y +CONFIG_IIO_SW_DEVICE=y +CONFIG_IIO_SW_TRIGGER=y +CONFIG_IIO_TRIGGERED_EVENT=y +CONFIG_ROCKCHIP_SARADC=y +CONFIG_SENSORS_ISL29018=y +CONFIG_SENSORS_TSL2563=y +CONFIG_TSL2583=y +CONFIG_IIO_MUX=y +CONFIG_IIO_HRTIMER_TRIGGER=y +CONFIG_IIO_SYSFS_TRIGGER=y +CONFIG_PWM=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_DPHY_RX0=y +CONFIG_PHY_ROCKCHIP_EMMC=y +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y +CONFIG_PHY_ROCKCHIP_PCIE=y +CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y +CONFIG_PHY_ROCKCHIP_TYPEC=y +CONFIG_PHY_ROCKCHIP_USB=y +CONFIG_ARM_SMMU_V3_PMU=y +CONFIG_MUX_GPIO=y +CONFIG_MUX_MMIO=y +CONFIG_EXT4_FS=y +# CONFIG_EXT4_USE_FOR_EXT2 is not set +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_XFS_FS=y +# CONFIG_DNOTIFY is not set +CONFIG_AUTOFS_FS=y +CONFIG_FUSE_FS=y +CONFIG_OVERLAY_FS=y +CONFIG_ISO9660_FS=y +CONFIG_JOLIET=y +CONFIG_ZISOFS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_FAT_DEFAULT_IOCHARSET="ascii" +CONFIG_EXFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_LZ4=y +CONFIG_SQUASHFS_LZO=y +CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_ZSTD=y +CONFIG_PSTORE=y +CONFIG_NLS_DEFAULT="utf-8" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_HARDENED_USERCOPY=y +CONFIG_STATIC_USERMODEHELPER=y +CONFIG_LSM="selinux,integrity" +CONFIG_INIT_STACK_NONE=y +CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y +CONFIG_INIT_ON_FREE_DEFAULT_ON=y +CONFIG_CRYPTO_USER=y +CONFIG_CRYPTO_PCRYPT=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_ECDH=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_CTS=y +CONFIG_CRYPTO_XTS=y +CONFIG_CRYPTO_CHACHA20POLY1305=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_ESSIV=y +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_LZ4=y +CONFIG_CRYPTO_LZ4HC=y +CONFIG_CRYPTO_ZSTD=y +CONFIG_CRYPTO_ANSI_CPRNG=y +CONFIG_CRYPTO_USER_API_HASH=y +CONFIG_CRYPTO_USER_API_SKCIPHER=y +CONFIG_CRYPTO_USER_API_RNG=y +CONFIG_CRYPTO_USER_API_AEAD=y +CONFIG_CRYPTO_STATS=y +CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_SHA512_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_DEV_ROCKCHIP=y +CONFIG_CORDIC=y +CONFIG_CRC_CCITT=y +CONFIG_CRC_T10DIF=y +CONFIG_CRC_ITU_T=y +CONFIG_CRC7=y +# CONFIG_XZ_DEC_X86 is not set +# CONFIG_XZ_DEC_POWERPC is not set +# CONFIG_XZ_DEC_SPARC is not set +CONFIG_PRINTK_TIME=y +CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7 +CONFIG_DYNAMIC_DEBUG=y +# CONFIG_SYMBOLIC_ERRNAME is not set +# CONFIG_DEBUG_MISC is not set +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0 +CONFIG_DEBUG_FS=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PANIC_TIMEOUT=1 +CONFIG_DETECT_HUNG_TASK=y +CONFIG_BOOTPARAM_HUNG_TASK_PANIC=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_STACKTRACE=y +CONFIG_RCU_CPU_STALL_TIMEOUT=60 +CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=20 +# CONFIG_RCU_TRACE is not set +# CONFIG_FTRACE is not set +# CONFIG_STRICT_DEVMEM is not set +# CONFIG_RUNTIME_TESTING_MENU is not set diff --git a/board/recalbox/copy-recalbox-archives.sh b/board/recalbox/copy-recalbox-archives.sh index 3869d2ff3d..9763ea535b 100755 --- a/board/recalbox/copy-recalbox-archives.sh +++ b/board/recalbox/copy-recalbox-archives.sh @@ -143,26 +143,22 @@ case "${RECALBOX_TARGET}" in rm -rf "${BINARIES_DIR}/boot-data/boot" || exit 1 mkdir -p "${BINARIES_DIR}/boot-data/boot" || exit 1 mkdir -p "${BINARIES_DIR}/boot-data/boot/extlinux" || exit 1 - mkdir -p "${BINARIES_DIR}/boot-data/boot/dtb" || exit 1 + mkdir -p "${BINARIES_DIR}/boot-data/boot/dtb/rockchip" || exit 1 mkdir -p "${BINARIES_DIR}/boot-data/boot/bootloader/64" || exit 1 - mkdir -p "${BINARIES_DIR}/boot-data/boot/bootloader/16384" || exit 1 - mkdir -p "${BINARIES_DIR}/boot-data/boot/bootloader/24576" || exit 1 # /boot echo "generating boot" cp "${BR2_EXTERNAL_RECALBOX_PATH}/board/recalbox/anbernic/rg353x/extlinux.conf" "${BINARIES_DIR}/boot-data/boot/extlinux/extlinux.conf" || exit 1 cp "${BR2_EXTERNAL_RECALBOX_PATH}/board/recalbox/anbernic/boot-640x480.ppm" "${BINARIES_DIR}/boot-data/boot.ppm" || exit 1 - cp "${BINARIES_DIR}/rk3566-rg353p-linux.dtb" "${BINARIES_DIR}/boot-data/boot/dtb/" || exit 1 - cp "${BINARIES_DIR}/rk3566-rg353v-linux.dtb" "${BINARIES_DIR}/boot-data/boot/dtb/" || exit 1 - cp "${BINARIES_DIR}/rk3566-rg353m-linux.dtb" "${BINARIES_DIR}/boot-data/boot/dtb/" || exit 1 - cp "${BINARIES_DIR}/rk3566-rg503-linux.dtb" "${BINARIES_DIR}/boot-data/boot/dtb/" || exit 1 - cp "${BINARIES_DIR}/rk3566-rk2023-linux.dtb" "${BINARIES_DIR}/boot-data/boot/dtb/" || exit 1 + for dtb in rk3566-anbernic-rg353ps.dtb rk3566-anbernic-rg353vs.dtb rk3566-anbernic-rg503.dtb \ + rk3566-anbernic-rg353p.dtb rk3566-anbernic-rg353v.dtb rk3566-powkiddy-rk2023.dtb \ + rk3566-powkiddy-rgb30.dtb rk3566-powkiddy-rgb10max3.dtb; do + cp "${BINARIES_DIR}/${dtb}" "${BINARIES_DIR}/boot-data/boot/dtb/rockchip/" || exit 1 + done cp "${BINARIES_DIR}/initrd.gz" "${BINARIES_DIR}/boot-data/boot/initrd.gz" || exit 1 cp "${BINARIES_DIR}/Image" "${BINARIES_DIR}/boot-data/boot/linux" || exit 1 cp "${BINARIES_DIR}/rootfs.squashfs" "${BINARIES_DIR}/boot-data/boot/recalbox" || exit 1 - cp "${BINARIES_DIR}/idbloader.img" "${BINARIES_DIR}/boot-data/boot/bootloader/64/" || exit 1 - cp "${BINARIES_DIR}/uboot.img" "${BINARIES_DIR}/boot-data/boot/bootloader/16384/" || exit 1 - cp "${BINARIES_DIR}/resource.img" "${BINARIES_DIR}/boot-data/boot/bootloader/24576/" || exit 1 + cp "${BINARIES_DIR}/u-boot-rockchip.bin" "${BINARIES_DIR}/boot-data/boot/bootloader/64/" || exit 1 GENIMAGE_CFG="${BR2_EXTERNAL_RECALBOX_PATH}/board/recalbox/anbernic/rg353x/genimage.cfg" ;; diff --git a/configs/recalbox-rg353x_defconfig b/configs/recalbox-rg353x_defconfig index 9e48ac0d47..f137778b92 100644 --- a/configs/recalbox-rg353x_defconfig +++ b/configs/recalbox-rg353x_defconfig @@ -4,9 +4,7 @@ BR2_OPTIMIZE_3=y BR2_SHARED_STATIC_LIBS=y BR2_GLOBAL_PATCH_DIR="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/patches $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/patches" BR2_TOOLCHAIN_BUILDROOT_GLIBC=y -BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_19=y BR2_TOOLCHAIN_BUILDROOT_CXX=y -BR2_GCC_ENABLE_LTO=y BR2_GCC_ENABLE_OPENMP=y BR2_GCC_ENABLE_GRAPHITE=y BR2_GCC_VERSION_14_X=y @@ -28,14 +26,24 @@ BR2_ROOTFS_OVERLAY="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/fsoverlay $(BR2 BR2_ROOTFS_POST_BUILD_SCRIPT="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/recalbox-patch-target.sh" BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/copy-recalbox-archives.sh" BR2_LINUX_KERNEL=y -BR2_LINUX_KERNEL_CUSTOM_GIT=y -BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/JustEnoughLinuxOS/rk356x-kernel" -BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="9d98ce7b4db1b66bcb173557c75bdadc136135cb" +BR2_LINUX_KERNEL_CUSTOM_VERSION=y +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.10" BR2_LINUX_KERNEL_PATCH="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST) $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)" BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y -BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel-aarch64-4.19-defconfig.config" +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config" BR2_LINUX_KERNEL_DTS_SUPPORT=y -BR2_LINUX_KERNEL_INTREE_DTS_NAME="rockchip/rk3566-rg353p-linux rockchip/rk3566-rg353v-linux rockchip/rk3566-rg353m-linux rockchip/rk3566-rg503-linux rockchip/rk3566-rk2023-linux rockchip/rk3566-rgb30-linux" +BR2_LINUX_KERNEL_INTREE_DTS_NAME="rockchip/rk3566-anbernic-rg353ps rockchip/rk3566-anbernic-rg353vs rockchip/rk3566-anbernic-rg503 rockchip/rk3566-anbernic-rg353p rockchip/rk3566-anbernic-rg353v rockchip/rk3566-powkiddy-rk2023 rockchip/rk3566-powkiddy-rgb30 rockchip/rk3566-powkiddy-rgb10max3" +BR2_PACKAGE_ROCKCHIP_RKBIN_TPL_FILENAME="bin/rk35/rk3568_ddr_1056MHz_v1.18.bin" +BR2_PACKAGE_ROCKCHIP_RKBIN_BL31_FILENAME="bin/rk35/rk3568_bl31_v1.43.elf" +BR2_TARGET_UBOOT=y +BR2_TARGET_UBOOT_BOARD_DEFCONFIG="anbernic-rgxx3-rk3566" +BR2_TARGET_UBOOT_NEEDS_ROCKCHIP_RKBIN=y +BR2_TARGET_UBOOT_USE_BINMAN=y +# BR2_TARGET_UBOOT_FORMAT_BIN is not set +BR2_TARGET_UBOOT_FORMAT_CUSTOM=y +BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot-rockchip.bin" +BR2_PACKAGE_ROCKCHIP_RKBIN=y +BR2_PACKAGE_HOST_SWIG=y BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/busybox.custom.config" BR2_PACKAGE_ALSA_UTILS=y BR2_PACKAGE_ALSA_UTILS_AMIXER=y @@ -63,7 +71,6 @@ BR2_PACKAGE_FBV_RECALBOX=y BR2_PACKAGE_SDL_IMAGE_XPM=y BR2_PACKAGE_SDL_MIXER=y BR2_PACKAGE_SDL_NET=y -BR2_PACKAGE_SDL2_KMSDRM=y BR2_PACKAGE_SDL2_OPENGLES=y BR2_PACKAGE_XKEYBOARD_CONFIG=y BR2_PACKAGE_LINUX_FIRMWARE=y @@ -82,7 +89,6 @@ BR2_PACKAGE_LIRC_TOOLS=y BR2_PACKAGE_PARTED=y BR2_PACKAGE_RECALBOX_3MOUNTS=y BR2_PACKAGE_USBUTILS=y -BR2_PACKAGE_NODEJS_MODULES_ADDITIONAL="request" BR2_PACKAGE_PYTHON3_PY_PYC=y BR2_PACKAGE_PYTHON_LIBUSB1=y BR2_PACKAGE_PYTHON_PAHO_MQTT=y @@ -289,8 +295,6 @@ BR2_PACKAGE_LIBRETRO_CHEATS=y BR2_PACKAGE_MEGATOOLS=y BR2_PACKAGE_PAMIX=y BR2_PACKAGE_KMSGRAB=y -BR2_PACKAGE_RECALBOX_ROCKCHIP_MALI_BIFROST_G52=y -BR2_PACKAGE_RECALBOX_ROCKCHIP_MALI_LIB_VERSION_G52_G2P0=y BR2_PACKAGE_XONE=y BR2_PACKAGE_XPAD_NOONE=y BR2_PACKAGE_WII_U_GC_ADAPTER=y diff --git a/package/libretro-flycast/libretro-flycast.mk b/package/libretro-flycast/libretro-flycast.mk index 22ce94954e..33f043e9eb 100644 --- a/package/libretro-flycast/libretro-flycast.mk +++ b/package/libretro-flycast/libretro-flycast.mk @@ -16,10 +16,10 @@ LIBRETRO_FLYCAST_PLATFORM = odroid LIBRETRO_FLYCAST_SUPP_OPT += BOARD=ODROID-XU4 CC_AS="$(TARGET_CC)" else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2),y) LIBRETRO_FLYCAST_PLATFORM = odroid-go2 -LIBRETRO_FLYCAST_SUPP_OPT += CC_AS="$(TARGET_CC)" LDFLAGS=-lmali +LIBRETRO_FLYCAST_SUPP_OPT += CC_AS="$(TARGET_CC)" else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RG353X),y) LIBRETRO_FLYCAST_PLATFORM = arm64 -LIBRETRO_FLYCAST_SUPP_OPT += CC_AS="$(TARGET_CC)" LDFLAGS=-lmali +LIBRETRO_FLYCAST_SUPP_OPT += CC_AS="$(TARGET_CC)" else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RPIZERO2LEGACY),y) LIBRETRO_FLYCAST_PLATFORM = rpi3 LIBRETRO_FLYCAST_SUPP_OPT += CC_AS="$(TARGET_CC)" @@ -41,6 +41,10 @@ LIBRETRO_FLYCAST_SUPP_OPT += FORCE_GLES=1 LIBRETRO_FLYCAST_DEPENDENCIES += libgles endif +ifeq ($(BR2_PACKAGE_RECALBOX_HAS_LIBMALI),y) +LIBRETRO_FLYCAST_SUPP_OPT += LDFLAGS=-lmali +endif + ifeq ($(BR2_PACKAGE_HAS_LIBGL),y) LIBRETRO_FLYCAST_DEPENDENCIES += libgl endif diff --git a/package/libretro-mupen64plus-nx/libretro-mupen64plus-nx.mk b/package/libretro-mupen64plus-nx/libretro-mupen64plus-nx.mk index cfc5c9d27c..a457135aff 100644 --- a/package/libretro-mupen64plus-nx/libretro-mupen64plus-nx.mk +++ b/package/libretro-mupen64plus-nx/libretro-mupen64plus-nx.mk @@ -36,11 +36,10 @@ LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT=BOARD="ODROID-XU" else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2),y) LIBRETRO_MUPEN64PLUS_NX_PLATFORM=odroid64 -LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT=BOARD="ODROID-GO2" EGL_LIB="-lEGL -lmali" +LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT=BOARD="ODROID-GO2" else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RG353X),y) LIBRETRO_MUPEN64PLUS_NX_PLATFORM=unix -LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT= EGL_LIB="-lEGL -lmali" else ifeq ($(BR2_x86_64),y) LIBRETRO_MUPEN64PLUS_NX_PLATFORM=unix @@ -59,6 +58,10 @@ ifeq ($(BR2_PACKAGE_RECALBOX_HAS_LIBGLES3),y) LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT += FORCE_GLES3=1 endif +ifeq ($(BR2_PACKAGE_RECALBOX_HAS_LIBMALI),y) +LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT += EGL_LIB="-lEGL -lmali" +endif + LIBRETRO_MUPEN64PLUS_NX_SUPP_OPT += ARCH=$(BR2_ARCH) LIBRETRO_MUPEN64PLUS_NX_DYNAREC = $(BR2_ARCH) diff --git a/package/libretro-parallel-n64/libretro-parallel-n64.mk b/package/libretro-parallel-n64/libretro-parallel-n64.mk index 169177ac76..ced02f27e2 100644 --- a/package/libretro-parallel-n64/libretro-parallel-n64.mk +++ b/package/libretro-parallel-n64/libretro-parallel-n64.mk @@ -53,19 +53,23 @@ LIBRETRO_PARALLEL_N64_SUPP_OPT=BOARD=ODROID-XU else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2),y) LIBRETRO_PARALLEL_N64_PLATFORM = odroid -LIBRETRO_PARALLEL_N64_SUPP_OPT = BOARD=ODROIDGO2 HAVE_PARELLEL_RSP=1 LIBS=-lmali +LIBRETRO_PARALLEL_N64_SUPP_OPT = BOARD=ODROIDGO2 HAVE_PARELLEL_RSP=1 else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RG353X),y) #LIBRETRO_PARALLEL_N64_PLATFORM = unix gles #LIBRETRO_PARALLEL_N64_SUPP_OPT = HAVE_PARALLEL=1 LIBS=-lmali CPUFLAGS="-DCLASSIC -DARM64 -DARM_FIX" LIBRETRO_PARALLEL_N64_PLATFORM = odroid -LIBRETRO_PARALLEL_N64_SUPP_OPT = BOARD=ODROIDGO2 HAVE_PARELLEL_RSP=1 LIBS=-lmali +LIBRETRO_PARALLEL_N64_SUPP_OPT = BOARD=ODROIDGO2 HAVE_PARELLEL_RSP=1 else ifeq ($(BR2_x86_64),y) LIBRETRO_PARALLEL_N64_SUPP_OPT=ARCH=x86_64 HAVE_PARALLEL_RSP=1 HAVE_THR_AL=1 LIBRETRO_PARALLEL_N64_PLATFORM=unix endif +ifeq ($(BR2_PACKAGE_RECALBOX_HAS_LIBMALI),y) +LIBRETRO_PARALLEL_N64_SUPP_OPT += LIBS=-lmali +endif + LIBRETRO_PARALLEL_N64_DYNAREC = $(BR2_ARCH) define LIBRETRO_PARALLEL_N64_BUILD_CMDS diff --git a/package/libretro-yabasanshiro/libretro-yabasanshiro.mk b/package/libretro-yabasanshiro/libretro-yabasanshiro.mk index 9d2a1140d7..8624c9dd3b 100644 --- a/package/libretro-yabasanshiro/libretro-yabasanshiro.mk +++ b/package/libretro-yabasanshiro/libretro-yabasanshiro.mk @@ -15,16 +15,20 @@ LIBRETRO_YABASANSHIRO_PLATFORM=odroid LIBRETRO_YABASANSHIRO_SUPP_OPT=BOARD="ODROID-XU4" else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2),y) LIBRETRO_YABASANSHIRO_PLATFORM=odroid-go2 -LIBRETRO_YABASANSHIRO_LDFLAGS_OPT = -lmali -lpthread +LIBRETRO_YABASANSHIRO_LDFLAGS_OPT = -lpthread else ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RG353X),y) LIBRETRO_YABASANSHIRO_PLATFORM=arm64 LIBRETRO_YABASANSHIRO_SUPP_OPT = FORCE_GLES=1 -LIBRETRO_YABASANSHIRO_LDFLAGS_OPT = -lmali -lpthread +LIBRETRO_YABASANSHIRO_LDFLAGS_OPT = -lpthread else LIBRETRO_YABASANSHIRO_PLATFORM=$(RETROARCH_LIBRETRO_BOARD_SHORT) LIBRETRO_YABASANSHIRO_SUPP_OPT= endif +ifeq ($(BR2_PACKAGE_RECALBOX_HAS_LIBMALI),y) +LIBRETRO_YABASANSHIRO_LDFLAGS_OPT += -lmali +endif + define LIBRETRO_YABASANSHIRO_DOSUNIX_PATCH $(SED) 's/\r//' $(@D)/yabause/src/yglshaderes.c endef diff --git a/package/recalbox-system/Config.in b/package/recalbox-system/Config.in index 56e49af87f..916969a476 100644 --- a/package/recalbox-system/Config.in +++ b/package/recalbox-system/Config.in @@ -108,6 +108,10 @@ config BR2_PACKAGE_RECALBOX_TARGET_RG353X select BR2_PACKAGE_GPTFDISK select BR2_PACKAGE_GPTFDISK_SGDISK select BR2_PACKAGE_RKWIFIBT + select BR2_PACKAGE_MESA3D + select BR2_PACKAGE_MESA3D_GALLIUM_DRIVER_PANFROST + select BR2_PACKAGE_MESA3D_OPENGL_EGL + select BR2_PACKAGE_MESA3D_OPENGL_ES config BR2_PACKAGE_RECALBOX_TARGET_X86_64 bool "x86_64" @@ -195,8 +199,7 @@ config BR2_PACKAGE_RECALBOX_HAS_LIBMALI bool default y if \ BR2_PACKAGE_RECALBOX_TARGET_ODROIDXU4 ||\ - BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2 ||\ - BR2_PACKAGE_RECALBOX_TARGET_RG353X + BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2 config BR2_PACKAGE_RECALBOX_EGL_NO_X11 bool diff --git a/package/recalbox-system/rg353x/pre-upgrade.sh b/package/recalbox-system/rg353x/pre-upgrade.sh index e4de3036bc..9e2d5df74c 100644 --- a/package/recalbox-system/rg353x/pre-upgrade.sh +++ b/package/recalbox-system/rg353x/pre-upgrade.sh @@ -16,3 +16,9 @@ rm -rf /recalbox/share/bios/mame2003-plus/mame2003-plus.xml rm -rf /recalbox/share/bios/mame2010/mame2010.xml rm -rf /recalbox/share/bios/mame2015/mame2014-xml.zip rm -rf /recalbox/share/bios/mame2015/mame2015-xml.zip + +# remove old bootloader blobs +mount -o remount,rw /boot +rm -rf /boot/boot/bootloader +mount -o remount,ro /boot + diff --git a/package/scummvm/Config.in b/package/scummvm/Config.in index 854cb945a4..ad7e8252a3 100644 --- a/package/scummvm/Config.in +++ b/package/scummvm/Config.in @@ -14,7 +14,7 @@ config BR2_PACKAGE_SCUMMVM select BR2_PACKAGE_FLUIDSYNTH select BR2_PACKAGE_FREETYPE select BR2_PACKAGE_ZLIB - select BR2_PACKAGE_LIBRGA if (BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2 || BR2_PACKAGE_RECALBOX_TARGET_RG353X) + select BR2_PACKAGE_LIBRGA if BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2 help ScummVM point and click http://wiki.scummvm.org/ diff --git a/package/scummvm/scummvm.mk b/package/scummvm/scummvm.mk index bed62c0326..3249a137e8 100644 --- a/package/scummvm/scummvm.mk +++ b/package/scummvm/scummvm.mk @@ -15,7 +15,7 @@ ifeq ($(BR2_PACKAGE_RPI_USERLAND),y) SCUMMVM_CONF_OPTS += --host=raspberrypi endif -ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2)$(BR2_PACKAGE_RECALBOX_TARGET_RG353X),y) +ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_ODROIDGO2),y) SCUMMVM_CONF_ENV += LDFLAGS="-lmali -lrga" SCUMMVM_DEPENDENCIES += librga endif -- GitLab From c23d166623fe8c5e54347fcebd977ac0560ef572 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Tue, 29 Oct 2024 21:15:57 +0100 Subject: [PATCH 4/9] chore: split uboot image into two files First file is idloader and second is uboot. We have to do this because genimage can't flash image larger than the partition. --- board/recalbox/anbernic/rg353x/genimage.cfg | 18 ++++++++++++++++-- .../fsoverlay/etc/init.d/S31emulationstation | 2 +- .../src/hardware/boards/anbernic/RG353XBoard.h | 6 +++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/board/recalbox/anbernic/rg353x/genimage.cfg b/board/recalbox/anbernic/rg353x/genimage.cfg index 47527005a8..f7d729edf1 100644 --- a/board/recalbox/anbernic/rg353x/genimage.cfg +++ b/board/recalbox/anbernic/rg353x/genimage.cfg @@ -30,10 +30,24 @@ image recalbox.img { partition-table-type = gpt } + partition idbloader { + in-partition-table = "no" + image = "u-boot-rockchip-idbloader.bin" + offset = 32K + size = 8355840 + } + partition uboot { in-partition-table = "yes" - image = "u-boot-rockchip.bin" - offset = 32k + image = "u-boot-rockchip-uboot.bin" + offset = 8M + size = 4M + } + + partition resource { + in-partition-table = "yes" + offset = 12M + size = 4M } partition boot { diff --git a/board/recalbox/fsoverlay/etc/init.d/S31emulationstation b/board/recalbox/fsoverlay/etc/init.d/S31emulationstation index 399706233b..865e842d4f 100755 --- a/board/recalbox/fsoverlay/etc/init.d/S31emulationstation +++ b/board/recalbox/fsoverlay/etc/init.d/S31emulationstation @@ -41,7 +41,7 @@ case "$1" in if currentVideoOnCRT; then export MESA_LOADER_DRIVER_OVERRIDE=vc4; fi HOME=/recalbox/share/system LANG="${settings_lang}.UTF-8" SDL_VIDEO_GL_DRIVER=/usr/lib/libGLESv2.so SDL_VIDEO_EGL_DRIVER=/usr/lib/libEGL.so SDL_NOMOUSE=1 start-stop-daemon -S -q -m -p /var/run/emulationstation.pid --exec "$ESBIN" & else - HOME=/recalbox/share/system LANG="${settings_lang}.UTF-8" SDL_VIDEO_GL_DRIVER=/usr/lib/libGLESv2.so SDL_VIDEO_EGL_DRIVER=/usr/lib/libGLESv2.so SDL_NOMOUSE=1 start-stop-daemon -S -q -m -p /var/run/emulationstation.pid --exec "$ESBIN" & + HOME=/recalbox/share/system LANG="${settings_lang}.UTF-8" SDL_NOMOUSE=1 start-stop-daemon -S -q -m -p /var/run/emulationstation.pid --exec "$ESBIN" & fi fi ;; diff --git a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.h b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.h index 3319f5d6ed..a9a9ba11a9 100644 --- a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.h +++ b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.h @@ -29,9 +29,9 @@ class RG353XBoard: public IBoardInterface private: static constexpr const char* sCpuGovernancePath = "/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"; static constexpr const char* sGpuGovernancePath = "/sys/class/devfreq/fde60000.gpu/governor"; - static constexpr const char* sDmcGovernancePath = "/sys/class/devfreq/dmc/governor"; - static constexpr const char* sBatteryCapacityPath = "/sys/class/power_supply/battery/capacity"; - static constexpr const char* sBatteryStatusPath = "/sys/class/power_supply/battery/status"; + static constexpr const char* sDmcGovernancePath = "/sys/class/devfreq/dmc/governor"; // TODO + static constexpr const char* sBatteryCapacityPath = "/sys/class/power_supply/rk817-battery/capacity"; + static constexpr const char* sBatteryStatusPath = "/sys/class/power_supply/rk817-battery/status"; //! Headphone jack event reader RG353XJackEventReader mHeadphoneReader; -- GitLab From d42252b13e675835bf7fb225e6323e5a21af4a2b Mon Sep 17 00:00:00 2001 From: David Barbion Date: Sat, 4 Jan 2025 23:01:05 +0100 Subject: [PATCH 5/9] chore(rg353x): set custom kernel configuration --- .../kernel-6.10-defconfig-fragment.config | 3 + .../rg353x/kernel-6.10-defconfig.config | 660 +++----- .../0001-add-singleadc-joy.patch | 1403 +++++++++++++++++ ...regulator-for-Anbernic-RGxx3-Devices.patch | 69 + board/recalbox/copy-recalbox-archives.sh | 7 +- configs/recalbox-rg353x_defconfig | 3 +- .../audio/pulseaudio/PulseAudioController.cpp | 6 - .../frontend/es-core/src/hardware/Board.cpp | 14 +- .../hardware/boards/anbernic/RG353XBoard.cpp | 8 +- .../boards/anbernic/RG353XJackEventReader.h | 2 +- .../boards/anbernic/RG353XPowerEventReader.h | 2 +- .../boards/anbernic/RG353XVolumeReader.h | 2 +- 12 files changed, 1748 insertions(+), 431 deletions(-) create mode 100644 board/recalbox/anbernic/rg353x/kernel_patches/0001-add-singleadc-joy.patch create mode 100644 board/recalbox/anbernic/rg353x/kernel_patches/0003-add-spk_amp-regulator-for-Anbernic-RGxx3-Devices.patch diff --git a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config index a3d71e41c5..a3bb773b16 100644 --- a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config +++ b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config @@ -29,3 +29,6 @@ CONFIG_ZEROPLUS_FF=y # disable module compression CONFIG_MODULE_COMPRESS_NONE=y + +# ported drivers +CONFIG_JOYSTICK_SINGLEADCJOY=y diff --git a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config index d87f3c31c0..2d621a0f21 100644 --- a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config +++ b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config @@ -31,14 +31,16 @@ CONFIG_CGROUP_BPF=y CONFIG_NAMESPACES=y CONFIG_SCHED_AUTOGROUP=y CONFIG_RELAY=y -CONFIG_INITRAMFS_SOURCE="" -CONFIG_INITRAMFS_COMPRESSION_LZO=y CONFIG_BOOT_CONFIG=y CONFIG_EXPERT=y CONFIG_SGETMASK_SYSCALL=y CONFIG_KALLSYMS_ALL=y CONFIG_PROFILING=y CONFIG_ARCH_ROCKCHIP=y +CONFIG_ARM64_ERRATUM_2441007=y +CONFIG_ARM64_ERRATUM_1286807=y +CONFIG_ARM64_ERRATUM_1542419=y +CONFIG_ARM64_ERRATUM_2441009=y # CONFIG_CAVIUM_ERRATUM_22375 is not set # CONFIG_CAVIUM_ERRATUM_23154 is not set # CONFIG_CAVIUM_ERRATUM_27456 is not set @@ -52,6 +54,7 @@ CONFIG_ARCH_ROCKCHIP=y # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set +CONFIG_ARM64_VA_BITS_48=y CONFIG_SCHED_MC=y CONFIG_SCHED_SMT=y CONFIG_NR_CPUS=4 @@ -71,14 +74,18 @@ CONFIG_CPU_IDLE_GOV_LADDER=y CONFIG_ARM_PSCI_CPUIDLE=y CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=y CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y CONFIG_CPUFREQ_DT=y CONFIG_ARM_SCMI_CPUFREQ=y +# CONFIG_GCC_PLUGINS is not set CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_BLK_DEV_BSGLIB=y CONFIG_PARTITION_ADVANCED=y CONFIG_MAC_PARTITION=y # CONFIG_MQ_IOSCHED_KYBER is not set @@ -99,7 +106,6 @@ CONFIG_NET_KEY=y CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y -CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_NET_IPIP=m @@ -109,6 +115,7 @@ CONFIG_IP_MROUTE=y CONFIG_IP_MROUTE_MULTIPLE_TABLES=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y +CONFIG_SYN_COOKIES=y CONFIG_INET_AH=y CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y @@ -125,200 +132,17 @@ CONFIG_TCP_CONG_ILLINOIS=m CONFIG_TCP_CONG_DCTCP=m CONFIG_TCP_CONG_CDG=m CONFIG_TCP_MD5SIG=y -# CONFIG_IPV6 is not set -CONFIG_NETFILTER=y -CONFIG_BRIDGE_NETFILTER=y -CONFIG_NETFILTER_NETLINK_QUEUE=y -CONFIG_NETFILTER_NETLINK_LOG=y -CONFIG_NF_CONNTRACK=m -CONFIG_NF_CONNTRACK_PROCFS=y -CONFIG_NF_CONNTRACK_EVENTS=y -CONFIG_NF_CONNTRACK_TIMEOUT=y -CONFIG_NF_CONNTRACK_TIMESTAMP=y -CONFIG_NF_CONNTRACK_AMANDA=m -CONFIG_NF_CONNTRACK_FTP=m -CONFIG_NF_CONNTRACK_H323=m -CONFIG_NF_CONNTRACK_IRC=m -CONFIG_NF_CONNTRACK_NETBIOS_NS=m -CONFIG_NF_CONNTRACK_SNMP=m -CONFIG_NF_CONNTRACK_PPTP=m -CONFIG_NF_CONNTRACK_SANE=m -CONFIG_NF_CONNTRACK_SIP=m -CONFIG_NF_CONNTRACK_TFTP=m -CONFIG_NF_CT_NETLINK=m -CONFIG_NF_CT_NETLINK_TIMEOUT=m -CONFIG_NF_TABLES=m -CONFIG_NFT_CT=m -CONFIG_NFT_LOG=m -CONFIG_NFT_LIMIT=m -CONFIG_NFT_MASQ=m -CONFIG_NFT_REDIR=m -CONFIG_NFT_QUEUE=m -CONFIG_NFT_REJECT=m -CONFIG_NFT_COMPAT=m -CONFIG_NFT_HASH=m -CONFIG_NETFILTER_XTABLES_COMPAT=y -CONFIG_NETFILTER_XT_SET=m -CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m -CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m -CONFIG_NETFILTER_XT_TARGET_CONNMARK=m -CONFIG_NETFILTER_XT_TARGET_DSCP=m -CONFIG_NETFILTER_XT_TARGET_HMARK=m -CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m -CONFIG_NETFILTER_XT_TARGET_LED=m -CONFIG_NETFILTER_XT_TARGET_LOG=m -CONFIG_NETFILTER_XT_TARGET_MARK=m -CONFIG_NETFILTER_XT_TARGET_NFLOG=m -CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m -CONFIG_NETFILTER_XT_TARGET_NOTRACK=m -CONFIG_NETFILTER_XT_TARGET_TEE=m -CONFIG_NETFILTER_XT_TARGET_TPROXY=m -CONFIG_NETFILTER_XT_TARGET_TRACE=m -CONFIG_NETFILTER_XT_TARGET_TCPMSS=m -CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP=m -CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=m -CONFIG_NETFILTER_XT_MATCH_BPF=m -CONFIG_NETFILTER_XT_MATCH_CGROUP=m -CONFIG_NETFILTER_XT_MATCH_CLUSTER=m -CONFIG_NETFILTER_XT_MATCH_COMMENT=m -CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m -CONFIG_NETFILTER_XT_MATCH_CONNLABEL=m -CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m -CONFIG_NETFILTER_XT_MATCH_CONNMARK=m -CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m -CONFIG_NETFILTER_XT_MATCH_CPU=m -CONFIG_NETFILTER_XT_MATCH_DCCP=m -CONFIG_NETFILTER_XT_MATCH_DEVGROUP=m -CONFIG_NETFILTER_XT_MATCH_DSCP=m -CONFIG_NETFILTER_XT_MATCH_ESP=m -CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m -CONFIG_NETFILTER_XT_MATCH_HELPER=m -CONFIG_NETFILTER_XT_MATCH_IPCOMP=m -CONFIG_NETFILTER_XT_MATCH_IPRANGE=m -CONFIG_NETFILTER_XT_MATCH_IPVS=m -CONFIG_NETFILTER_XT_MATCH_L2TP=m -CONFIG_NETFILTER_XT_MATCH_LENGTH=m -CONFIG_NETFILTER_XT_MATCH_LIMIT=m -CONFIG_NETFILTER_XT_MATCH_MAC=m -CONFIG_NETFILTER_XT_MATCH_MARK=m -CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m -CONFIG_NETFILTER_XT_MATCH_NFACCT=m -CONFIG_NETFILTER_XT_MATCH_OSF=m -CONFIG_NETFILTER_XT_MATCH_OWNER=m -CONFIG_NETFILTER_XT_MATCH_POLICY=m -CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m -CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m -CONFIG_NETFILTER_XT_MATCH_QUOTA=m -CONFIG_NETFILTER_XT_MATCH_RATEEST=m -CONFIG_NETFILTER_XT_MATCH_REALM=m -CONFIG_NETFILTER_XT_MATCH_RECENT=m -CONFIG_NETFILTER_XT_MATCH_SCTP=m -CONFIG_NETFILTER_XT_MATCH_SOCKET=m -CONFIG_NETFILTER_XT_MATCH_STATE=m -CONFIG_NETFILTER_XT_MATCH_STATISTIC=m -CONFIG_NETFILTER_XT_MATCH_STRING=m -CONFIG_NETFILTER_XT_MATCH_TCPMSS=m -CONFIG_NETFILTER_XT_MATCH_TIME=m -CONFIG_NETFILTER_XT_MATCH_U32=m -CONFIG_IP_SET=y -CONFIG_IP_SET_BITMAP_IP=m -CONFIG_IP_SET_BITMAP_IPMAC=m -CONFIG_IP_SET_BITMAP_PORT=m -CONFIG_IP_SET_HASH_IP=m -CONFIG_IP_SET_HASH_IPMARK=m -CONFIG_IP_SET_HASH_IPPORT=m -CONFIG_IP_SET_HASH_IPPORTIP=m -CONFIG_IP_SET_HASH_IPPORTNET=m -CONFIG_IP_SET_HASH_MAC=m -CONFIG_IP_SET_HASH_NETPORTNET=m -CONFIG_IP_SET_HASH_NET=m -CONFIG_IP_SET_HASH_NETNET=m -CONFIG_IP_SET_HASH_NETPORT=m -CONFIG_IP_SET_HASH_NETIFACE=m -CONFIG_IP_SET_LIST_SET=m -CONFIG_IP_VS=m -CONFIG_IP_VS_PROTO_TCP=y -CONFIG_IP_VS_PROTO_UDP=y -CONFIG_IP_VS_PROTO_ESP=y -CONFIG_IP_VS_PROTO_AH=y -CONFIG_IP_VS_PROTO_SCTP=y -CONFIG_IP_VS_RR=m -CONFIG_IP_VS_WRR=m -CONFIG_IP_VS_LC=m -CONFIG_IP_VS_WLC=m -CONFIG_IP_VS_FO=m -CONFIG_IP_VS_OVF=m -CONFIG_IP_VS_LBLC=m -CONFIG_IP_VS_LBLCR=m -CONFIG_IP_VS_DH=m -CONFIG_IP_VS_SH=m -CONFIG_IP_VS_SED=m -CONFIG_IP_VS_NQ=m -CONFIG_IP_VS_NFCT=y -CONFIG_NF_LOG_ARP=m -CONFIG_NF_LOG_IPV4=m -CONFIG_IP_NF_IPTABLES=y -CONFIG_IP_NF_MATCH_AH=m -CONFIG_IP_NF_MATCH_ECN=m -CONFIG_IP_NF_MATCH_RPFILTER=m -CONFIG_IP_NF_MATCH_TTL=m -CONFIG_IP_NF_FILTER=y -CONFIG_IP_NF_TARGET_REJECT=m -CONFIG_IP_NF_TARGET_SYNPROXY=m -CONFIG_IP_NF_NAT=m -CONFIG_IP_NF_TARGET_MASQUERADE=m -CONFIG_IP_NF_TARGET_NETMAP=m -CONFIG_IP_NF_TARGET_REDIRECT=m -CONFIG_IP_NF_MANGLE=m -CONFIG_IP_NF_TARGET_ECN=m -CONFIG_IP_NF_TARGET_TTL=m -CONFIG_IP_NF_RAW=m -CONFIG_IP_NF_SECURITY=y -CONFIG_IP_NF_ARPTABLES=m -CONFIG_IP_NF_ARPFILTER=m -CONFIG_IP_NF_ARP_MANGLE=m -CONFIG_NF_TABLES_BRIDGE=m -CONFIG_NFT_BRIDGE_META=m -CONFIG_BRIDGE_NF_EBTABLES=m -CONFIG_BRIDGE_EBT_BROUTE=m -CONFIG_BRIDGE_EBT_T_FILTER=m -CONFIG_BRIDGE_EBT_T_NAT=m -CONFIG_BRIDGE_EBT_802_3=m -CONFIG_BRIDGE_EBT_AMONG=m -CONFIG_BRIDGE_EBT_ARP=m -CONFIG_BRIDGE_EBT_IP=m -CONFIG_BRIDGE_EBT_LIMIT=m -CONFIG_BRIDGE_EBT_MARK=m -CONFIG_BRIDGE_EBT_PKTTYPE=m -CONFIG_BRIDGE_EBT_STP=m -CONFIG_BRIDGE_EBT_VLAN=m -CONFIG_BRIDGE_EBT_ARPREPLY=m -CONFIG_BRIDGE_EBT_DNAT=m -CONFIG_BRIDGE_EBT_MARK_T=m -CONFIG_BRIDGE_EBT_REDIRECT=m -CONFIG_BRIDGE_EBT_SNAT=m -CONFIG_BRIDGE_EBT_LOG=m -CONFIG_BRIDGE_EBT_NFLOG=m -CONFIG_BRIDGE=y -CONFIG_VLAN_8021Q=y -CONFIG_NET_SCHED=y -CONFIG_NET_SCH_HTB=y -CONFIG_NET_SCH_CODEL=y -CONFIG_NET_SCH_FQ_CODEL=y -CONFIG_NET_CLS_U32=y -CONFIG_CLS_U32_MARK=y -CONFIG_NET_CLS_CGROUP=y -CONFIG_DNS_RESOLVER=y -CONFIG_OPENVSWITCH=m +CONFIG_NET_NSH=m +CONFIG_NET_L3_MASTER_DEV=y CONFIG_CGROUP_NET_PRIO=y -CONFIG_CAN=y +CONFIG_CGROUP_NET_CLASSID=y CONFIG_BT=m CONFIG_BT_RFCOMM=y CONFIG_BT_HIDP=y -CONFIG_BT_HS=y CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_ATH3K=y +CONFIG_BT_HCIUART_RTL=y CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIVHCI=m CONFIG_BT_MRVL=m @@ -331,12 +155,8 @@ CONFIG_MAC80211_MESH=y CONFIG_RFKILL=m CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_GPIO=m +CONFIG_CEPH_LIB=m # CONFIG_ETHTOOL_NETLINK is not set -CONFIG_PCI=y -CONFIG_PCIEPORTBUS=y -CONFIG_PCIEAER=y -CONFIG_PCIE_ROCKCHIP_HOST=y -CONFIG_PCIE_ROCKCHIP_DW_HOST=y CONFIG_UEVENT_HELPER=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y @@ -356,90 +176,65 @@ CONFIG_MTD_SPI_NOR=y CONFIG_OF_OVERLAY=y CONFIG_ZRAM=y CONFIG_BLK_DEV_LOOP=y -CONFIG_BLK_DEV_DRBD=m -CONFIG_BLK_DEV_NBD=m CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 -CONFIG_ATA_OVER_ETH=m -CONFIG_BLK_DEV_RBD=m -CONFIG_BLK_DEV_NVME=m CONFIG_SRAM=y CONFIG_EEPROM_93CX6=y +CONFIG_SCSI=y CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SR=y CONFIG_SCSI_SCAN_ASYNC=y CONFIG_SCSI_SPI_ATTRS=y -CONFIG_MEGARAID_SAS=m -CONFIG_SCSI_MPT2SAS=m -CONFIG_ATA=y -CONFIG_SATA_AHCI=y -CONFIG_SATA_AHCI_PLATFORM=y -CONFIG_SATA_MV=m -CONFIG_SATA_NV=m -CONFIG_SATA_PROMISE=m -CONFIG_SATA_SIL=m -CONFIG_MD=y -CONFIG_BCACHE=m -CONFIG_BLK_DEV_DM=y -CONFIG_DM_CRYPT=m -CONFIG_DM_RAID=y CONFIG_NETDEVICES=y CONFIG_WIREGUARD=y -CONFIG_MACVLAN=y -CONFIG_IPVLAN=y -CONFIG_VXLAN=m CONFIG_TUN=m CONFIG_VETH=y -# CONFIG_NET_VENDOR_3COM is not set -# CONFIG_NET_VENDOR_ADAPTEC is not set -# CONFIG_NET_VENDOR_AGERE is not set -# CONFIG_NET_VENDOR_ALTEON is not set +# CONFIG_NET_VENDOR_ALACRITECH is not set +# CONFIG_NET_VENDOR_AMAZON is not set # CONFIG_NET_VENDOR_AMD is not set +# CONFIG_NET_VENDOR_AQUANTIA is not set # CONFIG_NET_VENDOR_ARC is not set -# CONFIG_NET_VENDOR_ATHEROS is not set +# CONFIG_NET_VENDOR_ASIX is not set # CONFIG_NET_VENDOR_BROADCOM is not set +# CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set -# CONFIG_NET_VENDOR_CHELSIO is not set -# CONFIG_NET_VENDOR_CISCO is not set -# CONFIG_NET_VENDOR_DEC is not set -# CONFIG_NET_VENDOR_DLINK is not set -# CONFIG_NET_VENDOR_EMULEX is not set +# CONFIG_NET_VENDOR_CORTINA is not set +# CONFIG_NET_VENDOR_DAVICOM is not set +# CONFIG_NET_VENDOR_ENGLEDER is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FUNGIBLE is not set +# CONFIG_NET_VENDOR_GOOGLE is not set # CONFIG_NET_VENDOR_HISILICON is not set -CONFIG_E100=y -CONFIG_E1000=y -CONFIG_E1000E=y -CONFIG_IGB=y -CONFIG_IXGBE=y +# CONFIG_NET_VENDOR_HUAWEI is not set +# CONFIG_NET_VENDOR_INTEL is not set +# CONFIG_NET_VENDOR_ADI is not set +# CONFIG_NET_VENDOR_LITEX is not set # CONFIG_NET_VENDOR_MARVELL is not set # CONFIG_NET_VENDOR_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set -# CONFIG_NET_VENDOR_MYRI is not set +# CONFIG_NET_VENDOR_MICROSEMI is not set +# CONFIG_NET_VENDOR_MICROSOFT is not set +# CONFIG_NET_VENDOR_NI is not set # CONFIG_NET_VENDOR_NATSEMI is not set -# CONFIG_NET_VENDOR_NVIDIA is not set -# CONFIG_NET_VENDOR_OKI is not set -# CONFIG_NET_VENDOR_QLOGIC is not set -# CONFIG_NET_VENDOR_BROCADE is not set +# CONFIG_NET_VENDOR_NETRONOME is not set +# CONFIG_NET_VENDOR_PENSANDO is not set # CONFIG_NET_VENDOR_QUALCOMM is not set -# CONFIG_NET_VENDOR_RDC is not set # CONFIG_NET_VENDOR_RENESAS is not set # CONFIG_NET_VENDOR_ROCKER is not set # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set -# CONFIG_NET_VENDOR_SILAN is not set -# CONFIG_NET_VENDOR_SIS is not set +# CONFIG_NET_VENDOR_SOLARFLARE is not set # CONFIG_NET_VENDOR_SMSC is not set -CONFIG_STMMAC_ETH=y -# CONFIG_NET_VENDOR_SUN is not set +# CONFIG_NET_VENDOR_SOCIONEXT is not set +# CONFIG_NET_VENDOR_STMICRO is not set # CONFIG_NET_VENDOR_SYNOPSYS is not set -# CONFIG_NET_VENDOR_TEHUTI is not set -# CONFIG_NET_VENDOR_TI is not set +# CONFIG_NET_VENDOR_VERTEXCOM is not set # CONFIG_NET_VENDOR_VIA is not set +# CONFIG_NET_VENDOR_WANGXUN is not set # CONFIG_NET_VENDOR_WIZNET is not set +# CONFIG_NET_VENDOR_XILINX is not set CONFIG_ROCKCHIP_PHY=y -CONFIG_CAN_SJA1000=y -CONFIG_CAN_PLX_PCI=y CONFIG_PPP=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_DEFLATE=m @@ -455,7 +250,6 @@ CONFIG_USB_NET_RNDIS_HOST=y # CONFIG_USB_NET_CDC_SUBSET is not set # CONFIG_USB_NET_ZAURUS is not set CONFIG_USB_NET_QMI_WWAN=y -CONFIG_ATH5K=m CONFIG_ATH9K=m CONFIG_ATH6KL=m CONFIG_ATH6KL_USB=m @@ -467,7 +261,6 @@ CONFIG_B43=m CONFIG_BRCMFMAC=m # CONFIG_BRCMFMAC_SDIO is not set CONFIG_BRCMFMAC_USB=y -CONFIG_BRCMFMAC_PCIE=y CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m CONFIG_LIBERTAS_THINFIRM=m @@ -483,35 +276,23 @@ CONFIG_RT2800USB_RT3573=y CONFIG_RT2800USB_RT53XX=y CONFIG_RT2800USB_RT55XX=y CONFIG_RT2800USB_UNKNOWN=y -CONFIG_RTL8180=m CONFIG_RTL8187=m -CONFIG_RTL8192CE=m -CONFIG_RTL8192SE=m -CONFIG_RTL8192DE=m -CONFIG_RTL8723AE=m -CONFIG_RTL8723BE=m -CONFIG_RTL8188EE=m -CONFIG_RTL8192EE=m -CONFIG_RTL8821AE=m CONFIG_RTL8XXXU=m CONFIG_RTW88=m -CONFIG_RTW88_8822BE=m CONFIG_RTW88_8822BS=m CONFIG_RTW88_8822BU=m -CONFIG_RTW88_8822CE=m CONFIG_RTW88_8822CS=m CONFIG_RTW88_8822CU=m -CONFIG_RTW88_8723DE=m -CONFIG_RTW88_8723DS=m CONFIG_RTW88_8723DU=m -CONFIG_RTW88_8821CE=m CONFIG_RTW88_8821CS=m CONFIG_RTW88_8821CU=m CONFIG_RTW89=m -CONFIG_RTW89_8852AE=m -CONFIG_RTW89_8852CE=m +# CONFIG_WLAN_VENDOR_RSI is not set +# CONFIG_WLAN_VENDOR_SILABS is not set +# CONFIG_WLAN_VENDOR_ST is not set +# CONFIG_WLAN_VENDOR_TI is not set CONFIG_ZD1211RW=m -CONFIG_ISDN=y +# CONFIG_WLAN_VENDOR_QUANTENNA is not set CONFIG_INPUT_MATRIXKMAP=y CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y @@ -521,8 +302,13 @@ CONFIG_KEYBOARD_GPIO_POLLED=y # CONFIG_MOUSE_PS2 is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ADC=y +CONFIG_JOYSTICK_COBRA=m +CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y +CONFIG_JOYSTICK_XPAD_LEDS=y +CONFIG_JOYSTICK_PXRC=m +CONFIG_JOYSTICK_SINGLEADCJOY=y CONFIG_INPUT_TABLET=y CONFIG_INPUT_TOUCHSCREEN=y CONFIG_TOUCHSCREEN_ATMEL_MXT=y @@ -538,7 +324,6 @@ CONFIG_GAMEPORT=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y -# CONFIG_SERIAL_8250_PCI is not set CONFIG_SERIAL_8250_NR_UARTS=5 CONFIG_SERIAL_8250_RUNTIME_UARTS=5 CONFIG_SERIAL_8250_EXTENDED=y @@ -552,7 +337,7 @@ CONFIG_HW_RANDOM=y CONFIG_TCG_TPM=y # CONFIG_I2C_COMPAT is not set CONFIG_I2C_CHARDEV=y -CONFIG_I2C_DESIGNWARE_PLATFORM=y +CONFIG_I2C_MUX=y CONFIG_I2C_RK3X=y CONFIG_SPI=y CONFIG_SPI_GPIO=y @@ -563,7 +348,6 @@ CONFIG_SPI_SPIDEV=y CONFIG_PINCTRL_RK805=y CONFIG_PINCTRL_SINGLE=y CONFIG_GPIO_SYSFS=y -CONFIG_GPIO_DWAPB=y CONFIG_GPIO_GENERIC_PLATFORM=y CONFIG_POWER_RESET_GPIO=y CONFIG_POWER_RESET_GPIO_RESTART=y @@ -577,15 +361,10 @@ CONFIG_CHARGER_BQ24735=y CONFIG_CHARGER_RK817=y CONFIG_SENSORS_PWM_FAN=y CONFIG_THERMAL=y -CONFIG_THERMAL_WRITABLE_TRIPS=y -CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR=y CONFIG_THERMAL_GOV_FAIR_SHARE=y -CONFIG_THERMAL_GOV_STEP_WISE=y -CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y CONFIG_CPU_THERMAL=y CONFIG_DEVFREQ_THERMAL=y CONFIG_ROCKCHIP_THERMAL=y -CONFIG_GENERIC_ADC_THERMAL=y CONFIG_WATCHDOG=y CONFIG_DW_WATCHDOG=y CONFIG_SSB=y @@ -605,26 +384,12 @@ CONFIG_REGULATOR_PWM=y CONFIG_REGULATOR_RK808=y CONFIG_REGULATOR_TPS6586X=y CONFIG_REGULATOR_VCTRL=y -CONFIG_RC_CORE=y -CONFIG_LIRC=y -CONFIG_RC_DECODERS=y -CONFIG_IR_JVC_DECODER=y -CONFIG_IR_MCE_KBD_DECODER=y -CONFIG_IR_NEC_DECODER=y -CONFIG_IR_RC5_DECODER=y -CONFIG_IR_RC6_DECODER=y -CONFIG_IR_SANYO_DECODER=y -CONFIG_IR_SHARP_DECODER=y -CONFIG_IR_SONY_DECODER=y -CONFIG_IR_XMP_DECODER=y -CONFIG_RC_DEVICES=y -CONFIG_IR_GPIO_CIR=y -CONFIG_MEDIA_CEC_RC=y CONFIG_MEDIA_CEC_SUPPORT=y CONFIG_USB_PULSE8_CEC=m CONFIG_USB_RAINSHADOW_CEC=m CONFIG_MEDIA_SUPPORT=y CONFIG_MEDIA_SUPPORT_FILTER=y +# CONFIG_MEDIA_SUBDRV_AUTOSELECT is not set CONFIG_MEDIA_CAMERA_SUPPORT=y CONFIG_MEDIA_ANALOG_TV_SUPPORT=y CONFIG_MEDIA_DIGITAL_TV_SUPPORT=y @@ -632,85 +397,166 @@ CONFIG_MEDIA_RADIO_SUPPORT=y CONFIG_MEDIA_SDR_SUPPORT=y CONFIG_MEDIA_PLATFORM_SUPPORT=y CONFIG_MEDIA_TEST_SUPPORT=y +CONFIG_MEDIA_CONTROLLER_DVB=y CONFIG_DVB_MAX_ADAPTERS=8 # CONFIG_DVB_DYNAMIC_MINORS is not set -CONFIG_MEDIA_USB_SUPPORT=y -CONFIG_VIDEO_USBTV=m -CONFIG_USB_VIDEO_CLASS=y -# CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV is not set -CONFIG_VIDEO_AU0828=m -CONFIG_VIDEO_CX231XX=m -CONFIG_VIDEO_CX231XX_ALSA=m -CONFIG_VIDEO_CX231XX_DVB=m -CONFIG_DVB_AS102=m -CONFIG_DVB_B2C2_FLEXCOP_USB=m -CONFIG_DVB_USB_V2=m -CONFIG_DVB_USB_AF9015=m -CONFIG_DVB_USB_AF9035=m -CONFIG_DVB_USB_ANYSEE=m -CONFIG_DVB_USB_AU6610=m -CONFIG_DVB_USB_AZ6007=m -CONFIG_DVB_USB_CE6230=m -CONFIG_DVB_USB_DVBSKY=m -CONFIG_DVB_USB_EC168=m -CONFIG_DVB_USB_GL861=m -CONFIG_DVB_USB_LME2510=m -CONFIG_DVB_USB_MXL111SF=m -CONFIG_DVB_USB_RTL28XXU=m -CONFIG_DVB_USB=y -CONFIG_DVB_USB_A800=m -CONFIG_DVB_USB_AF9005=m -CONFIG_DVB_USB_AF9005_REMOTE=m -CONFIG_DVB_USB_AZ6027=m -CONFIG_DVB_USB_CINERGY_T2=m -CONFIG_DVB_USB_CXUSB=m -CONFIG_DVB_USB_DIB0700=m -CONFIG_DVB_USB_DIBUSB_MB=m -CONFIG_DVB_USB_DIBUSB_MC=m -CONFIG_DVB_USB_DIGITV=m -CONFIG_DVB_USB_DTT200U=m -CONFIG_DVB_USB_DTV5100=m -CONFIG_DVB_USB_DW2102=m -CONFIG_DVB_USB_GP8PSK=m -CONFIG_DVB_USB_M920X=m -CONFIG_DVB_USB_NOVA_T_USB2=m -CONFIG_DVB_USB_OPERA1=m -CONFIG_DVB_USB_PCTV452E=m -CONFIG_DVB_USB_TECHNISAT_USB2=m -CONFIG_DVB_USB_TTUSB2=m -CONFIG_DVB_USB_UMT_010=m -CONFIG_DVB_USB_VP702X=m -CONFIG_DVB_USB_VP7045=m -CONFIG_DVB_TTUSB_BUDGET=m -CONFIG_DVB_TTUSB_DEC=m -CONFIG_VIDEO_EM28XX=m -CONFIG_VIDEO_EM28XX_V4L2=m -CONFIG_VIDEO_EM28XX_ALSA=m -CONFIG_VIDEO_EM28XX_DVB=m -CONFIG_USB_AIRSPY=m -CONFIG_USB_HACKRF=m -CONFIG_USB_MSI2500=m -CONFIG_MEDIA_PCI_SUPPORT=y -CONFIG_VIDEO_CX23885=m -CONFIG_VIDEO_CX25821=m +# CONFIG_RADIO_ADAPTERS is not set CONFIG_V4L_PLATFORM_DRIVERS=y -CONFIG_DVB_PLATFORM_DRIVERS=y CONFIG_V4L_MEM2MEM_DRIVERS=y CONFIG_VIDEO_ROCKCHIP_RGA=y -CONFIG_VIDEO_HANTRO=y -# CONFIG_VIDEO_IR_I2C is not set -CONFIG_VIDEO_IMX219=y -CONFIG_VIDEO_OV5645=y -CONFIG_CXD2880_SPI_DRV=m -CONFIG_DVB_ASCOT2E=m -CONFIG_DVB_HELENE=m -CONFIG_DVB_HORUS3A=m -CONFIG_DVB_ISL6405=m -CONFIG_DVB_LGS8GL5=m -CONFIG_DVB_LNBH25=m -CONFIG_DVB_LNBH29=m -CONFIG_DVB_TDA665x=m -CONFIG_DVB_CXD2099=m +CONFIG_VIDEO_HANTRO=m +# CONFIG_VIDEO_CAMERA_SENSOR is not set +# CONFIG_CXD2880_SPI_DRV is not set +# CONFIG_MEDIA_TUNER_E4000 is not set +# CONFIG_MEDIA_TUNER_FC0011 is not set +# CONFIG_MEDIA_TUNER_FC0012 is not set +# CONFIG_MEDIA_TUNER_FC0013 is not set +# CONFIG_MEDIA_TUNER_FC2580 is not set +# CONFIG_MEDIA_TUNER_IT913X is not set +# CONFIG_MEDIA_TUNER_M88RS6000T is not set +# CONFIG_MEDIA_TUNER_MAX2165 is not set +# CONFIG_MEDIA_TUNER_MC44S803 is not set +# CONFIG_MEDIA_TUNER_MSI001 is not set +# CONFIG_MEDIA_TUNER_MT2060 is not set +# CONFIG_MEDIA_TUNER_MT2063 is not set +# CONFIG_MEDIA_TUNER_MT20XX is not set +# CONFIG_MEDIA_TUNER_MT2131 is not set +# CONFIG_MEDIA_TUNER_MT2266 is not set +# CONFIG_MEDIA_TUNER_MXL301RF is not set +# CONFIG_MEDIA_TUNER_MXL5005S is not set +# CONFIG_MEDIA_TUNER_MXL5007T is not set +# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set +# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set +# CONFIG_MEDIA_TUNER_QT1010 is not set +# CONFIG_MEDIA_TUNER_R820T is not set +# CONFIG_MEDIA_TUNER_SI2157 is not set +# CONFIG_MEDIA_TUNER_SIMPLE is not set +# CONFIG_MEDIA_TUNER_TDA18212 is not set +# CONFIG_MEDIA_TUNER_TDA18218 is not set +# CONFIG_MEDIA_TUNER_TDA18250 is not set +# CONFIG_MEDIA_TUNER_TDA18271 is not set +# CONFIG_MEDIA_TUNER_TDA827X is not set +# CONFIG_MEDIA_TUNER_TDA8290 is not set +# CONFIG_MEDIA_TUNER_TDA9887 is not set +# CONFIG_MEDIA_TUNER_TEA5761 is not set +# CONFIG_MEDIA_TUNER_TEA5767 is not set +# CONFIG_MEDIA_TUNER_TUA9001 is not set +# CONFIG_MEDIA_TUNER_XC2028 is not set +# CONFIG_MEDIA_TUNER_XC4000 is not set +# CONFIG_MEDIA_TUNER_XC5000 is not set +# CONFIG_DVB_M88DS3103 is not set +# CONFIG_DVB_MXL5XX is not set +# CONFIG_DVB_STB0899 is not set +# CONFIG_DVB_STB6100 is not set +# CONFIG_DVB_STV090x is not set +# CONFIG_DVB_STV0910 is not set +# CONFIG_DVB_STV6110x is not set +# CONFIG_DVB_STV6111 is not set +# CONFIG_DVB_DRXK is not set +# CONFIG_DVB_MN88472 is not set +# CONFIG_DVB_MN88473 is not set +# CONFIG_DVB_SI2165 is not set +# CONFIG_DVB_TDA18271C2DD is not set +# CONFIG_DVB_CX24110 is not set +# CONFIG_DVB_CX24116 is not set +# CONFIG_DVB_CX24117 is not set +# CONFIG_DVB_CX24120 is not set +# CONFIG_DVB_CX24123 is not set +# CONFIG_DVB_DS3000 is not set +# CONFIG_DVB_MB86A16 is not set +# CONFIG_DVB_MT312 is not set +# CONFIG_DVB_S5H1420 is not set +# CONFIG_DVB_SI21XX is not set +# CONFIG_DVB_STB6000 is not set +# CONFIG_DVB_STV0288 is not set +# CONFIG_DVB_STV0299 is not set +# CONFIG_DVB_STV0900 is not set +# CONFIG_DVB_STV6110 is not set +# CONFIG_DVB_TDA10071 is not set +# CONFIG_DVB_TDA10086 is not set +# CONFIG_DVB_TDA8083 is not set +# CONFIG_DVB_TDA8261 is not set +# CONFIG_DVB_TDA826X is not set +# CONFIG_DVB_TS2020 is not set +# CONFIG_DVB_TUA6100 is not set +# CONFIG_DVB_TUNER_CX24113 is not set +# CONFIG_DVB_TUNER_ITD1000 is not set +# CONFIG_DVB_VES1X93 is not set +# CONFIG_DVB_ZL10036 is not set +# CONFIG_DVB_ZL10039 is not set +# CONFIG_DVB_AF9013 is not set +# CONFIG_DVB_CX22700 is not set +# CONFIG_DVB_CX22702 is not set +# CONFIG_DVB_CXD2820R is not set +# CONFIG_DVB_CXD2841ER is not set +# CONFIG_DVB_DIB3000MB is not set +# CONFIG_DVB_DIB3000MC is not set +# CONFIG_DVB_DIB7000M is not set +# CONFIG_DVB_DIB7000P is not set +# CONFIG_DVB_DIB9000 is not set +# CONFIG_DVB_DRXD is not set +# CONFIG_DVB_EC100 is not set +# CONFIG_DVB_L64781 is not set +# CONFIG_DVB_MT352 is not set +# CONFIG_DVB_NXT6000 is not set +# CONFIG_DVB_RTL2830 is not set +# CONFIG_DVB_RTL2832 is not set +# CONFIG_DVB_RTL2832_SDR is not set +# CONFIG_DVB_S5H1432 is not set +# CONFIG_DVB_SI2168 is not set +# CONFIG_DVB_SP887X is not set +# CONFIG_DVB_STV0367 is not set +# CONFIG_DVB_TDA10048 is not set +# CONFIG_DVB_TDA1004X is not set +# CONFIG_DVB_ZD1301_DEMOD is not set +# CONFIG_DVB_ZL10353 is not set +# CONFIG_DVB_CXD2880 is not set +# CONFIG_DVB_STV0297 is not set +# CONFIG_DVB_TDA10021 is not set +# CONFIG_DVB_TDA10023 is not set +# CONFIG_DVB_VES1820 is not set +# CONFIG_DVB_AU8522_DTV is not set +# CONFIG_DVB_AU8522_V4L is not set +# CONFIG_DVB_BCM3510 is not set +# CONFIG_DVB_LG2160 is not set +# CONFIG_DVB_LGDT3305 is not set +# CONFIG_DVB_LGDT3306A is not set +# CONFIG_DVB_LGDT330X is not set +# CONFIG_DVB_MXL692 is not set +# CONFIG_DVB_NXT200X is not set +# CONFIG_DVB_OR51132 is not set +# CONFIG_DVB_OR51211 is not set +# CONFIG_DVB_S5H1409 is not set +# CONFIG_DVB_S5H1411 is not set +# CONFIG_DVB_DIB8000 is not set +# CONFIG_DVB_MB86A20S is not set +# CONFIG_DVB_S921 is not set +# CONFIG_DVB_MN88443X is not set +# CONFIG_DVB_TC90522 is not set +# CONFIG_DVB_PLL is not set +# CONFIG_DVB_TUNER_DIB0070 is not set +# CONFIG_DVB_TUNER_DIB0090 is not set +# CONFIG_DVB_A8293 is not set +# CONFIG_DVB_AF9033 is not set +# CONFIG_DVB_ASCOT2E is not set +# CONFIG_DVB_ATBM8830 is not set +# CONFIG_DVB_HELENE is not set +# CONFIG_DVB_HORUS3A is not set +# CONFIG_DVB_ISL6405 is not set +# CONFIG_DVB_ISL6421 is not set +# CONFIG_DVB_ISL6423 is not set +# CONFIG_DVB_IX2505V is not set +# CONFIG_DVB_LGS8GL5 is not set +# CONFIG_DVB_LGS8GXX is not set +# CONFIG_DVB_LNBH25 is not set +# CONFIG_DVB_LNBH29 is not set +# CONFIG_DVB_LNBP21 is not set +# CONFIG_DVB_LNBP22 is not set +# CONFIG_DVB_M88RS2000 is not set +# CONFIG_DVB_TDA665x is not set +# CONFIG_DVB_DRX39XYJ is not set +# CONFIG_DVB_CXD2099 is not set +# CONFIG_DVB_SP2 is not set CONFIG_DRM=y CONFIG_DRM_LOAD_EDID_FIRMWARE=y CONFIG_DRM_MALI_DISPLAY=y @@ -744,7 +590,6 @@ CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_SEQUENCER=y CONFIG_SND_SEQ_DUMMY=y # CONFIG_SND_DRIVERS is not set -# CONFIG_SND_PCI is not set # CONFIG_SND_SPI is not set CONFIG_SND_USB_AUDIO=y CONFIG_SND_SOC=y @@ -770,61 +615,55 @@ CONFIG_HIDRAW=y CONFIG_UHID=y CONFIG_HID_A4TECH=y CONFIG_HID_ACRUX=y -CONFIG_HID_APPLE=y -CONFIG_HID_APPLEIR=y -CONFIG_HID_AUREAL=y +CONFIG_HID_ACRUX_FF=y CONFIG_HID_BELKIN=y -CONFIG_HID_BETOP_FF=y +CONFIG_HID_BETOP_FF=m CONFIG_HID_CHERRY=y -CONFIG_HID_CHICONY=y -CONFIG_HID_CORSAIR=y -CONFIG_HID_PRODIKEYS=y -CONFIG_HID_CP2112=y +CONFIG_HID_CHICONY=m +CONFIG_HID_CORSAIR=m +CONFIG_HID_PRODIKEYS=m +CONFIG_HID_CP2112=m CONFIG_HID_CYPRESS=y CONFIG_HID_DRAGONRISE=y CONFIG_DRAGONRISE_FF=y CONFIG_HID_EMS_FF=y -CONFIG_HID_ELECOM=y -CONFIG_HID_ELO=y -CONFIG_HID_EZKEY=y +CONFIG_HID_ELO=m CONFIG_HID_GEMBIRD=y -CONFIG_HID_GFRM=y -CONFIG_HID_HOLTEK=y -CONFIG_HOLTEK_FF=y -CONFIG_HID_GT683R=y CONFIG_HID_KEYTOUCH=y CONFIG_HID_KYE=y -CONFIG_HID_UCLOGIC=y +CONFIG_HID_UCLOGIC=m CONFIG_HID_WALTOP=y CONFIG_HID_GYRATION=y -CONFIG_HID_ICADE=y +CONFIG_HID_ICADE=m CONFIG_HID_TWINHAN=y CONFIG_HID_KENSINGTON=y CONFIG_HID_LCPOWER=y -CONFIG_HID_LENOVO=y -CONFIG_HID_LOGITECH=y -CONFIG_HID_LOGITECH_DJ=y +CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m CONFIG_LOGITECH_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y -CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MAYFLASH=m CONFIG_HID_MICROSOFT=y CONFIG_HID_MONTEREY=y CONFIG_HID_MULTITOUCH=y -CONFIG_HID_NTRIG=y +CONFIG_HID_NINTENDO=m +CONFIG_NINTENDO_FF=y CONFIG_HID_ORTEK=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y -CONFIG_HID_PENMOUNT=y +CONFIG_HID_PENMOUNT=m CONFIG_HID_PETALYNX=y CONFIG_HID_PLANTRONICS=y CONFIG_HID_PRIMAX=y -CONFIG_HID_ROCCAT=y -CONFIG_HID_SAITEK=y -CONFIG_HID_SAMSUNG=y -CONFIG_HID_SONY=y +CONFIG_HID_RETRODE=m +CONFIG_HID_ROCCAT=m +CONFIG_HID_SAITEK=m +CONFIG_HID_SAMSUNG=m +CONFIG_HID_SONY=m +CONFIG_SONY_FF=y CONFIG_HID_SPEEDLINK=y -CONFIG_HID_STEELSERIES=y +CONFIG_HID_STEELSERIES=m CONFIG_HID_SUNPLUS=y CONFIG_HID_RMI=y CONFIG_HID_GREENASIA=y @@ -834,9 +673,8 @@ CONFIG_SMARTJOYPLUS_FF=y CONFIG_HID_TIVO=y CONFIG_HID_TOPSEED=y CONFIG_HID_THINGM=y -CONFIG_HID_THRUSTMASTER=y +CONFIG_HID_THRUSTMASTER=m CONFIG_THRUSTMASTER_FF=y -CONFIG_HID_WACOM=y CONFIG_HID_WIIMOTE=y CONFIG_HID_XINMO=y CONFIG_HID_ZEROPLUS=y @@ -844,7 +682,7 @@ CONFIG_ZEROPLUS_FF=y CONFIG_HID_ZYDACRON=y CONFIG_HID_SENSOR_HUB=y CONFIG_HID_SENSOR_CUSTOM_SENSOR=y -CONFIG_HID_ALPS=y +CONFIG_USB_HID=m CONFIG_USB_HIDDEV=y CONFIG_I2C_HID_OF_GOODIX=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -859,7 +697,6 @@ CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_ROOT_HUB_TT=y CONFIG_USB_EHCI_HCD_PLATFORM=y CONFIG_USB_OHCI_HCD=y -# CONFIG_USB_OHCI_HCD_PCI is not set CONFIG_USB_OHCI_HCD_PLATFORM=y CONFIG_USB_ACM=y CONFIG_USB_STORAGE=y @@ -874,7 +711,6 @@ CONFIG_USB_STORAGE_JUMPSHOT=y CONFIG_USB_STORAGE_ALAUDA=y CONFIG_USB_STORAGE_ONETOUCH=y CONFIG_USB_STORAGE_KARMA=y -CONFIG_USB_STORAGE_CYPRESS_ATACB=y CONFIG_USB_STORAGE_ENE_UB6250=y CONFIG_USB_UAS=y CONFIG_USB_DWC3=y @@ -896,19 +732,16 @@ CONFIG_USB_GADGET_DEBUG_FILES=y CONFIG_USB_GADGET_VBUS_DRAW=500 CONFIG_U_SERIAL_CONSOLE=y CONFIG_USB_CONFIGFS=m -CONFIG_USB_CONFIGFS_ACM=y +CONFIG_USB_CONFIGFS_NCM=y CONFIG_USB_CONFIGFS_ECM=y +CONFIG_USB_CONFIGFS_RNDIS=y +CONFIG_USB_CONFIGFS_EEM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y CONFIG_USB_CONFIGFS_F_FS=y -CONFIG_USB_CONFIGFS_F_UVC=y CONFIG_USB_GADGETFS=m CONFIG_USB_FUNCTIONFS=m CONFIG_USB_MASS_STORAGE=m CONFIG_USB_G_SERIAL=m -CONFIG_TYPEC=y -CONFIG_TYPEC_TCPM=y -CONFIG_TYPEC_FUSB302=y -CONFIG_TYPEC_DP_ALTMODE=y CONFIG_MMC=y CONFIG_MMC_BLOCK_MINORS=32 CONFIG_MMC_TEST=y @@ -918,13 +751,16 @@ CONFIG_MMC_SDHCI_OF_DWCMSHC=y CONFIG_MMC_DW=y CONFIG_MMC_DW_ROCKCHIP=y CONFIG_MMC_HSQ=y +CONFIG_NEW_LEDS=y +CONFIG_LEDS_CLASS=y +CONFIG_LEDS_CLASS_FLASH=y +CONFIG_LEDS_CLASS_MULTICOLOR=y CONFIG_LEDS_GPIO=y CONFIG_LEDS_PWM=y CONFIG_LEDS_IS31FL32XX=y CONFIG_LEDS_SYSCON=y CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_ONESHOT=y -CONFIG_LEDS_TRIGGER_DISK=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_BACKLIGHT=y CONFIG_LEDS_TRIGGER_CPU=y @@ -947,18 +783,18 @@ CONFIG_RTL8723BS=m CONFIG_R8712U=m CONFIG_STAGING_MEDIA=y CONFIG_VIDEO_ROCKCHIP_VDEC=y -CONFIG_CHROME_PLATFORMS=y # CONFIG_SURFACE_PLATFORMS is not set CONFIG_COMMON_CLK_RK808=y CONFIG_COMMON_CLK_SCMI=y CONFIG_COMMON_CLK_SCPI=y -CONFIG_COMMON_CLK_XGENE=y CONFIG_COMMON_CLK_PWM=y CONFIG_COMMON_CLK_FIXED_MMIO=y +# CONFIG_CLK_PX30 is not set # CONFIG_CLK_RK3308 is not set # CONFIG_CLK_RK3328 is not set # CONFIG_CLK_RK3368 is not set # CONFIG_CLK_RK3399 is not set +# CONFIG_CLK_RK3588 is not set # CONFIG_FSL_ERRATUM_A008585 is not set # CONFIG_HISILICON_ERRATUM_161010101 is not set # CONFIG_ARM64_ERRATUM_858921 is not set @@ -999,9 +835,10 @@ CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y CONFIG_PHY_ROCKCHIP_PCIE=y CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y -CONFIG_PHY_ROCKCHIP_TYPEC=y CONFIG_PHY_ROCKCHIP_USB=y CONFIG_ARM_SMMU_V3_PMU=y +CONFIG_RAS=y +CONFIG_NVMEM_ROCKCHIP_OTP=y CONFIG_MUX_GPIO=y CONFIG_MUX_MMIO=y CONFIG_EXT4_FS=y @@ -1009,6 +846,7 @@ CONFIG_EXT4_FS=y CONFIG_EXT4_FS_POSIX_ACL=y CONFIG_EXT4_FS_SECURITY=y CONFIG_XFS_FS=y +CONFIG_BTRFS_FS=m # CONFIG_DNOTIFY is not set CONFIG_AUTOFS_FS=y CONFIG_FUSE_FS=y @@ -1020,14 +858,18 @@ CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_IOCHARSET="ascii" CONFIG_EXFAT_FS=y +CONFIG_NTFS_FS=m CONFIG_TMPFS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_FILE_DIRECT=y CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y CONFIG_SQUASHFS_ZSTD=y CONFIG_PSTORE=y +CONFIG_NFS_FS=y +CONFIG_CIFS=y CONFIG_NLS_DEFAULT="utf-8" CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ASCII=y @@ -1050,9 +892,7 @@ CONFIG_CRYPTO_ARC4=y CONFIG_CRYPTO_CTS=y CONFIG_CRYPTO_XTS=y CONFIG_CRYPTO_CHACHA20POLY1305=y -CONFIG_CRYPTO_CCM=y CONFIG_CRYPTO_ESSIV=y -CONFIG_CRYPTO_CMAC=y CONFIG_CRYPTO_XCBC=y CONFIG_CRYPTO_CRC32=y CONFIG_CRYPTO_LZO=y @@ -1064,14 +904,12 @@ CONFIG_CRYPTO_USER_API_HASH=y CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y -CONFIG_CRYPTO_STATS=y CONFIG_CRYPTO_NHPOLY1305_NEON=y CONFIG_CRYPTO_GHASH_ARM64_CE=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64_CE=y CONFIG_CRYPTO_AES_ARM64=y -CONFIG_CRYPTO_AES_ARM64_CE_BLK=y CONFIG_CRYPTO_AES_ARM64_BS=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_DEV_ROCKCHIP=y @@ -1079,10 +917,12 @@ CONFIG_CORDIC=y CONFIG_CRC_CCITT=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y +CONFIG_CRC64=m CONFIG_CRC7=y # CONFIG_XZ_DEC_X86 is not set # CONFIG_XZ_DEC_POWERPC is not set # CONFIG_XZ_DEC_SPARC is not set +CONFIG_IRQ_POLL=y CONFIG_PRINTK_TIME=y CONFIG_MESSAGE_LOGLEVEL_DEFAULT=7 CONFIG_DYNAMIC_DEBUG=y diff --git a/board/recalbox/anbernic/rg353x/kernel_patches/0001-add-singleadc-joy.patch b/board/recalbox/anbernic/rg353x/kernel_patches/0001-add-singleadc-joy.patch new file mode 100644 index 0000000000..624a200213 --- /dev/null +++ b/board/recalbox/anbernic/rg353x/kernel_patches/0001-add-singleadc-joy.patch @@ -0,0 +1,1403 @@ +From fa2996f558a2766abbdc4ef4becdd28b8505479f Mon Sep 17 00:00:00 2001 +From: David Barbion +Date: Mon, 4 Nov 2024 23:19:29 +0100 +Subject: [PATCH 1/3] add singleadc joy + +--- + .../dts/rockchip/rk3566-anbernic-rg353x.dtsi | 5 +- + .../dts/rockchip/rk3566-anbernic-rgxx3.dtsi | 160 ++- + drivers/input/joystick/Kconfig | 5 + + drivers/input/joystick/Makefile | 1 + + drivers/input/joystick/singleadcjoy.c | 1134 +++++++++++++++++ + 5 files changed, 1303 insertions(+), 2 deletions(-) + create mode 100644 drivers/input/joystick/singleadcjoy.c + +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353x.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353x.dtsi +index 63a18ff36cea..69b55ebc4d28 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353x.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353x.dtsi +@@ -8,7 +8,8 @@ + #include "rk3566-anbernic-rgxx3.dtsi" + + / { +- adc-joystick { ++ adc_joystick: adc-joystick { ++ status = "disabled"; + compatible = "adc-joystick"; + io-channels = <&adc_mux 0>, + <&adc_mux 1>, +@@ -61,6 +62,7 @@ adc_mux: adc-mux { + io-channel-names = "parent"; + mux-controls = <&gpio_mux>; + settle-time-us = <100>; ++ status = "disabled"; + }; + + backlight: backlight { +@@ -74,6 +76,7 @@ gpio_mux: mux-controller { + mux-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>, + <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>; + #mux-control-cells = <0>; ++ status = "disabled"; + }; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi +index 233eade30f21..b76fe7faf50e 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi +@@ -17,6 +17,7 @@ chosen: chosen { + }; + + adc_keys: adc-keys { ++ status = "disabled"; + compatible = "adc-keys"; + io-channels = <&saradc 0>; + io-channel-names = "buttons"; +@@ -34,7 +35,163 @@ button-mode { + }; + }; + ++ joypad: singleadc-joypad { ++ compatible = "singleadc-joypad"; ++ hw_info = <0x01>; ++ ++ joypad-name = "retrogame_joypad"; ++ joypad-product = <0x1101>; ++ joypad-revision = <0x0100>; ++ ++ status = "okay"; ++ ++ /* gpio pincontrol setup */ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&btn_pins_ctrl>; ++ ++ /* Analog mux define */ ++ io-channel-names = "amux_adc", "f_button"; ++ io-channels = <&saradc 3>, <&saradc 0>; ++ ++ /* adc mux channel count */ ++ amux-count = <4>; ++ /* adc mux select(a,b) gpio */ ++ amux-a-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>; ++ amux-b-gpios = <&gpio0 RK_PB7 GPIO_ACTIVE_LOW>; ++ /* adc mux enable gpio */ ++ amux-en-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_LOW>; ++ ++ /* adc calculate scale */ ++ button-adc-scale = <2>; ++ ++ /* adc deadzone range */ ++ button-adc-deadzone = <64>; ++ ++ /* ++ specifies fuzz value that is used to filter noise from ++ the event stream. ++ */ ++ button-adc-fuzz = <32>; ++ button-adc-flat = <32>; ++ ++ /* ++ Analog Stick data tuning value(precent) ++ p = positive direction, n = negative direction ++ report value = (real_adc_data * tuning_value) / 100 ++ */ ++ abs_x-p-tuning = <245>; ++ abs_x-n-tuning = <245>; ++ ++ abs_y-p-tuning = <245>; ++ abs_y-n-tuning = <245>; ++ ++ abs_rx-p-tuning = <245>; ++ abs_rx-n-tuning = <245>; ++ ++ abs_ry-p-tuning = <245>; ++ abs_ry-n-tuning = <245>; ++ ++ /* poll device interval (ms), adc read interval */ ++ poll-interval = <10>; ++ ++ /* f key raw value threshold ++ */ ++ f-key-threshold = <700>; ++ ++ /* gpio button auto repeat set value : default disable */ ++ /* ++ autorepeat; ++ */ ++ ++ sw1 { ++ gpios = <&gpio3 RK_PA3 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-UP"; ++ linux,code = ; ++ }; ++ sw2 { ++ gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-DOWN"; ++ linux,code = ; ++ }; ++ sw3 { ++ gpios = <&gpio3 RK_PA6 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-LEFT"; ++ linux,code = ; ++ }; ++ sw4 { ++ gpios = <&gpio3 RK_PA5 GPIO_ACTIVE_LOW>; ++ label = "GPIO DPAD-RIGHT"; ++ linux,code = ; ++ }; ++ sw5 { ++ gpios = <&gpio3 RK_PC3 GPIO_ACTIVE_LOW>; ++ label = "GPIO KEY BTN-A"; ++ linux,code = ; ++ }; ++ sw6 { ++ gpios = <&gpio3 RK_PC2 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN-B"; ++ linux,code = ; ++ }; ++ sw7 { ++ gpios = <&gpio3 RK_PC0 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN-X"; ++ linux,code = ; ++ }; ++ sw8 { ++ gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN-Y"; ++ linux,code = ; ++ }; ++ sw9 { ++ gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_SELECT"; ++ linux,code = ; ++ }; ++ sw10 { ++ gpios = <&gpio3 RK_PB5 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_START"; ++ linux,code = ; ++ }; ++ sw11 { // really used ? ++ gpios = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_F"; ++ linux,code = ; ++ }; ++ sw12 { ++ gpios = <&gpio3 RK_PB1 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_TL"; ++ linux,code = ; ++ }; ++ sw13 { ++ gpios = <&gpio3 RK_PB4 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_TR"; ++ linux,code = ; ++ }; ++ sw14 { ++ gpios = <&gpio3 RK_PB2 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_TL2"; ++ linux,code = ; ++ }; ++ sw15 { ++ gpios = <&gpio3 RK_PB3 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_TR2"; ++ linux,code = ; ++ }; ++ sw16 { ++ gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_THUMBL"; ++ linux,code = ; ++ }; ++ sw17 { ++ gpios = <&gpio3 RK_PA2 GPIO_ACTIVE_LOW>; ++ label = "GPIO BTN_THUMBR"; ++ linux,code = ; ++ }; ++ }; ++ + gpio_keys_control: gpio-keys-control { ++ status = "disabled"; + compatible = "gpio-keys"; + pinctrl-0 = <&btn_pins_ctrl>; + pinctrl-names = "default"; +@@ -509,6 +666,7 @@ btn_pins_ctrl: btn-pins-ctrl { + <3 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>, + <3 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>, + <3 RK_PB6 RK_FUNC_GPIO &pcfg_pull_up>, ++ <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_up>, + <3 RK_PC0 RK_FUNC_GPIO &pcfg_pull_up>, + <3 RK_PC1 RK_FUNC_GPIO &pcfg_pull_up>, + <3 RK_PC2 RK_FUNC_GPIO &pcfg_pull_up>, +@@ -525,7 +683,7 @@ btn_pins_vol: btn-pins-vol { + joy-mux { + joy_mux_en: joy-mux-en { + rockchip,pins = +- <0 RK_PB5 RK_FUNC_GPIO &pcfg_output_low>; ++ <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + +diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig +index 7755e5b454d2..76a6729db95d 100644 +--- a/drivers/input/joystick/Kconfig ++++ b/drivers/input/joystick/Kconfig +@@ -422,4 +422,9 @@ config JOYSTICK_SEESAW + To compile this driver as a module, choose M here: the module will be + called adafruit-seesaw. + ++config JOYSTICK_SINGLEADCJOY ++ tristate "Single SARADC dual-joystick gamepad driver" ++ help ++ The 1-in 4-out SARADC joypad driver. ++ + endif +diff --git a/drivers/input/joystick/Makefile b/drivers/input/joystick/Makefile +index 9976f596a920..237aec2076dd 100644 +--- a/drivers/input/joystick/Makefile ++++ b/drivers/input/joystick/Makefile +@@ -41,3 +41,4 @@ obj-$(CONFIG_JOYSTICK_WARRIOR) += warrior.o + obj-$(CONFIG_JOYSTICK_WALKERA0701) += walkera0701.o + obj-$(CONFIG_JOYSTICK_XPAD) += xpad.o + obj-$(CONFIG_JOYSTICK_ZHENHUA) += zhenhua.o ++obj-$(CONFIG_JOYSTICK_SINGLEADCJOY) += singleadcjoy.o +diff --git a/drivers/input/joystick/singleadcjoy.c b/drivers/input/joystick/singleadcjoy.c +new file mode 100644 +index 000000000000..f79af578bba5 +--- /dev/null ++++ b/drivers/input/joystick/singleadcjoy.c +@@ -0,0 +1,1134 @@ ++/*----------------------------------------------------------------------------*/ ++ ++/* ++ * Copyright (c) 2008-2021 Anbernic ++ * Copyright (c) 2024 davidb2111 for Recalbox ++ */ ++ ++/* ++ * Single SARADC dual-joystick gamepad driver ++ */ ++ ++/*----------------------------------------------------------------------------*/ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/*----------------------------------------------------------------------------*/ ++#define DRV_NAME "retrogame_joypad" ++#define __LEFT_JOYSTICK_INVERT__ ++/*----------------------------------------------------------------------------*/ ++#define ADC_MAX_VOLTAGE 1800 ++#define ADC_DATA_TUNING(x, p) ((x * p) / 100) ++#define ADC_TUNING_DEFAULT 180 ++ ++struct bt_adc { ++ /* report value (mV) */ ++ int value; ++ /* report type */ ++ int report_type; ++ /* input device init value (mV) */ ++ int max, min; ++ /* calibrated adc value */ ++ int cal; ++ /* adc scale value */ ++ int scale; ++ /* invert report */ ++ bool invert; ++ /* amux channel */ ++ int amux_ch; ++ /* adc data tuning value([percent), p = positive, n = negative */ ++ int tuning_p, tuning_n; ++}; ++ ++struct analog_mux { ++ /* IIO ADC Channel : amux connect channel */ ++ struct iio_channel *iio_ch; ++ /* analog mux select(a,b) gpio */ ++ struct gpio_desc *sel_a_gpio; ++ struct gpio_desc *sel_b_gpio; ++ /* analog mux enable gpio */ ++ struct gpio_desc * en_gpio; ++}; ++ ++struct bt_gpio { ++ /* GPIO Request label */ ++ const char *label; ++ /* GPIO Number */ ++ int num; ++ struct gpio_desc * desc; ++ /* report type */ ++ int report_type; ++ /* report linux code */ ++ int linux_code; ++ /* prev button value */ ++ bool old_value; ++}; ++ ++struct joypad { ++ struct device *dev; ++ struct input_dev *input; ++ int poll_interval; ++ ++ /* report enable/disable */ ++ bool enable; ++ ++ /* analog mux & joystick control */ ++ struct analog_mux *amux; ++ /* analog mux max count */ ++ int amux_count; ++ /* analog button */ ++ struct bt_adc *adcs; ++ ++ /* report interval (ms) */ ++ int bt_gpio_count; ++ struct bt_gpio *gpios; ++ ++ /* button auto repeat */ ++ int auto_repeat; ++ ++ /* report threshold (mV) */ ++ int bt_adc_fuzz, bt_adc_flat; ++ /* adc read value scale */ ++ int bt_adc_scale; ++ /* joystick deadzone control */ ++ int bt_adc_deadzone; ++ ++ /* F key is an adc button */ ++ struct iio_channel *iio_ch_fkey; ++ int fkey_threshold; ++ int fkey_fired; ++ ++ struct mutex mutex; ++ ++ /* amux debug channel */ ++ int debug_ch; ++}; ++ ++/*----------------------------------------------------------------------------*/ ++// ++// set to the value in the boot.ini file. (if exist) ++// ++/*----------------------------------------------------------------------------*/ ++static unsigned int g_button_adc_fuzz = 0; ++static unsigned int g_button_adc_flat = 0; ++static unsigned int g_button_adc_scale = 0; ++static unsigned int g_button_adc_deadzone = 0; ++ ++static int button_adc_fuzz(char *str) ++{ ++ if (!str) ++ return -EINVAL; ++ g_button_adc_fuzz = simple_strtoul(str, NULL, 10); ++ return 0; ++} ++__setup("button-adc-fuzz=", button_adc_fuzz); ++ ++static int button_adc_flat(char *str) ++{ ++ if (!str) ++ return -EINVAL; ++ g_button_adc_flat = simple_strtoul(str, NULL, 10); ++ return 0; ++} ++__setup("button-adc-flat=", button_adc_flat); ++ ++static int button_adc_scale(char *str) ++{ ++ if (!str) ++ return -EINVAL; ++ g_button_adc_scale = simple_strtoul(str, NULL, 10); ++ return 0; ++} ++__setup("button-adc-scale=", button_adc_scale); ++ ++static int button_adc_deadzone(char *str) ++{ ++ if (!str) ++ return -EINVAL; ++ g_button_adc_deadzone = simple_strtoul(str, NULL, 10); ++ return 0; ++} ++__setup("button-adc-deadzone=", button_adc_deadzone); ++ ++/*----------------------------------------------------------------------------*/ ++/*----------------------------------------------------------------------------*/ ++static int joypad_amux_select(struct analog_mux *amux, int channel) ++{ ++ /* select mux channel */ ++ gpiod_set_value(amux->en_gpio, 1); ++ ++ switch(channel) { ++ case 0: /* EVENT (ABS_RY) */ ++ gpiod_set_value(amux->sel_a_gpio, 1); ++ gpiod_set_value(amux->sel_b_gpio, 1); ++ break; ++ case 1: /* EVENT (ABS_RX) */ ++ gpiod_set_value(amux->sel_a_gpio, 1); ++ gpiod_set_value(amux->sel_b_gpio, 0); ++ break; ++ case 2: /* EVENT (ABS_Y) */ ++ gpiod_set_value(amux->sel_a_gpio, 0); ++ gpiod_set_value(amux->sel_b_gpio, 1); ++ break; ++ case 3: /* EVENT (ABS_X) */ ++ gpiod_set_value(amux->sel_a_gpio, 0); ++ gpiod_set_value(amux->sel_b_gpio, 0); ++ break; ++ default: ++ /* amux disable */ ++ gpiod_set_value(amux->en_gpio, 0); ++ return -1; ++ } ++ /* mux swtiching speed : 35ns(on) / 9ns(off) */ ++ usleep_range(10, 20); ++ return 0; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_adc_read(struct analog_mux *amux, struct bt_adc *adc) ++{ ++ int value; ++ ++ ++ if (joypad_amux_select(amux, adc->amux_ch)) ++ return 0; ++ ++ iio_read_channel_raw(amux->iio_ch, &value); ++ ++ value *= adc->scale; ++#ifdef __LEFT_JOYSTICK_INVERT__ ++ return value; ++#else ++ return (adc->invert ? (adc->max - value) : value); ++#endif ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_adckey_read(struct iio_channel *channel) ++{ ++ int value; ++ ++ iio_read_channel_raw(channel, &value); ++ ++ return value; ++} ++ ++/*----------------------------------------------------------------------------*/ ++/*----------------------------------------------------------------------------*/ ++/* ++ * ATTRIBUTES: ++ * ++ * /sys/devices/platform/retrogame_joypad/poll_interval [rw] ++ */ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_store_poll_interval(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, ++ size_t count) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ mutex_lock(&joypad->mutex); ++ joypad->poll_interval = simple_strtoul(buf, NULL, 10); ++ mutex_unlock(&joypad->mutex); ++ ++ return count; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_show_poll_interval(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ return sprintf(buf, "%d\n", joypad->poll_interval); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static DEVICE_ATTR(poll_interval, S_IWUSR | S_IRUGO, ++ joypad_show_poll_interval, ++ joypad_store_poll_interval); ++ ++/*----------------------------------------------------------------------------*/ ++/* ++ * ATTRIBUTES: ++ * ++ * /sys/devices/platform/retrogame_joypad/adc_fuzz [r] ++ */ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_show_adc_fuzz(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ return sprintf(buf, "%d\n", joypad->bt_adc_fuzz); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static DEVICE_ATTR(adc_fuzz, S_IWUSR | S_IRUGO, ++ joypad_show_adc_fuzz, ++ NULL); ++ ++/*----------------------------------------------------------------------------*/ ++/* ++ * ATTRIBUTES: ++ * ++ * /sys/devices/platform/retrogame_joypad/adc_flat [r] ++ */ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_show_adc_flat(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ return sprintf(buf, "%d\n", joypad->bt_adc_flat); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static DEVICE_ATTR(adc_flat, S_IWUSR | S_IRUGO, ++ joypad_show_adc_flat, ++ NULL); ++ ++/*----------------------------------------------------------------------------*/ ++/* ++ * ATTRIBUTES: ++ * ++ * /sys/devices/platform/retrogame_joypad/enable [rw] ++ */ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_store_enable(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, ++ size_t count) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ mutex_lock(&joypad->mutex); ++ joypad->enable = simple_strtoul(buf, NULL, 10); ++ mutex_unlock(&joypad->mutex); ++ ++ return count; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_show_enable(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ return sprintf(buf, "%d\n", joypad->enable); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static DEVICE_ATTR(enable, S_IWUSR | S_IRUGO, ++ joypad_show_enable, ++ joypad_store_enable); ++ ++/*----------------------------------------------------------------------------*/ ++/* ++ * ATTRIBUTES: ++ * ++ * /sys/devices/platform/retrogame_joypad/adc_cal [rw] ++ */ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_store_adc_cal(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, ++ size_t count) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ bool calibration; ++ ++ calibration = simple_strtoul(buf, NULL, 10); ++ ++ if (calibration) { ++ int nbtn; ++ ++ mutex_lock(&joypad->mutex); ++ for (nbtn = 0; nbtn < joypad->amux_count; nbtn++) { ++ struct bt_adc *adc = &joypad->adcs[nbtn]; ++ ++ adc->value = joypad_adc_read(joypad->amux, adc); ++ if (!adc->value) { ++ dev_err(joypad->dev, "%s : saradc channels[%d]!\n", ++ __func__, nbtn); ++ continue; ++ } ++ adc->cal = adc->value; ++ } ++ mutex_unlock(&joypad->mutex); ++ } ++ return count; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_show_adc_cal(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ int nbtn; ++ ssize_t pos; ++ ++ for (nbtn = 0, pos = 0; nbtn < joypad->amux_count; nbtn++) { ++ struct bt_adc *adc = &joypad->adcs[nbtn]; ++ pos += sprintf(&buf[pos], "adc[%d]->cal = %d\n", ++ nbtn, adc->cal); ++ } ++ pos += sprintf(&buf[pos], "adc scale = %d\n", joypad->bt_adc_scale); ++ return pos; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static DEVICE_ATTR(adc_cal, S_IWUSR | S_IRUGO, ++ joypad_show_adc_cal, ++ joypad_store_adc_cal); ++ ++/*----------------------------------------------------------------------------*/ ++/* ++ * ATTRIBUTES: ++ * ++ * /sys/devices/platform/retrogame_joypad/amux_debug [rw] ++ * ++ * echo [debug channel] > amux_debug ++ * cat amux_debug : debug channel mux set & adc read ++ */ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_store_amux_debug(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, ++ size_t count) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ ++ joypad->debug_ch = simple_strtoul(buf, NULL, 10); ++ ++ /* if error than default setting(debug_ch = 0) */ ++ if (joypad->debug_ch > joypad->amux_count) ++ joypad->debug_ch = 0; ++ ++ return count; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static ssize_t joypad_show_amux_debug(struct device *dev, ++ struct device_attribute *attr, ++ char *buf) ++{ ++ struct platform_device *pdev = to_platform_device(dev); ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ struct analog_mux *amux = joypad->amux; ++ ssize_t pos; ++ int value; ++ ++ mutex_lock(&joypad->mutex); ++ ++ /* disable poll driver */ ++ if (joypad->enable) ++ joypad->enable = false; ++ ++ if (joypad_amux_select(amux, joypad->debug_ch)) ++ goto err_out; ++ ++ if (iio_read_channel_processed(amux->iio_ch, &value)) ++ goto err_out; ++ ++ pos = sprintf(buf, "amux ch[%d], adc scale = %d, adc value = %d\n", ++ joypad->debug_ch, joypad->bt_adc_scale, ++ value * joypad->bt_adc_scale); ++ goto out; ++ ++err_out: ++ pos = sprintf(buf, "error : amux setup & adc read!\n"); ++out: ++ mutex_unlock(&joypad->mutex); ++ return pos; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static DEVICE_ATTR(amux_debug, S_IWUSR | S_IRUGO, ++ joypad_show_amux_debug, ++ joypad_store_amux_debug); ++ ++/*----------------------------------------------------------------------------*/ ++static struct attribute *joypad_attrs[] = { ++ &dev_attr_poll_interval.attr, ++ &dev_attr_adc_fuzz.attr, ++ &dev_attr_adc_flat.attr, ++ &dev_attr_enable.attr, ++ &dev_attr_adc_cal.attr, ++ &dev_attr_amux_debug.attr, ++ NULL, ++}; ++ ++static struct attribute_group joypad_attr_group = { ++ .attrs = joypad_attrs, ++}; ++ ++/*----------------------------------------------------------------------------*/ ++/*----------------------------------------------------------------------------*/ ++static void joypad_gpio_check(struct input_dev *input) ++{ ++ struct joypad *joypad = input_get_drvdata(input); ++ int nbtn, value; ++ ++ for (nbtn = 0; nbtn < joypad->bt_gpio_count; nbtn++) { ++ struct bt_gpio *gpio = &joypad->gpios[nbtn]; ++ ++ value = gpiod_get_value_cansleep(gpio->desc); ++ if(value < 0) { ++ dev_err(joypad->dev, "Failed to get GPIO state for button %s\n", gpio->label); ++ continue; ++ } ++ if (value != gpio->old_value) { ++ input_event(input, ++ gpio->report_type, ++ gpio->linux_code, ++ value); ++ gpio->old_value = value; ++ } ++ } ++ input_sync(input); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void joypad_adc_check(struct input_dev *input) ++{ ++ struct joypad *joypad = input_get_drvdata(input); ++ int nbtn; ++ int mag; ++ ++ /* Assumes an even number of axes and that joystick axis pairs are sequential */ ++ /* e.g. left stick Y immediately follows left stick X */ ++ for (nbtn = 0; nbtn < joypad->amux_count; nbtn+=2) { ++ struct bt_adc *adcx = &joypad->adcs[nbtn]; ++ struct bt_adc *adcy = &joypad->adcs[nbtn + 1]; ++ ++ /* Read first joystick axis */ ++ adcx->value = joypad_adc_read(joypad->amux, adcx); ++ if (!adcx->value) { ++ //dev_err(joypad->dev, "%s : saradc channels[%d]! adc->value : %d\n",__func__, nbtn, adc->value); ++ continue; ++ } ++ adcx->value = adcx->value - adcx->cal; ++ ++ /* Read second joystick axis */ ++ adcy->value = joypad_adc_read(joypad->amux, adcy); ++ if (!adcy->value) { ++ //dev_err(joypad->dev, "%s : saradc channels[%d]! adc->value : %d\n",__func__, nbtn, adc->value); ++ continue; ++ } ++ adcy->value = adcy->value - adcy->cal; ++ ++ /* Joystick Deadzone check */ ++ mag = int_sqrt((adcx->value * adcx->value) + (adcy->value * adcy->value)); ++ if (joypad->bt_adc_deadzone) { ++ if (mag <= joypad->bt_adc_deadzone) { ++ adcx->value = 0; ++ adcy->value = 0; ++ } ++ else { ++ /* Assumes adcx->max == -adcx->min == adcy->max == -adcy->min */ ++ /* Order of operations is critical to avoid integer overflow */ ++ adcx->value = (((adcx->max * adcx->value) / mag) * (mag - joypad->bt_adc_deadzone)) / (adcx->max - joypad->bt_adc_deadzone); ++ adcy->value = (((adcy->max * adcy->value) / mag) * (mag - joypad->bt_adc_deadzone)) / (adcy->max - joypad->bt_adc_deadzone); ++ } ++ } ++ ++ /* adc data tuning */ ++ if (adcx->tuning_n && adcx->value < 0) ++ adcx->value = ADC_DATA_TUNING(adcx->value, adcx->tuning_n); ++ if (adcx->tuning_p && adcx->value > 0) ++ adcx->value = ADC_DATA_TUNING(adcx->value, adcx->tuning_p); ++ if (adcy->tuning_n && adcy->value < 0) ++ adcy->value = ADC_DATA_TUNING(adcy->value, adcy->tuning_n); ++ if (adcy->tuning_p && adcy->value > 0) ++ adcy->value = ADC_DATA_TUNING(adcy->value, adcy->tuning_p); ++ ++ /* Clamp to [min, max] */ ++ adcx->value = adcx->value > adcx->max ? adcx->max : adcx->value; ++ adcx->value = adcx->value < adcx->min ? adcx->min : adcx->value; ++ adcy->value = adcy->value > adcy->max ? adcy->max : adcy->value; ++ adcy->value = adcy->value < adcy->min ? adcy->min : adcy->value; ++ ++ input_report_abs(input, ++ adcx->report_type, ++ adcx->invert ? adcx->value * (-1) : adcx->value); ++ input_report_abs(input, ++ adcy->report_type, ++ adcy->invert ? adcy->value * (-1) : adcy->value); ++ } ++ ++ /* check for adc keys (f key for instance) */ ++ if (joypad_adckey_read(joypad->iio_ch_fkey) < joypad->fkey_threshold && !joypad->fkey_fired) { ++ joypad->fkey_fired = 1; ++ input_report_key(input, BTN_MODE, 1); ++ } ++ if (joypad_adckey_read(joypad->iio_ch_fkey) >= joypad->fkey_threshold && joypad->fkey_fired) { ++ joypad->fkey_fired = 0; ++ input_report_key(input, BTN_MODE, 0); ++ } ++ ++ input_sync(input); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void joypad_poll(struct input_dev *input) ++{ ++ struct joypad *joypad = input_get_drvdata(input); ++ ++ if (joypad->enable) { ++ joypad_adc_check(input); ++ joypad_gpio_check(input); ++ } ++ if (input_get_poll_interval(input) != joypad->poll_interval) { ++ input_set_poll_interval(input, joypad->poll_interval); ++ } ++ ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_open(struct input_dev *input) ++{ ++ struct joypad *joypad = input_get_drvdata(input); ++ int nbtn; ++ ++ for (nbtn = 0; nbtn < joypad->bt_gpio_count; nbtn++) { ++ struct bt_gpio *gpio = &joypad->gpios[nbtn]; ++ gpio->old_value = 0; ++ } ++ for (nbtn = 0; nbtn < joypad->amux_count; nbtn++) { ++ struct bt_adc *adc = &joypad->adcs[nbtn]; ++ ++ adc->value = joypad_adc_read(joypad->amux, adc); ++ if (!adc->value) { ++ dev_err(joypad->dev, "%s : saradc channels[%d]!\n", ++ __func__, nbtn); ++ continue; ++ } ++ adc->cal = adc->value; ++ dev_info(joypad->dev, "%s : adc[%d] adc->cal = %d\n", ++ __func__, nbtn, adc->cal); ++ } ++ /* buttons status sync */ ++ joypad_adc_check(input); ++ joypad_gpio_check(input); ++ ++ /* button report enable */ ++ mutex_lock(&joypad->mutex); ++ joypad->enable = true; ++ mutex_unlock(&joypad->mutex); ++ ++ return 0; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void joypad_close(struct input_dev *input) ++{ ++ struct joypad *joypad = input_get_drvdata(input); ++ ++ /* button report disable */ ++ mutex_lock(&joypad->mutex); ++ joypad->enable = false; ++ mutex_unlock(&joypad->mutex); ++ ++} ++ ++ ++static int joypad_fkey_setup(struct device *dev, struct joypad *joypad) ++{ ++ ++ enum iio_chan_type type; ++ ++ joypad->iio_ch_fkey = devm_iio_channel_get(dev, "f_button"); ++ if (PTR_ERR(joypad->iio_ch_fkey) == -EPROBE_DEFER) ++ return -EPROBE_DEFER; ++ if (IS_ERR(joypad->iio_ch_fkey)) { ++ dev_err(dev, "iio channel get error\n"); ++ return -EINVAL; ++ } ++ if (!joypad->iio_ch_fkey->indio_dev) ++ return -ENXIO; ++ ++ if (iio_get_channel_type(joypad->iio_ch_fkey, &type)) ++ return -EINVAL; ++ ++ if (type != IIO_VOLTAGE) { ++ dev_err(dev, "Incompatible channel type %d\n", type); ++ return -EINVAL; ++ } ++ return 0; ++} ++/*----------------------------------------------------------------------------*/ ++static int joypad_amux_setup(struct device *dev, struct joypad *joypad) ++{ ++ struct analog_mux *amux; ++ enum iio_chan_type type; ++ int ret; ++ ++ /* analog mux control struct init */ ++ joypad->amux = devm_kzalloc(dev, sizeof(struct analog_mux), ++ GFP_KERNEL); ++ if (!joypad->amux) { ++ dev_err(dev, "%s amux devm_kzmalloc error!", __func__); ++ return -ENOMEM; ++ } ++ amux = joypad->amux; ++ amux->iio_ch = devm_iio_channel_get(dev, "amux_adc"); ++ if (PTR_ERR(amux->iio_ch) == -EPROBE_DEFER) ++ return -EPROBE_DEFER; ++ if (IS_ERR(amux->iio_ch)) { ++ dev_err(dev, "iio channel get error\n"); ++ return -EINVAL; ++ } ++ if (!amux->iio_ch->indio_dev) ++ return -ENXIO; ++ ++ if (iio_get_channel_type(amux->iio_ch, &type)) ++ return -EINVAL; ++ ++ if (type != IIO_VOLTAGE) { ++ dev_err(dev, "Incompatible channel type %d\n", type); ++ return -EINVAL; ++ } ++ ++ amux->sel_a_gpio = devm_gpiod_get(dev, "amux-a", GPIOD_OUT_LOW); ++ if (IS_ERR(amux->sel_a_gpio)) { ++ ret = PTR_ERR(amux->sel_a_gpio); ++ dev_err(dev, "%s: failed to get amux-a-gpios GPIO (%d)\n", __func__, ret); ++ goto err_out; ++ } ++ ++ amux->sel_b_gpio = devm_gpiod_get(dev, "amux-b", GPIOD_OUT_LOW); ++ if (IS_ERR(amux->sel_b_gpio)) { ++ ret = PTR_ERR(amux->sel_b_gpio); ++ dev_err(dev, "%s: failed to get amux-b-gpios GPIO (%d)\n", __func__, ret); ++ goto err_out; ++ } ++ ++ amux->en_gpio = devm_gpiod_get(dev, "amux-en", GPIOD_OUT_LOW); ++ if (IS_ERR(amux->en_gpio)) { ++ ret = PTR_ERR(amux->en_gpio); ++ dev_err(dev, "%s: failed to get amux-en-gpios GPIO (%d)\n", __func__, ret); ++ goto err_out; ++ } ++ ++ return 0; ++err_out: ++ return ret; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_adc_setup(struct device *dev, struct joypad *joypad) ++{ ++ int nbtn; ++ ++ /* adc button struct init */ ++ joypad->adcs = devm_kzalloc(dev, joypad->amux_count * ++ sizeof(struct bt_adc), GFP_KERNEL); ++ if (!joypad->adcs) { ++ dev_err(dev, "%s devm_kzmalloc error!", __func__); ++ return -ENOMEM; ++ } ++ ++ for (nbtn = 0; nbtn < joypad->amux_count; nbtn++) { ++ struct bt_adc *adc = &joypad->adcs[nbtn]; ++ ++ adc->scale = joypad->bt_adc_scale; ++ ++ adc->max = (ADC_MAX_VOLTAGE / 2); ++ adc->min = (ADC_MAX_VOLTAGE / 2) * (-1); ++ if (adc->scale) { ++ adc->max *= adc->scale; ++ adc->min *= adc->scale; ++ } ++ adc->amux_ch = nbtn; ++ adc->invert = false; ++ ++ switch (nbtn) { ++ case 0: ++ adc->report_type = ABS_RY; ++ if (device_property_read_u32(dev, ++ "abs_ry-p-tuning", ++ &adc->tuning_p)) ++ adc->tuning_p = ADC_TUNING_DEFAULT; ++ if (device_property_read_u32(dev, ++ "abs_ry-n-tuning", ++ &adc->tuning_n)) ++ adc->tuning_n = ADC_TUNING_DEFAULT; ++ break; ++ case 1: ++ adc->report_type = ABS_RX; ++ if (device_property_read_u32(dev, ++ "abs_rx-p-tuning", ++ &adc->tuning_p)) ++ adc->tuning_p = ADC_TUNING_DEFAULT; ++ if (device_property_read_u32(dev, ++ "abs_rx-n-tuning", ++ &adc->tuning_n)) ++ adc->tuning_n = ADC_TUNING_DEFAULT; ++ break; ++ case 2: ++ #ifdef __LEFT_JOYSTICK_INVERT__ ++ adc->invert = true; ++ #endif ++ adc->report_type = ABS_Y; ++ if (device_property_read_u32(dev, ++ "abs_y-p-tuning", ++ &adc->tuning_p)) ++ adc->tuning_p = ADC_TUNING_DEFAULT; ++ if (device_property_read_u32(dev, ++ "abs_y-n-tuning", ++ &adc->tuning_n)) ++ adc->tuning_n = ADC_TUNING_DEFAULT; ++ break; ++ case 3: ++ #ifdef __LEFT_JOYSTICK_INVERT__ ++ adc->invert = true; ++ #endif ++ adc->report_type = ABS_X; ++ if (device_property_read_u32(dev, ++ "abs_x-p-tuning", ++ &adc->tuning_p)) ++ adc->tuning_p = ADC_TUNING_DEFAULT; ++ if (device_property_read_u32(dev, ++ "abs_x-n-tuning", ++ &adc->tuning_n)) ++ adc->tuning_n = ADC_TUNING_DEFAULT; ++ break; ++ default : ++ dev_err(dev, "%s amux count(%d) error!", ++ __func__, nbtn); ++ return -EINVAL; ++ } ++ } ++ ++ // fkey property setup ++ if (device_property_read_u32(dev, "f-key-threshold", &joypad->fkey_threshold)) ++ joypad->fkey_threshold = 500; ++ ++ return 0; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_gpio_setup(struct device *dev, struct joypad *joypad) ++{ ++ struct fwnode_handle * child_dev; ++ int nbtn; ++ ++ joypad->gpios = devm_kzalloc(dev, joypad->bt_gpio_count * ++ sizeof(struct bt_gpio), GFP_KERNEL); ++ ++ if (!joypad->gpios) { ++ dev_err(dev, "%s devm_kzmalloc error!", __func__); ++ return -ENOMEM; ++ } ++ ++ nbtn = 0; ++ device_for_each_child_node(dev, child_dev) { ++ struct bt_gpio *gpio = &joypad->gpios[nbtn++]; ++ int error; ++ gpio->desc = devm_fwnode_gpiod_get(dev, child_dev, NULL, GPIOD_IN, "gpio_button"); ++ if (IS_ERR(gpio->desc)) { ++ error = PTR_ERR(gpio->desc); ++ dev_err(dev, "GPIO get error: %d\n", error); ++ return -EINVAL; ++ } ++ ++ ++ if (fwnode_property_read_u32(child_dev, "linux,code", ++ &gpio->linux_code)) { ++ dev_err(dev, "Button without keycode\n"); ++ fwnode_handle_put(child_dev); ++ return -EINVAL; ++ } ++ ++ fwnode_property_read_string(child_dev, "label", &gpio->label); ++ ++ /* gpio active level(key press level) */ ++ if (fwnode_property_read_u32(child_dev, "linux,code", &gpio->linux_code)) { ++ dev_err(dev, "Button without keycode: %s\n", ++ gpio->label); ++ return -EINVAL; ++ } ++ if (fwnode_property_read_u32(child_dev, "linux,input-type", ++ &gpio->report_type)) ++ gpio->report_type = EV_KEY; ++ } ++ if (nbtn == 0) { ++ dev_err(dev, "No button configured"); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++/*----------------------------------------------------------------------------*/ ++ ++static int joypad_input_setup(struct device *dev, struct joypad *joypad) ++{ ++ struct input_dev *input; ++ int nbtn, error; ++ u32 joypad_revision = 0; ++ u32 joypad_product = 0; ++ ++ input = devm_input_allocate_device(dev); ++ if (!input) { ++ dev_err(dev, "Unable to allocate input device\n"); ++ return -ENOMEM; ++ } ++ ++ device_property_read_string(dev, "joypad-name", &input->name); ++ input->phys = DRV_NAME"/input0"; ++ ++ device_property_read_u32(dev, "joypad-revision", &joypad_revision); ++ device_property_read_u32(dev, "joypad-product", &joypad_product); ++ input->id.bustype = BUS_HOST; ++ input->id.vendor = 0x484B; ++ input->id.product = (u16)joypad_product; ++ input->id.version = (u16)joypad_revision; ++ input->open = joypad_open; ++ input->close = joypad_close; ++ input_set_drvdata(input, joypad); ++ ++ /* IIO ADC key setup (0 mv ~ 1800 mv) * adc->scale */ ++ __set_bit(EV_ABS, input->evbit); ++ for(nbtn = 0; nbtn < joypad->amux_count; nbtn++) { ++ struct bt_adc *adc = &joypad->adcs[nbtn]; ++ input_set_abs_params(input, adc->report_type, ++ adc->min, adc->max, ++ joypad->bt_adc_fuzz, ++ joypad->bt_adc_flat); ++ dev_info(dev, ++ "%s : SCALE = %d, ABS min = %d, max = %d," ++ " fuzz = %d, flat = %d, deadzone = %d\n", ++ __func__, adc->scale, adc->min, adc->max, ++ joypad->bt_adc_fuzz, joypad->bt_adc_flat, ++ joypad->bt_adc_deadzone); ++ dev_info(dev, ++ "%s : adc tuning_p = %d, adc_tuning_n = %d\n\n", ++ __func__, adc->tuning_p, adc->tuning_n); ++ } ++ ++ /* GPIO key setup */ ++ __set_bit(EV_KEY, input->evbit); ++ for(nbtn = 0; nbtn < joypad->bt_gpio_count; nbtn++) { ++ struct bt_gpio *gpio = &joypad->gpios[nbtn]; ++ input_set_capability(input, gpio->report_type, ++ gpio->linux_code); ++ } ++ ++ /* F key setup */ ++ input_set_capability(input, EV_KEY, BTN_MODE); ++ ++ if (joypad->auto_repeat) ++ __set_bit(EV_REP, input->evbit); ++ ++ joypad->dev = dev; ++ joypad->input = input; ++ ++ input_setup_polling(input, joypad_poll); ++ input_set_poll_interval(input, joypad->poll_interval); ++ ++ error = input_register_device(input); ++ if (error) { ++ dev_err(dev, "unable to register input device, err=%d\n", ++ error); ++ return error; ++ } ++ return 0; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void joypad_setup_value_check(struct device *dev, struct joypad *joypad) ++{ ++ /* ++ fuzz: specifies fuzz value that is used to filter noise from ++ the event stream. ++ */ ++ if (g_button_adc_fuzz) ++ joypad->bt_adc_fuzz = g_button_adc_fuzz; ++ else ++ device_property_read_u32(dev, "button-adc-fuzz", ++ &joypad->bt_adc_fuzz); ++ /* ++ flat: values that are within this value will be discarded by ++ joydev interface and reported as 0 instead. ++ */ ++ if (g_button_adc_flat) ++ joypad->bt_adc_flat = g_button_adc_flat; ++ else ++ device_property_read_u32(dev, "button-adc-flat", ++ &joypad->bt_adc_flat); ++ ++ /* Joystick report value control */ ++ if (g_button_adc_scale) ++ joypad->bt_adc_scale = g_button_adc_scale; ++ else ++ device_property_read_u32(dev, "button-adc-scale", ++ &joypad->bt_adc_scale); ++ ++ /* Joystick deadzone value control */ ++ if (g_button_adc_deadzone) ++ joypad->bt_adc_deadzone = g_button_adc_deadzone; ++ else ++ device_property_read_u32(dev, "button-adc-deadzone", ++ &joypad->bt_adc_deadzone); ++ ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_dt_parse(struct device *dev, struct joypad *joypad) ++{ ++ int error = 0; ++ ++ /* initialize value check from boot.ini */ ++ joypad_setup_value_check(dev, joypad); ++ ++ device_property_read_u32(dev, "amux-count", ++ &joypad->amux_count); ++ ++ device_property_read_u32(dev, "poll-interval", ++ &joypad->poll_interval); ++ ++ joypad->auto_repeat = device_property_present(dev, "autorepeat"); ++ ++ joypad->bt_gpio_count = device_get_child_node_count(dev); ++ ++ if ((joypad->amux_count == 0) || (joypad->bt_gpio_count == 0)) { ++ dev_err(dev, "adc key = %d, gpio key = %d error!", ++ joypad->amux_count, joypad->bt_gpio_count); ++ return -EINVAL; ++ } ++ ++ error = joypad_adc_setup(dev, joypad); ++ if (error) ++ return error; ++ ++ error = joypad_amux_setup(dev, joypad); ++ if (error) ++ return error; ++ ++ error = joypad_gpio_setup(dev, joypad); ++ if (error) ++ return error; ++ ++ error = joypad_fkey_setup(dev, joypad); ++ if (error) ++ return error; ++ ++ dev_info(dev, "%s : adc key cnt = %d, gpio key cnt = %d\n", ++ __func__, joypad->amux_count, joypad->bt_gpio_count); ++ ++ return error; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static int joypad_probe(struct platform_device *pdev) ++{ ++ struct joypad *joypad; ++ struct device *dev = &pdev->dev; ++ int error; ++ ++ joypad = devm_kzalloc(dev, sizeof(struct joypad), GFP_KERNEL); ++ if (!joypad) { ++ dev_err(dev, "joypad devm_kzmalloc error!"); ++ return -ENOMEM; ++ } ++ ++ /* device tree data parse */ ++ error = joypad_dt_parse(dev, joypad); ++ if (error) { ++ dev_err(dev, "dt parse error!(err = %d)\n", error); ++ return error; ++ } ++ ++ mutex_init(&joypad->mutex); ++ platform_set_drvdata(pdev, joypad); ++ ++ /* input device setup */ ++ error = joypad_input_setup(dev, joypad); ++ if (error) { ++ dev_err(dev, "input setup failed!(err = %d)\n", error); ++ return error; ++ } ++ ++ error = sysfs_create_group(&pdev->dev.kobj, &joypad_attr_group); ++ if (error) { ++ dev_err(dev, "create sysfs group fail, error: %d\n", ++ error); ++ return error; ++ } ++ ++ return 0; ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void joypad_shutdown(struct platform_device *pdev) ++{ ++ struct joypad *joypad = platform_get_drvdata(pdev); ++ struct input_dev *input = joypad->input; ++ ++ if (input_device_enabled(input)) ++ joypad_close(input); ++ input_unregister_device(input); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static const struct of_device_id joypad_of_match[] = { ++ { .compatible = "singleadc-joypad", }, ++ {}, ++}; ++ ++MODULE_DEVICE_TABLE(of, joypad_of_match); ++ ++/*----------------------------------------------------------------------------*/ ++static struct platform_driver joypad_driver = { ++ .probe = joypad_probe, ++ .shutdown = joypad_shutdown, ++ .driver = { ++ .name = DRV_NAME, ++ .of_match_table = joypad_of_match, ++ }, ++}; ++ ++/*----------------------------------------------------------------------------*/ ++static int __init joypad_init(void) ++{ ++ return platform_driver_register(&joypad_driver); ++} ++ ++/*----------------------------------------------------------------------------*/ ++static void __exit joypad_exit(void) ++{ ++ platform_driver_unregister(&joypad_driver); ++} ++ ++/*----------------------------------------------------------------------------*/ ++late_initcall(joypad_init); ++module_exit(joypad_exit); +-- +2.48.1 + diff --git a/board/recalbox/anbernic/rg353x/kernel_patches/0003-add-spk_amp-regulator-for-Anbernic-RGxx3-Devices.patch b/board/recalbox/anbernic/rg353x/kernel_patches/0003-add-spk_amp-regulator-for-Anbernic-RGxx3-Devices.patch new file mode 100644 index 0000000000..d2cc891648 --- /dev/null +++ b/board/recalbox/anbernic/rg353x/kernel_patches/0003-add-spk_amp-regulator-for-Anbernic-RGxx3-Devices.patch @@ -0,0 +1,69 @@ +From 09d298a016243063fd45f051e53c5720020ff3b1 Mon Sep 17 00:00:00 2001 +From: David Barbion +Date: Thu, 23 Jan 2025 00:02:03 +0100 +Subject: [PATCH 3/3] add spk_amp regulator for Anbernic RGxx3 Devices + +--- + arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts | 3 ++- + arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts | 2 +- + arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts | 3 ++- + 3 files changed, 5 insertions(+), 3 deletions(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts +index a73cf30801ec..20f600e1ceb3 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353p.dts +@@ -43,7 +43,7 @@ sound { + simple-audio-card,name = "rk817_ext"; + simple-audio-card,aux-devs = <&spk_amp>; + simple-audio-card,format = "i2s"; +- simple-audio-card,hp-det-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; ++ simple-audio-card,hp-det-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,widgets = + "Microphone", "Mic Jack", +@@ -74,6 +74,7 @@ spk_amp: audio-amplifier { + pinctrl-0 = <&spk_amp_enable_h>; + pinctrl-names = "default"; + sound-name-prefix = "Speaker Amp"; ++ VCC-supply = <&vcc_3v3>; + }; + }; + +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts +index ca5284e4807d..4fb712fe918c 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg353ps.dts +@@ -42,7 +42,7 @@ sound { + simple-audio-card,name = "rk817_ext"; + simple-audio-card,aux-devs = <&spk_amp>; + simple-audio-card,format = "i2s"; +- simple-audio-card,hp-det-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; ++ simple-audio-card,hp-det-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,widgets = + "Microphone", "Mic Jack", +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts +index 74cf313e0635..4e62b4568c65 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts +@@ -132,7 +132,7 @@ sound { + simple-audio-card,name = "rk817_ext"; + simple-audio-card,aux-devs = <&spk_amp>; + simple-audio-card,format = "i2s"; +- simple-audio-card,hp-det-gpio = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; ++ simple-audio-card,hp-det-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,widgets = + "Microphone", "Mic Jack", +@@ -163,6 +163,7 @@ spk_amp: audio-amplifier { + pinctrl-0 = <&spk_amp_enable_h>; + pinctrl-names = "default"; + sound-name-prefix = "Speaker Amp"; ++ VCC-supply = <&vcc_3v3>; + }; + }; + +-- +2.48.1 + diff --git a/board/recalbox/copy-recalbox-archives.sh b/board/recalbox/copy-recalbox-archives.sh index 9763ea535b..e3a66b84a3 100755 --- a/board/recalbox/copy-recalbox-archives.sh +++ b/board/recalbox/copy-recalbox-archives.sh @@ -158,7 +158,12 @@ case "${RECALBOX_TARGET}" in cp "${BINARIES_DIR}/initrd.gz" "${BINARIES_DIR}/boot-data/boot/initrd.gz" || exit 1 cp "${BINARIES_DIR}/Image" "${BINARIES_DIR}/boot-data/boot/linux" || exit 1 cp "${BINARIES_DIR}/rootfs.squashfs" "${BINARIES_DIR}/boot-data/boot/recalbox" || exit 1 - cp "${BINARIES_DIR}/u-boot-rockchip.bin" "${BINARIES_DIR}/boot-data/boot/bootloader/64/" || exit 1 + # split uboot, genimage does not allow flashing image bigger than partition + dd if="${BINARIES_DIR}/u-boot-rockchip.bin" of="${BINARIES_DIR}/u-boot-rockchip-idbloader.bin" bs=512 count=16320 || exit 1 + dd if="${BINARIES_DIR}/u-boot-rockchip.bin" of="${BINARIES_DIR}/u-boot-rockchip-uboot.bin" bs=512 skip=16320 || exit 1 + mkdir -p "${BINARIES_DIR}/boot-data/boot/bootloader/"{64,16384} + cp "${BINARIES_DIR}/u-boot-rockchip-idbloader.bin" "${BINARIES_DIR}/boot-data/boot/bootloader/64/" || exit 1 + cp "${BINARIES_DIR}/u-boot-rockchip-uboot.bin" "${BINARIES_DIR}/boot-data/boot/bootloader/16384/" || exit 1 GENIMAGE_CFG="${BR2_EXTERNAL_RECALBOX_PATH}/board/recalbox/anbernic/rg353x/genimage.cfg" ;; diff --git a/configs/recalbox-rg353x_defconfig b/configs/recalbox-rg353x_defconfig index f137778b92..f2be8dd79b 100644 --- a/configs/recalbox-rg353x_defconfig +++ b/configs/recalbox-rg353x_defconfig @@ -28,9 +28,10 @@ BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/copy- BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_VERSION=y BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.10" -BR2_LINUX_KERNEL_PATCH="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST) $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST)" +BR2_LINUX_KERNEL_PATCH="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST) $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST) $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel_patches/" BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config" +BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig-fragment.config" BR2_LINUX_KERNEL_DTS_SUPPORT=y BR2_LINUX_KERNEL_INTREE_DTS_NAME="rockchip/rk3566-anbernic-rg353ps rockchip/rk3566-anbernic-rg353vs rockchip/rk3566-anbernic-rg503 rockchip/rk3566-anbernic-rg353p rockchip/rk3566-anbernic-rg353v rockchip/rk3566-powkiddy-rk2023 rockchip/rk3566-powkiddy-rgb30 rockchip/rk3566-powkiddy-rgb10max3" BR2_PACKAGE_ROCKCHIP_RKBIN_TPL_FILENAME="bin/rk35/rk3568_ddr_1056MHz_v1.18.bin" diff --git a/projects/frontend/es-core/src/audio/pulseaudio/PulseAudioController.cpp b/projects/frontend/es-core/src/audio/pulseaudio/PulseAudioController.cpp index ebf89e0433..2f2271d270 100755 --- a/projects/frontend/es-core/src/audio/pulseaudio/PulseAudioController.cpp +++ b/projects/frontend/es-core/src/audio/pulseaudio/PulseAudioController.cpp @@ -712,12 +712,6 @@ String PulseAudioController::AdjustSpecialPlayback(const String& originalPlaybac case BoardType::RG353P: case BoardType::RG353M: case BoardType::RG503: - { - // we force headphone output so that rg353m can be switched to spk by the software after the init/detection of headphone - if (system("amixer sset 'Playback Path' HP") != 0) - { LOG(LogError) << "[PulseAudio] Error setting playback path"; } - break; - } case BoardType::UndetectedYet: case BoardType::Unknown: case BoardType::Pi0: diff --git a/projects/frontend/es-core/src/hardware/Board.cpp b/projects/frontend/es-core/src/hardware/Board.cpp index db21852717..b5f3cefc9f 100644 --- a/projects/frontend/es-core/src/hardware/Board.cpp +++ b/projects/frontend/es-core/src/hardware/Board.cpp @@ -202,13 +202,19 @@ BoardType Board::GetBoardType() if (left == REVISION_STRING) revision = right; } + // Finally read devicetree model + if (hardware.empty()) + hardware = Files::LoadFile(Path("/sys/firmware/devicetree/base/model")); + + { LOG(LogInfo) << "[Hardware] " << hardware; } + // Identification if (hardware == "Anbernic RG351V") { LOG(LogInfo) << "[Hardware] Anbernic RG351V"; mType = BoardType::RG351V; } else if (hardware == "Anbernic RG351P") { LOG(LogInfo) << "[Hardware] Anbernic RG351P"; mType = BoardType::RG351P; } - else if (hardware == "Anbernic RG353P") { LOG(LogInfo) << "[Hardware] Anbernic RG353P"; mType = BoardType::RG353P; } - else if (hardware == "Anbernic RG353V") { LOG(LogInfo) << "[Hardware] Anbernic RG353V"; mType = BoardType::RG353V; } - else if (hardware == "Anbernic RG353M") { LOG(LogInfo) << "[Hardware] Anbernic RG353M"; mType = BoardType::RG353M; } - else if (hardware == "Anbernic RG503") { LOG(LogInfo) << "[Hardware] Anbernic RG503"; mType = BoardType::RG503; } + else if (hardware.Contains("RG353P")) { LOG(LogInfo) << "[Hardware] Anbernic RG353P"; mType = BoardType::RG353P; } + else if (hardware.Contains("RG353V")) { LOG(LogInfo) << "[Hardware] Anbernic RG353V"; mType = BoardType::RG353V; } + else if (hardware.Contains("RG353M")) { LOG(LogInfo) << "[Hardware] Anbernic RG353M"; mType = BoardType::RG353M; } + else if (hardware.Contains("RG503")) { LOG(LogInfo) << "[Hardware] Anbernic RG503"; mType = BoardType::RG503; } else if (hardware == "Hardkernel ODROID-GO3") { LOG(LogInfo) << "[Hardware] Odroid Advance Go Super revision " << revision; mType = BoardType::OdroidAdvanceGoSuper; } else if ((hardware == "Hardkernel ODROID-GO2") || (hardware == "Hardkernel ODROID-GO1") || (hardware == "Hardkernel ODROID-GO")) { diff --git a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.cpp b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.cpp index ba540d0c40..823e785080 100644 --- a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.cpp +++ b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XBoard.cpp @@ -32,9 +32,9 @@ void RG353XBoard::SetLowestBrightness() void RG353XBoard::SetBrightness(int step) { String maxValue = Files::LoadFile(Path("/sys/class/backlight/backlight/max_brightness")); - int max = 255; // Max RG value + int max = 1666; // Max RG value (void)maxValue.Trim("\r\n").TryAsInt(max); - int value = 1 << step; if (value > max) value = max; + int value = ((max >> 8) + 1) << step; if (value > max) value = max; Files::SaveFile(Path("/sys/class/backlight/backlight/brightness"), String(value)); } @@ -86,15 +86,11 @@ bool RG353XBoard::IsBatteryCharging() void RG353XBoard::HeadphonePlugged() { - if (system("amixer sset 'Playback Path' HP") != 0) - { LOG(LogError) << "[RG353XBoard] Error setting headphone on!"; } AudioController::Instance().SetOutputPort("rk817-headphones"); } void RG353XBoard::HeadphoneUnplugged() { - if (system("amixer sset 'Playback Path' SPK") != 0) - { LOG(LogError) << "[RG353XBoard] Error setting headphone off!"; } AudioController::Instance().SetOutputPort("rk817-speaker"); } diff --git a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XJackEventReader.h b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XJackEventReader.h index 229ca95632..45dc57a5d6 100644 --- a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XJackEventReader.h +++ b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XJackEventReader.h @@ -24,7 +24,7 @@ class RG353XJackEventReader : private Thread private: //! Event to read - static constexpr const char* sInputEventPath = "/dev/input/event4"; + static constexpr const char* sInputEventPath = "/dev/input/event3"; //! Headphone insert event type static constexpr int sHeadphoneInsertType = EV_SW; //! Headphone insert event code diff --git a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XPowerEventReader.h b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XPowerEventReader.h index fe82404d26..c2e8999c77 100644 --- a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XPowerEventReader.h +++ b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XPowerEventReader.h @@ -33,7 +33,7 @@ class RG353XPowerEventReader : private Thread }; //! Event to read - static constexpr const char* sInputEventPath = "/dev/input/by-path/platform-fdd40000.i2c-platform-rk805-pwrkey-event"; + static constexpr const char* sInputEventPath = "/dev/input/by-path/platform-fdd40000.i2c-platform-rk805-pwrkey.3.auto-event"; //! Power key code static constexpr int sPowerKeyCode = 116; diff --git a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XVolumeReader.h b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XVolumeReader.h index bb6f233ac3..8c655afa30 100644 --- a/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XVolumeReader.h +++ b/projects/frontend/es-core/src/hardware/boards/anbernic/RG353XVolumeReader.h @@ -32,7 +32,7 @@ class RG353XVolumeReader : private Thread private: //! Event to read - static constexpr const char* sInputEventPath = "/dev/input/by-path/platform-gpio-keys-event"; + static constexpr const char* sInputEventPath = "/dev/input/by-path/platform-gpio-keys-vol-event"; //! Volume button up static constexpr int sVolumeUp = 115; //! Volume button down -- GitLab From d453f465c050944b5a962535ca79b25f59e5bc53 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Sat, 4 Jan 2025 23:02:10 +0100 Subject: [PATCH 6/9] ci: reenable rg353x build --- .gitlab-ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 10b1cb1524..09cdac786a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -291,11 +291,11 @@ build rpi3-zero2: when: manual variables: ARCH: 'rpi3' -#build rg353x: -# <<: *build_definition -# when: manual -# variables: -# ARCH: 'rg353x' +build rg353x: + <<: *build_definition + when: manual + variables: + ARCH: 'rg353x' build rpi5_64: <<: *build_definition when: manual -- GitLab From 59a787adc6a208d9ba75f18c10bd1e5d5abc06b8 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Tue, 7 Jan 2025 23:23:21 +0100 Subject: [PATCH 7/9] chore(rg353x): disable ohci device For an unknown reason, this device causes locks during shutdown or even when running lsusb -v, after a few second of uptime. The kernel defconfig has been simplified though Added bluetooth firmware --- .../rg353x/kernel-6.10-defconfig.config | 62 +++++++++---------- .../0002-disable-ohci-usb-device.patch | 25 ++++++++ configs/recalbox-rg353x_defconfig | 5 +- 3 files changed, 57 insertions(+), 35 deletions(-) create mode 100644 board/recalbox/anbernic/rg353x/kernel_patches/0002-disable-ohci-usb-device.patch diff --git a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config index 2d621a0f21..519dff3875 100644 --- a/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config +++ b/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config @@ -54,7 +54,7 @@ CONFIG_ARM64_ERRATUM_2441009=y # CONFIG_QCOM_FALKOR_ERRATUM_E1041 is not set # CONFIG_NVIDIA_CARMEL_CNP_ERRATUM is not set # CONFIG_SOCIONEXT_SYNQUACER_PREITS is not set -CONFIG_ARM64_VA_BITS_48=y +CONFIG_ARM64_VA_BITS_39=y CONFIG_SCHED_MC=y CONFIG_SCHED_SMT=y CONFIG_NR_CPUS=4 @@ -63,6 +63,7 @@ CONFIG_COMPAT=y CONFIG_ARMV8_DEPRECATED=y CONFIG_ARM64_PMEM=y # CONFIG_ARM64_BTI is not set +# CONFIG_ARM64_SME is not set CONFIG_RANDOMIZE_BASE=y # CONFIG_EFI is not set CONFIG_SUSPEND_SKIP_SYNC=y @@ -138,7 +139,7 @@ CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y CONFIG_BT=m CONFIG_BT_RFCOMM=y -CONFIG_BT_HIDP=y +CONFIG_BT_HIDP=m CONFIG_BT_HCIBTUSB=m CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_ATH3K=y @@ -186,7 +187,7 @@ CONFIG_BLK_DEV_SR=y CONFIG_SCSI_SCAN_ASYNC=y CONFIG_SCSI_SPI_ATTRS=y CONFIG_NETDEVICES=y -CONFIG_WIREGUARD=y +CONFIG_WIREGUARD=m CONFIG_TUN=m CONFIG_VETH=y # CONFIG_NET_VENDOR_ALACRITECH is not set @@ -257,17 +258,13 @@ CONFIG_AR5523=m CONFIG_ATH10K=m CONFIG_WCN36XX=m CONFIG_AT76C50X_USB=m -CONFIG_B43=m -CONFIG_BRCMFMAC=m -# CONFIG_BRCMFMAC_SDIO is not set -CONFIG_BRCMFMAC_USB=y -CONFIG_LIBERTAS=m -CONFIG_LIBERTAS_USB=m -CONFIG_LIBERTAS_THINFIRM=m -CONFIG_MWIFIEX=m -CONFIG_MWIFIEX_SDIO=m -CONFIG_MWIFIEX_USB=m -CONFIG_MT7601U=m +# CONFIG_WLAN_VENDOR_BROADCOM is not set +# CONFIG_WLAN_VENDOR_INTEL is not set +# CONFIG_WLAN_VENDOR_INTERSIL is not set +# CONFIG_WLAN_VENDOR_MARVELL is not set +# CONFIG_WLAN_VENDOR_MEDIATEK is not set +# CONFIG_WLAN_VENDOR_MICROCHIP is not set +# CONFIG_WLAN_VENDOR_PURELIFI is not set CONFIG_RT2X00=m CONFIG_RT2500USB=m CONFIG_RT73USB=m @@ -283,6 +280,8 @@ CONFIG_RTW88_8822BS=m CONFIG_RTW88_8822BU=m CONFIG_RTW88_8822CS=m CONFIG_RTW88_8822CU=m +CONFIG_RTW88_8723DS=m +CONFIG_RTW88_8723CS=m CONFIG_RTW88_8723DU=m CONFIG_RTW88_8821CS=m CONFIG_RTW88_8821CU=m @@ -297,17 +296,15 @@ CONFIG_INPUT_MATRIXKMAP=y CONFIG_INPUT_JOYDEV=y CONFIG_INPUT_EVDEV=y CONFIG_KEYBOARD_ADC=y +# CONFIG_KEYBOARD_ATKBD is not set CONFIG_KEYBOARD_GPIO=y CONFIG_KEYBOARD_GPIO_POLLED=y # CONFIG_MOUSE_PS2 is not set CONFIG_INPUT_JOYSTICK=y CONFIG_JOYSTICK_ADC=y -CONFIG_JOYSTICK_COBRA=m -CONFIG_JOYSTICK_SPACEBALL=m CONFIG_JOYSTICK_XPAD=m CONFIG_JOYSTICK_XPAD_FF=y CONFIG_JOYSTICK_XPAD_LEDS=y -CONFIG_JOYSTICK_PXRC=m CONFIG_JOYSTICK_SINGLEADCJOY=y CONFIG_INPUT_TABLET=y CONFIG_INPUT_TOUCHSCREEN=y @@ -320,6 +317,7 @@ CONFIG_INPUT_UINPUT=y CONFIG_INPUT_PWM_VIBRA=y CONFIG_INPUT_RK805_PWRKEY=y CONFIG_SERIO_SERPORT=m +CONFIG_SERIO_LIBPS2=y CONFIG_GAMEPORT=y # CONFIG_LEGACY_PTYS is not set CONFIG_SERIAL_8250=y @@ -355,7 +353,6 @@ CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON_POWEROFF=y CONFIG_SYSCON_REBOOT_MODE=y CONFIG_BATTERY_CW2015=y -CONFIG_BATTERY_SBS=y CONFIG_CHARGER_GPIO=y CONFIG_CHARGER_BQ24735=y CONFIG_CHARGER_RK817=y @@ -367,8 +364,6 @@ CONFIG_DEVFREQ_THERMAL=y CONFIG_ROCKCHIP_THERMAL=y CONFIG_WATCHDOG=y CONFIG_DW_WATCHDOG=y -CONFIG_SSB=y -CONFIG_BCMA=y CONFIG_MFD_RK8XX_I2C=y CONFIG_MFD_TPS6586X=y CONFIG_REGULATOR=y @@ -573,7 +568,7 @@ CONFIG_DRM_PANEL_SITRONIX_ST7703=y CONFIG_DRM_DISPLAY_CONNECTOR=y CONFIG_DRM_DW_HDMI_CEC=y CONFIG_DRM_PANEL_MIPI_DBI=y -CONFIG_DRM_PANFROST=y +CONFIG_DRM_PANFROST=m CONFIG_FB=y CONFIG_FIRMWARE_EDID=y CONFIG_FB_MODE_HELPERS=y @@ -715,22 +710,21 @@ CONFIG_USB_STORAGE_ENE_UB6250=y CONFIG_USB_UAS=y CONFIG_USB_DWC3=y CONFIG_USB_DWC2=y -CONFIG_USB_SERIAL=y +CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y -CONFIG_USB_SERIAL_CH341=y -CONFIG_USB_SERIAL_CP210X=y -CONFIG_USB_SERIAL_FTDI_SIO=y -CONFIG_USB_SERIAL_KEYSPAN=y -CONFIG_USB_SERIAL_PL2303=y -CONFIG_USB_SERIAL_OTI6858=y -CONFIG_USB_SERIAL_QUALCOMM=y -CONFIG_USB_SERIAL_SIERRAWIRELESS=y -CONFIG_USB_SERIAL_OPTION=y +CONFIG_USB_SERIAL_CH341=m +CONFIG_USB_SERIAL_CP210X=m +CONFIG_USB_SERIAL_FTDI_SIO=m +CONFIG_USB_SERIAL_KEYSPAN=m +CONFIG_USB_SERIAL_PL2303=m +CONFIG_USB_SERIAL_OTI6858=m +CONFIG_USB_SERIAL_QUALCOMM=m +CONFIG_USB_SERIAL_SIERRAWIRELESS=m +CONFIG_USB_SERIAL_OPTION=m CONFIG_NOP_USB_XCEIV=y CONFIG_USB_GADGET=y CONFIG_USB_GADGET_DEBUG_FILES=y CONFIG_USB_GADGET_VBUS_DRAW=500 -CONFIG_U_SERIAL_CONSOLE=y CONFIG_USB_CONFIGFS=m CONFIG_USB_CONFIGFS_NCM=y CONFIG_USB_CONFIGFS_ECM=y @@ -905,7 +899,9 @@ CONFIG_CRYPTO_USER_API_SKCIPHER=y CONFIG_CRYPTO_USER_API_RNG=y CONFIG_CRYPTO_USER_API_AEAD=y CONFIG_CRYPTO_NHPOLY1305_NEON=y +CONFIG_CRYPTO_CHACHA20_NEON=y CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_POLY1305_NEON=y CONFIG_CRYPTO_SHA1_ARM64_CE=y CONFIG_CRYPTO_SHA2_ARM64_CE=y CONFIG_CRYPTO_SHA512_ARM64_CE=y @@ -914,6 +910,8 @@ CONFIG_CRYPTO_AES_ARM64_BS=y CONFIG_CRYPTO_AES_ARM64_CE_CCM=y CONFIG_CRYPTO_DEV_ROCKCHIP=y CONFIG_CORDIC=y +CONFIG_CRYPTO_LIB_CURVE25519=y +CONFIG_CRYPTO_LIB_CHACHA20POLY1305=y CONFIG_CRC_CCITT=y CONFIG_CRC_T10DIF=y CONFIG_CRC_ITU_T=y diff --git a/board/recalbox/anbernic/rg353x/kernel_patches/0002-disable-ohci-usb-device.patch b/board/recalbox/anbernic/rg353x/kernel_patches/0002-disable-ohci-usb-device.patch new file mode 100644 index 0000000000..c822dc356d --- /dev/null +++ b/board/recalbox/anbernic/rg353x/kernel_patches/0002-disable-ohci-usb-device.patch @@ -0,0 +1,25 @@ +From 1525bf3ad4083253ab78e8c39ac60725979e1fff Mon Sep 17 00:00:00 2001 +From: David Barbion +Date: Tue, 7 Jan 2025 23:15:48 +0100 +Subject: [PATCH 2/3] disable ohci usb device + +--- + arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi +index b76fe7faf50e..7fba104e90ec 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3566-anbernic-rgxx3.dtsi +@@ -834,7 +834,7 @@ &usb_host1_ehci { + }; + + &usb_host1_ohci { +- status = "okay"; ++ status = "disabled"; + }; + + &usb_host1_xhci { +-- +2.48.1 + diff --git a/configs/recalbox-rg353x_defconfig b/configs/recalbox-rg353x_defconfig index f2be8dd79b..5047dd8e78 100644 --- a/configs/recalbox-rg353x_defconfig +++ b/configs/recalbox-rg353x_defconfig @@ -27,7 +27,7 @@ BR2_ROOTFS_POST_BUILD_SCRIPT="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/recal BR2_ROOTFS_POST_IMAGE_SCRIPT="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/copy-recalbox-archives.sh" BR2_LINUX_KERNEL=y BR2_LINUX_KERNEL_CUSTOM_VERSION=y -BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.10" +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="6.10.14" BR2_LINUX_KERNEL_PATCH="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST) $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel_patches/$(BR2_TOOLCHAIN_HEADERS_AT_LEAST) $(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel_patches/" BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_RECALBOX_PATH)/board/recalbox/anbernic/rg353x/kernel-6.10-defconfig.config" @@ -75,8 +75,7 @@ BR2_PACKAGE_SDL_NET=y BR2_PACKAGE_SDL2_OPENGLES=y BR2_PACKAGE_XKEYBOARD_CONFIG=y BR2_PACKAGE_LINUX_FIRMWARE=y -BR2_PACKAGE_LINUX_FIRMWARE_RTL_81XX=y -BR2_PACKAGE_LINUX_FIRMWARE_RTL_87XX=y +BR2_PACKAGE_LINUX_FIRMWARE_RTL_88XX_BT=y BR2_PACKAGE_LINUX_FIRMWARE_RTL_88XX=y BR2_PACKAGE_LINUX_FIRMWARE_RTL_RTW88=y BR2_PACKAGE_DBUS_CPP=y -- GitLab From 7d278412ed6d4f18b1a3d3bf0eb14ee3b133e4c7 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Tue, 7 Jan 2025 23:30:04 +0100 Subject: [PATCH 8/9] chore(rg353x): remove deprecated bluetooth controller init --- package/recalbox-bluetooth/recalbox-bluetooth.mk | 9 +-------- package/recalbox-bluetooth/src/init/bluetooth | 1 - .../src/scripts/bluetoothcontrollers.sh.others | 3 --- .../src/scripts/bluetoothcontrollers.sh.rg353x | 10 ---------- 4 files changed, 1 insertion(+), 22 deletions(-) delete mode 100755 package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.others delete mode 100755 package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.rg353x diff --git a/package/recalbox-bluetooth/recalbox-bluetooth.mk b/package/recalbox-bluetooth/recalbox-bluetooth.mk index c5eabfd9c2..e12c1584ad 100644 --- a/package/recalbox-bluetooth/recalbox-bluetooth.mk +++ b/package/recalbox-bluetooth/recalbox-bluetooth.mk @@ -8,12 +8,6 @@ RECALBOX_BLUETOOTH_SOURCE = RECALBOX_BLUETOOTH_VERSION = 1.0 RECALBOX_BLUETOOTH_LICENSE = MIT -ifeq ($(BR2_PACKAGE_RECALBOX_TARGET_RG353X),y) -RECALBOX_BLUETOOTH_BT_CONTROLLERS=rg353x -else -RECALBOX_BLUETOOTH_BT_CONTROLLERS=others -endif - RECALBOX_BLUETOOTH_SCRIPTS_FILES = \ bluezutils.py \ recalpair \ @@ -22,13 +16,12 @@ RECALBOX_BLUETOOTH_SCRIPTS_FILES = \ test-discovery \ autopair \ recalbox-bluetooth-agent + define RECALBOX_BLUETOOTH_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(RECALBOX_BLUETOOTH_PKGDIR)/src/init/bluetooth $(TARGET_DIR)/etc/init.d/S07bluetooth $(foreach script,$(RECALBOX_BLUETOOTH_SCRIPTS_FILES),\ $(INSTALL) -D -m 0755 $(RECALBOX_BLUETOOTH_PKGDIR)/src/scripts/$(script) $(TARGET_DIR)/recalbox/scripts/bluetooth/$(script) ) - $(INSTALL) -D -m 0755 $(RECALBOX_BLUETOOTH_PKGDIR)/src/scripts/bluetoothcontrollers.sh.$(RECALBOX_BLUETOOTH_BT_CONTROLLERS) \ - $(TARGET_DIR)/recalbox/scripts/bluetooth/bluetoothcontrollers.sh endef $(eval $(generic-package)) diff --git a/package/recalbox-bluetooth/src/init/bluetooth b/package/recalbox-bluetooth/src/init/bluetooth index 8f7f49d33f..3f13b1dd5f 100755 --- a/package/recalbox-bluetooth/src/init/bluetooth +++ b/package/recalbox-bluetooth/src/init/bluetooth @@ -34,7 +34,6 @@ start_bluetoothd() { settings_version="$($systemsetting -command load -key controllers.ps3.driver -default bluez)" if [ "$settings_version" != "bluez" ]; then BLUETOOTHD_ARGS="--noplugin=sixaxis"; else BLUETOOTHD_ARGS="--noplugin=sixaxispair"; fi start-stop-daemon -S -q -m -p /var/run/bluetoothd.pid --exec /usr/libexec/bluetooth/bluetoothd -- $BLUETOOTHD_ARGS & - ( /recalbox/scripts/bluetooth/bluetoothcontrollers.sh ) & } start_bluetooth_autopair() { diff --git a/package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.others b/package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.others deleted file mode 100755 index 8c3cbfc39d..0000000000 --- a/package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.others +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -exit 0 diff --git a/package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.rg353x b/package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.rg353x deleted file mode 100755 index a9de129f1b..0000000000 --- a/package/recalbox-bluetooth/src/scripts/bluetoothcontrollers.sh.rg353x +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -HCIATTACH=/usr/bin/rtk_hciattach -SERIAL=$(awk '/^Serial/{ print $3 }' /proc/cpuinfo) -B1=${SERIAL:10:2} -B2=${SERIAL:12:2} -B3=${SERIAL:14:2} -BDADDR=$(printf 00:e0:4c:%02x:%02x:%02x $((0x$B1 ^ 0xaa)) $((0x$B2 ^ 0xaa)) $((0x$B3 ^ 0xaa))) - -$HCIATTACH -n -s 115200 /dev/ttyS1 rtk_h5 "$BDADDR" -- GitLab From 0370b0a39a4cc417d1c1c854a35d63421214ab02 Mon Sep 17 00:00:00 2001 From: David Barbion Date: Thu, 23 Jan 2025 00:12:17 +0100 Subject: [PATCH 9/9] chore(rg353x): fix pulseaudio profile-set for rg353x rk817 audio device For an unknown reason, SPK shuts all audio output. Playback mux must be set to HP. Internal speaker controls audio output on speakers. --- .../etc/udev/rules.d/91-pulseaudio.rules | 4 ++-- .../alsa-mixer/paths/rk817-headphones.conf | 21 ++++------------ .../alsa-mixer/paths/rk817-speaker.conf | 24 ++++--------------- .../alsa-mixer/profile-sets/rk817.conf | 10 ++++---- 4 files changed, 16 insertions(+), 43 deletions(-) diff --git a/board/recalbox/fsoverlay/etc/udev/rules.d/91-pulseaudio.rules b/board/recalbox/fsoverlay/etc/udev/rules.d/91-pulseaudio.rules index e80a7ce725..5dc2591a01 100644 --- a/board/recalbox/fsoverlay/etc/udev/rules.d/91-pulseaudio.rules +++ b/board/recalbox/fsoverlay/etc/udev/rules.d/91-pulseaudio.rules @@ -16,7 +16,7 @@ DRIVERS=="vc4_hdmi", ATTR{id}=="vc4hdmi1", ENV{PULSE_PROFILE_SET}="recalbox-hdmi DRIVERS=="bcm2835_audio", ATTR{id}=="Headphones", ENV{PULSE_PROFILE_SET}="recalbox-analog.conf",ENV{PULSE_MODARGS}="tsched=false", GOTO="end" DRIVERS=="bcm2835_audio", ATTR{id}=="ALSA", ENV{PULSE_PROFILE_SET}="recalbox-analog.conf",ENV{PULSE_MODARGS}="tsched=false", GOTO="end" -DRIVERS=="asoc-simple-card", ATTR{id}=="rockchiprk817co", ENV{PULSE_PROFILE_SET}="rk817.conf", GOTO="end" -DRIVERS=="asoc-simple-card", ATTR{id}=="rockchiphdmi", ENV{PULSE_PROFILE_SET}="recalbox-hdmi.conf", GOTO="end" +DRIVERS=="asoc-simple-card", ATTR{id}=="rk817ext", ENV{PULSE_PROFILE_SET}="rk817.conf", GOTO="end" +DRIVERS=="asoc-simple-card", ATTR{id}=="HDMI", ENV{PULSE_PROFILE_SET}="recalbox-hdmi.conf", GOTO="end" LABEL="end" diff --git a/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-headphones.conf b/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-headphones.conf index a2d63a7a2b..2ca4a2b3ed 100644 --- a/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-headphones.conf +++ b/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-headphones.conf @@ -1,27 +1,14 @@ -[Element Int Spk] +[Element Internal Speakers] switch = off -[Element Speaker] -switch = off - -[Element Speaker] -volume = off - -[Element DMIC] +[Element Playback Mux] enumeration = select -[Option DMIC:DMIC1] -name = analog-input-internal-microphone - -[Element Playback Path] -enumeration = select - -[Option Playback Path:HP] +[Option Playback Mux:HP] name = output-headphones priority = 10 [Jack Headphone] -state.unplugged=no +state.unplugged=unknown state.plugged=yes - diff --git a/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-speaker.conf b/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-speaker.conf index f1aa32b951..1d77ff8d82 100644 --- a/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-speaker.conf +++ b/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/paths/rk817-speaker.conf @@ -1,28 +1,14 @@ -[Element Int Spk] -switch = mute +[Element Internal Speakers] +switch = on -[Element Speaker] -switch = mute - -[Element Speaker] -volume = merge -override-map.1 = all -override-map.2 = all-left,all-right - -[Element DMIC] -enumeration = select - -[Option DMIC:DMIC1] -name = analog-input-internal-microphone - -[Element Playback Path] +[Element Playback Mux] enumeration = select -[Option Playback Path:SPK] +# for an unknown reason, SPK disables all outputs (at least on rg353m) +[Option Playback Mux:HP] name = output-speaker priority = 10 [Jack Headphone] state.unplugged=unknown state.plugged=no - diff --git a/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/profile-sets/rk817.conf b/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/profile-sets/rk817.conf index d5a7e627a9..9c51a3a6c3 100644 --- a/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/profile-sets/rk817.conf +++ b/board/recalbox/fsoverlay/usr/share/pulseaudio/alsa-mixer/profile-sets/rk817.conf @@ -2,17 +2,17 @@ auto-profiles = yes [Mapping analog-stereo] +description = Analog Stereo device-strings = hw:%f channel-map = left,right paths-output = rk817-speaker rk817-headphones +priority = 9000 direction = output -priority = 60 [Mapping analog-mono] description = Analog Mono device-strings = hw:%f -direction = output channel-map = mono -paths-output = analog-output analog-output-mono -priority = 1 - +paths-input = microphone-input +priority = 9000 +direction = input -- GitLab