diff --git a/.github/actions/setup-python/action.yml b/.github/actions/setup-python/action.yml index 695311fd9a2..81e7a4ad985 100644 --- a/.github/actions/setup-python/action.yml +++ b/.github/actions/setup-python/action.yml @@ -15,4 +15,4 @@ runs: - name: Install dependencies shell: bash - run: uv sync --locked --all-extras --dev + run: uv sync --locked --all-extras --dev --no-install-package pygobject --no-install-package pycairo diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 6ef250808e1..55995b8f0e0 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -34,7 +34,8 @@ jobs: uses: './.github/actions/setup-python' - name: Run tests - # For example, using `pytest` + env: + UV_NO_SYNC: 1 run: uv run py.test python-src lint: @@ -46,4 +47,6 @@ jobs: uses: './.github/actions/setup-python' - name: Prek hooks + env: + UV_NO_SYNC: 1 run: uv run prek --show-diff-on-failure --color=always --all-files diff --git a/.gitignore b/.gitignore index 7ca6f46d017..52039134114 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /output +/output-* /dl /configs/batocera-*_defconfig /configs/batocera-board.local.common @@ -34,3 +35,4 @@ batocera-mok.key typescript .ruff_cache .coverage +*.mo diff --git a/.gitmodules b/.gitmodules index ea4c1d504ce..bdb839c0d7b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "buildroot"] path = buildroot - url = https://github.com/batocera-linux/buildroot.git + url = https://github.com/Pyohwan/buildroot.git diff --git a/Config.in b/Config.in index 32b2b30680c..3804e514f20 100644 --- a/Config.in +++ b/Config.in @@ -34,12 +34,8 @@ menu "System" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-ps5000/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-ps7000/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-powkiddy-a13/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-odroid-m1/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-rock-3a/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-rock-3c/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-firefly-station-m2/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-firefly-station-p2/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-anbernic-rgxx3/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-vim4/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-vim1s/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-800/Config.in" @@ -53,19 +49,22 @@ menu "System" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-bananapi-m7/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-5-pro/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-nanopi-m6/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-odroid-m1s/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-4a/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-3b/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-5-ultra/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-5-max/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-orangepi-5b/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-powkiddy-x55/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-rk3326/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/rocknix-abl/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-radxa-zero-3/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-odroid-m2/Config.in" + # Pre-dates upstream's "rework uboot for rk356x devices" (01273a1f5f), + # which deleted uboot-odroid-m1 in favor of the unified uboot-rk356x + # below. Our board still uses this standalone package (known-working, + # matches this board's actual VU8M/SPI boot flow) - migrating to + # uboot-rk356x is a separate, deliberate follow-up, not a merge fix. + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-odroid-m1/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-rk356x/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-rk3576/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/boot/uboot-gameforce-ace/Config.in" endmenu menu "Toolchain" @@ -99,6 +98,7 @@ menu "System" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mesa-panfork/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mali-G610/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mali-G52/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mali-g52-odroidm1/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mali-G31/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mali-g31-gbm/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/mali-mp400-wayland/Config.in" @@ -117,6 +117,7 @@ menu "System" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/vulkan/spirv-cross/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/vulkan/vulkan-utility-libraries/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/vulkan/vulkan-validationlayers/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/vulkan/vulkan-wsi-layer/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/gpu/gtk-layer-shell/Config.in" endmenu @@ -211,6 +212,8 @@ menu "Controllers" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/controllers/wheels/hid-t150/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/controllers/wheels/new-lg4ff/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/controllers/wheels/hid-tmff2/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/controllers/wheels/logitech-trueforce/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/controllers/wheels/logi-wheel/Config.in" endmenu endmenu @@ -258,6 +261,7 @@ menu "Emulators" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-gp32emu/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-fbalpha/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-fbneo/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-fbneo-korean/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-gw/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-prboom/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/retroarch/libretro/libretro-mrboom/Config.in" @@ -357,15 +361,11 @@ menu "Emulators" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/dosbox-staging/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/dosbox-x/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/fsuae/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/supermodel-common/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/supermodel/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/supermodel-legacy/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/supermodel-es/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/model2emu/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/mame/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/melonds/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/citron/Config.in" - source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/ryujinx/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/cemu-common/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/cemu/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/lightspark/Config.in" @@ -379,6 +379,7 @@ menu "Emulators" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/xenia-canary/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/xenia-edge/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/pcsx2/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/aethersx2/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/rpcs3/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/ppsspp/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/emulators/flycast/Config.in" @@ -503,6 +504,7 @@ menu "Emulators" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/dentonmod/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/desolated/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/eldoom/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/eoc/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/fitz/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/grimm/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/ports/dhewm3/hardcorps/Config.in" @@ -615,10 +617,12 @@ menu "Utils" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/utils/box64/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/utils/sdl2-touch-test/Config.in" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/utils/batocera-torrent/Config.in" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/utils/batocera-bezel-overlay/Config.in" endmenu menu "Utils Host" source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/utils-host/python-mkbootimg/Config.in.host" + source "$BR2_EXTERNAL_BATOCERA_PATH/package/batocera/utils/picom/Config.in" endmenu menu "Cases" diff --git a/Makefile b/Makefile index 7f6f373197c..cbb7f09d451 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ BATCH_MODE ?= PARALLEL_BUILD ?= DIRECT_BUILD ?= DAYS ?= 1 +SINCE ?= $(DAYS) days ago SYSTEMS_REPORT_EXCLUDE_TARGETS ?= bcm2835 jh7110 SYSTEMS_REPORT_PARALLEL ?= y @@ -150,7 +151,7 @@ help: @echo @echo 'Incremental rebuild:' @echo ' -refresh - surgically reset recently changed packages and rebuild' - @echo ' (requires PARALLEL_BUILD=y, uses DAYS= to control scope)' + @echo ' (requires PARALLEL_BUILD=y, uses SINCE= to control scope)' @echo ' -clean-for-refresh - reset recently changed packages without rebuilding' @echo @echo 'Deployment:' @@ -200,7 +201,7 @@ help: @echo ' EXTRA_OPTS="..." - extra defconfig options (deprecated, use add-defconfig)' @echo ' PKG= - package name for -pkg' @echo ' CMD= - command for -shell or -build' - @echo ' DAYS= - number of days to look back for -refresh (default: 1)' + @echo ' SINCE= - period of time to look back for -refresh (default: 1 days ago)' @echo ' DEV= - device path for -flash and -upgrade' @echo ' DOCKER= - Docker command to use (default: docker)' @echo ' DOCKER_OPTS="..." - additional Docker run options' @@ -324,11 +325,11 @@ endif ifndef PARALLEL_BUILD $(error PARALLEL_BUILD=y must be set for $*-refresh) endif - @$(call MESSAGE,Refresh & Targeted Rebuild Trigger (DAYS=$(DAYS))) + @$(call MESSAGE,Refresh & Targeted Rebuild Trigger (SINCE=$(SINCE))) @python3 $(PROJECT_DIR)/scripts/linux/refresh_resolver.py \ --project-dir $(PROJECT_DIR) \ --output-dir $(TARGET_OUTPUT_DIR) \ - --days $(DAYS) \ + --since='$(SINCE)' \ --mandatory "$(MANDATORY_REBUILD_PKGS)" @$(call MESSAGE,Removing Host and Target directories) diff --git a/README-odroidm1.en.md b/README-odroidm1.en.md new file mode 100644 index 00000000000..0548b3b64f8 --- /dev/null +++ b/README-odroidm1.en.md @@ -0,0 +1,97 @@ +# ODROID-M1 (bsp-odroidm1) + +*English | [한국어](README-odroidm1.ko.md)* + +## Features added on top of vanilla Batocera + +- Uses Hardkernel's own BSP kernel (**Linux 6.1.141**) instead of mainline + - Required for VU8M, mono audio, and USB3.0 support +- VU8M (Hardkernel's 8" DSI touchscreen) support +- Uses the vendor Mali G52 blob (g29p1 generation) - GLES + Vulkan +- Wayland (labwc) compositor support - enables standalone Qt-based emulators (PCSX2/Dolphin/AetherSX2, etc.) to actually run +- Fixed mono speaker volume/output routing (default volume was far too quiet) +- FBNeo Korean-patched core (`fbneo_korean`) set as default - includes DsNo's patch, which fixes a CRC32 mismatch that caused Korean-patched ROMs to be rejected +- AetherSX2 (PS2) set as default - an alternative core that avoids a Mali GPU fault that mainline PCSX2-family cores hit +- Vulkan rendering support for PS2/GameCube/Dreamcast/PSP and other major systems +- Re-tuned per-system "auto" core/API defaults to match actual measured best performance + +## Setup + +### Display (HDMI / VU8M) + +- **HDMI**: enabled by default, no configuration needed (tested up to 1080p). +- **VU8M**: disabled by default. Enable it in `config.ini` on the **BATOCERA** partition (the drive that shows up when you plug the SD card into a PC): + ``` + overlays="display_vu8m" + ``` + Set it back to `overlays=""` to disable. The DSI panel has no hotplug detection, so once the overlay is enabled it's always reported as "connected" whether the panel is physically attached or not - turn it off when not in use. + +### Backglass / screen rotation + +Everything below assumes VU8M is already enabled via `overlays="display_vu8m"` in `config.ini` above. + +**Note**: the settings below are stored in `system/batocera.conf`, which only exists after the board has **booted at least once** and initialized the SHARE partition - a freshly flashed SD card has neither this file nor the `system` folder at all (Batocera creates the whole default directory structure - `roms`/`bios`/`saves`/`system`, etc. - on first boot). Do this after the first boot. + +**Using it as a backglass**: to use VU8M as a secondary screen showing box art/game info while playing on the main screen (HDMI), go to **MAIN MENU → SYSTEM SETTINGS → HARDWARE → MULTISCREENS → BACKGLASS / INFORMATION SCREEN** and set VIDEO OUTPUT to VU8M (`DSI-1`). **This must be set** for ES to actually configure that output (resolution/rotation) - leaving it blank just gets you an unused extended screen tacked onto HDMI with nothing rendered on it. + +**Exception - NDS dual-screen**: NDS naturally has two screens (top/bottom). Enabling both HDMI and VU8M together with the `melonDS` core lets you output NDS's top and bottom screens to the two physical displays separately. However, melonDS performs poorly on this board (much slower than the default `drastic` core even with GPU acceleration on), making it **impractical for regular use** - stick with the default `drastic` (single screen) unless you specifically need the dual-screen setup. + +**Rotation**: best done from the ES menu - note that both options are labeled "SCREEN ROTATION", so you have to go by location: +- **MAIN MENU → SYSTEM SETTINGS → HARDWARE → SCREEN ROTATION**: rotates the main screen (HDMI). +- **MAIN MENU → SYSTEM SETTINGS → HARDWARE → MULTISCREENS → BACKGLASS / INFORMATION SCREEN → SCREEN ROTATION**: rotates VU8M (the backglass). (Saved together with the VIDEO OUTPUT setting above.) + +These values are stored in `system/batocera.conf` on the **SHARE partition** (the second drive that shows up when you plug the SD card into a PC). Mount that partition and edit the file directly, or over SSH: +``` +batocera-settings-set global.videooutput2 DSI-1 # assign VU8M as the 2nd screen (backglass) +batocera-settings-set display.rotate2.DSI-1 3 # rotation value for that screen +``` +A **reboot** is needed for this to take effect (EmulationStation only sets up outputs/rotation at startup): +``` +reboot +``` +Main-screen rotation uses `display.rotate.=` per connector (e.g. `display.rotate.HDMI-A-1`), falling back to the global `display.rotate=` if unset. `` is `0` (normal), `1` (90°), `2` (180°), `3` (270°) - main-screen rotation is also automatically picked up by the boot splash on the next reboot (vanilla mechanism, no extra setup needed). `display.rotate2` (backglass) doesn't apply here - the splash never draws anything to the 2nd screen. + +## Per-system performance results and recommended core/API + +Measured on **`batocera44-odroidm1-v1.0.0`** (this doc always tracks the latest version - re-verify if the relevant core/kernel/blob changes in a later release), Power Mode fixed to High Performance, Avg FPS / 1% low (frametime-based, an industry-standard metric). **The core/API actually selected by "auto" is bolded.** + +| System | Game | Core | API | Avg FPS | 1% Low | +| --- | --- | --- | --- | --- | --- | +| Genesis/Mega Drive | Altered Beast | **genesisplusgx** | — | **60.0** | 50.3 | +| | | genesisplusgx-expanded | — | 60.0 | 47.6 | +| | | picodrive | — | 60.0 | 48.5 | +| FBNeo | Ninja Baseball Bat Man | **fbneo_korean** | — | **60.0** | 41.0 | +| Saturn | Strikers 1945 | **yabasanshiro** | GLES | **59.3** | 24.3 | +| | | beetle-saturn | GLES | 22.5 | 16.8 | +| | | beetle-saturn | Vulkan | 22.8 | 16.4 | +| PSX | Soul Blade | **pcsx_rearmed** | GLES | **60.0** | 38.9 | +| | | pcsx_rearmed | Vulkan | 60.0 | 42.0 | +| | | swanstation | GLES | 58.5 | 32.1 | +| | | swanstation | Vulkan | 59.3 | 34.5 | +| | | mednafen_psx | GLES | 29.0 | 19.6 | +| | | mednafen_psx | Vulkan | 31.3 | 20.7 | +| N64 | Yoshi's Story | standalone mupen64plus(**rice**) | GLES | **59.6** | 30.3 | +| | | standalone mupen64plus(glide64mk2) | GLES | 54.9 | 13.0 | +| | | standalone mupen64plus(gliden64) | GLES | 10.3 | 3.6 | +| | | libretro mupen64plus-next | GLES | 59.5 | 24.5 | +| | | libretro parallel_n64 | GLES | 56.2 | 17.9 | +| Dreamcast | Soulcalibur | **standalone flycast** | **Vulkan** | **55.5** | 11.7 | +| | | standalone flycast | GLES | 56.4 | 13.0 | +| | | libretro flycast | GLES | 55.9 | 10.1 | +| | | libretro flycast | Vulkan | 56.0 | 13.1 | +| PS2 | 2002 FIFA World Cup (Korea) | **AetherSX2** | **Vulkan** | **23.8** | 4.2 | +| GameCube | Pikmin | **standalone Dolphin** | **Vulkan** | **29.7** | 8.4 | +| PSP | Tekken 6 | **standalone PPSSPP** | **Vulkan** | **58.9** | 27.0 | +| | | standalone PPSSPP | GLES | 54.0 | 17.7 | +| | | libretro ppsspp | GLES | 54.2 | 16.1 | +| | | libretro ppsspp | Vulkan | 54.1 | 27.0 | +| NDS | (excluded from the matrix - all 3 tracks cleared 60fps with 99%+ headroom, so a full sweep wasn't needed) | **drastic** | — | — | — | + +**Notes**: +- Genesis/FBNeo use software 2D rendering, so the GLES/Vulkan API distinction doesn't apply. +- The libretro Vulkan cores for N64/Dreamcast (mupen64plus-next, parallel_n64) have a known issue where audio plays but no video appears, so they're excluded above (GLES-only comparison). +- Wii isn't benchmarked separately but is expected to behave the same as GameCube (standalone Dolphin + Vulkan), so the same recommendation applies. + +## Known limitations + +- **PS2 `pcsx2` core** (mainline PCSX2 family): the newer GS command patterns these cores use trigger a genuine Mali G52 GPU hardware fault (`DATA_INVALID_FAULT`) - confirmed via dmesg logs and actual game hangs. AetherSX2 (a PCSX2-family fork using older GS command patterns) avoids this fault and is used as the default. `pcsx2` is left installed and selectable in EmulationStation for anyone who wants to experiment with it. diff --git a/README-odroidm1.ko.md b/README-odroidm1.ko.md new file mode 100644 index 00000000000..442edd8bb70 --- /dev/null +++ b/README-odroidm1.ko.md @@ -0,0 +1,97 @@ +# ODROID-M1 (bsp-odroidm1) + +*[English](README-odroidm1.en.md) | 한국어* + +## Vanilla Batocera 대비 추가된 기능 + +- 하드커널 자체 BSP 커널(**Linux 6.1.141**)을 씀 — 메인라인 대신 사용 + - VU8M, 모노 오디오, USB3.0 지원에 필요 +- VU8M(하드커널 8인치 DSI 터치스크린) 지원 +- 벤더 Mali G52 blob(g29p1 세대)을 씀 — GLES + Vulkan +- Wayland(labwc) 컴포지터 지원 — PCSX2/Dolphin/AetherSX2 등 standalone Qt 기반 에뮬레이터 실사용 가능 +- 모노 스피커 볼륨/출력 라우팅 수정(기본 볼륨이 너무 작던 문제 해결) +- FBNeo 한국어 패치 코어(`fbneo_korean`)를 기본값으로 씀 — 한국어 패치 롬의 CRC32 불일치 현상을 해결한 DsNo님의 패치를 넣은 것 +- AetherSX2(PS2)를 기본값으로 넣음 — mainline PCSX2 계열이 겪는 Mali GPU 폴트를 피하는 대안 코어 +- PS2/GameCube/Dreamcast/PSP 등 주요 시스템 Vulkan 렌더링 지원 +- 시스템별 자동(auto) 코어/API 선택을 실측 최고 성능 기준으로 다시 맞춤 + +## 설정 + +### 디스플레이 (HDMI / VU8M) + +- **HDMI**: 기본 활성화, 별도 설정 불필요(1080p까지 테스트 완료). +- **VU8M**: 기본 비활성화. **BATOCERA** 파티션(SD카드를 컴퓨터에 꽂으면 보이는 드라이브)의 `config.ini`에서 켤 것: + ``` + overlays="display_vu8m" + ``` + 끄려면 다시 `overlays=""`. DSI 패널은 핫플러그 감지가 안 되므로, 켜두면 실제로 패널이 꽂혀있지 않아도 항상 "연결됨"으로 잡힘 — 안 쓸 땐 꺼둘 것. + +### 백글래스 / 화면 회전 + +아래 내용은 모두 위 `config.ini`에서 `overlays="display_vu8m"`로 VU8M을 켠 상태를 전제로 함. + +**주의**: 아래 설정이 저장되는 `system/batocera.conf`는 기기가 **최초 1회 부팅**해서 SHARE 파티션을 초기화해야 생김 — 갓 구운 SD카드를 PC에 바로 꽂으면 이 파일도, `system` 폴더 자체도 없음(최초 부팅 시 Batocera가 SHARE 파티션에 `roms`/`bios`/`saves`/`system` 등 전체 기본 디렉토리 구조를 만듦). 기기를 한 번 부팅시킨 뒤에 설정할 것. + +**백글래스로 쓰기**: VU8M을 메인 화면(HDMI) 게임 중 박스아트/게임 정보를 보여주는 보조 화면으로 쓰려면, ES 메뉴 **MAIN MENU → SYSTEM SETTINGS → HARDWARE → MULTISCREENS → BACKGLASS / INFORMATION SCREEN**에서 VIDEO OUTPUT을 VU8M(`DSI-1`)으로 지정. **이 지정을 해야만** ES가 그 출력을 실제로 구성(해상도/회전 적용)함 — 비워두면 HDMI 옆에 이어붙는 미사용 확장 화면으로만 잡히고 아무것도 제대로 안 나옴. + +**예외 — NDS 듀얼스크린**: NDS는 원래 화면이 위/아래 두 개라, HDMI+VU8M을 동시에 켜고 `melonDS` 코어를 쓰면 실제 물리 화면 두 개에 NDS의 위/아래 화면을 각각 나눠 출력할 수 있음. 다만 melonDS는 이 보드에서 성능이 안 좋아서(GPU가속 켜도 기본 권장 코어 drastic 대비 훨씬 느림) **사실상 실사용은 힘듦** — 듀얼스크린이 정말 꼭 필요한 경우가 아니면 기본값인 drastic(단일 화면)을 쓸 것. + +**회전 설정**: ES 메뉴에서 하는 게 정석 — 단, 라벨이 둘 다 "SCREEN ROTATION"이라 위치로 구분해야 함: +- **MAIN MENU → SYSTEM SETTINGS → HARDWARE → SCREEN ROTATION**: 메인 화면(HDMI) 회전. +- **MAIN MENU → SYSTEM SETTINGS → HARDWARE → MULTISCREENS → BACKGLASS / INFORMATION SCREEN → SCREEN ROTATION**: VU8M(백글래스) 회전. (여기서 고른 값이 위 VIDEO OUTPUT과 함께 저장됨) + +이 값들은 **SHARE 파티션**(SD카드를 컴퓨터에 꽂으면 보이는 두 번째 드라이브)의 `system/batocera.conf`에 저장됨. 이 파티션을 마운트해서 직접 편집하거나, SSH로: +``` +batocera-settings-set global.videooutput2 DSI-1 # VU8M을 2번째 화면(백글래스)으로 지정 +batocera-settings-set display.rotate2.DSI-1 3 # 그 화면의 회전값 +``` +설정 후 **재부팅**해야 적용됨(EmulationStation이 시작 시점에만 출력/회전을 구성함): +``` +reboot +``` +메인 화면 회전은 커넥터별로 `display.rotate.<커넥터이름>=`(예: `display.rotate.HDMI-A-1`), 없으면 전역 `display.rotate=`. ``은 `0`(정상), `1`(90도), `2`(180도), `3`(270도) — 메인 화면 회전은 부팅 스플래시에도 재부팅 시점에 자동 반영됨(vanilla 메커니즘, 별도 설정 불필요). `display.rotate2`(백글래스)는 여기 해당 안 됨 — 스플래시는 2번째 화면엔 아무것도 안 그림. + +## 시스템별 성능 측정 결과 및 권장 코어/API + +측정 기준 버전: **`batocera44-odroidm1-v1.0.0`**(이 문서는 릴리스마다 최신 상태로 유지 — 이후 버전에서 관련 코어/커널/blob이 바뀌면 재검증 필요), Power Mode = High Performance 고정, Avg FPS/1% Low 기준(프레임타임 기반, 업계 표준 지표). **auto로 실제 적용되는 코어/API는 굵게 표시.** + +| 시스템 | 게임 | 코어 | API | Avg FPS | 1% Low | +| --- | --- | --- | --- | --- | --- | +| Genesis/Mega Drive | Altered Beast | **genesisplusgx** | — | **60.0** | 50.3 | +| | | genesisplusgx-expanded | — | 60.0 | 47.6 | +| | | picodrive | — | 60.0 | 48.5 | +| FBNeo | 야구격투 리그맨 | **fbneo_korean** | — | **60.0** | 41.0 | +| Saturn | Strikers 1945 | **yabasanshiro** | GLES | **59.3** | 24.3 | +| | | beetle-saturn | GLES | 22.5 | 16.8 | +| | | beetle-saturn | Vulkan | 22.8 | 16.4 | +| PSX | Soul Blade | **pcsx_rearmed** | GLES | **60.0** | 38.9 | +| | | pcsx_rearmed | Vulkan | 60.0 | 42.0 | +| | | swanstation | GLES | 58.5 | 32.1 | +| | | swanstation | Vulkan | 59.3 | 34.5 | +| | | mednafen_psx | GLES | 29.0 | 19.6 | +| | | mednafen_psx | Vulkan | 31.3 | 20.7 | +| N64 | 요시스토리 | standalone mupen64plus(**rice**) | GLES | **59.6** | 30.3 | +| | | standalone mupen64plus(glide64mk2) | GLES | 54.9 | 13.0 | +| | | standalone mupen64plus(gliden64) | GLES | 10.3 | 3.6 | +| | | libretro mupen64plus-next | GLES | 59.5 | 24.5 | +| | | libretro parallel_n64 | GLES | 56.2 | 17.9 | +| Dreamcast | Soulcalibur | **standalone flycast** | **Vulkan** | **55.5** | 11.7 | +| | | standalone flycast | GLES | 56.4 | 13.0 | +| | | libretro flycast | GLES | 55.9 | 10.1 | +| | | libretro flycast | Vulkan | 56.0 | 13.1 | +| PS2 | 2002 FIFA World Cup(Korea) | **AetherSX2** | **Vulkan** | **23.8** | 4.2 | +| GameCube | Pikmin | **standalone Dolphin** | **Vulkan** | **29.7** | 8.4 | +| PSP | Tekken 6 | **standalone PPSSPP** | **Vulkan** | **58.9** | 27.0 | +| | | standalone PPSSPP | GLES | 54.0 | 17.7 | +| | | libretro ppsspp | GLES | 54.2 | 16.1 | +| | | libretro ppsspp | Vulkan | 54.1 | 27.0 | +| NDS | (매트릭스 측정 제외 — 3트랙 모두 99%+ 여유로 일찌감치 결론남) | **drastic** | — | — | — | + +**참고**: +- Genesis/FBNeo는 소프트웨어 2D 렌더링이라 API(GLES/Vulkan) 구분 자체가 의미 없음. +- N64/Dreamcast의 libretro Vulkan 코어(mupen64plus-next, parallel_n64)는 소리만 나오고 화면이 안 뜨는 알려진 문제가 있어 위 표에서 제외함(GLES만 비교 가능). +- Wii는 GameCube와 같은 원리(standalone Dolphin + Vulkan)로 별도 성능 측정은 안 했지만 동일하게 권장. + +## 알려진 제약 + +- **PS2 `pcsx2` 코어**(mainline PCSX2 계열): 이 코어들이 쓰는 신형 GS 커맨드 패턴이 Mali G52 GPU의 진짜 하드웨어 폴트(`DATA_INVALID_FAULT`)를 유발함 — dmesg 로그와 실제 게임 멈춤으로 확인됨. AetherSX2(구형 GS 커맨드 패턴을 쓰는 PCSX2 계열 포크)는 이 폴트를 회피해서 기본값으로 씀. `pcsx2`도 EmulationStation에 설치+선택 가능한 상태로 남겨뒀음(실험해보고 싶은 사람용). diff --git a/batocera-Changelog.md b/batocera-Changelog.md index 1b96c9db1f5..5996a01b096 100644 --- a/batocera-Changelog.md +++ b/batocera-Changelog.md @@ -11,6 +11,8 @@ - AYN Odin 3 initial support - Mangmi Air X initial support - Odroid M2 initial support +- Radxa Rock-5T initial support +- Retroid Pocket Nova initial support ### Added - Anbernic H700 device hardware acceleration support - Anbernic RGCubeXX device LED controller support @@ -50,12 +52,13 @@ - Raspberry Pi4 now uses LabWC - Raspberry Pi4 now uses the latest Mesa3D drivers - Khadas VIM4 now uses LabWC +- MangoHud now scales the size based on the screen resolution - Migrated Khadas VIM4 GPU driver to Panfrost with the latest Mesa3D stack - PCSX2 variant for capable aarch64 devices - Removed Libretro-Puae2021 - Removed the buggy Libretro-A5200 core. We will use the compatible Libretro-Atari800 core instead - Rockchip RK3588 devices moved to the mainline linux kernel: - CoolPi 4B, FriendlyElec CM3588 NAS, GameForce ACE, IndieDroid Nova, Khadas Edge2, Orange Pi 5 + CoolPi 4B, FriendlyElec CM3588 NAS, IndieDroid Nova, Khadas Edge2, Orange Pi 5 Orange Pi 5 Plus, Orange Pi 5B, QuartzPro64, ROCK 5A, ROCK 5B, ROCK 5B Plus, ROCK 5C - Select Qualcomm handheld devices can now install batcoera on the internal drive alongside Android (batocera-install-internal) - The Force Engine to capable aarch64 devices @@ -67,7 +70,7 @@ - Azahar to 2125.1.2 - BigPEmu to 1.221 - Box64 0.4.2 -- Cemu to June 23rd, 2026 build +- Cemu to August 7th, 2026 build - CDogs to 2.4.0 - CLK to 2026-07-23 - CorsixTH to v0.69.2 @@ -110,12 +113,13 @@ - Play to 0.77 - PPSSPP to v1.20.4 - Python Pyxel to May 9th, 2026 build -- Redream to 1.5.0-1155-g0056e35 -- RPCS3 to v.0.0.41 -- ShadPS4 to v.0.16.0 +- Redream to 1.5.0-1235-g506c3f1 +- RPCS3 to v.0.0.42 +- ScummVM to v2026.3.0 +- ShadPS4 to v.0.17.0 - Solarus to 2.0.4 - Sonic3-Air to v26.03.28.0 -- Supermodel to v0.3a-20260528 +- Supermodel to v0.3a-20260726-git-b7d8acd - TheXTech to v1.3.7.3-1 - TRX to 1.9.2 - Tsugaru to v20251206 @@ -127,8 +131,8 @@ - Xemu to v0.8.136 - Ymir to v0.3.3 ### System -- Allwinner H616 device kernel updated to 7.1.4 -- Allwinner H700 device kernel updated to 7.0.11 +- Allwinner H616 device kernel updated to 7.1.5 +- Allwinner H700 device kernel updated to 7.0.14 - ALSA UCM configuration to v1.2.16.1 - Buildroot to 2026.05.x with supporting package & toolchain updates - DXVK to 3.0.2 @@ -139,17 +143,18 @@ - Khadas VIM4 kernel updated to vendor 5.15.y - LabWC to 0.20.1 - Linux Firmware to 20260622 -- Mesa3D to 26.1.5 -- Nvidia Open Production driver to 610.43.03 -- Nvidia 580 Legacy driver to 580.173.02 +- Mesa3D to 26.1.6 +- MangoHud to v0.8.4 +- Nvidia Open Production driver to 610.57.04 +- Nvidia 580 Legacy driver to 580.178.04 - QT to 6.11.1 -- Qualcomm SM6115 device kernel updated to 7.0.11 -- Qualcomm SM8550 device kernel updated to 7.0.11 -- Qualcomm SM8750 device kernel updated to 7.1.4 -- Raspberry Pi device kernel updated to 6.18.37 -- Rockchip RK3568 device kernel updated to 7.0.11 -- Rockchip RK3588 mainline device kernel updated to 7.1.4 -- Rocknix ABL to 1.1.4 (SM8x50 devices) +- Qualcomm SM6115 device kernel updated to 7.0.14 +- Qualcomm SM8550 device kernel updated to 7.0.14 +- Qualcomm SM8750 device kernel updated to 7.1.5 +- Raspberry Pi device kernel updated to 6.18.39 +- Rockchip RK3568 device kernel updated to 7.0.14 +- Rockchip RK3588 mainline device kernel updated to 7.1.5 +- Rocknix ABL to 1.1.6 (SM6115 & SM8x50 devices) - Sound Open Firmware to 2025.12.2 - SwitchRes to 2.2.2 - RTKit to v0.14 @@ -159,7 +164,7 @@ - WINE Proton to proton-11.0-1 - WINE TKG to 11.13 - Wlroots to 0.20.2 -- X86_64 / Zen3 kernel updated to 7.1.4 +- X86_64 / Zen3 kernel updated to 7.1.5 - Xone to v0.5.8 # 2026/05/30 - batocera.linux 43.1 diff --git a/board/batocera/allwinner/h616/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/allwinner/h616/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/allwinner/h616/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/allwinner/h616/linux_patches/series b/board/batocera/allwinner/h616/linux_patches/series index e791e8f2f95..dd035060ae6 100644 --- a/board/batocera/allwinner/h616/linux_patches/series +++ b/board/batocera/allwinner/h616/linux_patches/series @@ -517,3 +517,4 @@ patches.armbian/arm64-dts-sun50i-h616-bigtreetech-cb1-emac1-ac300.patch linux-usbhid-quircks.patch linux-wiimote-abs-not-hat.patch uvc-bandwidth_cap_param-for-sinden.patch +hid-nintendo-bt-rumble.patch diff --git a/board/batocera/allwinner/h700/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/allwinner/h700/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/allwinner/h700/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/allwinner/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/allwinner/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/allwinner/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/amlogic/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/amlogic/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/amlogic/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/amlogic/s812/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/amlogic/s812/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/amlogic/s812/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/amlogic/s922x/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/amlogic/s922x/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/amlogic/s922x/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/broadcom/bcm2711/patches/mesa3d/001-return-first-hardware-drm-device-as-fallback-in-_eglFindDevice.patch b/board/batocera/broadcom/bcm2711/patches/mesa3d/001-return-first-hardware-drm-device-as-fallback-in-_eglFindDevice.patch new file mode 100644 index 00000000000..c290a0740ed --- /dev/null +++ b/board/batocera/broadcom/bcm2711/patches/mesa3d/001-return-first-hardware-drm-device-as-fallback-in-_eglFindDevice.patch @@ -0,0 +1,41 @@ +diff --git a/src/egl/main/egldevice.c b/src/egl/main/egldevice.c +index ebebda4..128a22f 100644 +--- a/src/egl/main/egldevice.c ++++ b/src/egl/main/egldevice.c +@@ -200,6 +200,7 @@ _eglFindDevice(int fd, bool software) + + #ifdef HAVE_LIBDRM + drmDevicePtr device; ++ _EGLDevice *first_hw_dev = NULL; + + if (drmGetDevice2(fd, 0, &device) != 0) { + dev = NULL; +@@ -209,14 +210,23 @@ _eglFindDevice(int fd, bool software) + while (dev->Next) { + dev = dev->Next; + +- if (_eglDeviceSupports(dev, _EGL_DEVICE_DRM) && +- drmDevicesEqual(device, dev->device) != 0) { +- goto cleanup_drm; ++ if (_eglDeviceSupports(dev, _EGL_DEVICE_DRM)) { ++ if (!first_hw_dev) ++ first_hw_dev = dev; ++ ++ if (drmDevicesEqual(device, dev->device) != 0) { ++ goto cleanup_drm; ++ } + } + } + +- /* Couldn't find an EGLDevice for the device. */ +- dev = NULL; ++ /* Fallback for split-GPU (KMSRO) systems like the RPi4. If the display ++ * device (vc4) doesn't match the render device (v3d) in the list, ++ * return the first hardware render device instead of falling back to software. */ ++ if (first_hw_dev) ++ dev = first_hw_dev; ++ else ++ dev = NULL; + + cleanup_drm: + drmFreeDevice(&device); diff --git a/board/batocera/broadcom/bcm2712/linux-defconfig.config b/board/batocera/broadcom/bcm2712/linux-defconfig.config index fb2096eed7c..dde5247e0a9 100644 --- a/board/batocera/broadcom/bcm2712/linux-defconfig.config +++ b/board/batocera/broadcom/bcm2712/linux-defconfig.config @@ -1,8 +1,8 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm64 6.18.37 Kernel Configuration +# Linux/arm64 6.18.39 Kernel Configuration # -CONFIG_CC_VERSION_TEXT="aarch64-buildroot-linux-gnu-gcc.br_real (Buildroot 2019.11-27266-g8a24dafdcc) 14.3.0" +CONFIG_CC_VERSION_TEXT="aarch64-buildroot-linux-gnu-gcc.br_real (Buildroot 2019.11-27298-g836eafc8dc) 14.3.0" CONFIG_CC_IS_GCC=y CONFIG_GCC_VERSION=140300 CONFIG_CLANG_VERSION=0 @@ -2012,6 +2012,7 @@ CONFIG_CONNECTOR=m CONFIG_DMIID=y # CONFIG_DMI_SYSFS is not set CONFIG_RASPBERRYPI_FIRMWARE=y +CONFIG_FIRMWARE_RP1=m # CONFIG_FW_CFG_SYSFS is not set # CONFIG_SYSFB_SIMPLEFB is not set # CONFIG_ARM_FFA_TRANSPORT is not set @@ -2231,6 +2232,8 @@ CONFIG_NVME_HWMON=y # Misc devices # CONFIG_BCM2835_SMI=m +CONFIG_RP1_PIO=m +CONFIG_WS2812_PIO_RP1=m # CONFIG_AD525X_DPOT is not set # CONFIG_DUMMY_IRQ is not set # CONFIG_PHANTOM is not set @@ -2249,7 +2252,7 @@ CONFIG_BCM2835_SMI=m # CONFIG_HMC6352 is not set # CONFIG_DS1682 is not set # CONFIG_LATTICE_ECP3_CONFIG is not set -# CONFIG_SRAM is not set +CONFIG_SRAM=y # CONFIG_DW_XDATA_PCIE is not set # CONFIG_PCI_ENDPOINT_TEST is not set # CONFIG_XILINX_SDFEC is not set @@ -2390,7 +2393,7 @@ CONFIG_SATA_PMP=y CONFIG_SATA_AHCI=m CONFIG_SATA_MOBILE_LPM_POLICY=0 # CONFIG_SATA_AHCI_PLATFORM is not set -# CONFIG_AHCI_BRCM is not set +CONFIG_AHCI_BRCM=m # CONFIG_AHCI_DWC is not set # CONFIG_AHCI_CEVA is not set # CONFIG_SATA_INIC162X is not set @@ -2995,7 +2998,7 @@ CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m -CONFIG_USB_RTL8152=y +CONFIG_USB_RTL8152=m CONFIG_USB_LAN78XX=y CONFIG_USB_USBNET=y CONFIG_USB_NET_AX8817X=m @@ -3120,7 +3123,20 @@ CONFIG_WLAN_VENDOR_INTEL=y # CONFIG_IPW2200 is not set # CONFIG_IWL4965 is not set # CONFIG_IWL3945 is not set -# CONFIG_IWLWIFI is not set +CONFIG_IWLWIFI=m +CONFIG_IWLWIFI_LEDS=y +CONFIG_IWLDVM=m +CONFIG_IWLMVM=m +CONFIG_IWLMLD=m +CONFIG_IWLWIFI_OPMODE_MODULAR=y + +# +# Debugging Options +# +# CONFIG_IWLWIFI_DEBUG is not set +CONFIG_IWLWIFI_DEVICE_TRACING=y +# end of Debugging Options + CONFIG_WLAN_VENDOR_INTERSIL=y CONFIG_P54_COMMON=m CONFIG_P54_USB=m @@ -3164,12 +3180,13 @@ CONFIG_MT76x2U=m # CONFIG_MT7663S is not set # CONFIG_MT7915E is not set CONFIG_MT7921_COMMON=m -# CONFIG_MT7921E is not set +CONFIG_MT7921E=m # CONFIG_MT7921S is not set CONFIG_MT7921U=m # CONFIG_MT7996E is not set -# CONFIG_MT7925E is not set -# CONFIG_MT7925U is not set +CONFIG_MT7925_COMMON=m +CONFIG_MT7925E=m +CONFIG_MT7925U=m CONFIG_WLAN_VENDOR_MICROCHIP=y # CONFIG_WILC1000_SDIO is not set # CONFIG_WILC1000_SPI is not set @@ -3228,6 +3245,10 @@ CONFIG_RTW88_8822C=m CONFIG_RTW88_8723X=m CONFIG_RTW88_8723D=m CONFIG_RTW88_8821C=m +CONFIG_RTW88_88XXA=m +CONFIG_RTW88_8821A=m +CONFIG_RTW88_8812A=m +CONFIG_RTW88_8814A=m CONFIG_RTW88_8822BE=m CONFIG_RTW88_8822BS=m CONFIG_RTW88_8822BU=m @@ -3251,19 +3272,22 @@ CONFIG_RTW88_LEDS=y CONFIG_RTW89=m CONFIG_RTW89_CORE=m CONFIG_RTW89_PCI=m +CONFIG_RTW89_USB=m CONFIG_RTW89_8851B=m CONFIG_RTW89_8852A=m CONFIG_RTW89_8852B_COMMON=m CONFIG_RTW89_8852B=m +CONFIG_RTW89_8852BT=m CONFIG_RTW89_8852C=m +CONFIG_RTW89_8922A=m CONFIG_RTW89_8851BE=m CONFIG_RTW89_8851BU=m CONFIG_RTW89_8852AE=m CONFIG_RTW89_8852BE=m CONFIG_RTW89_8852BU=m -# CONFIG_RTW89_8852BTE is not set +CONFIG_RTW89_8852BTE=m CONFIG_RTW89_8852CE=m -# CONFIG_RTW89_8922AE is not set +CONFIG_RTW89_8922AE=m # CONFIG_RTW89_DEBUGMSG is not set CONFIG_WLAN_VENDOR_RSI=y # CONFIG_RSI_91X is not set @@ -3273,9 +3297,11 @@ CONFIG_WLAN_VENDOR_ST=y # CONFIG_CW1200 is not set CONFIG_WLAN_VENDOR_TI=y # CONFIG_WL1251 is not set -# CONFIG_WL12XX is not set +CONFIG_WL12XX=m # CONFIG_WL18XX is not set -# CONFIG_WLCORE is not set +CONFIG_WLCORE=m +# CONFIG_WLCORE_SPI is not set +# CONFIG_WLCORE_SDIO is not set CONFIG_WLAN_VENDOR_ZYDAS=y CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set @@ -3393,7 +3419,7 @@ CONFIG_JOYSTICK_PSXPAD_SPI_FF=y # CONFIG_JOYSTICK_PXRC is not set # CONFIG_JOYSTICK_QWIIC is not set CONFIG_JOYSTICK_FSIA6B=m -# CONFIG_JOYSTICK_SENSEHAT is not set +CONFIG_JOYSTICK_SENSEHAT=m # CONFIG_JOYSTICK_SEESAW is not set # CONFIG_INPUT_TABLET is not set CONFIG_INPUT_TOUCHSCREEN=y @@ -3402,7 +3428,8 @@ CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_AD7879 is not set # CONFIG_TOUCHSCREEN_ADC is not set # CONFIG_TOUCHSCREEN_AR1021_I2C is not set -# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set +CONFIG_TOUCHSCREEN_ATMEL_MXT=m +# CONFIG_TOUCHSCREEN_ATMEL_MXT_T37 is not set # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set # CONFIG_TOUCHSCREEN_BU21013 is not set # CONFIG_TOUCHSCREEN_BU21029 is not set @@ -3428,8 +3455,8 @@ CONFIG_TOUCHSCREEN_GOODIX_BERLIN_SPI=m # CONFIG_TOUCHSCREEN_HYNITRON_CSTXXX is not set # CONFIG_TOUCHSCREEN_HYNITRON_CST816X is not set CONFIG_TOUCHSCREEN_ILI210X=m -# CONFIG_TOUCHSCREEN_ILITEK is not set -# CONFIG_TOUCHSCREEN_ILITEK_V3 is not set +CONFIG_TOUCHSCREEN_ILITEK=m +CONFIG_TOUCHSCREEN_ILITEK_V3=m # CONFIG_TOUCHSCREEN_S6SY761 is not set # CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_EKTF2127 is not set @@ -3518,7 +3545,7 @@ CONFIG_INPUT_CM109=m # CONFIG_INPUT_REGULATOR_HAPTIC is not set CONFIG_INPUT_UINPUT=y # CONFIG_INPUT_PCF8574 is not set -# CONFIG_INPUT_PWM_BEEPER is not set +CONFIG_INPUT_PWM_BEEPER=m # CONFIG_INPUT_PWM_VIBRA is not set CONFIG_INPUT_GPIO_ROTARY_ENCODER=m # CONFIG_INPUT_DA7280_HAPTICS is not set @@ -3903,7 +3930,8 @@ CONFIG_PINCTRL_MCP23S08=m # CONFIG_PINCTRL_SX150X is not set CONFIG_PINCTRL_RP1=y CONFIG_PINCTRL_BCM2835=y -# CONFIG_PINCTRL_BRCMSTB is not set +CONFIG_PINCTRL_BRCMSTB=y +CONFIG_PINCTRL_BCM2712=y # # Renesas pinctrl drivers @@ -3956,7 +3984,7 @@ CONFIG_GPIO_BRCMSTB=y # I2C GPIO expanders # # CONFIG_GPIO_ADNP is not set -# CONFIG_GPIO_FXL6408 is not set +CONFIG_GPIO_FXL6408=m # CONFIG_GPIO_DS4520 is not set # CONFIG_GPIO_GW_PLD is not set CONFIG_GPIO_MAX7300=m @@ -4045,7 +4073,7 @@ CONFIG_W1_SLAVE_DS2413=m CONFIG_W1_SLAVE_DS2406=m CONFIG_W1_SLAVE_DS2423=m # CONFIG_W1_SLAVE_DS2805 is not set -# CONFIG_W1_SLAVE_DS2430 is not set +CONFIG_W1_SLAVE_DS2430=m CONFIG_W1_SLAVE_DS2431=m CONFIG_W1_SLAVE_DS2433=m # CONFIG_W1_SLAVE_DS2433_CRC is not set @@ -4152,7 +4180,7 @@ CONFIG_SENSORS_AHT10=m # CONFIG_SENSORS_ASUS_ROG_RYUJIN is not set # CONFIG_SENSORS_AXI_FAN_CONTROL is not set # CONFIG_SENSORS_ATXP1 is not set -# CONFIG_SENSORS_CHIPCAP2 is not set +CONFIG_SENSORS_CHIPCAP2=m # CONFIG_SENSORS_CORSAIR_CPRO is not set # CONFIG_SENSORS_CORSAIR_PSU is not set CONFIG_SENSORS_DRIVETEMP=m @@ -4176,7 +4204,7 @@ CONFIG_SENSORS_IIO_HWMON=m # CONFIG_SENSORS_ISL28022 is not set # CONFIG_SENSORS_IT87 is not set CONFIG_SENSORS_JC42=m -# CONFIG_SENSORS_POWERZ is not set +CONFIG_SENSORS_POWERZ=m # CONFIG_SENSORS_POWR1220 is not set # CONFIG_SENSORS_LINEAGE is not set # CONFIG_SENSORS_LTC2945 is not set @@ -4268,12 +4296,12 @@ CONFIG_SENSORS_EMC2305=m # CONFIG_SENSORS_SCH5636 is not set # CONFIG_SENSORS_STTS751 is not set # CONFIG_SENSORS_ADC128D818 is not set -# CONFIG_SENSORS_ADS7828 is not set +CONFIG_SENSORS_ADS7828=m # CONFIG_SENSORS_ADS7871 is not set # CONFIG_SENSORS_AMC6821 is not set # CONFIG_SENSORS_INA209 is not set CONFIG_SENSORS_INA2XX=m -# CONFIG_SENSORS_INA238 is not set +CONFIG_SENSORS_INA238=m # CONFIG_SENSORS_INA3221 is not set # CONFIG_SENSORS_SPD5118 is not set # CONFIG_SENSORS_TC74 is not set @@ -4632,7 +4660,7 @@ CONFIG_REGULATOR_WAVESHARE_TOUCHSCREEN=m # CONFIG_REGULATOR_TPS65132 is not set # CONFIG_REGULATOR_TPS6524X is not set # CONFIG_REGULATOR_VCTRL is not set -# CONFIG_REGULATOR_EDATEC_PANEL is not set +CONFIG_REGULATOR_EDATEC_PANEL=m CONFIG_RC_CORE=y CONFIG_BPF_LIRC_MODE2=y CONFIG_LIRC=y @@ -5001,7 +5029,7 @@ CONFIG_VIDEO_BCM2835_UNICAM=m CONFIG_VIDEO_RPI_HEVC_DEC=m CONFIG_VIDEO_RASPBERRYPI_PISP_BE=m CONFIG_VIDEO_RP1_CFE=m -# CONFIG_VIDEO_RP1_CFE_DOWNSTREAM is not set +CONFIG_VIDEO_RP1_CFE_DOWNSTREAM=m # # Renesas media platform drivers @@ -5099,20 +5127,20 @@ CONFIG_VIDEO_ARDUCAM_PIVARIETY=m CONFIG_VIDEO_IMX219=m CONFIG_VIDEO_IMX258=m # CONFIG_VIDEO_IMX274 is not set -# CONFIG_VIDEO_IMX283 is not set +CONFIG_VIDEO_IMX283=m CONFIG_VIDEO_IMX290=m CONFIG_VIDEO_IMX296=m # CONFIG_VIDEO_IMX319 is not set # CONFIG_VIDEO_IMX334 is not set -# CONFIG_VIDEO_IMX335 is not set -# CONFIG_VIDEO_IMX355 is not set +CONFIG_VIDEO_IMX335=m +CONFIG_VIDEO_IMX355=m # CONFIG_VIDEO_IMX412 is not set -# CONFIG_VIDEO_IMX415 is not set +CONFIG_VIDEO_IMX415=m CONFIG_VIDEO_IMX477=m CONFIG_VIDEO_IMX500=m CONFIG_VIDEO_IMX519=m CONFIG_VIDEO_IMX708=m -# CONFIG_VIDEO_MIRA220 is not set +CONFIG_VIDEO_MIRA220=m # CONFIG_VIDEO_MT9M001 is not set # CONFIG_VIDEO_MT9M111 is not set # CONFIG_VIDEO_MT9M114 is not set @@ -5165,8 +5193,8 @@ CONFIG_VIDEO_OV9282=m # CONFIG_VIDEO_S5C73M3 is not set # CONFIG_VIDEO_S5K5BAF is not set # CONFIG_VIDEO_S5K6A3 is not set -# CONFIG_VIDEO_VD55G1 is not set -# CONFIG_VIDEO_VD56G3 is not set +CONFIG_VIDEO_VD55G1=m +CONFIG_VIDEO_VD56G3=m # CONFIG_VIDEO_VGXY61 is not set # CONFIG_VIDEO_CCS is not set # CONFIG_VIDEO_ET8EK8 is not set @@ -5588,6 +5616,7 @@ CONFIG_DRM_DISPLAY_HELPER=m # CONFIG_DRM_DISPLAY_DP_AUX_CEC is not set # CONFIG_DRM_DISPLAY_DP_AUX_CHARDEV is not set CONFIG_DRM_DISPLAY_HDMI_AUDIO_HELPER=y +CONFIG_DRM_DISPLAY_HDMI_CEC_HELPER=y CONFIG_DRM_DISPLAY_HDMI_HELPER=y CONFIG_DRM_DISPLAY_HDMI_STATE_HELPER=y CONFIG_DRM_EXEC=m @@ -5642,19 +5671,19 @@ CONFIG_DRM_PANEL=y # CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set # CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set # CONFIG_DRM_PANEL_DSI_CM is not set -# CONFIG_DRM_PANEL_LVDS is not set +CONFIG_DRM_PANEL_LVDS=m # CONFIG_DRM_PANEL_HIMAX_HX8279 is not set # CONFIG_DRM_PANEL_HIMAX_HX83102 is not set # CONFIG_DRM_PANEL_HIMAX_HX83112A is not set # CONFIG_DRM_PANEL_HIMAX_HX83112B is not set # CONFIG_DRM_PANEL_HIMAX_HX8394 is not set # CONFIG_DRM_PANEL_HYDIS_HV101HD1 is not set -# CONFIG_DRM_PANEL_ILITEK_IL79600A is not set +CONFIG_DRM_PANEL_ILITEK_IL79600A=m # CONFIG_DRM_PANEL_ILITEK_IL9322 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set # CONFIG_DRM_PANEL_ILITEK_ILI9805 is not set CONFIG_DRM_PANEL_ILITEK_ILI9806E=m -# CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI is not set +CONFIG_DRM_PANEL_ILITEK_ILI9806E_SPI=m CONFIG_DRM_PANEL_ILITEK_ILI9881C=m # CONFIG_DRM_PANEL_ILITEK_ILI9882T is not set # CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set @@ -5734,7 +5763,7 @@ CONFIG_DRM_PANEL_SIMPLE=m # CONFIG_DRM_PANEL_SYNAPTICS_R63353 is not set # CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set CONFIG_DRM_PANEL_TPO_Y17P=m -# CONFIG_DRM_PANEL_TDO_DSI_V1 is not set +CONFIG_DRM_PANEL_TDO_DSI_V1=m # CONFIG_DRM_PANEL_TPO_TD028TTEC1 is not set # CONFIG_DRM_PANEL_TPO_TD043MTEA1 is not set # CONFIG_DRM_PANEL_TPO_TPG110 is not set @@ -5788,7 +5817,7 @@ CONFIG_DRM_TOSHIBA_TC358762=m # CONFIG_DRM_TI_DLPC3433 is not set # CONFIG_DRM_TI_TDP158 is not set # CONFIG_DRM_TI_TFP410 is not set -# CONFIG_DRM_TI_SN65DSI83 is not set +CONFIG_DRM_TI_SN65DSI83=m # CONFIG_DRM_TI_SN65DSI86 is not set # CONFIG_DRM_TI_TPD12S015 is not set # CONFIG_DRM_WAVESHARE_BRIDGE is not set @@ -5800,8 +5829,8 @@ CONFIG_DRM_TOSHIBA_TC358762=m # CONFIG_DRM_CDNS_MHDP8546 is not set # end of Display Interface Bridges -CONFIG_DRM_V3D=y -CONFIG_DRM_VC4=y +CONFIG_DRM_V3D=m +CONFIG_DRM_VC4=m CONFIG_DRM_VC4_HDMI_CEC=y CONFIG_DRM_RP1_DSI=m CONFIG_DRM_RP1_DPI=m @@ -5833,7 +5862,9 @@ CONFIG_DRM_GUD=m # CONFIG_DRM_ST7571_I2C is not set # CONFIG_DRM_ST7586 is not set # CONFIG_DRM_ST7735R is not set -# CONFIG_DRM_SSD130X is not set +CONFIG_DRM_SSD130X=m +CONFIG_DRM_SSD130X_I2C=m +CONFIG_DRM_SSD130X_SPI=m # CONFIG_DRM_POWERVR is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=m @@ -5964,6 +5995,8 @@ CONFIG_SND_DMAENGINE_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_SEQ_DEVICE=m CONFIG_SND_RAWMIDI=m +CONFIG_SND_UMP=m +CONFIG_SND_UMP_LEGACY_RAWMIDI=y CONFIG_SND_COMPRESS_OFFLOAD=m CONFIG_SND_JACK=y CONFIG_SND_JACK_INPUT_DEV=y @@ -6001,8 +6034,8 @@ CONFIG_SND_MTPAV=m CONFIG_SND_SERIAL_U16550=m # CONFIG_SND_SERIAL_GENERIC is not set CONFIG_SND_MPU401=m -# CONFIG_SND_PIMIDI is not set -# CONFIG_SND_PISOUND_MICRO is not set +CONFIG_SND_PIMIDI=m +CONFIG_SND_PISOUND_MICRO=m CONFIG_SND_PCI=y # CONFIG_SND_AD1889 is not set # CONFIG_SND_ALS300 is not set @@ -6077,7 +6110,7 @@ CONFIG_SND_PCI=y CONFIG_SND_SPI=y CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=m -# CONFIG_SND_USB_AUDIO_MIDI_V2 is not set +CONFIG_SND_USB_AUDIO_MIDI_V2=y CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER=y CONFIG_SND_USB_UA101=m CONFIG_SND_USB_CAIAQ=m @@ -6140,7 +6173,7 @@ CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSHD=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADC=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSADCPRO=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DACPLUSDSP=m -CONFIG_SND_BCM2708_SOC_HIFIBERRY_STUDIO_DAC8X=m +CONFIG_SND_BCM2708_SOC_HIFIBERRY_STUDIO=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_DIGI=m CONFIG_SND_BCM2708_SOC_HIFIBERRY_AMP=m CONFIG_SND_BCM2708_SOC_PIFI_40=m @@ -6248,7 +6281,7 @@ CONFIG_SND_DESIGNWARE_PCM=y # # end of PXA -# CONFIG_SND_RP1_AUDIO_OUT is not set +CONFIG_SND_RP1_AUDIO_OUT=m # # SoundWire (SDCA) @@ -6411,7 +6444,8 @@ CONFIG_SND_SOC_PCM186X_I2C=m # CONFIG_SND_SOC_PCM186X_SPI is not set # CONFIG_SND_SOC_PCM3060_I2C is not set # CONFIG_SND_SOC_PCM3060_SPI is not set -# CONFIG_SND_SOC_PCM3168A_I2C is not set +CONFIG_SND_SOC_PCM3168A=m +CONFIG_SND_SOC_PCM3168A_I2C=m # CONFIG_SND_SOC_PCM3168A_SPI is not set CONFIG_SND_SOC_PCM5102A=m CONFIG_SND_SOC_PCM512x=m @@ -6500,7 +6534,7 @@ CONFIG_SND_SOC_WM8804=m CONFIG_SND_SOC_WM8804_I2C=m # CONFIG_SND_SOC_WM8804_SPI is not set # CONFIG_SND_SOC_WM8903 is not set -# CONFIG_SND_SOC_WM8904 is not set +CONFIG_SND_SOC_WM8904=m # CONFIG_SND_SOC_WM8940 is not set CONFIG_SND_SOC_WM8960=m # CONFIG_SND_SOC_WM8961 is not set @@ -6740,10 +6774,10 @@ CONFIG_USB_MON=m CONFIG_USB_XHCI_HCD=y # CONFIG_USB_XHCI_DBGCAP is not set CONFIG_USB_XHCI_PCI=y -# CONFIG_USB_XHCI_PCI_RENESAS is not set +CONFIG_USB_XHCI_PCI_RENESAS=m CONFIG_USB_XHCI_PLATFORM=y # CONFIG_USB_XHCI_SIDEBAND is not set -# CONFIG_USB_BRCMSTB is not set +CONFIG_USB_BRCMSTB=y # CONFIG_USB_EHCI_HCD is not set # CONFIG_USB_OXU210HP_HCD is not set # CONFIG_USB_ISP116X_HCD is not set @@ -6834,7 +6868,7 @@ CONFIG_USB_DWC2_HOST=y # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y -# CONFIG_USB_SERIAL_SIMPLE is not set +CONFIG_USB_SERIAL_SIMPLE=m CONFIG_USB_SERIAL_AIRCABLE=m CONFIG_USB_SERIAL_ARK3116=m CONFIG_USB_SERIAL_BELKIN=m @@ -6851,7 +6885,7 @@ CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_F81232=m -# CONFIG_USB_SERIAL_F8153X is not set +CONFIG_USB_SERIAL_F8153X=m CONFIG_USB_SERIAL_GARMIN=m CONFIG_USB_SERIAL_IPW=m CONFIG_USB_SERIAL_IUU=m @@ -6863,7 +6897,7 @@ CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_METRO=m CONFIG_USB_SERIAL_MOS7720=m CONFIG_USB_SERIAL_MOS7840=m -# CONFIG_USB_SERIAL_MXUPORT is not set +CONFIG_USB_SERIAL_MXUPORT=m CONFIG_USB_SERIAL_NAVMAN=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_OTI6858=m @@ -6884,8 +6918,8 @@ CONFIG_USB_SERIAL_XSENS_MT=m CONFIG_USB_SERIAL_WISHBONE=m CONFIG_USB_SERIAL_SSU100=m CONFIG_USB_SERIAL_QT2=m -# CONFIG_USB_SERIAL_UPD78F0730 is not set -# CONFIG_USB_SERIAL_XR is not set +CONFIG_USB_SERIAL_UPD78F0730=m +CONFIG_USB_SERIAL_XR=m CONFIG_USB_SERIAL_DEBUG=m # @@ -6978,6 +7012,7 @@ CONFIG_USB_F_UAC1=m CONFIG_USB_F_UAC2=m CONFIG_USB_F_UVC=m CONFIG_USB_F_MIDI=m +CONFIG_USB_F_MIDI2=m CONFIG_USB_F_HID=m CONFIG_USB_F_PRINTER=m CONFIG_USB_CONFIGFS=m @@ -6996,7 +7031,7 @@ CONFIG_USB_CONFIGFS_F_UAC1=y # CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set CONFIG_USB_CONFIGFS_F_UAC2=y CONFIG_USB_CONFIGFS_F_MIDI=y -# CONFIG_USB_CONFIGFS_F_MIDI2 is not set +CONFIG_USB_CONFIGFS_F_MIDI2=y CONFIG_USB_CONFIGFS_F_HID=y CONFIG_USB_CONFIGFS_F_UVC=y CONFIG_USB_CONFIGFS_F_PRINTER=y @@ -7069,7 +7104,7 @@ CONFIG_MMC_SPI=m CONFIG_MMC_CQHCI=y CONFIG_MMC_HSQ=y # CONFIG_MMC_TOSHIBA_PCI is not set -# CONFIG_MMC_BCM2835 is not set +CONFIG_MMC_BCM2835=y # CONFIG_MMC_MTK is not set CONFIG_MMC_SDHCI_BRCMSTB=y # CONFIG_MMC_SDHCI_XENON is not set @@ -7373,7 +7408,7 @@ CONFIG_DMA_BCM2708=y # CONFIG_SYNC_FILE=y # CONFIG_SW_SYNC is not set -# CONFIG_UDMABUF is not set +CONFIG_UDMABUF=y # CONFIG_DMABUF_MOVE_NOTIFY is not set # CONFIG_DMABUF_DEBUG is not set # CONFIG_DMABUF_SELFTESTS is not set @@ -7536,7 +7571,7 @@ CONFIG_COMMON_CLK_RP1_SDIO=y CONFIG_COMMON_CLK_HIFIBERRY_DACPLUSHD=m CONFIG_COMMON_CLK_HIFIBERRY_DACPRO=m # CONFIG_COMMON_CLK_SI5341 is not set -# CONFIG_COMMON_CLK_SI5351 is not set +CONFIG_COMMON_CLK_SI5351=m # CONFIG_COMMON_CLK_SI514 is not set # CONFIG_COMMON_CLK_SI544 is not set # CONFIG_COMMON_CLK_SI570 is not set @@ -7584,7 +7619,7 @@ CONFIG_MAILBOX=y CONFIG_BCM2835_MBOX=y # CONFIG_MAILBOX_TEST is not set CONFIG_BCM74110_MAILBOX=y -# CONFIG_MBOX_RP1 is not set +CONFIG_MBOX_RP1=m CONFIG_IOMMU_IOVA=y CONFIG_IOMMU_API=y CONFIG_IOMMU_SUPPORT=y @@ -7728,6 +7763,7 @@ CONFIG_IIO_BUFFER_CB=m CONFIG_IIO_KFIFO_BUF=m CONFIG_IIO_TRIGGERED_BUFFER=m CONFIG_IIO_CONFIGFS=m +CONFIG_IIO_GTS_HELPER=m CONFIG_IIO_TRIGGER=y CONFIG_IIO_CONSUMERS_PER_TRIGGER=2 # CONFIG_IIO_SW_DEVICE is not set @@ -7741,7 +7777,8 @@ CONFIG_IIO_SW_TRIGGER=m # CONFIG_ADIS16209 is not set # CONFIG_ADXL313_I2C is not set # CONFIG_ADXL313_SPI is not set -# CONFIG_ADXL355_I2C is not set +CONFIG_ADXL355=m +CONFIG_ADXL355_I2C=m # CONFIG_ADXL355_SPI is not set # CONFIG_ADXL367_SPI is not set # CONFIG_ADXL367_I2C is not set @@ -7819,7 +7856,7 @@ CONFIG_IIO_SW_TRIGGER=m # CONFIG_AD7923 is not set # CONFIG_AD7944 is not set # CONFIG_AD7949 is not set -# CONFIG_AD799X is not set +CONFIG_AD799X=m # CONFIG_AD9467 is not set # CONFIG_ADE9000 is not set # CONFIG_CC10001_ADC is not set @@ -7923,7 +7960,7 @@ CONFIG_CCS811=m # CONFIG_MHZ19B is not set # CONFIG_PMS7003 is not set # CONFIG_SCD30_CORE is not set -# CONFIG_SCD4X is not set +CONFIG_SCD4X=m # CONFIG_SEN0322 is not set CONFIG_SENSIRION_SGP30=m # CONFIG_SENSIRION_SGP40 is not set @@ -8080,9 +8117,11 @@ CONFIG_DHT11=m # CONFIG_ENS210 is not set CONFIG_HDC100X=m # CONFIG_HDC2010 is not set -# CONFIG_HDC3020 is not set +CONFIG_HDC3020=m # CONFIG_HID_SENSOR_HUMIDITY is not set -# CONFIG_HTS221 is not set +CONFIG_HTS221=m +CONFIG_HTS221_I2C=m +CONFIG_HTS221_SPI=m CONFIG_HTU21=m # CONFIG_SI7005 is not set CONFIG_SI7020=m @@ -8130,7 +8169,7 @@ CONFIG_INV_MPU6050_I2C=m # CONFIG_APDS9300 is not set # CONFIG_APDS9306 is not set CONFIG_APDS9960=m -# CONFIG_AS73211 is not set +CONFIG_AS73211=m # CONFIG_BH1745 is not set CONFIG_BH1750=m # CONFIG_BH1780 is not set @@ -8166,7 +8205,7 @@ CONFIG_BH1750=m # CONFIG_STK3310 is not set # CONFIG_ST_UVIS25 is not set # CONFIG_TCS3414 is not set -# CONFIG_TCS3472 is not set +CONFIG_TCS3472=m # CONFIG_SENSORS_TSL2563 is not set # CONFIG_TSL2583 is not set # CONFIG_TSL2591 is not set @@ -8176,11 +8215,11 @@ CONFIG_TSL4531=m # CONFIG_VCNL4000 is not set # CONFIG_VCNL4035 is not set # CONFIG_VEML3235 is not set -# CONFIG_VEML6030 is not set -# CONFIG_VEML6040 is not set +CONFIG_VEML6030=m +CONFIG_VEML6040=m # CONFIG_VEML6046X00 is not set CONFIG_VEML6070=m -# CONFIG_VEML6075 is not set +CONFIG_VEML6075=m # CONFIG_VL6180 is not set # CONFIG_ZOPT2201 is not set # end of Light sensors @@ -8334,7 +8373,7 @@ CONFIG_MAXIM_THERMOCOUPLE=m # CONFIG_MLX90635 is not set # CONFIG_TMP006 is not set # CONFIG_TMP007 is not set -# CONFIG_TMP117 is not set +CONFIG_TMP117=m # CONFIG_TSYS01 is not set # CONFIG_TSYS02D is not set # CONFIG_MAX30208 is not set @@ -8357,6 +8396,7 @@ CONFIG_PWM_BRCMSTB=y CONFIG_PWM_GPIO=m # CONFIG_PWM_MC33XS2410 is not set CONFIG_PWM_PCA9685=m +CONFIG_PWM_PIO_RP1=m CONFIG_PWM_RASPBERRYPI_POE=m CONFIG_PWM_RP1=y # CONFIG_PWM_STMPE is not set @@ -9580,7 +9620,7 @@ CONFIG_SCHED_TRACER=y # CONFIG_HWLAT_TRACER is not set # CONFIG_OSNOISE_TRACER is not set # CONFIG_TIMERLAT_TRACER is not set -# CONFIG_FTRACE_SYSCALLS is not set +CONFIG_FTRACE_SYSCALLS=y CONFIG_TRACER_SNAPSHOT=y # CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP is not set CONFIG_BRANCH_PROFILE_NONE=y @@ -9681,4 +9721,4 @@ CONFIG_ARCH_USE_MEMTEST=y # end of Rust hacking # end of Kernel hacking -CONFIG_IO_URING_ZCRX=y +CONFIG_IO_URING_ZCRX=y \ No newline at end of file diff --git a/board/batocera/broadcom/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/broadcom/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/broadcom/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/fsoverlay/etc/init.d/S08connman b/board/batocera/fsoverlay/etc/init.d/S08connman index af42ff53daf..98a3d8c2fb6 100755 --- a/board/batocera/fsoverlay/etc/init.d/S08connman +++ b/board/batocera/fsoverlay/etc/init.d/S08connman @@ -96,7 +96,8 @@ wifi_enable() { done echo "*** Wifi Hardware detected. ***" > /dev/kmsg # Delay to allow for firmware to settle - sleep 3 + sleep 1 + rfkill unblock all # If wifi interface is available then apply the country code if set by the user settingsCountry="$(/usr/bin/batocera-settings-get -f "$BATOCONF" wifi.country | tr -d '[:space:]')" diff --git a/board/batocera/patches/sdl2/sdl2_frametime_log.patch b/board/batocera/patches/sdl2/sdl2_frametime_log.patch new file mode 100644 index 00000000000..7a0c9accbd8 --- /dev/null +++ b/board/batocera/patches/sdl2/sdl2_frametime_log.patch @@ -0,0 +1,80 @@ +--- a/src/video/SDL_egl.c ++++ b/src/video/SDL_egl.c +@@ -37,6 +37,54 @@ + #include "SDL_egl_c.h" + #include "SDL_loadso.h" + #include "SDL_hints.h" ++#include ++#include ++ ++/* frametime logger (env FRAMETIME_LOG). Wraps the eglSwapBuffers function ++ * pointer itself instead of the generic SDL_EGL_SwapBuffers() helper: on ++ * this board (and any Wayland/KMSDRM backend), the per-backend SwapWindow ++ * implementations (Wayland_GLES_SwapWindow, KMSDRM_GLES_SwapWindow) call ++ * _this->egl_data->eglSwapBuffers() directly and never go through ++ * SDL_EGL_SwapBuffers() - a hook there is dead code for those backends. ++ * The function pointer is the true single choke point for every backend ++ * (SDL_EGL_SwapBuffers() itself also calls through this same pointer, so ++ * wrapping it here covers that path too without double-counting). */ ++static EGLBoolean (EGLAPIENTRY *FT_real_eglSwapBuffers)(EGLDisplay, EGLSurface); ++static FILE *FT_log; ++static EGLBoolean EGLAPIENTRY FT_log_eglSwapBuffers(EGLDisplay dpy, EGLSurface surf) ++{ ++ struct timespec ts_; ++ clock_gettime(CLOCK_MONOTONIC, &ts_); ++ fprintf(FT_log, "%lld\n", ++ (long long)(ts_.tv_sec * 1000000LL + ts_.tv_nsec / 1000)); ++ return FT_real_eglSwapBuffers(dpy, surf); ++} ++ ++/* FRAMETIME_LOG is set on the *frontend* (emulationstation) process so that ++ * the game it forks/execs inherits it - but emulationstation itself also ++ * links this same libSDL2 and does its own swaps (still-live background ++ * redraws even with a game "in front"), so it would otherwise open and ++ * write into the same log file as the game it launched, corrupting it with ++ * interleaved/out-of-order timestamps from two independent processes ++ * (confirmed live: ES held an open FD on the game's FRAMETIME_LOG path, ++ * producing multi-hundred-second jumps in the CSV). Exclude the frontend ++ * itself by process name so only the actual emulator process logs. */ ++static int FT_skip_self(void) ++{ ++ static int cached = -1; ++ if (cached < 0) { ++ char comm[16] = {0}; ++ FILE *cf = fopen("/proc/self/comm", "r"); ++ if (cf) { ++ if (!fgets(comm, sizeof(comm), cf)) { ++ comm[0] = '\0'; ++ } ++ fclose(cf); ++ } ++ cached = (SDL_strncmp(comm, "emulationstatio", 15) == 0); ++ } ++ return cached; ++} + + #ifdef EGL_KHR_create_context + /* EGL_OPENGL_ES3_BIT_KHR was added in version 13 of the extension. */ +@@ -479,6 +527,22 @@ + _this->egl_data = NULL; + return -1; + } ++ ++ /* frametime logger: substitute logging wrapper if requested. Guarded by ++ * a pointer-identity check so a second LoadLibraryOnly() call (video ++ * reinit) doesn't double-wrap. Skipped entirely for the emulationstation ++ * frontend itself (see FT_skip_self() above). */ ++ if (!FT_skip_self()) { ++ const char *ft_path = SDL_getenv("FRAMETIME_LOG"); ++ if (ft_path && !FT_log) { ++ FT_log = fopen(ft_path, "w"); ++ if (FT_log) setvbuf(FT_log, NULL, _IOLBF, 0); ++ } ++ if (FT_log && _this->egl_data->eglSwapBuffers != FT_log_eglSwapBuffers) { ++ FT_real_eglSwapBuffers = _this->egl_data->eglSwapBuffers; ++ _this->egl_data->eglSwapBuffers = FT_log_eglSwapBuffers; ++ } ++ } + return 0; + } + diff --git a/board/batocera/patches/sdl2/sdl2_mali_wayland_platform_display.patch b/board/batocera/patches/sdl2/sdl2_mali_wayland_platform_display.patch new file mode 100644 index 00000000000..5c0e13ef7e6 --- /dev/null +++ b/board/batocera/patches/sdl2/sdl2_mali_wayland_platform_display.patch @@ -0,0 +1,20 @@ +--- a/src/video/wayland/SDL_waylandopengles.c 2026-08-14 23:02:13.895506292 +0900 ++++ b/src/video/wayland/SDL_waylandopengles.c 2026-08-14 23:02:22.119634687 +0900 +@@ -40,7 +40,16 @@ + int ret; + SDL_VideoData *data = (SDL_VideoData *)_this->driverdata; + +- ret = SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display, 0); ++ /* Proprietary Mali blobs (SDL_VIDEO_DRIVER_MALI, see the SDL_egl.c hook ++ * added by sdl2_add_video_mali_gles2.patch) only resolve a Wayland ++ * EGLDisplay via eglGetPlatformDisplayEXT/eglGetPlatformDisplay ++ * (EGL_KHR_platform_wayland). The legacy eglGetDisplay(wl_display*) ++ * auto-detection that Mesa supports is not implemented by the blob and ++ * returns EGL_NO_DISPLAY ("Could not get EGL display"). Passing ++ * platform=0 here (as upstream SDL2 does) skips that Mali dispatch ++ * entirely. EGL_KHR_platform_wayland is a standard extension Mesa ++ * supports too, so passing it unconditionally is safe there as well. */ ++ ret = SDL_EGL_LoadLibrary(_this, path, (NativeDisplayType) data->display, EGL_PLATFORM_WAYLAND_KHR); + + Wayland_PumpEvents(_this); + WAYLAND_wl_display_flush(data->display); diff --git a/board/batocera/qualcomm/qcs6490/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/qualcomm/qcs6490/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/qualcomm/qcs6490/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/qualcomm/sdm845/linux_patches/hid-nintendo-bt-rumble.patch b/board/batocera/qualcomm/sdm845/linux_patches/hid-nintendo-bt-rumble.patch new file mode 100644 index 00000000000..f3c4a79592e --- /dev/null +++ b/board/batocera/qualcomm/sdm845/linux_patches/hid-nintendo-bt-rumble.patch @@ -0,0 +1,70 @@ +diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c +--- a/drivers/hid/hid-nintendo.c ++++ b/drivers/hid/hid-nintendo.c +@@ -589,6 +589,8 @@ + unsigned int last_input_report_msecs; + unsigned int last_subcmd_sent_msecs; + unsigned int consecutive_valid_report_deltas; ++ unsigned int subcmd_rate_exhaustions; ++ bool subcmd_rate_relaxed; + + /* factory calibration data */ + struct joycon_stick_cal left_stick_cal_x; +@@ -823,7 +825,8 @@ + #define JC_SUBCMD_RATE_LIMITER_USB_MS 20 + #define JC_SUBCMD_RATE_LIMITER_BT_MS 60 + #define JC_SUBCMD_RATE_LIMITER_MS(ctlr) ((ctlr)->hdev->bus == BUS_USB ? JC_SUBCMD_RATE_LIMITER_USB_MS : JC_SUBCMD_RATE_LIMITER_BT_MS) +-static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++#define JC_SUBCMD_RATE_MAX_FAILURES 2 ++static void joycon_enforce_subcmd_rate_strict(struct joycon_ctlr *ctlr) + { + unsigned int current_ms; + unsigned long subcmd_delta; +@@ -851,6 +854,14 @@ + + if (attempts >= JC_SUBCMD_RATE_MAX_ATTEMPTS) { + hid_warn(ctlr->hdev, "%s: exceeded max attempts", __func__); ++ ++ if (++ctlr->subcmd_rate_exhaustions == JC_SUBCMD_RATE_MAX_FAILURES) { ++ ctlr->subcmd_rate_relaxed = true; ++ hid_info(ctlr->hdev, ++ "input report cadence does not fit the %d-%dms window; using the legacy subcommand throttle\n", ++ JC_INPUT_REPORT_MIN_DELTA, ++ JC_INPUT_REPORT_MAX_DELTA); ++ } + return; + } + +@@ -865,6 +876,32 @@ + msleep(JC_SUBCMD_TX_OFFSET_MS); + } + ++/* The rate limiter as it was before commit d750d1480362, without the report ++ * cadence requirement. ++ */ ++static void joycon_enforce_subcmd_rate_legacy(struct joycon_ctlr *ctlr) ++{ ++ static const unsigned int max_subcmd_rate_ms = 25; ++ unsigned int current_ms = jiffies_to_msecs(jiffies); ++ unsigned int delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ ++ while (delta_ms < max_subcmd_rate_ms && ++ ctlr->ctlr_state == JOYCON_CTLR_STATE_READ) { ++ joycon_wait_for_input_report(ctlr); ++ current_ms = jiffies_to_msecs(jiffies); ++ delta_ms = current_ms - ctlr->last_subcmd_sent_msecs; ++ } ++ ctlr->last_subcmd_sent_msecs = current_ms; ++} ++ ++static void joycon_enforce_subcmd_rate(struct joycon_ctlr *ctlr) ++{ ++ if (ctlr->subcmd_rate_relaxed) ++ joycon_enforce_subcmd_rate_legacy(ctlr); ++ else ++ joycon_enforce_subcmd_rate_strict(ctlr); ++} ++ + static int joycon_hid_send_sync(struct joycon_ctlr *ctlr, u8 *data, size_t len, + u32 timeout) + { diff --git a/board/batocera/qualcomm/sm6115/create-boot-script.sh b/board/batocera/qualcomm/sm6115/create-boot-script.sh new file mode 100755 index 00000000000..d32372380a5 --- /dev/null +++ b/board/batocera/qualcomm/sm6115/create-boot-script.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +# HOST_DIR = host dir +# BOARD_DIR = board specific dir +# BUILD_DIR = base dir/build +# BINARIES_DIR = images dir +# TARGET_DIR = target dir +# BATOCERA_BINARIES_DIR = batocera binaries sub directory + +HOST_DIR=$1 +BOARD_DIR=$2 +BUILD_DIR=$3 +BINARIES_DIR=$4 +TARGET_DIR=$5 +BATOCERA_BINARIES_DIR=$6 + +mkdir -p "${BATOCERA_BINARIES_DIR}/boot/boot" || exit 1 + +echo "*** Copying the Batocera base system files ***" +cp "${BINARIES_DIR}/rootfs.squashfs" "${BATOCERA_BINARIES_DIR}/boot/boot/batocera.update" || exit 1 +cp "${BINARIES_DIR}/rufomaculata" "${BATOCERA_BINARIES_DIR}/boot/boot/rufomaculata.update" || exit 1 + +echo "*** Compressing the Kernel ***" +gzip -9c "${BINARIES_DIR}/Image" > "${BINARIES_DIR}/kernel.gz" || exit 1 + +echo "*** Appending all built .dtb files to the end of the compressed kernel ***" +for dtb in "${BINARIES_DIR}"/*.dtb; do + if [ -f "$dtb" ]; then + echo "Appending: $dtb" + cat "$dtb" >> "${BINARIES_DIR}/kernel.gz" + fi +done + +# Define the Kernel command line +CMDLINE="label=BATOCERA rootwait quiet loglevel=0 console=ttyMSM0,115200n8 vt.global_cursor_default=0" + +MKBOOTIMG="${HOST_DIR}/usr/bin/mkbootimg.py" + +# Comment out the missing 'gki' import since Header V0 doesn't need it. +chmod u+w "${MKBOOTIMG}" 2>/dev/null || true +sed -i 's/^from gki.generate_gki_certificate/#from gki.generate_gki_certificate/' "${MKBOOTIMG}" + +echo "*** Generating the Android boot image ***" +${HOST_DIR}/bin/python3 "${MKBOOTIMG}" \ + --kernel "${BINARIES_DIR}/kernel.gz" \ + --ramdisk "${BINARIES_DIR}/initrd.lz4" \ + --kernel_offset 0x00000000 \ + --ramdisk_offset 0x00000000 \ + --tags_offset 0x00000000 \ + --os_version 12.0.0 \ + --os_patch_level "$(date '+%Y-%m')" \ + --header_version 0 \ + --cmdline "${CMDLINE}" \ + -o "${BATOCERA_BINARIES_DIR}/boot/boot/Image" || exit 1 + +exit 0 diff --git a/board/batocera/qualcomm/sm6115/dts/qcom/sm6115-mangmi-air-x-base.dtsi b/board/batocera/qualcomm/sm6115/dts/qcom/sm6115-mangmi-air-x-base.dtsi index e36f6776b69..6a42b825348 100644 --- a/board/batocera/qualcomm/sm6115/dts/qcom/sm6115-mangmi-air-x-base.dtsi +++ b/board/batocera/qualcomm/sm6115/dts/qcom/sm6115-mangmi-air-x-base.dtsi @@ -44,13 +44,20 @@ #cooling-cells = <2>; }; - vibrator { - compatible = "clk-vibrator"; + clk_pwm: pwm { + compatible = "clk-pwm"; + #pwm-cells = <2>; clocks = <&gcc GCC_GP1_CLK>; - vcc-supply = <&vibra_vcc>; pinctrl-names = "default"; pinctrl-0 = <&gpio_clk_pins>; - vibration-frequency-hz = <10000>; + }; + + vibrator { + compatible = "pwm-vibrator"; + pwms = <&clk_pwm 0 25000>; + pwm-names = "enable"; + min-duty-cycle-ns = <10000>; + vcc-supply = <&vibra_vcc>; }; led_vdd: regulator-led-vdd { @@ -563,7 +570,6 @@ interrupts-extended = <&tlmm 70 IRQ_TYPE_EDGE_FALLING>; pinctrl-names = "default"; pinctrl-0 = <&chg_int_default>, <&chg_en_default>; - wakeup-source; input-voltage-limit-microvolt = <4500000>; @@ -727,7 +733,6 @@ &mdss { status = "okay"; - interconnects = <&mmrt_virt MASTER_MDP_PORT0 RPM_ACTIVE_TAG &bimc SLAVE_EBI_CH0 RPM_ACTIVE_TAG>, <&bimc MASTER_AMPSS_M0 RPM_ACTIVE_TAG @@ -794,6 +799,7 @@ &pon_pwrkey { status = "okay"; + wakeup-source; }; &pon_resin { @@ -812,10 +818,10 @@ clock-names = "se"; power-domains = <&rpmpd SM6115_VDDCX>; operating-points-v2 = <&qup_opp_table>; - interconnects = <&clk_virt MASTER_QUP_CORE_0 RPM_ALWAYS_TAG - &clk_virt SLAVE_QUP_CORE_0 RPM_ALWAYS_TAG>, - <&bimc MASTER_AMPSS_M0 RPM_ALWAYS_TAG - &config_noc SLAVE_QUP_0 RPM_ALWAYS_TAG>; + interconnects = <&clk_virt MASTER_QUP_CORE_0 RPM_ACTIVE_TAG + &clk_virt SLAVE_QUP_CORE_0 RPM_ACTIVE_TAG>, + <&bimc MASTER_AMPSS_M0 RPM_ACTIVE_TAG + &config_noc SLAVE_QUP_0 RPM_ACTIVE_TAG>; interconnect-names = "qup-core", "qup-config"; pinctrl-0 = <&qup_uart0_active>; pinctrl-1 = <&qup_uart0_sleep>; @@ -826,11 +832,29 @@ &remoteproc_adsp { firmware-name = "qcom/qrb4210/adsp.mbn"; status = "okay"; + + interrupts-extended = <&intc GIC_SPI 282 IRQ_TYPE_EDGE_RISING>, + <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>, + <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>, + <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>, + <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>, + <&adsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "wdog", "fatal", "ready", + "handover", "stop-ack", "shutdown-ack"; }; &remoteproc_cdsp { firmware-name = "qcom/qrb4210/cdsp.mbn"; status = "okay"; + + interrupts-extended = <&intc GIC_SPI 265 IRQ_TYPE_EDGE_RISING>, + <&cdsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>, + <&cdsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>, + <&cdsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>, + <&cdsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>, + <&cdsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>; + interrupt-names = "wdog", "fatal", "ready", + "handover", "stop-ack", "shutdown-ack"; }; &remoteproc_mpss { @@ -990,7 +1014,7 @@ }; vreg_l23a_3p3: l23 { - regulator-min-microvolt = <3312000>; + regulator-min-microvolt = <3200000>; regulator-max-microvolt = <3312000>; regulator-allow-set-load; }; @@ -1034,9 +1058,53 @@ mmc-hs400-1_8v; mmc-hs400-enhanced-strobe; + interconnects = <&system_noc MASTER_SDCC_1 RPM_ALWAYS_TAG + &bimc SLAVE_EBI_CH0 RPM_ALWAYS_TAG>, + <&bimc MASTER_AMPSS_M0 RPM_ALWAYS_TAG + &config_noc SLAVE_SDCC_1 RPM_ALWAYS_TAG>; + status = "okay"; }; +&scm { + qcom,dload-mode = <&tcsr_regs 0x13000>; + + interconnects = <&system_noc MASTER_CRYPTO_CORE0 RPM_ACTIVE_TAG + &bimc SLAVE_EBI_CH0 RPM_ACTIVE_TAG>; +}; + +&{/smp2p-mpss} { + wlan_smp2p_in: wlan-wpss-to-ap { + qcom,entry-name = "wlan"; + interrupt-controller; + #interrupt-cells = <2>; + }; + + ipa_smp2p_out: ipa-1-out { + qcom,entry-name = "ipa"; + #qcom,smem-state-cells = <1>; + }; + + ipa_smp2p_in: ipa-1-in { + qcom,entry-name = "ipa"; + interrupt-controller; + #interrupt-cells = <2>; + }; +}; + +&{/smp2p-cdsp} { + cdsp_rdbg_smp2p_out: rdbg5-out { + qcom,entry-name = "rdbg"; + #qcom,smem-state-cells = <1>; + }; + + cdsp_rdbg_smp2p_in: rdbg5-in { + qcom,entry-name = "rdbg"; + interrupt-controller; + #interrupt-cells = <2>; + }; +}; + &sdhc_2 { cd-gpios = <&tlmm 88 GPIO_ACTIVE_LOW>; pinctrl-names = "default", "sleep"; @@ -1053,6 +1121,11 @@ sd-uhs-sdr104; sd-uhs-ddr50; + interconnects = <&system_noc MASTER_SDCC_2 RPM_ALWAYS_TAG + &bimc SLAVE_EBI_CH0 RPM_ALWAYS_TAG>, + <&bimc MASTER_AMPSS_M0 RPM_ALWAYS_TAG + &config_noc SLAVE_SDCC_2 RPM_ALWAYS_TAG>; + status = "okay"; }; @@ -1211,7 +1284,7 @@ pins = "gpio22", "gpio25", "gpio26", "gpio27", "gpio28"; function = "gpio"; drive-strength = <2>; - bias-disable; + bias-pull-up; }; btn_pins { @@ -1374,15 +1447,8 @@ pins = "gpio69"; function = "gpio"; drive-strength = <2>; - bias-disable; - }; - - ts_reset_default: ts-reset-default-state { - pins = "gpio68"; - function = "gpio"; - drive-strength = <2>; - bias-disable; - output-low; + bias-pull-up; + input-enable; }; tcpc_irq_default: tcpc-irq-default-state { @@ -1418,6 +1484,8 @@ &usb_dwc3 { dr_mode = "otg"; maximum-speed = "super-speed"; + /delete-property/ snps,dis_u2_susphy_quirk; + /delete-property/ snps,dis_enblslpm_quirk; ports { port@0 { @@ -1687,3 +1755,109 @@ interconnects = <&bimc MASTER_AMPSS_M0 RPM_ACTIVE_TAG &bimc SLAVE_EBI_CH0 RPM_ACTIVE_TAG>; }; + +&soc { + psci_suspend_fallback: psci-suspend-fallback { + compatible = "qcom,psci-suspend-fallback"; + qcom,suspend-state-id = <0x42000343>; + qcom,mpm-vmpm = <&apss_mpm>; + }; +}; + +&cluster_0_sleep_0 { + arm,psci-suspend-param = <0x41000023>; +}; + +&cluster_1_sleep_0 { + arm,psci-suspend-param = <0x41000023>; +}; + +&cluster_0_sleep_1 { + arm,psci-suspend-param = <0x41000043>; + entry-latency-us = <640>; + exit-latency-us = <1664>; + min-residency-us = <8094>; +}; + +&cluster_1_sleep_1 { + arm,psci-suspend-param = <0x41000043>; + entry-latency-us = <800>; + exit-latency-us = <2118>; + min-residency-us = <7376>; +}; + +&little_cpu_sleep_0 { + entry-latency-us = <297>; + exit-latency-us = <324>; + min-residency-us = <1110>; +}; + +&big_cpu_sleep_0 { + entry-latency-us = <290>; + exit-latency-us = <376>; + min-residency-us = <1182>; +}; + +&{/cpus/domain-idle-states} { + cci_ret: cci-ret { + compatible = "domain-idle-state"; + idle-state-name = "cci-ret"; + arm,psci-suspend-param = <0x42000043>; + entry-latency-us = <108>; + exit-latency-us = <450>; + min-residency-us = <153>; + }; + + cci_pc: cci-pc { + compatible = "domain-idle-state"; + idle-state-name = "cci-pc"; + arm,psci-suspend-param = <0x42000343>; + entry-latency-us = <10831>; + exit-latency-us = <4506>; + min-residency-us = <15338>; + }; +}; + +&{/psci} { + cci_ret_pd: power-domain-cci-ret { + #power-domain-cells = <0>; + power-domains = <&cci_pc_pd>; + domain-idle-states = <&cci_ret>; + }; + + cci_pc_pd: power-domain-cci-pc { + #power-domain-cells = <0>; + domain-idle-states = <&cci_pc>; + }; +}; + +&cluster_0_pd { power-domains = <&cci_ret_pd>; }; +&cluster_1_pd { power-domains = <&cci_ret_pd>; }; + +&mpm { power-domains = <&cci_pc_pd>; }; + +&pm6125_rtc { + status = "okay"; +}; + +&rpmpd_opp_table { + rpmpd_opp_retention: opp0a { + opp-level = ; + }; + + rpmpd_opp_retention_plus: opp0b { + opp-level = ; + }; +}; + +&qup_opp_table { + opp-75000000 { + required-opps = <&rpmpd_opp_retention>; + }; +}; + +&mdp_opp_table { + opp-192000000 { + required-opps = <&rpmpd_opp_retention>; + }; +}; diff --git a/board/batocera/qualcomm/sm6115/fsoverlay/etc/init.d/S06mangmi-fan b/board/batocera/qualcomm/sm6115/fsoverlay/etc/init.d/S06mangmi-fan new file mode 100755 index 00000000000..fda77f0d2fa --- /dev/null +++ b/board/batocera/qualcomm/sm6115/fsoverlay/etc/init.d/S06mangmi-fan @@ -0,0 +1,45 @@ +#!/bin/bash + +MODEL=$(batocera-model) + +start() { + if [[ "$MODEL" == "MANGMI_Air_X_MQ65" || "$MODEL" == "MANGMI_Air_X_MQ66" || "$MODEL" == "MANGMI_Air_X_MQ66B" ]]; then + echo "Starting fan control daemon for $MODEL..." + /usr/bin/mangmi_fan_control.py & + else + echo "Skipping fan control: Model '$MODEL' does not require this service." + fi +} + +stop() { + if [[ "$MODEL" == "MANGMI_Air_X_MQ65" || "$MODEL" == "MANGMI_Air_X_MQ66" || "$MODEL" == "MANGMI_Air_X_MQ66B" ]]; then + echo "Stopping fan control daemon..." + pkill -f mangmi_fan_control.py + # Force the fan off to prevent it running indefinitely + if [ -f /sys/devices/platform/gpio-fan/hwmon/hwmon20/pwm1 ]; then + echo 0 > /sys/devices/platform/gpio-fan/hwmon/hwmon20/pwm1 + fi + fi +} + +restart() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 +esac + +exit $? diff --git a/board/batocera/qualcomm/sm6115/fsoverlay/lib/firmware/Himax_firmware.bin b/board/batocera/qualcomm/sm6115/fsoverlay/lib/firmware/Himax_firmware.bin new file mode 100644 index 00000000000..c3a56263731 Binary files /dev/null and b/board/batocera/qualcomm/sm6115/fsoverlay/lib/firmware/Himax_firmware.bin differ diff --git a/board/batocera/qualcomm/sm6115/fsoverlay/lib/firmware/qca/cmnv13s.bin b/board/batocera/qualcomm/sm6115/fsoverlay/lib/firmware/qca/cmnv13s.bin new file mode 100644 index 00000000000..8fa471f7185 Binary files /dev/null and b/board/batocera/qualcomm/sm6115/fsoverlay/lib/firmware/qca/cmnv13s.bin differ diff --git a/board/batocera/qualcomm/sm6115/genimage.cfg b/board/batocera/qualcomm/sm6115/genimage.cfg new file mode 100644 index 00000000000..02d90188b6b --- /dev/null +++ b/board/batocera/qualcomm/sm6115/genimage.cfg @@ -0,0 +1,35 @@ +image boot.vfat { + vfat { + extraargs = "-F 32 -n BATOCERA" + @files + } + size = 8G +} + +image userdata.ext4 { + ext4 { + label = "SHARE" + use-mke2fs = "true" + extraargs = "-m 0" + } + size = "512M" + mountpoint = "/userdata" +} + +image batocera.img { + hdimage { + partition-table-type = "gpt" + } + + partition vfat { + partition-type-uuid = U + image = "boot.vfat" + offset = 32K + bootable = true + } + + partition userdata { + partition-type-uuid = L + image = "userdata.ext4" + } +} diff --git a/board/batocera/qualcomm/sm6115/linux_patches/0001-gpu-drm-panel-add-mangmi-airx-panel.patch b/board/batocera/qualcomm/sm6115/linux_patches/0001-gpu-drm-panel-add-mangmi-airx-panel.patch new file mode 100644 index 00000000000..21c752c5230 --- /dev/null +++ b/board/batocera/qualcomm/sm6115/linux_patches/0001-gpu-drm-panel-add-mangmi-airx-panel.patch @@ -0,0 +1,425 @@ +From b02534ba4f7a1028c15f2de764b217bf357d1f5f Mon Sep 17 00:00:00 2001 +From: Philippe Simons +Date: Mon, 22 Dec 2025 23:39:45 +0100 +Subject: [PATCH] gpu:drm:panel: add mangmi airx panel + +--- + drivers/gpu/drm/panel/Kconfig | 10 + + drivers/gpu/drm/panel/Makefile | 1 + + drivers/gpu/drm/panel/panel-hx83112a.c | 374 +++++++++++++++++++++++++++++++++ + 3 files changed, 384 insertions(+) + +diff --git a/drivers/gpu/drm/panel/Kconfig b/drivers/gpu/drm/panel/Kconfig +index d592f4f4b..9a2c8dc13 100644 +--- a/drivers/gpu/drm/panel/Kconfig ++++ b/drivers/gpu/drm/panel/Kconfig +@@ -491,6 +491,16 @@ config DRM_PANEL_MAGNACHIP_D53E6EA8966 + with the Magnachip D53E6EA8966 panel IC. This panel receives + video data via DSI but commands via 9-bit SPI using DBI. + ++config DRM_PANEL_MANGMI_HX83112A ++ tristate "Mangmi HX83112a DSI panel" ++ depends on OF ++ depends on DRM_MIPI_DSI ++ depends on BACKLIGHT_CLASS_DEVICE ++ select DRM_KMS_HELPER ++ help ++ Say Y here if you want to enable support for Himax HX83112A-based ++ display panels, such as the one found in the Fairphone 4 smartphone. ++ + config DRM_PANEL_MANTIX_MLAF057WE51 + tristate "Mantix MLAF057WE51-X MIPI-DSI LCD panel" + depends on OF +diff --git a/drivers/gpu/drm/panel/Makefile b/drivers/gpu/drm/panel/Makefile +index a4291dc39..9c44a9212 100644 +--- a/drivers/gpu/drm/panel/Makefile ++++ b/drivers/gpu/drm/panel/Makefile +@@ -49,6 +49,7 @@ obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o + obj-$(CONFIG_DRM_PANEL_LG_SW43408) += panel-lg-sw43408.o + obj-$(CONFIG_DRM_PANEL_LXD_M9189A) += panel-lxd-m9189a.o + obj-$(CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966) += panel-magnachip-d53e6ea8966.o ++obj-$(CONFIG_DRM_PANEL_MANGMI_HX83112A) += panel-hx83112a.o + obj-$(CONFIG_DRM_PANEL_MOTOROLA_MOT) += panel-motorola-mot.o + obj-$(CONFIG_DRM_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o + obj-$(CONFIG_DRM_PANEL_NEWVISION_NV3051D) += panel-newvision-nv3051d.o +diff --git a/drivers/gpu/drm/panel/panel-hx83112a.c b/drivers/gpu/drm/panel/panel-hx83112a.c +new file mode 100644 +index 000000000..fd0674398 +--- /dev/null ++++ b/drivers/gpu/drm/panel/panel-hx83112a.c +@@ -0,0 +1,374 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++// Copyright (c) 2025 FIXME ++// Generated with linux-mdss-dsi-panel-driver-generator from vendor device tree: ++// Copyright (c) 2013, The Linux Foundation. All rights reserved. (FIXME) ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include