mirror of
https://github.com/archr-linux/Arch-R.git
synced 2026-07-12 18:19:42 -07:00
Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c9fa2ae9d3 | |||
| faa9c6f6c4 | |||
| 14db5f1ffb | |||
| b29af12832 | |||
| 9723e3e09c | |||
| c1b9f27838 | |||
| 2d04170214 | |||
| 01bfa9a5c7 | |||
| 8275879350 | |||
| ccb3eaaa86 | |||
| 330c4199a6 | |||
| 8b0f09c43e | |||
| 6faa39c570 | |||
| 56cd1626d6 | |||
| f99aff1149 | |||
| 5f1f6182cf | |||
| a0a45889f4 | |||
| 34b76db065 | |||
| 62edc065ad | |||
| 205c5bccb3 | |||
| 8aacf5c823 | |||
| bd6fb8d0a9 | |||
| 0be7aab31b | |||
| df92325273 | |||
| 4385a37cbf | |||
| 413b62304b | |||
| 5c5dcd3c4a | |||
| a30e6ea7f5 | |||
| d652e2d7bd | |||
| 39e4a5ebcf | |||
| 6794a56987 | |||
| d80eb6c482 | |||
| 235f113c25 | |||
| 1d892b9231 | |||
| 3cd958e549 | |||
| 6a66a44a8e | |||
| fd304683a3 | |||
| 492a61eee2 | |||
| 94d26a87fd | |||
| 88647c6e07 | |||
| 9de9224f80 | |||
| 2424c658de | |||
| 45dd6ff144 | |||
| a738af646b |
@@ -118,7 +118,12 @@ docker-image-pull:
|
||||
# Runs host-side on purpose: the website repo is not mounted into the build
|
||||
# container. The sync script is itself non-fatal, and the guard keeps it off
|
||||
# non-build docker targets (docker-shell, docker-update, ...).
|
||||
# Before any docker build, fail fast if the three shipped input-config
|
||||
# artifacts drifted from the per-pad definitions (see projects/ArchR/inputs).
|
||||
# Verification only: the build never rewrites the artifacts by itself.
|
||||
docker-%:
|
||||
@./projects/ArchR/inputs/gen-input-configs verify >/dev/null || \
|
||||
{ ./projects/ArchR/inputs/gen-input-configs verify; exit 1; }
|
||||
./scripts/get_env > .env
|
||||
BUILD_DIR="$(DOCKER_WORK_DIR)" $(DOCKER_CMD) run $(PODMAN_ARGS) $(INTERACTIVE) --init --env-file .env --rm --user $(UID):$(GID) $(GLOBAL_SETTINGS) $(LOCAL_SSH_KEYS_FILE) $(EMULATIONSTATION_SRC) -v "$(PWD)":"$(DOCKER_WORK_DIR)" -v /tmp:/tmp -w "$(DOCKER_WORK_DIR)" $(DOCKER_EXTRA_OPTS) $(DOCKER_IMAGE) $(COMMAND)
|
||||
@if [ "$*" = "RK3326" ]; then ./scripts/repo/sync-site-bases; fi
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<strong>Arch Linux-based gaming distribution for handheld devices.</strong>
|
||||
<strong>Arch Linux gaming distribution for handheld devices.</strong>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -14,22 +14,27 @@
|
||||
|
||||
---
|
||||
|
||||
Arch R is a custom Linux distribution for the **R36S** handheld gaming console and all its variants, built on top of [ROCKNIX](https://github.com/ROCKNIX/distribution) with an **Arch Linux-based** build environment. It supports **16 board profiles** and **20 display panels** across original and clone hardware.
|
||||
Arch R is an **Arch Linux** distribution for the **R36S** handheld gaming console and its many variants. In the same spirit as SteamOS, it pairs a genuine Arch userland (pacman, systemd, up-to-date packages) with a curated console experience: flash it, turn the device on, play. System updates are delivered through the built-in updater, kernel included; reflashing is only needed for a fresh install or recovery.
|
||||
|
||||
The image build pipeline descends from the LibreELEC family of embedded build systems (through JELOS and ROCKNIX), but the operating system it assembles is Arch Linux ARM, not a JELOS derivative.
|
||||
|
||||
## Features
|
||||
|
||||
- Arch Linux-based build system with Docker support.
|
||||
- Kernel 6.12 LTS with board auto-detection via SARADC.
|
||||
- Mesa Panfrost open-source GPU driver (GLES 3.1, no proprietary blobs).
|
||||
- EmulationStation frontend with RetroArch and 18+ cores pre-installed.
|
||||
- Full audio support with speaker/headphone auto-switch.
|
||||
- Battery monitoring with capacity reporting and LED warning.
|
||||
- 43 pre-generated MIPI panel overlays (15 original + 18 clone + 10 soysauce variants), one per motherboard revision.
|
||||
- Genuine Arch Linux ARM base with pacman and signed package repositories (stable, next and dev channels).
|
||||
- Built-in system updater in EmulationStation; kernel and device trees update through it too, with checksum-verified writes to the boot partition.
|
||||
- Mainline kernel 6.12 LTS with board auto-detection via SARADC.
|
||||
- Memory clock trained at 666MHz from boot (twice the BSP-era default) and tuned Mali-G31 graphics.
|
||||
- EmulationStation frontend with RetroArch and 18+ cores pre-installed, plus PortMaster.
|
||||
- Full audio support with speaker/headphone auto-switch across board revisions.
|
||||
- Power button light sleep: screen and backlight fully off, instant wake.
|
||||
- Power LED control (on, off, heartbeat) on every supported family.
|
||||
- USB WiFi dongle support, including the common RTL8188EUS family (TP-Link, Edimax).
|
||||
- MIPI panel overlays for every known motherboard revision, generated on demand by the online overlay generator at https://arch-r.io/overlay-generator/ (or during flashing by the Arch R Flasher). The generator also extracts board-specific wiring (audio amplifier, jack detect, LEDs, PMIC interrupt) from your stock DTB.
|
||||
- Separate images for original and clone boards, both with hardware auto-detection.
|
||||
- Integrated cross-device local and remote network play.
|
||||
- Fine-grained control for battery life and performance.
|
||||
- Bluetooth audio and controller support.
|
||||
- HDMI audio/video output, USB audio.
|
||||
- Bluetooth audio and controller support (via USB Bluetooth adapter; the boards have no internal radio).
|
||||
- USB audio devices (DACs, headsets, controllers with audio).
|
||||
- Device sync with Syncthing and rclone.
|
||||
- VPN support with WireGuard, Tailscale, and ZeroTier.
|
||||
- Built-in scraping and RetroAchievements.
|
||||
@@ -40,17 +45,16 @@ Arch R is a custom Linux distribution for the **R36S** handheld gaming console a
|
||||
|
||||
| Board | Image |
|
||||
|-------|-------|
|
||||
| R36S (original), R33S | Original |
|
||||
| R36S (original), R33S, R36S Soysauce | Original |
|
||||
| Odroid Go Advance / v1.1 / Super | Original |
|
||||
| Anbernic RG351V / RG351M | Original |
|
||||
| GameForce Chi, MagicX XU10 | Original |
|
||||
| K36 / R36S clones / EE Clone | Clone |
|
||||
| Powkiddy RGB10 / RGB10X / RGB20S | Clone |
|
||||
| MagicX XU-Mini-M, BatLexp G350 | Clone |
|
||||
| GameForce Chi, MagicX XU10, Powkiddy RGB10 | Original |
|
||||
| K36 / R36S V20 clones / EE Clone | Clone |
|
||||
| Powkiddy RGB10X, MagicX XU-Mini-M | Clone |
|
||||
|
||||
### Display Panels
|
||||
|
||||
Arch R ships 43 pre-generated MIPI panel overlays covering all known R36S display variants, named after the exact motherboard revision (e.g. `R36S-V21_2024-12-18_2551.dtbo`, `G80CA-MB_V1.3-20251212_Panel_8.dtbo`). Panel selection is done by copying the correct `.dtbo` file to `overlays/mipi-panel.dtbo` on the boot partition. Sources live under `config/archr-dts/{original,clone,soysauce}/<MB-revision>/`; the build extracts the panel description from each revision's `rk3326-r36s-linux.dtb` via `config/mipi-generator/generator.sh`.
|
||||
Panel overlays are not baked into the images. Generate the overlay for your exact motherboard revision at the online generator, https://arch-r.io/overlay-generator/ (pick your board, or upload the stock `dtb` from the SD card that shipped with the device), then copy the resulting file to `overlays/mipi-panel.dtbo` on the boot partition. The Arch R Flasher can also generate and install the overlay during flashing. The `/flash/overlays/` folder on a fresh install contains a `README.txt` with the same instructions.
|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -59,15 +63,22 @@ Download the latest images from [Releases](https://github.com/archr-linux/Arch-R
|
||||
- **Original image** -- for genuine R36S and compatible boards.
|
||||
- **Clone image** -- for K36 clones and compatible boards.
|
||||
|
||||
Flash to a MicroSD card:
|
||||
The easiest path is the [Arch R Flasher](https://github.com/archr-linux/archr-flasher), which downloads, verifies, flashes and installs your panel overlay in one go. Manual flashing works too:
|
||||
|
||||
```bash
|
||||
xz -d ArchR-R36S-*.img.xz
|
||||
gzip -d ArchR-R36S-*.img.gz
|
||||
sudo dd if=ArchR-R36S-*.img of=/dev/sdX bs=4M status=progress
|
||||
sync
|
||||
```
|
||||
|
||||
Insert the SD card and power on. The correct board DTB is selected automatically.
|
||||
Always verify the download against the published `SHA256SUMS` before flashing. Insert the SD card and power on; the correct board DTB is selected automatically.
|
||||
|
||||
## Updates
|
||||
|
||||
- **In place (default after install)**: EmulationStation > Updates, or `archr-update` over SSH. Updates come from the signed pacman repository; after each transaction the boot partition is synchronized automatically, so kernel and device-tree fixes arrive without reflashing. User overlays and configuration are never touched.
|
||||
- **Reflash**: for fresh installs, recovery, or the rare low-level bootloader change (TPL/U-Boot, e.g. a DDR frequency change), which lives outside the filesystem.
|
||||
|
||||
Release channel is configurable (stable, next, dev) under updates settings.
|
||||
|
||||
## Building from Source
|
||||
|
||||
@@ -90,7 +101,7 @@ make docker-image-build
|
||||
make docker-RK3326
|
||||
```
|
||||
|
||||
Output images are generated in `target/`.
|
||||
Output images are generated in `target/`. Add `OFFICIAL=yes` for release-stamped images.
|
||||
|
||||
### Build Commands
|
||||
|
||||
@@ -105,23 +116,23 @@ Output images are generated in `target/`.
|
||||
|
||||
Arch R separates **board configuration** from **panel configuration**:
|
||||
|
||||
- **Board DTB** = hardware profile (GPIOs, PMIC, joypad, audio codec). Selected automatically by U-Boot via SARADC.
|
||||
- **Panel overlay** = display init sequence and timings. Applied on top of the board DTB at boot time.
|
||||
- **Board DTB** = hardware profile (GPIOs, PMIC, joypad, audio codec). Selected automatically by U-Boot via SARADC. One generic DTB per hardware family; board-revision differences are carried by the overlay.
|
||||
- **Panel overlay** = display init sequence, timings and board-specific wiring extracted from the stock DTB. Applied on top of the board DTB at boot time.
|
||||
|
||||
This means the same image works on all boards of a variant. Only the panel overlay needs to match the specific display.
|
||||
This means the same image works on all boards of a variant. Only the overlay needs to match the specific device.
|
||||
|
||||
### Boot Flow
|
||||
|
||||
```
|
||||
Power On
|
||||
U-Boot (BSP or mainline)
|
||||
boot.scr: read SARADC hwrev, select board DTB
|
||||
U-Boot (mainline, legacy BSP loader for clone boards)
|
||||
boot script: read SARADC hwrev, select board DTB
|
||||
sysboot: load kernel + DTB + overlay from extlinux.conf
|
||||
Kernel 6.12 + initramfs
|
||||
mount root (ext4) + storage
|
||||
mount root (ext4) + storage, resolved by partition label
|
||||
switch_root to systemd
|
||||
systemd
|
||||
archr-autostart (quirks, governors, audio)
|
||||
archr-autostart (quirks by device-tree model, governors, audio)
|
||||
EmulationStation
|
||||
```
|
||||
|
||||
@@ -130,7 +141,7 @@ Power On
|
||||
| Partition | Filesystem | Label | Purpose |
|
||||
|-----------|-----------|-------|---------|
|
||||
| 1 | FAT32 | ARCHR | Boot (kernel, DTBs, overlays, boot.scr) |
|
||||
| 2 | ext4 | ARCHR_ROOT | Root filesystem |
|
||||
| 2 | ext4 | ARCHR_ROOT | Root filesystem (Arch Linux ARM) |
|
||||
| 3 | ext4 | STORAGE | User data, ROMs, configs |
|
||||
|
||||
## Community
|
||||
@@ -139,7 +150,7 @@ Contributions are welcome. Please open issues or pull requests on [GitHub](https
|
||||
|
||||
## Licenses
|
||||
|
||||
**Arch R** is a fork of [ROCKNIX](https://github.com/ROCKNIX/distribution), which is a fork of [JELOS](https://github.com/JustEnoughLinuxOS/distribution/). All upstream licenses apply.
|
||||
The Arch R operating system is Arch Linux ARM plus original Arch R software. The image build tooling in this repository descends from [ROCKNIX](https://github.com/ROCKNIX/distribution) and [JELOS](https://github.com/JustEnoughLinuxOS/distribution/); the licenses of that inherited tooling continue to apply to the portions derived from it.
|
||||
|
||||
You are free to:
|
||||
|
||||
@@ -168,12 +179,12 @@ Like any Linux distribution, this project is not the work of one person. It is t
|
||||
|
||||
Special thanks to:
|
||||
|
||||
- **[ROCKNIX](https://github.com/ROCKNIX/distribution)** -- the upstream distribution that Arch R is forked from. ROCKNIX provided the complete build system, device support, EmulationStation integration, and the foundation for handheld gaming on Linux.
|
||||
- **[JELOS](https://github.com/JustEnoughLinuxOS/distribution/)** -- the project that ROCKNIX was originally forked from.
|
||||
- **[CoreELEC](https://coreelec.org/)** and **[LibreELEC](https://libreelec.tv/)** -- the embedded Linux distributions whose build system forms the backbone of this project.
|
||||
- **[Arch Linux](https://archlinux.org/)** and **[Arch Linux ARM](https://archlinuxarm.org/)** -- the operating system Arch R is built on.
|
||||
- **[ROCKNIX](https://github.com/ROCKNIX/distribution)** and **[JELOS](https://github.com/JustEnoughLinuxOS/distribution/)** -- the projects whose build tooling and RK3326 device knowledge Arch R inherited and still learns from.
|
||||
- **[CoreELEC](https://coreelec.org/)** and **[LibreELEC](https://libreelec.tv/)** -- the embedded Linux distributions whose build system forms the backbone of the image pipeline.
|
||||
- **[Hardkernel](https://www.hardkernel.com/)** -- for the Odroid Go Advance BSP U-Boot and kernel device trees.
|
||||
- **[Rockchip](https://www.rock-chips.com/)** -- for the RK3326 SoC and rkbin firmware.
|
||||
- **[Mesa](https://mesa3d.org/)** -- for the Panfrost open-source GPU driver.
|
||||
- **[Rockchip](https://www.rock-chips.com/)** -- for the RK3326 SoC, rkbin firmware and the libmali GPU driver.
|
||||
- **[Mesa](https://mesa3d.org/)** -- for the open-source graphics stack.
|
||||
- **[RetroArch](https://www.retroarch.com/)** and **[Libretro](https://www.libretro.com/)** -- for the emulation framework and cores.
|
||||
- **[EmulationStation](https://emulationstation.org/)** -- for the frontend.
|
||||
- All developers and contributors across the open-source community who made this possible.
|
||||
|
||||
@@ -15,6 +15,22 @@
|
||||
this = "r33s";
|
||||
};
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&power_led_pin>;
|
||||
|
||||
led-0 {
|
||||
/* Mono blue power LED on GPIO2_B5 (BSP gpio77), active
|
||||
* low: the old JELOS quirk wrote 1 through the legacy
|
||||
* gpio sysfs to turn it off. sysfs name is blue:status. */
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
function = LED_FUNCTION_STATUS;
|
||||
gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_LOW>;
|
||||
default-state = "on";
|
||||
};
|
||||
};
|
||||
|
||||
builtin_gamepad: r33s_joypad {
|
||||
compatible = "archr-singleadc-joypad";
|
||||
pinctrl-names = "default";
|
||||
@@ -107,6 +123,12 @@
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
leds {
|
||||
power_led_pin: power-led-pin {
|
||||
rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
btns {
|
||||
btn_pins: btn-pins {
|
||||
rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>,
|
||||
|
||||
@@ -15,6 +15,23 @@
|
||||
this = "r36s";
|
||||
};
|
||||
|
||||
gpio-leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&power_led_pin>;
|
||||
|
||||
led-0 {
|
||||
/* Bicolor power LED behind a single line (BSP gpio77 =
|
||||
* GPIO2_B5): driving it high lights red, low shows the
|
||||
* green side, so there is no hardware "off". Exposed as
|
||||
* the red half; sysfs name is red:status. */
|
||||
color = <LED_COLOR_ID_RED>;
|
||||
function = LED_FUNCTION_STATUS;
|
||||
gpios = <&gpio2 RK_PB5 GPIO_ACTIVE_HIGH>;
|
||||
default-state = "off";
|
||||
};
|
||||
};
|
||||
|
||||
joypad: odroidgo3-joypad {
|
||||
compatible = "odroidgo3-joypad";
|
||||
pwms = <&pwm0 0 200000000 0>;
|
||||
@@ -202,6 +219,12 @@
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
leds {
|
||||
power_led_pin: power-led-pin {
|
||||
rockchip,pins = <2 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
btns {
|
||||
btn_pins: btn-pins {
|
||||
rockchip,pins = <1 RK_PB4 RK_FUNC_GPIO &pcfg_pull_up>,
|
||||
|
||||
@@ -24,20 +24,19 @@
|
||||
this = "soysauce";
|
||||
};
|
||||
|
||||
/* LED indicators (soysauce-specific) */
|
||||
/* LED indicators (soysauce-specific). Only the blue power LED is
|
||||
* GPIO-driven; the red one is hardwired to the charger IC (toggling
|
||||
* the old led-red node on GPIO0_A5 did nothing on hardware, so the
|
||||
* node was a phantom and got dropped). The line is active HIGH:
|
||||
* declaring it active low inverted the whole ES power LED menu
|
||||
* (off lit the LED, on darkened it, heartbeat looked normal). */
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
|
||||
led-red {
|
||||
gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>;
|
||||
label = "red";
|
||||
default-state = "off";
|
||||
};
|
||||
|
||||
led-blue {
|
||||
gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
|
||||
gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;
|
||||
label = "blue";
|
||||
default-state = "off";
|
||||
default-state = "on";
|
||||
};
|
||||
};
|
||||
|
||||
@@ -276,3 +275,16 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
/* The Soysauce routes the PMIC interrupt to GPIO0_A7, not the GPIO0_B2
|
||||
* the rest of the family uses (vendor DTB pmic_int pinctrl says pin 7).
|
||||
* With the wrong pin every rk817 interrupt is lost: power key, jack
|
||||
* detect, charger plug events and the suspend wake path (verified live:
|
||||
* /proc/interrupts stayed at zero across button presses). */
|
||||
&rk817 {
|
||||
interrupts = <RK_PA7 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
|
||||
&pmic_int {
|
||||
rockchip,pins = <0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>;
|
||||
};
|
||||
|
||||
@@ -2173,7 +2173,7 @@ CONFIG_MT7663_USB_SDIO_COMMON=m
|
||||
CONFIG_MT7663U=m
|
||||
CONFIG_MT7663S=m
|
||||
# CONFIG_MT7921S is not set
|
||||
# CONFIG_MT7921U is not set
|
||||
CONFIG_MT7921U=m
|
||||
# CONFIG_MT7925U is not set
|
||||
CONFIG_WLAN_VENDOR_MICROCHIP=y
|
||||
# CONFIG_WILC1000_SDIO is not set
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
# for a list of additional drivers see packages/linux-drivers
|
||||
# Space separated list is supported,
|
||||
# e.g. ADDITIONAL_DRIVERS="DRIVER1 DRIVER2"
|
||||
ADDITIONAL_DRIVERS="RTL8188EUS RTL8812AU RTL8814AU RTL8821AU RTL8821CU RTL88x2BU RTL8831 AIC8800 mali-bifrost"
|
||||
ADDITIONAL_DRIVERS="rk915 RTL8188EUS RTL8812AU RTL8814AU RTL8821AU RTL8821CU RTL88x2BU RTL8831 RTL8852BU RTL8852CU AIC8800 mali-bifrost"
|
||||
|
||||
# Additional Firmware to use ( )
|
||||
# Space separated list is supported,
|
||||
|
||||
+238
@@ -0,0 +1,238 @@
|
||||
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
|
||||
index 1bbff11..xxxxxxx 100644
|
||||
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c 2025-12-07 05:25:03.000000000 +0800
|
||||
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c 2026-03-24 08:32:09.772362168 +0800
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
+#include <linux/regulator/consumer.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
@@ -189,6 +190,8 @@
|
||||
* @port_id: flag for otg port or host port.
|
||||
* @suspended: phy suspended flag.
|
||||
* @vbus_attached: otg device vbus status.
|
||||
+ * @switch_gpio: GPIO descriptor for USB signal routing switch.
|
||||
+ * @ext_supply: regulator for external USB device power supply.
|
||||
* @host_disconnect: usb host disconnect status.
|
||||
* @bvalid_irq: IRQ number assigned for vbus valid rise detection.
|
||||
* @id_irq: IRQ number assigned for ID pin detection.
|
||||
@@ -209,6 +212,8 @@
|
||||
unsigned int port_id;
|
||||
bool suspended;
|
||||
bool vbus_attached;
|
||||
+ struct gpio_desc *switch_gpio;
|
||||
+ struct regulator *ext_supply;
|
||||
bool host_disconnect;
|
||||
int bvalid_irq;
|
||||
int id_irq;
|
||||
@@ -640,6 +645,24 @@
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Check if we should be in USB host mode.
|
||||
+ * Returns true if:
|
||||
+ * - EXTCON_USB_HOST is set, OR
|
||||
+ * - switch_gpio exists and is low (internal device mode)
|
||||
+ */
|
||||
+static bool rockchip_usb2phy_is_host_mode(struct rockchip_usb2phy *rphy,
|
||||
+ struct rockchip_usb2phy_port *rport)
|
||||
+{
|
||||
+ if (rphy->edev && extcon_get_state(rphy->edev, EXTCON_USB_HOST) > 0)
|
||||
+ return true;
|
||||
+
|
||||
+ if (rport->switch_gpio && gpiod_get_value_cansleep(rport->switch_gpio) == 0)
|
||||
+ return true;
|
||||
+
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static void rockchip_usb2phy_otg_sm_work(struct work_struct *work)
|
||||
{
|
||||
struct rockchip_usb2phy_port *rport =
|
||||
@@ -666,7 +689,7 @@
|
||||
rockchip_usb2phy_power_off(rport->phy);
|
||||
fallthrough;
|
||||
case OTG_STATE_B_IDLE:
|
||||
- if (extcon_get_state(rphy->edev, EXTCON_USB_HOST) > 0) {
|
||||
+ if (rockchip_usb2phy_is_host_mode(rphy, rport)) {
|
||||
dev_dbg(&rport->phy->dev, "usb otg host connect\n");
|
||||
rport->state = OTG_STATE_A_HOST;
|
||||
rockchip_usb2phy_power_on(rport->phy);
|
||||
@@ -740,7 +763,7 @@
|
||||
sch_work = true;
|
||||
break;
|
||||
case OTG_STATE_A_HOST:
|
||||
- if (extcon_get_state(rphy->edev, EXTCON_USB_HOST) == 0) {
|
||||
+ if (!rockchip_usb2phy_is_host_mode(rphy, rport)) {
|
||||
dev_dbg(&rport->phy->dev, "usb otg host disconnect\n");
|
||||
rport->state = OTG_STATE_B_IDLE;
|
||||
rockchip_usb2phy_power_off(rport->phy);
|
||||
@@ -1042,6 +1065,115 @@
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Helper to find OTG port
|
||||
+ */
|
||||
+static struct rockchip_usb2phy_port *
|
||||
+rockchip_usb2phy_find_switch_port(struct rockchip_usb2phy *rphy)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ for (i = 0; i < rphy->phy_cfg->num_ports; i++) {
|
||||
+ if (rphy->ports[i].port_id == USB2PHY_PORT_OTG)
|
||||
+ return &rphy->ports[i];
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+static ssize_t usb_switch_gpio_show(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
+{
|
||||
+ struct rockchip_usb2phy *rphy = dev_get_drvdata(dev);
|
||||
+ struct rockchip_usb2phy_port *rport;
|
||||
+
|
||||
+ rport = rockchip_usb2phy_find_switch_port(rphy);
|
||||
+ if (!rport || !rport->switch_gpio)
|
||||
+ return sysfs_emit(buf, "unsupported\n");
|
||||
+
|
||||
+ return sysfs_emit(buf, "%d\n",
|
||||
+ gpiod_get_value_cansleep(rport->switch_gpio));
|
||||
+}
|
||||
+
|
||||
+static ssize_t usb_switch_gpio_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ struct rockchip_usb2phy *rphy = dev_get_drvdata(dev);
|
||||
+ struct rockchip_usb2phy_port *rport;
|
||||
+ unsigned int val;
|
||||
+ int ret;
|
||||
+
|
||||
+ rport = rockchip_usb2phy_find_switch_port(rphy);
|
||||
+ if (!rport || !rport->switch_gpio)
|
||||
+ return -ENOTSUPP;
|
||||
+
|
||||
+ ret = kstrtouint(buf, 10, &val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ gpiod_set_value_cansleep(rport->switch_gpio, val ? 1 : 0);
|
||||
+ dev_info(dev, "switch_gpio set to %d\n", val ? 1 : 0);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+static DEVICE_ATTR_RW(usb_switch_gpio);
|
||||
+
|
||||
+static ssize_t usb_switch_ext_show(struct device *dev,
|
||||
+ struct device_attribute *attr, char *buf)
|
||||
+{
|
||||
+ struct rockchip_usb2phy *rphy = dev_get_drvdata(dev);
|
||||
+ struct rockchip_usb2phy_port *rport;
|
||||
+
|
||||
+ rport = rockchip_usb2phy_find_switch_port(rphy);
|
||||
+ if (!rport || !rport->ext_supply)
|
||||
+ return sysfs_emit(buf, "unsupported\n");
|
||||
+
|
||||
+ return sysfs_emit(buf, "%d\n", regulator_is_enabled(rport->ext_supply));
|
||||
+}
|
||||
+
|
||||
+static ssize_t usb_switch_ext_store(struct device *dev,
|
||||
+ struct device_attribute *attr,
|
||||
+ const char *buf, size_t count)
|
||||
+{
|
||||
+ struct rockchip_usb2phy *rphy = dev_get_drvdata(dev);
|
||||
+ struct rockchip_usb2phy_port *rport;
|
||||
+ unsigned int val;
|
||||
+ int ret;
|
||||
+
|
||||
+ rport = rockchip_usb2phy_find_switch_port(rphy);
|
||||
+ if (!rport || !rport->ext_supply)
|
||||
+ return -ENOTSUPP;
|
||||
+
|
||||
+ ret = kstrtouint(buf, 10, &val);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ if (val)
|
||||
+ ret = regulator_enable(rport->ext_supply);
|
||||
+ else
|
||||
+ ret = regulator_disable(rport->ext_supply);
|
||||
+
|
||||
+ if (ret) {
|
||||
+ dev_err(dev, "failed to %s ext-supply: %d\n",
|
||||
+ val ? "enable" : "disable", ret);
|
||||
+ return ret;
|
||||
+ }
|
||||
+ dev_info(dev, "ext-supply %s\n", val ? "enabled" : "disabled");
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+static DEVICE_ATTR_RW(usb_switch_ext);
|
||||
+
|
||||
+static struct attribute *rockchip_usb2phy_switch_attrs[] = {
|
||||
+ &dev_attr_usb_switch_gpio.attr,
|
||||
+ &dev_attr_usb_switch_ext.attr,
|
||||
+ NULL,
|
||||
+};
|
||||
+
|
||||
+static const struct attribute_group rockchip_usb2phy_switch_group = {
|
||||
+ .attrs = rockchip_usb2phy_switch_attrs,
|
||||
+};
|
||||
+
|
||||
static irqreturn_t rockchip_usb2phy_id_irq(int irq, void *data)
|
||||
{
|
||||
struct rockchip_usb2phy_port *rport = data;
|
||||
@@ -1281,6 +1413,34 @@
|
||||
|
||||
mutex_init(&rport->mutex);
|
||||
|
||||
+ /*
|
||||
+ * Get optional switch GPIO for USB signal routing.
|
||||
+ * Some devices use a GPIO to multiplex USB signals between
|
||||
+ * an external USB port and an internal device (like WiFi).
|
||||
+ * Default to internal device (GPIO low) on init.
|
||||
+ */
|
||||
+ rport->switch_gpio = devm_fwnode_gpiod_get(rphy->dev,
|
||||
+ of_fwnode_handle(child_np),
|
||||
+ "switch", GPIOD_OUT_LOW,
|
||||
+ "usb-switch");
|
||||
+ if (IS_ERR(rport->switch_gpio)) {
|
||||
+ if (PTR_ERR(rport->switch_gpio) != -ENOENT)
|
||||
+ dev_warn(rphy->dev, "failed to get switch GPIO: %ld\n",
|
||||
+ PTR_ERR(rport->switch_gpio));
|
||||
+ rport->switch_gpio = NULL;
|
||||
+ } else if (rport->switch_gpio) {
|
||||
+ gpiod_set_value_cansleep(rport->switch_gpio, 0);
|
||||
+ dev_info(rphy->dev, "USB switch GPIO initialized, default to internal device\n");
|
||||
+ }
|
||||
+
|
||||
+ rport->ext_supply = devm_regulator_get_optional(&rport->phy->dev, "ext");
|
||||
+ if (IS_ERR(rport->ext_supply)) {
|
||||
+ rport->ext_supply = NULL;
|
||||
+ } else if (rport->ext_supply) {
|
||||
+ regulator_enable(rport->ext_supply);
|
||||
+ dev_info(rphy->dev, "ext-supply regulator initialized, default enabled\n");
|
||||
+ }
|
||||
+
|
||||
rport->mode = of_usb_get_dr_mode_by_phy(child_np, -1);
|
||||
if (rport->mode == USB_DR_MODE_HOST ||
|
||||
rport->mode == USB_DR_MODE_UNKNOWN) {
|
||||
@@ -1480,6 +1640,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ /* Create sysfs for USB switch control */
|
||||
+ if (rockchip_usb2phy_find_switch_port(rphy)) {
|
||||
+ ret = sysfs_create_group(&dev->kobj, &rockchip_usb2phy_switch_group);
|
||||
+ if (ret)
|
||||
+ dev_warn(dev, "failed to create usb_switch sysfs: %d\n", ret);
|
||||
+ }
|
||||
+
|
||||
return PTR_ERR_OR_ZERO(provider);
|
||||
|
||||
put_child:
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
diff -ur linux-6.12.29/drivers/mmc/core/host.c linux_for_rk915/drivers/mmc/core/host.c
|
||||
--- linux-6.12.29/drivers/mmc/core/host.c 2025-05-18 06:25:00.000000000 +0000
|
||||
+++ linux_for_rk915/drivers/mmc/core/host.c 2025-06-28 17:43:59.825733795 +0000
|
||||
@@ -403,6 +403,8 @@
|
||||
host->caps2 |= MMC_CAP2_NO_SD;
|
||||
if (device_property_read_bool(dev, "no-mmc"))
|
||||
host->caps2 |= MMC_CAP2_NO_MMC;
|
||||
+ if (device_property_read_bool(dev, "supports-rk912"))
|
||||
+ host->caps2 |= MMC_CAP2_WIFI_RK912;
|
||||
if (device_property_read_bool(dev, "no-mmc-hs400"))
|
||||
host->caps2 &= ~(MMC_CAP2_HS400_1_8V | MMC_CAP2_HS400_1_2V |
|
||||
MMC_CAP2_HS400_ES);
|
||||
diff -ur linux-6.12.29/drivers/mmc/core/sdio.c linux_for_rk915/drivers/mmc/core/sdio.c
|
||||
--- linux-6.12.29/drivers/mmc/core/sdio.c 2025-05-18 06:25:00.000000000 +0000
|
||||
+++ linux_for_rk915/drivers/mmc/core/sdio.c 2025-06-28 17:43:59.827733748 +0000
|
||||
@@ -1076,7 +1076,8 @@
|
||||
* removable card is checked from a detect work later on in the resume
|
||||
* process.
|
||||
*/
|
||||
- if (!mmc_card_keep_power(host)) {
|
||||
+ if (!mmc_card_keep_power(host) &&
|
||||
+ !(host->caps2 & MMC_CAP2_WIFI_RK912)) {
|
||||
mmc_power_up(host, host->card->ocr);
|
||||
/*
|
||||
* Tell runtime PM core we just powered up the card,
|
||||
diff -ur linux-6.12.29/drivers/mmc/core/sdio_cis.c linux_for_rk915/drivers/mmc/core/sdio_cis.c
|
||||
--- linux-6.12.29/drivers/mmc/core/sdio_cis.c 2025-05-18 06:25:00.000000000 +0000
|
||||
+++ linux_for_rk915/drivers/mmc/core/sdio_cis.c 2025-06-28 17:43:59.826733772 +0000
|
||||
@@ -190,15 +191,15 @@
|
||||
pr_warn("%s: card has broken SDIO 1.1 CIS, forcing SDIO 1.0\n",
|
||||
mmc_hostname(card->host));
|
||||
vsn = SDIO_SDIO_REV_1_00;
|
||||
- } else if (size < min_size) {
|
||||
+ } else if (size < min_size && !(card->host->caps2 & MMC_CAP2_WIFI_RK912)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* TPLFE_MAX_BLK_SIZE */
|
||||
func->max_blksize = buf[12] | (buf[13] << 8);
|
||||
|
||||
/* TPLFE_ENABLE_TIMEOUT_VAL, present in ver 1.1 and above */
|
||||
- if (vsn > SDIO_SDIO_REV_1_00)
|
||||
+ if (vsn > SDIO_SDIO_REV_1_00 && !(card->host->caps2 & MMC_CAP2_WIFI_RK912))
|
||||
func->enable_timeout = (buf[28] | (buf[29] << 8)) * 10;
|
||||
else
|
||||
func->enable_timeout = jiffies_to_msecs(HZ);
|
||||
diff -ur linux-6.12.29/drivers/mmc/host/dw_mmc.c linux_for_rk915/drivers/mmc/host/dw_mmc.c
|
||||
--- linux-6.12.29/drivers/mmc/host/dw_mmc.c 2025-05-18 06:25:00.000000000 +0000
|
||||
+++ linux_for_rk915/drivers/mmc/host/dw_mmc.c 2025-06-28 17:44:02.417672518 +0000
|
||||
@@ -295,6 +295,10 @@
|
||||
SDMMC_CMD_PRV_DAT_WAIT, 0);
|
||||
}
|
||||
|
||||
+ if ((mmc->caps2 & MMC_CAP2_WIFI_RK912) &&
|
||||
+ (cmd->opcode == SD_IO_RW_DIRECT))
|
||||
+ cmdr |= SDMMC_CMD_PRV_DAT_WAIT;
|
||||
+
|
||||
if (cmd->flags & MMC_RSP_PRESENT) {
|
||||
/* We expect a response, so set this bit */
|
||||
cmdr |= SDMMC_CMD_RESP_EXP;
|
||||
@@ -1263,7 +1267,8 @@
|
||||
|
||||
/* enable clock; only low power if no SDIO */
|
||||
clk_en_a = SDMMC_CLKEN_ENABLE << slot->id;
|
||||
- if (!test_bit(DW_MMC_CARD_NO_LOW_PWR, &slot->flags))
|
||||
+ if (!test_bit(DW_MMC_CARD_NO_LOW_PWR, &slot->flags) &&
|
||||
+ !(slot->mmc->caps2 & MMC_CAP2_WIFI_RK912))
|
||||
clk_en_a |= SDMMC_CLKEN_LOW_PWR << slot->id;
|
||||
mci_writel(host, CLKENA, clk_en_a);
|
||||
|
||||
diff -ur linux-6.12.29/include/linux/mmc/host.h linux_for_rk915/include/linux/mmc/host.h
|
||||
--- linux-6.12.29/include/linux/mmc/host.h 2025-05-18 06:25:00.000000000 +0000
|
||||
+++ linux_for_rk915/include/linux/mmc/host.h 2025-06-28 17:45:54.422123779 +0000
|
||||
@@ -404,6 +404,7 @@
|
||||
#define MMC_CAP2_CRYPTO 0
|
||||
#endif
|
||||
#define MMC_CAP2_ALT_GPT_TEGRA (1 << 28) /* Host with eMMC that has GPT entry at a non-standard location */
|
||||
+#define MMC_CAP2_WIFI_RK912 (1 << 29)
|
||||
|
||||
int fixed_drv_type; /* fixed driver type for non-removable media */
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
# Built-in gamepad definitions (single source of truth)
|
||||
|
||||
Every built-in platform pad must exist in THREE shipped artifacts:
|
||||
|
||||
1. `packages/ui/emulationstation/config/common/es_input.cfg` (EmulationStation)
|
||||
2. `packages/emulators/libretro/retroarch/retroarch-joypads/gamepads/<name>.cfg` (RetroArch)
|
||||
3. `packages/apps/gamecontrollerdb/config/gamecontrollerdb.txt` (SDL games and ports)
|
||||
|
||||
Historically these were maintained by hand and nothing checked they agreed:
|
||||
the Soysauce pad shipped without the SDL entry, so ports saw no controller.
|
||||
The JSON files in `defs/` are now the source of truth and `gen-input-configs`
|
||||
keeps the three artifacts honest.
|
||||
|
||||
## Daily use
|
||||
|
||||
`make docker-*` refuses to build if the artifacts drifted from `defs/`:
|
||||
|
||||
./gen-input-configs verify # what CI/build runs
|
||||
./gen-input-configs write # regenerate artifacts from defs
|
||||
|
||||
Only external controllers (USB/Bluetooth pads inherited from upstream
|
||||
databases) stay unmanaged; the managed set is exactly the defs directory.
|
||||
|
||||
## Adding a new pad (example: a future R36T Max)
|
||||
|
||||
1. On the device, read the identity:
|
||||
|
||||
cat /proc/bus/input/devices # Name=, Vendor=, Product=, Version=
|
||||
|
||||
2. Compute the GUID the runtime will use (bus 0x19 for platform drivers):
|
||||
|
||||
./gen-input-configs guid "r36tmax_Gamepad" --vendor 1 --product 0x1199 --version 0x0100
|
||||
|
||||
Vendor or product zero switches SDL to the name-embedded GUID form
|
||||
automatically, exactly like the runtime does (that mismatch was the
|
||||
Soysauce bug).
|
||||
|
||||
3. Copy the closest def (`defs/r36s_Gamepad.json`), adjust name, identity,
|
||||
buses, the SDL mapping string, the ES inputs and the RetroArch keys.
|
||||
|
||||
4. Materialize and check:
|
||||
|
||||
./gen-input-configs write "r36tmax_Gamepad"
|
||||
./gen-input-configs verify
|
||||
|
||||
5. Commit the def together with the regenerated artifacts.
|
||||
|
||||
## Fidelity rules (deliberate)
|
||||
|
||||
* gamecontrollerdb line: byte-exact; the GUID is always recomputed from the
|
||||
identity fields (use `guid_override` only for entries that predate the
|
||||
tool and cannot be reproduced; none of the platform pads needs it).
|
||||
* RetroArch cfg and es_input block: semantically exact (key/value sets);
|
||||
comments, blank lines and ordering are not preserved by `write`.
|
||||
* `sdl_mapping` may be a per-GUID dict when buses legitimately differ
|
||||
(retrogame_joypad ships guide:b10 only on the 0x19 bus line).
|
||||
Binary file not shown.
@@ -0,0 +1,204 @@
|
||||
{
|
||||
"name": "GO-Super Gamepad",
|
||||
"vendor": 0,
|
||||
"product": 4352,
|
||||
"version": 256,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,a:b1,b:b0,dpdown:b14,dpleft:b15,+lefty:+a1,-leftx:-a0,+leftx:+a0,-lefty:-a1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,dpright:b16,+righty:+a3,-rightx:-a2,+rightx:+a2,-righty:-a3,rightshoulder:b5,rightstick:b12,righttrigger:b7,back:b8,start:b9,dpup:b13,x:b2,y:b3,",
|
||||
"retroarch": {
|
||||
"input_device": "GO-Super Gamepad",
|
||||
"input_driver": "udev",
|
||||
"input_vendor_id": "0000",
|
||||
"input_product_id": "1100",
|
||||
"input_b_btn": "0",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "2",
|
||||
"input_y_btn": "3",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "6",
|
||||
"input_r2_btn": "7",
|
||||
"input_up_btn": "13",
|
||||
"input_down_btn": "14",
|
||||
"input_left_btn": "15",
|
||||
"input_right_btn": "16",
|
||||
"input_select_btn": "8",
|
||||
"input_start_btn": "9",
|
||||
"input_l3_btn": "11",
|
||||
"input_r3_btn": "12",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_r_x_plus_axis": "+2",
|
||||
"input_r_x_minus_axis": "-2",
|
||||
"input_r_y_plus_axis": "+3",
|
||||
"input_r_y_minus_axis": "-3",
|
||||
"input_enable_hotkey_btn": "8",
|
||||
"input_exit_emulator_btn": "9",
|
||||
"input_screenshot_btn": "0",
|
||||
"input_pause_toggle_btn": "1",
|
||||
"input_menu_toggle_btn": "2",
|
||||
"input_fps_toggle_btn": "3",
|
||||
"input_state_slot_increase_btn": "13",
|
||||
"input_state_slot_decrease_btn": "14",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_rewind_btn": "6",
|
||||
"input_toggle_fast_forward_btn": "7"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "16",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,202 @@
|
||||
{
|
||||
"name": "GO-Ultra Gamepad",
|
||||
"vendor": 0,
|
||||
"product": 0,
|
||||
"version": 0,
|
||||
"buses": [
|
||||
3
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,a:b1,b:b0,dpdown:b15,dpleft:b16,guide:b11,+lefty:+a1,-leftx:-a0,+leftx:+a0,-lefty:-a1,leftshoulder:b5,leftstick:b12,lefttrigger:b7,dpright:b17,+righty:+a3,-rightx:-a2,+rightx:+a2,-righty:-a3,rightshoulder:b6,rightstick:b13,righttrigger:b8,back:b9,start:b10,dpup:b14,x:b3,y:b4,",
|
||||
"retroarch": {
|
||||
"input_device": "GO-Ultra Gamepad",
|
||||
"input_driver": "udev",
|
||||
"input_b_btn": "0",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "3",
|
||||
"input_y_btn": "4",
|
||||
"input_l_btn": "5",
|
||||
"input_r_btn": "6",
|
||||
"input_l2_btn": "7",
|
||||
"input_r2_btn": "8",
|
||||
"input_up_btn": "14",
|
||||
"input_down_btn": "15",
|
||||
"input_left_btn": "16",
|
||||
"input_right_btn": "17",
|
||||
"input_select_btn": "9",
|
||||
"input_start_btn": "10",
|
||||
"input_l3_btn": "12",
|
||||
"input_r3_btn": "13",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_r_x_plus_axis": "+2",
|
||||
"input_r_x_minus_axis": "-2",
|
||||
"input_r_y_plus_axis": "+3",
|
||||
"input_r_y_minus_axis": "-3",
|
||||
"input_enable_hotkey_btn": "11",
|
||||
"input_exit_emulator_btn": "10",
|
||||
"input_screenshot_btn": "0",
|
||||
"input_pause_toggle_btn": "1",
|
||||
"input_menu_toggle_btn": "3",
|
||||
"input_fps_toggle_btn": "4",
|
||||
"input_state_slot_increase_btn": "14",
|
||||
"input_state_slot_decrease_btn": "15",
|
||||
"input_load_state_btn": "5",
|
||||
"input_save_state_btn": "6",
|
||||
"input_rewind_btn": "7",
|
||||
"input_toggle_fast_forward_btn": "8"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "16",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "17",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
{
|
||||
"name": "GameForce ACE Gamepad",
|
||||
"vendor": 0,
|
||||
"product": 0,
|
||||
"version": 0,
|
||||
"buses": [
|
||||
3
|
||||
],
|
||||
"sdl_mapping": "a:b1,b:b0,dpdown:b13,dpleft:b14,lefty:a1,leftx:a0,leftshoulder:b5,leftstick:b10,lefttrigger:-a2,dpright:b15,+righty:+a4,-rightx:-a3,+rightx:+a3,-righty:-a4,rightshoulder:b6,rightstick:b11,righttrigger:-a5,back:b7,guide:b9,start:b8,dpup:b12,x:b3,y:b4,platform:Linux,",
|
||||
"retroarch": {
|
||||
"input_driver": "udev",
|
||||
"input_device": "GameForce ACE Gamepad",
|
||||
"input_b_btn": "0",
|
||||
"input_y_btn": "4",
|
||||
"input_select_btn": "7",
|
||||
"input_start_btn": "8",
|
||||
"input_up_btn": "12",
|
||||
"input_down_btn": "13",
|
||||
"input_left_btn": "14",
|
||||
"input_right_btn": "15",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "3",
|
||||
"input_l_btn": "5",
|
||||
"input_r_btn": "6",
|
||||
"input_l2_axis": "-2",
|
||||
"input_r2_axis": "-5",
|
||||
"input_l3_btn": "10",
|
||||
"input_r3_btn": "11",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_r_x_plus_axis": "+3",
|
||||
"input_r_x_minus_axis": "-3",
|
||||
"input_r_y_plus_axis": "+4",
|
||||
"input_r_y_minus_axis": "-4",
|
||||
"input_enable_hotkey_btn": "9"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "4",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "axis",
|
||||
"id": "5",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"name": "H700 Gamepad",
|
||||
"vendor": 18507,
|
||||
"product": 5343,
|
||||
"version": 256,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,x:b3,a:b1,b:b0,y:b2,back:b8,guide:b10,start:b9,dpleft:b15,dpdown:b14,dpright:b16,dpup:b13,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b11,rightstick:b12,leftx:a0,lefty:a1,rightx:a2,righty:a3,",
|
||||
"retroarch": {
|
||||
"input_driver": "udev",
|
||||
"input_device": "H700 Gamepad",
|
||||
"input_device_display_name": "Anbernic RG35XX Gamepad",
|
||||
"input_vendor_id": "18507",
|
||||
"input_product_id": "5343",
|
||||
"input_b_btn": "0",
|
||||
"input_a_btn": "1",
|
||||
"input_y_btn": "2",
|
||||
"input_x_btn": "3",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "6",
|
||||
"input_r2_btn": "7",
|
||||
"input_select_btn": "8",
|
||||
"input_start_btn": "9",
|
||||
"input_l3_btn": "11",
|
||||
"input_r3_btn": "12",
|
||||
"input_up_btn": "13",
|
||||
"input_down_btn": "14",
|
||||
"input_left_btn": "15",
|
||||
"input_right_btn": "16",
|
||||
"input_enable_hotkey_btn": "10",
|
||||
"input_exit_emulator_btn": "9",
|
||||
"input_pause_toggle_btn": "1",
|
||||
"input_menu_toggle_btn": "3",
|
||||
"input_fps_toggle_btn": "2",
|
||||
"input_screenshot_btn": "nul",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_toggle_fast_forward_btn": "7",
|
||||
"input_rewind_btn": "6",
|
||||
"input_analog_dpad_mode": "0",
|
||||
"input_gun_trigger_mbtn": "1",
|
||||
"input_joypad_index": "0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_mouse_index": "0",
|
||||
"input_r_x_minus_axis": "-2",
|
||||
"input_r_x_plus_axis": "+2",
|
||||
"input_r_y_minus_axis": "-3",
|
||||
"input_r_y_plus_axis": "+3",
|
||||
"input_state_slot_increase_btn": "nul",
|
||||
"input_state_slot_decrease_btn": "nul"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "16",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
{
|
||||
"name": "RGB20S Gamepad",
|
||||
"vendor": 18507,
|
||||
"product": 4471,
|
||||
"version": 375,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b12,start:b13,dpleft:b10,dpdown:b9,dpright:b11,dpup:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b14,rightstick:b15,leftx:a0,lefty:a1,rightx:a2,righty:a3,",
|
||||
"retroarch": {
|
||||
"input_driver": "udev",
|
||||
"input_device": "RGB20S Gamepad",
|
||||
"input_device_display_name": "RGB20S Gamepad",
|
||||
"input_b_btn": "0",
|
||||
"input_y_btn": "3",
|
||||
"input_select_btn": "12",
|
||||
"input_start_btn": "13",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "2",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "6",
|
||||
"input_r2_btn": "7",
|
||||
"input_l3_btn": "14",
|
||||
"input_r3_btn": "15",
|
||||
"input_up_btn": "8",
|
||||
"input_down_btn": "9",
|
||||
"input_left_btn": "10",
|
||||
"input_right_btn": "11",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_r_x_plus_axis": "+2",
|
||||
"input_r_x_minus_axis": "-2",
|
||||
"input_r_y_plus_axis": "+3",
|
||||
"input_r_y_minus_axis": "-3",
|
||||
"input_enable_hotkey_btn": "12",
|
||||
"input_exit_emulator_btn": "13",
|
||||
"input_menu_toggle_btn": "2",
|
||||
"input_fps_toggle_btn": "3",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_rewind_btn": "6",
|
||||
"input_toggle_fast_forward_btn": "7"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
{
|
||||
"name": "XU10 Gamepad",
|
||||
"vendor": 50096,
|
||||
"product": 512,
|
||||
"version": 16,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,x:b3,a:b2,b:b1,y:b0,back:b8,guide:b16,start:b9,dpleft:b14,dpdown:b13,dpright:b15,dpup:b12,leftshoulder:b4,lefttrigger:b7,rightshoulder:b5,righttrigger:b6,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,",
|
||||
"retroarch": {
|
||||
"input_device": "XU10 Gamepad",
|
||||
"input_driver": "udev",
|
||||
"input_device_display_name": "MagicX XU10 Gamepad",
|
||||
"input_b_btn": "1",
|
||||
"input_a_btn": "2",
|
||||
"input_x_btn": "3",
|
||||
"input_y_btn": "0",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "7",
|
||||
"input_r2_btn": "6",
|
||||
"input_up_btn": "12",
|
||||
"input_down_btn": "13",
|
||||
"input_left_btn": "14",
|
||||
"input_right_btn": "15",
|
||||
"input_select_btn": "8",
|
||||
"input_start_btn": "9",
|
||||
"input_l3_btn": "10",
|
||||
"input_r3_btn": "11",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_r_x_plus_axis": "+2",
|
||||
"input_r_x_minus_axis": "-2",
|
||||
"input_r_y_plus_axis": "+3",
|
||||
"input_r_y_minus_axis": "-3",
|
||||
"input_enable_hotkey_btn": "16",
|
||||
"input_exit_emulator_btn": "9",
|
||||
"input_screenshot_btn": "0",
|
||||
"input_pause_toggle_btn": "1",
|
||||
"input_menu_toggle_btn": "2",
|
||||
"input_fps_toggle_btn": "3",
|
||||
"input_state_slot_increase_btn": "7",
|
||||
"input_state_slot_decrease_btn": "6",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_rewind_btn": "10",
|
||||
"input_toggle_fast_forward_btn": "11"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "16",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
{
|
||||
"name": "XU Mini M Gamepad",
|
||||
"vendor": 50096,
|
||||
"product": 512,
|
||||
"version": 16,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b8,guide:b16,start:b9,dpleft:b14,dpdown:b13,dpright:b15,dpup:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,",
|
||||
"retroarch": {
|
||||
"input_driver": "udev",
|
||||
"input_device": "XU Mini M Gamepad",
|
||||
"input_device_display_name": "MagicX XU Mini M Gamepad",
|
||||
"input_b_btn": "0",
|
||||
"input_y_btn": "3",
|
||||
"input_select_btn": "8",
|
||||
"input_start_btn": "9",
|
||||
"input_up_btn": "12",
|
||||
"input_down_btn": "13",
|
||||
"input_left_btn": "14",
|
||||
"input_right_btn": "15",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "2",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "6",
|
||||
"input_r2_btn": "7",
|
||||
"input_l3_btn": "10",
|
||||
"input_r3_btn": "11",
|
||||
"input_l_x_plus_axis": "+1",
|
||||
"input_l_x_minus_axis": "-1",
|
||||
"input_l_y_plus_axis": "-0",
|
||||
"input_l_y_minus_axis": "+0",
|
||||
"input_r_x_plus_axis": "+3",
|
||||
"input_r_x_minus_axis": "-3",
|
||||
"input_r_y_plus_axis": "-2",
|
||||
"input_r_y_minus_axis": "+2",
|
||||
"input_enable_hotkey_btn": "16",
|
||||
"input_exit_emulator_btn": "9",
|
||||
"input_menu_toggle_btn": "2",
|
||||
"input_fps_toggle_btn": "3",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_rewind_btn": "6",
|
||||
"input_toggle_fast_forward_btn": "7"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "16",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogdown",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogleft",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogright",
|
||||
"type": "axis",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightanalogup",
|
||||
"type": "axis",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
{
|
||||
"name": "odroidgo2_joypad",
|
||||
"vendor": 1,
|
||||
"product": 1,
|
||||
"version": 257,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b10,start:b13,dpleft:b8,dpdown:b7,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b11,rightshoulder:b5,righttrigger:b12,leftx:a0,lefty:a1,",
|
||||
"retroarch": {
|
||||
"input_driver": "udev",
|
||||
"input_device": "odroidgo2_joypad",
|
||||
"input_device_display_name": "Odroid GO Advance Joypad",
|
||||
"input_b_btn": "0",
|
||||
"input_y_btn": "3",
|
||||
"input_select_btn": "10",
|
||||
"input_start_btn": "13",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "2",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "11",
|
||||
"input_r2_btn": "12",
|
||||
"input_up_btn": "6",
|
||||
"input_down_btn": "7",
|
||||
"input_left_btn": "8",
|
||||
"input_right_btn": "9",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_enable_hotkey_btn": "10",
|
||||
"input_exit_emulator_btn": "13",
|
||||
"input_menu_toggle_btn": "2",
|
||||
"input_fps_toggle_btn": "3",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_rewind_btn": "11",
|
||||
"input_toggle_fast_forward_btn": "12"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
{
|
||||
"name": "odroidgo2_v11_joypad",
|
||||
"vendor": 1,
|
||||
"product": 2,
|
||||
"version": 257,
|
||||
"buses": [
|
||||
25
|
||||
],
|
||||
"sdl_mapping": "platform:Linux,x:b2,a:b1,b:b0,y:b3,back:b8,start:b9,dpleft:b14,dpdown:b13,dpright:b15,dpup:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,",
|
||||
"retroarch": {
|
||||
"input_driver": "udev",
|
||||
"input_device": "odroidgo2_v11_joypad",
|
||||
"input_device_display_name": "Odroid GO Advance Joypad v1.1",
|
||||
"input_b_btn": "0",
|
||||
"input_y_btn": "3",
|
||||
"input_select_btn": "8",
|
||||
"input_start_btn": "9",
|
||||
"input_a_btn": "1",
|
||||
"input_x_btn": "2",
|
||||
"input_l_btn": "4",
|
||||
"input_r_btn": "5",
|
||||
"input_l2_btn": "6",
|
||||
"input_r2_btn": "7",
|
||||
"input_l3_btn": "10",
|
||||
"input_r3_btn": "11",
|
||||
"input_up_btn": "12",
|
||||
"input_down_btn": "13",
|
||||
"input_left_btn": "14",
|
||||
"input_right_btn": "15",
|
||||
"input_l_x_plus_axis": "+0",
|
||||
"input_l_x_minus_axis": "-0",
|
||||
"input_l_y_plus_axis": "+1",
|
||||
"input_l_y_minus_axis": "-1",
|
||||
"input_enable_hotkey_btn": "8",
|
||||
"input_exit_emulator_btn": "9",
|
||||
"input_menu_toggle_btn": "2",
|
||||
"input_fps_toggle_btn": "3",
|
||||
"input_load_state_btn": "4",
|
||||
"input_save_state_btn": "5",
|
||||
"input_rewind_btn": "6",
|
||||
"input_toggle_fast_forward_btn": "7"
|
||||
},
|
||||
"es_inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
"type": "button",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "b",
|
||||
"type": "button",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "down",
|
||||
"type": "button",
|
||||
"id": "13",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "hotkeyenable",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "left",
|
||||
"type": "button",
|
||||
"id": "14",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogdown",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogleft",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogright",
|
||||
"type": "axis",
|
||||
"id": "0",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftanalogup",
|
||||
"type": "axis",
|
||||
"id": "1",
|
||||
"value": "-1"
|
||||
},
|
||||
{
|
||||
"name": "leftshoulder",
|
||||
"type": "button",
|
||||
"id": "4",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "leftthumb",
|
||||
"type": "button",
|
||||
"id": "10",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "lefttrigger",
|
||||
"type": "button",
|
||||
"id": "6",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "right",
|
||||
"type": "button",
|
||||
"id": "15",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightshoulder",
|
||||
"type": "button",
|
||||
"id": "5",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "rightthumb",
|
||||
"type": "button",
|
||||
"id": "11",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "righttrigger",
|
||||
"type": "button",
|
||||
"id": "7",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "select",
|
||||
"type": "button",
|
||||
"id": "8",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "start",
|
||||
"type": "button",
|
||||
"id": "9",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "up",
|
||||
"type": "button",
|
||||
"id": "12",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "x",
|
||||
"type": "button",
|
||||
"id": "2",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "y",
|
||||
"type": "button",
|
||||
"id": "3",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user