Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
c54454d
batocera-system: bring forward A/B-common Kconfig gating fixes and KE…
Pyohwan Aug 10, 2026
397b00a
buildroot: bump submodule for mesa3d-headers version fix (26.1.4 -> 2…
Pyohwan Aug 10, 2026
da6b3b6
odroidm1: cap BR2_JLEVEL=8 to stop 17-way parallel g++ from OOM-killi…
Pyohwan Aug 11, 2026
2d1a870
local.mk.example: fix KERNEL_SRCDIR path after SSD migration
Pyohwan Aug 10, 2026
71b4570
local.mk.example: fix stale panfrost-enable branch reference for track C
Pyohwan Aug 12, 2026
9013dd3
configgen: inject GALLIUM_HUD=fps whenever show_fps is on, as a Mesa-…
Pyohwan Aug 11, 2026
eb86551
odroidm1: default global.powermode to highperformance
Pyohwan Aug 11, 2026
d85e998
Fix vkquake2/pcsx2 desktop-GL blockers for GLES-only Vulkan build
Pyohwan Aug 11, 2026
bf09efa
Add RK3568 board branch to libretro-parallel-n64 - fixes x86 SSE buil…
Pyohwan Aug 11, 2026
b995fdd
Enable real PPSSPP Vulkan on RK3568 - was force-disabled via ARM_NO_V…
Pyohwan Aug 11, 2026
f076d70
pcsx2: fix ps2 default emulator + eglfs for no-compositor boards
Pyohwan Aug 12, 2026
9af63f4
dolphin: eglfs for no-compositor boards, same pattern as duckstation/…
Pyohwan Aug 12, 2026
6981a3f
odroidm1: enable PCSX2/Dolphin-standalone/parallel-n64/azahar/ppsspp …
Pyohwan Aug 12, 2026
1ae087d
odroidm1: reintroduce labwc for track C, fix stale gbm_bo_get_fd alias
Pyohwan Aug 13, 2026
c12e978
mali-g52-odroidm1: swap blob to g29p1 for track C
Pyohwan Aug 13, 2026
cb30303
odroidm1: disable libgtk3's Wayland GDK backend on track C
Pyohwan Aug 13, 2026
74309d9
mali-g52-odroidm1: stop clobbering wayland's own libwayland-egl.so
Pyohwan Aug 13, 2026
7265f18
sdl2: pass EGL_PLATFORM_WAYLAND_KHR for Wayland EGL display (Mali blob)
Pyohwan Aug 14, 2026
b93d99b
configgen: bind RetroArch's exit_emulator to the same button as Start
Pyohwan Aug 15, 2026
b24dccc
odroidm1: enable BATOCERA_VULKAN for track C - needed for ES UI optio…
Pyohwan Aug 15, 2026
a0ad43e
gpu: add vulkan-wsi-layer package - bridges g29p1 blob's KHR_display-…
Pyohwan Aug 15, 2026
38d396b
buildroot: bump submodule for the SDL2 video-vulkan gating fix (uncom…
Pyohwan Aug 15, 2026
f088699
vulkan-wsi-layer: fix real root cause of Wayland surface/swapchain fa…
Pyohwan Aug 15, 2026
c736fc6
vulkan-wsi-layer: fix vkCreateDevice failures for RetroArch/libretro …
Pyohwan Aug 15, 2026
f9a7c59
libretro-dolphin: enable Vulkan backend when BATOCERA_VULKAN is set
Pyohwan Aug 15, 2026
11f3bb9
board: disable duckstation - mesa3d Config.in gap breaks the build wi…
Pyohwan Aug 15, 2026
2bc3f55
duckstation: fix disable - a defconfig "is not set" can't override ba…
Pyohwan Aug 15, 2026
f1be9dc
duckstation: actually fix the disable - override the shared select co…
Pyohwan Aug 15, 2026
fdbd09a
batocera-system: fix Kconfig syntax error from mid-expression comments
Pyohwan Aug 15, 2026
36faefd
sdl3: don't pull in full mesa3d for Vulkan on mesa3d-headers boards
Pyohwan Aug 15, 2026
5cf49d0
dolphin-emu: switch to ROCKNIX's Wayland+Vulkan patch series on Wayla…
Pyohwan Aug 15, 2026
9fe586f
dolphin-emu: add CMAKE_POLICY_VERSION_MINIMUM for the older Wayland-c…
Pyohwan Aug 15, 2026
473abd1
dolphin-emu: fix fmt 12 compile-string API break on the Wayland-commi…
Pyohwan Aug 15, 2026
907e0dc
dolphin-emu: force the bundled Externals/fmt instead of patching for …
Pyohwan Aug 15, 2026
ebc4f86
dolphin-emu: disable ENABLE_X11 on the Wayland build (no GLX on this …
Pyohwan Aug 15, 2026
95880ef
dolphin-emu: fix missing <cstdio> include in bundled VulkanMemoryAllo…
Pyohwan Aug 15, 2026
9227718
mali-g52-odroidm1: install a Vulkan ICD manifest (was missing entirely)
Pyohwan Aug 15, 2026
e1cf403
dolphin-emu: roundtrip after the initial wl_surface commit before Vulkan
Pyohwan Aug 15, 2026
9df6495
vulkan-wsi-layer: roundtrip before surface init - fixes intermittent
Pyohwan Aug 15, 2026
835b0bc
libretro-beetle-psx: exclude the HW/GLES3 renderer on mesa3d-headers …
Pyohwan Aug 15, 2026
470be1e
board: correct stale parallel-n64 comment - it's GL-only on ARM, not …
Pyohwan Aug 15, 2026
d4ef6fe
dolphin-emu: fix standalone Wayland platform staying windowed/cropped
Pyohwan Aug 15, 2026
3a5bce9
labwc: force pcsx2-qt fullscreen - fixes zero-size window on launch
Pyohwan Aug 15, 2026
fb3b104
labwc: give pcsx2-qt keyboard focus alongside ToggleFullscreen
Pyohwan Aug 16, 2026
cd2cced
pcsx2: fix Vulkan swap chain double-free + retry surface format race
Pyohwan Aug 16, 2026
c11e395
ps2: add AetherSX2 as a personal-build PS2 core alongside pcsx2
Pyohwan Aug 16, 2026
d5b4943
aethersx2: fix gamepad face buttons + add gfxbackend/resolution/fps o…
Pyohwan Aug 16, 2026
49e0927
saturn: fix beetle-saturn GLES link on GLES-only boards
Pyohwan Aug 16, 2026
b66635e
nds: switch melonDS standalone to wayland QPA for dual-screen support
Pyohwan Aug 16, 2026
8649295
perf: add frametime logging hooks for A/B/C fps benchmarking
Pyohwan Aug 16, 2026
b96cee5
batocera-system: add board-specific ODROIDM1 identity symbol
Pyohwan Aug 17, 2026
0b13878
dolphin-emu: scope the Wayland-Vulkan commit swap to this board only
Pyohwan Aug 17, 2026
4582c40
vulkan-wsi-layer: revert bring-up Debug build to Release
Pyohwan Aug 17, 2026
9131967
aethersx2: pin to a commit instead of branch HEAD, add .hash, documen…
Pyohwan Aug 17, 2026
1bc7107
labwc: merge duplicate pcsx2-qt windowRule
Pyohwan Aug 17, 2026
2170337
mali-g52-odroidm1: select the GBM DMA-BUF/format-modifier feature sym…
Pyohwan Aug 17, 2026
7fbbe9b
odroidm1: fix inaccurate comment on why rk3568/patches isn't reused, …
Pyohwan Aug 17, 2026
b9dc2aa
docker.mk: drop comment reference to unimplemented EXTRA_SRCDIR_MOUNTS
Pyohwan Aug 17, 2026
c24119d
batocera-system: give BSP_ODROIDM1 identity symbol a prompt - prompt-…
Pyohwan Aug 17, 2026
f9ba510
dolphin-emu: fix remaining Wayland gate - Qt/NoGUI toggle was still g…
Pyohwan Aug 17, 2026
cbeaa11
Merge origin/master (upstream squashed history, 2026-08-04) into C track
Pyohwan Aug 17, 2026
84a69a3
odroidm1: rebind Xbox Wireless Controller hotkey from Guide to Select
Pyohwan Aug 18, 2026
a4e8a50
odroidm1: force-enable libretro-beetle-saturn for RK3568
Pyohwan Aug 18, 2026
bb4599b
sdl2: fix frametime logger to hook the eglSwapBuffers fn pointer, not…
Pyohwan Aug 18, 2026
0374ac8
sdl2: exclude emulationstation itself from the frametime logger
Pyohwan Aug 18, 2026
8616ce1
fix post-merge regressions from origin/master sync
Pyohwan Aug 19, 2026
48fda9d
ps2: fix missing PS2 system in ES (PCSX2 dep + missing AetherSX2 enable)
Pyohwan Aug 19, 2026
4ed9511
pcsx2: explicitly select xorgproto instead of relying on the XORG7 chain
Pyohwan Aug 19, 2026
0c216cd
odroidm1: sync syslinux.cfg fallback with config.ini/boot.cmd defaults
Pyohwan Aug 17, 2026
7c486fc
batocera-storage-manager: port per-partition ignore fix from Track A
Pyohwan Aug 19, 2026
98c8b7e
batocera-storage-manager: replace with Track A's current file wholesale
Pyohwan Aug 19, 2026
b49de0e
odroidm1: default to Asia/Seoul timezone + Korean keyboard layout
Pyohwan Aug 19, 2026
65abe59
odroidm1: revert global.powermode factory default back to unset
Pyohwan Aug 20, 2026
645fddc
labwc: drop pcsx2-qt's ToggleFullscreen windowRule action
Pyohwan Aug 22, 2026
848fe54
aethersx2: vendor libcurl.so.4 + transitive closure - fixes launch fa…
Pyohwan Aug 22, 2026
541c5ec
aethersx2: vendor libssl.so.3/libcrypto.so.3 too - fixes ENGINE_init
Pyohwan Aug 22, 2026
ce7fd87
aethersx2: set SettingsVersion=1 in PCSX2.ini - fixes reset-to-defaul…
Pyohwan Aug 22, 2026
52523fc
bezel-overlay: fix Python 2 except-tuple syntax error
Pyohwan Aug 23, 2026
88f71e5
odroidm1: make auto/default core+API selection match benchmarked results
Pyohwan Aug 23, 2026
9358834
batocera-es-swissknife: respect updates.url override for the ES updat…
Pyohwan Aug 23, 2026
1b114b9
buildroot: bump submodule for gst1-plugins-bad aja fix
Pyohwan Aug 23, 2026
dc8d78b
odroidm1: explicitly disable gst1-plugins-bad vulkan plugin
Pyohwan Aug 23, 2026
24421e2
odroidm1: fix gst1-plugins-bad vulkan plugin gating, correct .board c…
Pyohwan Aug 23, 2026
4463889
odroidm1: fix 6 upstream bugs hit by the first full Wayland-only rebu…
Pyohwan Aug 25, 2026
eec2121
odroidm1: restore fixes wiped by the 9bf3f05ccc upstream sync merge
Pyohwan Aug 25, 2026
8920c48
odroidm1: fix POST_INSTALL_TARGET_HOOKS ordering for es_input.cfg patch
Pyohwan Aug 25, 2026
520d806
odroidm1: fix git-worktree docker mount + false update-available prompt
Pyohwan Aug 26, 2026
d05f5c6
odroidm1: switch batocera.version to our own release-tag scheme
Pyohwan Aug 26, 2026
443e322
odroidm1: don't rebrand dev builds, keep upstream default pre-release
Pyohwan Aug 26, 2026
1808e20
odroidm1: fix auto emulator/core defaults for n64/gamecube/wii/dreamcast
Pyohwan Aug 26, 2026
4dc8fe5
odroidm1: fix PS2 auto default - was pointing at the known-broken core
Pyohwan Aug 28, 2026
acc831e
odroidm1: build AetherSX2's missing libXrandr properly instead of ven…
Pyohwan Aug 28, 2026
58fcc13
odroidm1: also read display.rotate from config.ini for the boot splash
Pyohwan Aug 29, 2026
e8ea822
odroidm1: fix missing Korean glyphs on the backglass window + add boa…
Pyohwan Aug 29, 2026
7ffd2f8
odroidm1: drop redundant config.ini rotation read, document real mech…
Pyohwan Aug 29, 2026
4b38737
odroidm1: don't hardcode this VU8M unit's specific rotation value in …
Pyohwan Aug 29, 2026
34b3bba
odroidm1: trim README - drop stale/verbose display setup wording
Pyohwan Aug 29, 2026
5c1b828
odroidm1: rename README rotation section to '백글래스 / 화면 회전'
Pyohwan Aug 29, 2026
7e36de1
odroidm1: move backglass/NDS-dual-screen content into the 백글래스/화면 회전 …
Pyohwan Aug 29, 2026
00c2f20
odroidm1: polish 백글래스/화면 회전 section - subheadings, restore videooutpu…
Pyohwan Aug 29, 2026
dfae1c5
odroidm1: note the overlays=display_vu8m prerequisite atop the backgl…
Pyohwan Aug 29, 2026
7ad3354
odroidm1: reorder README backglass section, explain why reboot is needed
Pyohwan Aug 29, 2026
71a4f7e
odroidm1: give exact ES menu paths for backglass/rotation settings
Pyohwan Aug 29, 2026
e415f84
odroidm1: strip batocera/v prefix from release tag before it becomes …
Pyohwan Aug 29, 2026
edb018a
Merge odroid-m1-bsp-kernel (A track) via 'ours' strategy - fix PR #4'…
Pyohwan Aug 29, 2026
fdc833a
odroidm1: address PR #4 4th-round review blocking items
Pyohwan Aug 29, 2026
c6fdfa2
odroidm1: soften wording in README (drop '반드시')
Pyohwan Aug 29, 2026
523554f
odroidm1: credit dsno(Zansword)'s FBNeo Korean patch in the README
Pyohwan Aug 29, 2026
f28d0f5
odroidm1: fix FBNeo Korean patch attribution (DsNo, not dsno/Zansword)
Pyohwan Aug 29, 2026
7b24329
odroidm1: use user's phrasing for the DsNo FBNeo patch credit
Pyohwan Aug 29, 2026
08751e3
odroidm1: split README into Korean/English versions
Pyohwan Aug 29, 2026
a8f2022
odroidm1: use the English title (Ninja Baseball Bat Man) in the EN RE…
Pyohwan Aug 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/output
/output-*
/dl
/configs/batocera-*_defconfig
/configs/batocera-board.local.common
Expand Down
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "buildroot"]
path = buildroot
url = https://github.com/batocera-linux/buildroot.git
url = https://github.com/Pyohwan/buildroot.git
10 changes: 10 additions & 0 deletions Config.in
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ menu "System"
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-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"
Expand Down Expand Up @@ -92,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"
Expand All @@ -110,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

Expand Down Expand Up @@ -253,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"
Expand Down Expand Up @@ -370,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"
Expand Down
97 changes: 97 additions & 0 deletions README-odroidm1.en.md
Original file line number Diff line number Diff line change
@@ -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.<connector-name>=<N>` per connector (e.g. `display.rotate.HDMI-A-1`), falling back to the global `display.rotate=<N>` if unset. `<N>` 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.
97 changes: 97 additions & 0 deletions README-odroidm1.ko.md
Original file line number Diff line number Diff line change
@@ -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.<커넥터이름>=<N>`(예: `display.rotate.HDMI-A-1`), 없으면 전역 `display.rotate=<N>`. `<N>`은 `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에 설치+선택 가능한 상태로 남겨뒀음(실험해보고 싶은 사람용).
Loading