Recalbox - leonkasovan/RG353P GitHub Wiki

Source:
https://gitlab.com/recalbox/recalbox

Upgrade Recalbox

wget https://raw.githubusercontent.com/leonkasovan/RG353P/main/recalbox/update_bios.sh -O - | /bin/bash
wget https://raw.githubusercontent.com/leonkasovan/RG353P/main/recalbox/install_package_ikemen.sh -O - | /bin/bash
wget https://raw.githubusercontent.com/leonkasovan/RG353P/main/recalbox/install_package_ikemen_batch.sh -O - | /bin/bash
wget https://raw.githubusercontent.com/leonkasovan/RG353P/main/recalbox/install_package_luaxx.sh -O - | /bin/bash
wget https://raw.githubusercontent.com/leonkasovan/RG353P/main/recalbox/install_package_love.sh -O - | /bin/bash
wget https://raw.githubusercontent.com/leonkasovan/RG353P/main/recalbox/install_package_addon.sh -O - | /bin/bash

Development Environment in WSL2

Download and extract toolchain

cd /opt
wget https://github.com/rg35xx-cfw/Koriki/releases/download/koriki_batocera_rg35xx_sdk_20240208/arm-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz
wget https://github.com/leonkasovan/RG353P/releases/download/recalbox-9.1/rg353p-recalbox-toolchain.tar.gz
sudo tar -xvzf rg353p-recalbox-toolchain.tar.gz
sudo tar -xvzf arm-buildroot-linux-gnueabihf_sdk-buildroot.tar.gz

Setting shell profile

Edit nano .profile and add these lines:

# set PATH for aarch64 cross compiler
PATH="/opt/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin:/opt/arm-buildroot-linux-gnueabihf_sdk-buildroot/arm-buildroot-linux-gnueabihf/sysroot/usr/bin:/opt/host/bin:/opt/host/aarch64-buildroot-linux-gnu/sysroot/usr/bin:$PATH"

# custom library needed by compiler
export LD_LIBRARY_PATH="/opt/host/lib:/opt/arm-buildroot-linux-gnueabihf_sdk-buildroot/lib"

# for running GUI in WSL2
export DISPLAY=:0
export XDG_RUNTIME_DIR=/home/pi
export RUNLEVEL=3
export LIBGL_ALWAYS_INDIRECT=1

Test Development Environment

  1. Create file test_sdl2.c
#include <SDL2/SDL.h>
#include <stdio.h>

// Function to handle events
void handleEvents(SDL_Event *event, int *quit) {
    while (SDL_PollEvent(event) != 0) {
        if (event->type == SDL_QUIT) {
            *quit = 1;
        } else if (event->type == SDL_KEYDOWN) {
            if (event->key.keysym.sym == SDLK_ESCAPE) {
                *quit = 1;
            }
        }
    }
}

// Function to print available video drivers
void printAvailableVideoDrivers() {
    int numDrivers = SDL_GetNumVideoDrivers();
    printf("Available Video Drivers:\n");

    for (int i = 0; i < numDrivers; ++i) {
        const char *driverName = SDL_GetVideoDriver(i);
        printf("%d. %s\n", i + 1, driverName);
    }
}

int main(int argc, char* argv[]) {
    // Print available video drivers
    printAvailableVideoDrivers();

    // Set the desired video driver (x11 in this case)
    // if (setenv("SDL_VIDEODRIVER", "KMSDRM", 1) != 0) {
    //     printf("Failed to set SDL_VIDEODRIVER environment variable!\n");
    //     return 1;
    // }

    // Initialize SDL
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
        return 1;
    }

    // Get and print the current video driver
    const char *currentDriver = SDL_GetCurrentVideoDriver();
    printf("Current Video Driver: %s\n", currentDriver);

    // Create a window
    SDL_Window* window = SDL_CreateWindow("Green Rectangle", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
    if (window == NULL) {
        printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
        return 1;
    }

    // Create a renderer
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if (renderer == NULL) {
        printf("Renderer could not be created! SDL_Error: %s\n", SDL_GetError());
        return 1;
    }

    // Set the draw color to green
    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);

    // Create a green rectangle
    SDL_Rect rect = {100, 100, 200, 200};

    // Main loop
    int quit = 0;
    SDL_Event event;
    while (!quit) {
        // Handle events
        handleEvents(&event, &quit);

        // Clear the screen
        SDL_RenderClear(renderer);

        // Draw the green rectangle
        SDL_RenderFillRect(renderer, &rect);

        // Update the screen
        SDL_RenderPresent(renderer);

        // Add a small delay to avoid high CPU usage
        SDL_Delay(10);
    }

    // Clean up
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}
  1. Compile: aarch64-buildroot-linux-gnu-gcc -o test_sdl2 test_sdl2.c -lSDL2

Cross compile using Makefile

CC = x86_64-linux-gnu-gcc-12
EXE = test_sdl2
# CC = aarch64-buildroot-linux-gnu-gcc
# EXE = test_sdl2_arm64
# CC = arm-buildroot-linux-gnueabihf-gcc
# EXE = test_sdl2_arm

SYSROOT = $(shell $(CC) -print-sysroot)
SDLCONFIG = $(SYSROOT)/usr/bin/sdl2-config
PKGCONFIG = $(SYSROOT)/usr/bin/pkg-config

CFLAGS = -Wall -Wformat `$(SDLCONFIG) --cflags`
LIBS = -s `$(SDLCONFIG) --libs`

all:
	$(CC) -o $(EXE) test_sdl2.c $(CFLAGS) $(LIBS)

Add new system

nano /recalbox/share/system/.emulationstation/systemlist.xml

<?xml version="1.0" ?>
<systemList>
  <system uuid="novancd6-ebaa-4925-864a-46c84b0dc001" name="ikemen" fullname="Ikemen Go">
    <descriptor command="/usr/bin/Ikemen_GO_Linux_RG353P -game %ROM%" path="%ROOT%/ikemen" theme="dos" extensions=".game" icon="$F2d7" downloader="0"/>
    <scraper screenscraper="223"/>
    <properties type="engine" pad="mandatory" keyboard="optional" mouse="no" lightgun="no" releasedate="2011-12" manufacturer="Ikemen" retroachievements="0" crt.multiresolution="0" crt.multiregion="0" ignoredfiles=""/>
    <emulatorList>
      <emulator name="ikemen">
        <core name="ikemen" priority="1" extensions=".game" netplay="0" softpatching="0" compatibility="high" speed="high" crt.available="1"/>
      </emulator>
    </emulatorList>
  </system>
  <system uuid="novancd6-ebaa-4925-864a-46c84b0dc003" name="love" fullname="Love 2D Engine">
    <descriptor command="/usr/bin/love %ROM%" path="%ROOT%/love" theme="dos" extensions=".zip .love" icon="$F2d7" downloader="0"/>
    <scraper screenscraper="223"/>
    <properties type="engine" pad="mandatory" keyboard="optional" mouse="no" lightgun="no" releasedate="2011-12" manufacturer="Ikemen" retroachievements="0" crt.multiresolution="0" crt.multiregion="0" ignoredfiles=""/>
    <emulatorList>
      <emulator name="love">
        <core name="love" priority="1" extensions=".zip .love" netplay="0" softpatching="0" compatibility="high" speed="high" crt.available="1"/>
      </emulator>
    </emulatorList>
  </system>
  <system uuid="novancd6-ebaa-4925-864a-46c84b0dc002" name="addon" fullname="Add-On">
    <descriptor command="/bin/bash %ROM%" path="%ROOT%/addon" theme="dos" extensions=".sh" icon="$F2d7" downloader="0"/>
    <scraper screenscraper="223"/>
    <properties type="engine" pad="mandatory" keyboard="optional" mouse="no" lightgun="no" releasedate="2011-12" manufacturer="Linux" retroachievements="0" crt.multiresolution="0" crt.multiregion="0" ignoredfiles=""/>
    <emulatorList>
      <emulator name="bash">
        <core name="bash" priority="1" extensions=".sh" netplay="0" softpatching="0" compatibility="high" speed="high" crt.available="1"/>
      </emulator>
    </emulatorList>
  </system>
</systemList>

Compatibility Layer SDL 1.2 in Recalbox

In Recalbox OS, using Custom Front-End: Emulation Station. It only launchs SDL2 application. SDL1.2 application can not be launched in this front-end. So to be enable run SDL1.2 application, it needs specific for library sdl1.2 https://github.com/libsdl-org/sdl12-compat. Binary for aarch64 is not provided in official SDL repository. So we need to build it manually and replace sdl1.2 binary in RG353P.

Preparing docker image:

Build docker image (once): docker build -t "recalbox-dev" .
Edit launcher without building docker image again and again:
nano /home/ark/recalbox-rpi4_64/scripts/linux/recaldocker.sh
Remove this line: docker build -t "recalbox-dev" .

Build recalbox image:

export ARCH="rpi4_64"
export ARCH="rg353x"
export RECALBOX_VERSION="9.1-Pulstar"
export PACKAGE="recalbox-emulationstation2"

git clone https://gitlab.com/recalbox/recalbox.git recalbox-${ARCH}
cd recalbox-${ARCH}

./scripts/linux/recaldocker.sh bash
  make recalbox-rg353x_defconfig
  make menuconfig
  choose:
    System configuration: Enable root login with password (linux) **(fail)**
    Change local time: Asia/Jakarta **(fail)**
    Target packages > Shell and utilitie > file
    Target packages > System tools > psmisc
    Target packages > Development tools > binutils (binaries) **(fail)**
    Target packages > Text editors and viewers > mc
    Target packages > Interpreter languages and scripting > Lua libraries/modules : luafilesystem, lua-cjson
  make BR2_DL_DIR="/share/dl"
  exit
OR ./scripts/linux/recaldocker.sh
cp output/images/recalbox/recalbox-rg353x.img.xz /mnt/e/Anbernic/RG353P/recalbox-rg353x-dev.img.xz
cp output/images/recalbox/recalbox-rpi4_64.img.xz /mnt/e/Raspberry/recalbox/recalbox-rpi4_64.novan.img.xz

Editing and rebuilt a package:

nano projects/frontend/es-app/src/MainRunner.cpp
rm -r output/build/recalbox-emulationstation2-custom
./scripts/linux/recaldocker.sh bash
  make BR2_DL_DIR="/share/dl"
  exit
OR ./scripts/linux/recaldocker.sh
cp output/images/recalbox/recalbox-rg353x.img.xz /mnt/e/Anbernic/RG353P/recalbox-rg353x-dev.img.xz
cp output/images/recalbox/recalbox-rpi4_64.img.xz /mnt/e/Raspberry/recalbox-rpi4_64.novan.img.xz

Build emulationstation only in Ubuntu Shell (without docker)

cd /home/ark/recalbox-rpi4_64/output/build/recalbox-emulationstation2-custom/
rm -f CMakeCache.txt
PATH="/home/ark/recalbox-rpi4_64/output/host/bin:/home/ark/recalbox-rpi4_64/output/host/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"  /home/ark/recalbox-rpi4_64/output/host/bin/cmake /home/ark/recalbox-rpi4_64/output/build/recalbox-emulationstation2-custom/ -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE="/home/ark/recalbox-rpi4_64/output/host/share/buildroot/toolchainfile.cmake" -DCMAKE_INSTALL_PREFIX="/usr" -DCMAKE_INSTALL_RUNSTATEDIR="/run" -DCMAKE_COLOR_MAKEFILE=OFF -DBUILD_DOC=OFF -DBUILD_DOCS=OFF -DBUILD_EXAMPLE=OFF -DBUILD_EXAMPLES=OFF -DBUILD_TEST=OFF -DBUILD_TESTS=OFF -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON  -DCMAKE_C_ARCHIVE_CREATE="<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>" -DCMAKE_C_ARCHIVE_FINISH=true -DCMAKE_CXX_ARCHIVE_CREATE="<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>" -DCMAKE_CXX_ARCHIVE_FINISH=true -DCMAKE_AR="/home/ark/recalbox-rpi4_64/output/host/bin/aarch64-buildroot-linux-gnu-gcc-ar" -DCMAKE_C_COMPILER="/home/ark/recalbox-rpi4_64/output/host/bin/aarch64-buildroot-linux-gnu-gcc" -DCMAKE_CXX_COMPILER="/home/ark/recalbox-rpi4_64/output/host/bin/aarch64-buildroot-linux-gnu-g++" -DCMAKE_LINKER="/home/ark/recalbox-rpi4_64/output/host/bin/aarch64-buildroot-linux-gnu-ld" -DCMAKE_C_FLAGS="  -mabi="lp64" -mabi="lp64" -mcpu="cortex-a72" -mcpu="cortex-a72"     -mabi="lp64" -mabi="lp64" -mcpu="cortex-a72" -mcpu="cortex-a72"    -O3 -O3 -fdata-sections -ffunction-sections -Wl,--gc-sections -fdata-sections -ffunction-sections -Wl,--gc-sections  -fdata-sections -ffunction-sections -Wl,--gc-sections -fdata-sections -ffunction-sections -Wl,--gc-sections " -DCMAKE_CXX_FLAGS="  -mabi="lp64" -mabi="lp64" -mcpu="cortex-a72" -mcpu="cortex-a72"     -mabi="lp64" -mabi="lp64" -mcpu="cortex-a72" -mcpu="cortex-a72"    -O3 -O3 -fdata-sections -ffunction-sections -Wl,--gc-sections -fdata-sections -ffunction-sections -Wl,--gc-sections  -fdata-sections -ffunction-sections -Wl,--gc-sections -fdata-sections -ffunction-sections -Wl,--gc-sections " -DCMAKE_LINKER_EXE_FLAGS=" -mabi="lp64" -mabi="lp64" -mcpu="cortex-a72" -mcpu="cortex-a72"     -mabi="lp64" -mabi="lp64" -mcpu="cortex-a72" -mcpu="cortex-a72"    -O3 -O3 -fdata-sections -ffunction-sections -Wl,--gc-sections -fdata-sections -ffunction-sections -Wl,--gc-sections  -fdata-sections -ffunction-sections -Wl,--gc-sections -fdata-sections -ffunction-sections -Wl,--gc-sections " -DOPTION_RECALBOX_PRODUCTION_BUILD=true -DUSE_KMSDRM=ON
make -j8

Editing and rebuilt emulationstation package (inside docker):

./scripts/linux/recaldocker.sh bash #enter docker

TZ='Asia/Jakarta'; export TZ
touch projects/frontend/es-app/src/guis/menus/GuiMenuBase.cpp
cd /home/ark/recalbox-rpi4_64/output/build/recalbox-emulationstation2-custom
rsync -vau --chmod=u=rwX,go=rX  --exclude .svn --exclude .git --exclude .hg --exclude .bzr --exclude CVS /home/ark/recalbox-rpi4_64/buildroot/../projects/frontend/ /home/ark/recalbox-rpi4_64/output/build/recalbox-emulationstation2-custom
make

output: /home/ark/recalbox-rpi4_64/output/build/recalbox-emulationstation2-custom/emulationstation

Clone, editing and build emulationstation package (from docker):

./scripts/linux/recaldocker.sh bash #enter docker in docker shell:

cd /home/ark/recalbox-rg353x/output/build/recalbox-emulationstation2-custom
7z a recalbox-emulationstation.7z recalbox-emulationstation2-custom

in host shell:

cd recalbox-rg353x
cp recalbox-emulationstation.7z /mnt/f/project
# extract recalbox-emulationstation.7z
cd recalbox-rg353x
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ cmake .
make -j8

Install emulationstation binary in device (after sftp)

es stop
mount -o remount,rw /
mv emulationstation /usr/bin/emulationstation
chmod a+x /usr/bin/emulationstation
es start

for monitoring log
tail -f -s 1 /recalbox/share/system/logs/frontend.log

check

cat /recalbox/share/system/logs/es_event_script.log
ls -l /recalbox/share/roms/fbneo/media/images/
cat /recalbox/share/roms/fbneo/gamelist.xml | grep image
nano /recalbox/share/roms/fbneo/gamelist.xml

Disable tar image

Edit file recalbox/copy-recalbox-archives.sh and comment these lines.
nano /home/ark/recalbox-rpi4_64/board/recalbox/copy-recalbox-archives.sh

# generate recalbox.tar.xz (formerly boot.tar.xz)
# echo "Generating tar"
# generate_recalbox_tar_xz "${BINARIES_DIR}/boot-data/" "${RECALBOX_BINARIES_DIR}/recalbox-${RECALBOX_TARGET_LOWER}.tar
#       { echo "ERROR : unable to create recalbox.tar.xz" && exit 1 ; }

TODO

  1. Disable automatic OS update
  2. Turn off music in ES
  3. Disable splash
  4. Change Storage Device to 2nd-Slot sdcard
  5. Setting WIFI
  6. Speed up boot: disable few process at boot

Custom Firmware by myself

  1. Add scrape local (screenshot)
  2. Fix event for custom script
  3. Add lua support for scripting in ES Event
  4. Fix icon no_image
  5. Enable / Disable splash screen
  6. Add log viewer
  7. Simplify menu

Pad to Keyboard Mapping (.p2k)

Install for a directory:

cd /recalbox/share/roms/love/
nano nano .p2k.cfg
# dpad to arrow keys
0:up = up
0:down = down
0:right = right
0:left = left

# button A to SPACE
0:a = space
# B to Y key (for Y/N prompts)
0:b = y
# And finally, map START button to ENTER
0:start = enter

Source information: es-app/src/padtokeyboard/pad/MappingConfiguration.cpp

PAD:
    { __STRL("up"      ), PadItems::Up            }, //!< DPad Up direction
    { __STRL("right"   ), PadItems::Right         }, //!< DPad Right direction
    { __STRL("down"    ), PadItems::Down          }, //!< DPad Down direction
    { __STRL("left"    ), PadItems::Left          }, //!< DPad Left direction
    { __STRL("a"       ), PadItems::A             }, //!< A Button
    { __STRL("b"       ), PadItems::B             }, //!< B Button
    { __STRL("x"       ), PadItems::X             }, //!< X Button
    { __STRL("y"       ), PadItems::Y             }, //!< Y Button
    { __STRL("l1"      ), PadItems::L1            }, //!< L1 Button/Trigger
    { __STRL("r1"      ), PadItems::R1            }, //!< R1 Button/Trigger
    { __STRL("l2"      ), PadItems::L2            }, //!< L2 Button/Trigger
    { __STRL("r2"      ), PadItems::R2            }, //!< R2 Button/Trigger
    { __STRL("l3"      ), PadItems::L3            }, //!< L3 Button/Trigger
    { __STRL("r3"      ), PadItems::R3            }, //!< R3 Button/Trigger
    { __STRL("start"   ), PadItems::Start         }, //!< Start button
    { __STRL("select"  ), PadItems::Select        }, //!< Select button
    { __STRL("hotkey"  ), PadItems::Hotkey        }, //!< Hotkey (or Home) button
    { __STRL("j1up"    ), PadItems::J1Up          }, //!< Joystick 1 (left) Up position
    { __STRL("j1right" ), PadItems::J1Right       }, //!< Joystick 1 (left) Right position
    { __STRL("j1down"  ), PadItems::J1Down        }, //!< Joystick 1 (left) Down position
    { __STRL("j1left"  ), PadItems::J1Left        }, //!< Joystick 1 (left) Left position
    { __STRL("j2up"    ), PadItems::J2Up          }, //!< Joystick 2 (right) Uo positio
    { __STRL("j2right" ), PadItems::J2Right       }, //!< Joystick 2 (right) Right position
    { __STRL("j2down"  ), PadItems::J2Down        }, //!< Joystick 2 (right) Down position
    { __STRL("j2left"  ), PadItems::J2Left        }, //!< Joystick 2 (right) Left position
    { __STRL("+up"     ), PadItems::HotKeyUp      }, //!< DPad Up direction
    { __STRL("+right"  ), PadItems::HotKeyRight   }, //!< DPad Right direction
    { __STRL("+down"   ), PadItems::HotKeyDown    }, //!< DPad Down direction
    { __STRL("+left"   ), PadItems::HotKeyLeft    }, //!< DPad Left direction
    { __STRL("+a"      ), PadItems::HotKeyA       }, //!< A Button
    { __STRL("+b"      ), PadItems::HotKeyB       }, //!< B Button
    { __STRL("+x"      ), PadItems::HotKeyX       }, //!< X Button
    { __STRL("+y"      ), PadItems::HotKeyY       }, //!< Y Button
    { __STRL("+l1"     ), PadItems::HotKeyL1      }, //!< L1 Button/Trigger
    { __STRL("+r1"     ), PadItems::HotKeyR1      }, //!< R1 Button/Trigger
    { __STRL("+l2"     ), PadItems::HotKeyL2      }, //!< L2 Button/Trigger
    { __STRL("+r2"     ), PadItems::HotKeyR2      }, //!< R2 Button/Trigger
    { __STRL("+l3"     ), PadItems::HotKeyL3      }, //!< L3 Button/Trigger
    { __STRL("+r3"     ), PadItems::HotKeyR3      }, //!< R3 Button/Trigger
    { __STRL("+start"  ), PadItems::HotKeyStart   }, //!< R3 Button/Trigger
    { __STRL("+j1up"   ), PadItems::HotKeyJ1Up    }, //!< Joystick 1 (left) Up position
    { __STRL("+j1right"), PadItems::HotKeyJ1Right }, //!< Joystick 1 (left) Right position
    { __STRL("+j1down" ), PadItems::HotKeyJ1Down  }, //!< Joystick 1 (left) Down position
    { __STRL("+j1left" ), PadItems::HotKeyJ1Left  }, //!< Joystick 1 (left) Left position
    { __STRL("+j2up"   ), PadItems::HotKeyJ2Up    }, //!< Joystick 2 (right) Uo positio
    { __STRL("+j2right"), PadItems::HotKeyJ2Right }, //!< Joystick 2 (right) Right position
    { __STRL("+j2down" ), PadItems::HotKeyJ2Down  }, //!< Joystick 2 (right) Down position
    { __STRL("+j2left" ), PadItems::HotKeyJ2Left  }, //!< Joystick 2 (right) Left position

KEYBOARD:
esc: KEY_ESC
1: KEY_1
2: KEY_2
3: KEY_3
4: KEY_4
5: KEY_5
6: KEY_6
7: KEY_7
8: KEY_8
9: KEY_9
0: KEY_0
backspace: KEY_BACKSPACE
tab: KEY_TAB
q: KEY_Q
w: KEY_W
e: KEY_E
r: KEY_R
t: KEY_T
y: KEY_Y
u: KEY_U
i: KEY_I
o: KEY_O
p: KEY_P
enter:  KEY_ENTER
leftctrl:KEY_LEFTCTRL
a: KEY_A
s: KEY_S
d: KEY_D
f: KEY_F
g: KEY_G
h: KEY_H
j: KEY_J
k: KEY_K
l: KEY_L
leftshift: KEY_LEFTSHIFT
z: KEY_Z
x: KEY_X
c: KEY_C
v: KEY_V
b: KEY_B
n: KEY_N
m: KEY_M
rightshift:  KEY_RIGHTSHIFT
kpasterisk:  KEY_KPASTERISK
leftalt:KEY_LEFTALT
space:  KEY_SPACE
f1:  KEY_F1
f2:  KEY_F2
f3:  KEY_F3
f4:  KEY_F4
f5:  KEY_F5
f6:  KEY_F6
f7:  KEY_F7
f8:  KEY_F8
f9:  KEY_F9
f10: KEY_F10
kp7: KEY_KP7
kp8: KEY_KP8
kp9: KEY_KP9
kpminus:KEY_KPMINUS
kp4: KEY_KP4
kp5: KEY_KP5
kp6: KEY_KP6
kpplus: KEY_KPPLUS
kp1: KEY_KP1
kp2: KEY_KP2
kp3: KEY_KP3
kp0: KEY_KP0
kpdot:  KEY_KPDOT
f11: KEY_F11
f12: KEY_F12
kpenter:KEY_KPENTER
rightctrl: KEY_RIGHTCTRL
kpslash:KEY_KPSLASH
rightalt:KEY_RIGHTALT
home:KEY_HOME
up:  KEY_UP
pageup: KEY_PAGEUP
left:KEY_LEFT
right:  KEY_RIGHT
end: KEY_END
down:KEY_DOWN
pagedown:KEY_PAGEDOWN
break:  KEY_BREAK
insert: KEY_INSERT
delete: KEY_DELETE
s01: KEY_GRAVE
s02: KEY_MINUS
s03: KEY_EQUAL
s04: KEY_LEFTBRACE
s05: KEY_RIGHTBRACE
s06: KEY_SEMICOLON
s07: KEY_APOSTROPHE
s08: KEY_BACKSLASH
s09: KEY_COMMA
s10: KEY_DOT
s11: KEY_SLASH
// Mouse button
mouse.button.left: BTN_LEFT
mouse.button.middle: BTN_MIDDLE
mouse.button.right:  BTN_RIGHT
// Mouse move
mouse.move.up: (int)MouseMove::Up
mouse.move.down: (int)MouseMove::Down
mouse.move.left: (int)MouseMove::Left
mouse.move.right:(int)MouseMove::Right

Generate global systemlist.xml

# enter docker shell
./scripts/linux/recaldocker.sh bash

# generate global systemlist.xml
python3 package/recalbox-romfs2/scripts/romfs.py -systems package/recalbox-romfs2/systems -buildsystems output/target/recalbox/share_init/system/.emulationstation/systemlist.xml

# install default roms and its folder
python3 package/recalbox-romfs2/scripts/romfs.py -systems package/recalbox-romfs2/systems -installroms output/target/recalbox/

Generating images/recalbox files

Executing post-image script /home/ark/recalbox-rg353x/board/recalbox/copy-recalbox-archives.sh

Preparing genimage.cfg
Command: prepare_genimage_cfg /home/ark/recalbox-rg353x/board/recalbox/anbernic/rg353x/genimage.cfg

Generating image /home/ark/recalbox-rg353x/output/images/recalbox/recalbox.img
Command: generate_recalbox_img /home/ark/recalbox-rg353x/output/target /home/ark/recalbox-rg353x/output/images /home/ark/recalbox-rg353x/output/images/recalbox /home/ark/recalbox-rg353x/output/build/genimage.tmp
⚠️ **GitHub.com Fallback** ⚠️