Skip to content

How Does Joypad OS Combine W5500 GameCube Ethernet and AI Controller Tools?

Joypad OS 2.2 pairs an experimental W5500 GBA-to-Dolphin bridge with separate UART-based MCP and emulator AI controller tools.

Benjamin

Published July 03, 2026 ยท ยฉ Apache License 2.0 (Apache-2.0)

Original author: Robert Dale Smith ยท United States of AmericaOriginal source (new tab)

How Does Joypad OS Combine W5500 GameCube Ethernet and AI Controller Tools?

Components

Hardware components

WIZnet parts

Project description

๐Ÿ“Œ Overview

Robert Dale Smith, founder of Joypad, maintains Joypad OS as an open-source firmware platform for controller adapters, custom controllers, and assistive input devices. The repository now contains a W5500-based GBA-to-Dolphin Ethernet bridge alongside MCP, vision-agent, and robot-learning experiments.

The important word is "alongside." The W5500 target carries real GBA Joybus traffic to Dolphin over TCP. The MCP path sends controller states over UART, while the VLM and LeRobot paths currently operate with a software NES emulator. They share one repository, but they are not one end-to-end transport.

Joypad OS in one line: one controller platform contains an experimental W5500 bridge and separate AI control tools, with clear boundaries between the two.

Illustrative developer bench with separate W5500 Ethernet and AI controller lanes AI-generated editorial illustration for this article. It is not a Joypad product photograph or wiring diagram.

The current reference points are Joypad OS v2.2.0, released on July 8, 2026, and main commit e62fcff from July 17. The main branch is newer than the release tag, so a source target can exist without a ready-to-flash v2.2.0 image.

One Repository, Separate Data Paths

The current source exposes three related but distinct paths:

  1. gc2eth_feather_usbhost connects a real GBA link-cable signal to Dolphin through RP2040, W5500, and two TCP connections.
  2. joypad-mcp exposes controller and observation actions as MCP tools, then sends full desired controller states through a 115200-baud serial link.
  3. joypad-bot and its LeRobot files observe and control nes-py in software. The public source does not show those models driving a real console through the W5500 target.

Two-path diagram separating the W5500 bridge from the UART MCP controller path Generated technical diagram: the Ethernet and AI paths share the Joypad OS repository, not the same connection.

The build configuration keeps the same boundary. MCP traffic does not use the W5500 target. The W5500 application does not enable the UART-host configuration required by the current MCP transport, so an MCP client does not inject input into gc2eth_feather.

The W5500 GBA-to-Dolphin Bridge

The gc2eth_feather configuration targets an Adafruit Feather RP2040 USB Host plus a W5500 Ethernet FeatherWing. A real GBA sits behind a GameCube-to-GBA link cable; Dolphin supplies the GameCube side. A physical GameCube console is not part of this path.

The target's pin and network settings are explicit:

  • Joybus data uses GP4.
  • W5500 uses SPI1 with SCK GP14, MOSI GP15, MISO GP8, and CS GP10.
  • The project sets SPI to 20 MHz for this board.
  • The bridge uses static IP 192.168.1.250; the Dolphin host is 192.168.1.159.
  • Socket 0 connects to TCP port 54970 for commands and responses.
  • Socket 1 connects to TCP port 49420 for Dolphin clock synchronization.

Portrait packet-loop diagram showing Dolphin, W5500, RP2040, and a real GBA Generated technical diagram from the current app.h and app.c configuration.

Socket 1 is unusual but important. The firmware drains and discards its received bytes because the connection itself is what allows Dolphin's GBA device to proceed. Socket 0 carries RESET, STATUS, READ, and WRITE exchanges to the app.c bridge logic, which performs the corresponding Joybus transaction and returns the real device response.

The 20 MHz value is a project setting, not the W5500's device limit. WIZnet's official W5500 documentation specifies an SPI clock up to 80 MHz. The Joypad source comments that a higher setting increased jitter on the tested PCB, so the firmware chooses the lower value for this experiment.

Build Status and Runtime Defaults

The W5500 path is real source code, not a keyword mention. Its CMake target compiles a direct w5500.c SPI driver, opens W5500 hardware TCP sockets, and reads and writes socket buffers without lwIP or a software TCP/IP stack on the RP2040.

At the same time, this is an experimental source-build target. It is present in the general APPS list and can be invoked with:

make gc2eth_feather_usbhost

It is absent from RELEASE_APPS, and the v2.2.0 release does not include a dedicated W5500 Feather UF2. The static IP constants also have to be reviewed for another network.

Version, W5500 build status, and MCP transport snapshot Generated source snapshot based on the current VERSION, Makefile, CMake, bridge, and MCP files.

The bridge keeps several timing experiments in source, but its defaults are conservative. STATUS caching refreshes after four served polls; speculative STATUS, WRITE caching, and READ caching default to off. Intercept-and-replay code is explicitly disabled because generated responses did not reproduce the live JSTAT.RECV transitions expected by Madden. The active path is direct passthrough.

No single latency number is used here because comments and development commits refer to different workloads and measurement points. The public source supports the architecture and successful Madden multiboot research, not a general benchmark for every game or network.

The AI Path: MCP, Vision, and LeRobot

joypad-mcp is a Node.js MCP server. MCP itself uses stdio; downstream, its SerialPort transport sends INPUT_EVENT packet type 0x10 at 115200 baud to compatible Joypad OS UART-host firmware.

Counting the current server.tool registrations gives 20 tools: four connection, eight input, three observation, and five vision tools. That is one more than the 19-tool sentence still present in the README. The source includes both list_cameras and analyze_game_state.

Illustrative see-decide-act workflow with a serial-connected controller adapter AI-generated conceptual illustration of the separate AI controller path. No Ethernet hardware is shown because MCP does not use W5500 here.

The tool boundary matters. read_state returns the state requested by MCP; it does not confirm delivery to or application by a console. The joypad-bot V1 loop is also software-only: a vision-capable model observes nes-py, chooses a button action, and advances the emulator.

The repository has progressed beyond a roadmap-only LeRobot note. recorder.py, train.py, and inference.py provide an emulator-side record, train, and live inference workflow, and the maintainer reports an end-to-end Diffusion Policy run. However, there is no public real-console integration, dataset, checkpoint, success-rate benchmark, or W5500 connection for this path.

โš™๏ธ Why the W5500 Role Matters

W5500 gives the bridge a microcontroller-controlled, wired TCP endpoint beside a timing-sensitive Joybus interface. The firmware manages the W5500 at register and socket level, while the RP2040 stays responsible for protocol translation and real-device I/O.

That separation is the reusable design pattern. W5500 terminates the wired TCP connection; RP2040 preserves the device-side transaction. The same pattern can be useful when an embedded bridge must keep local I/O timing visible and still exchange framed data with a host over Ethernet.

The project's current scope is clear: this W5500 build is a research target, not a retail adapter, stable release image, AI-over-Ethernet appliance, or universal low-latency benchmark. Its value is the unusually inspectable implementation: pins, fixed IPs, two TCP sockets, direct W5500 access, Joybus forwarding, cache controls, and trace hooks are all public.

Project and Community Context

Joypad OS grew from USB2PCE and USBRetro into a broader firmware ecosystem. The official shop currently lists maintained USB2USB, BT2USB, USB2GC, and USB2PCE adapters, while the W5500 target remains a separate research build.

The public repository also shows active user-driven development. A 2026 Neo Geo tournament request led to a contributor PR with real RP2040-Zero testing for tournament-safe remapping rules. That work is not part of the W5500 bridge, but it shows how controller use cases are feeding back into the platform.

The repository specifies the Apache License 2.0. Repository and visual assets should still be used without implying permission to use Joypad trademarks.

Related WIZnet Maker Projects

  • libogc2 adds WIZnet network interfaces to the GameCube/Wii homebrew SDK. It is the closest code-side reference, but it is not an RP2040 GBA-to-Dolphin or MCP bridge.
  • W5500 Ethernet Adapter for GameCube: ETH2SP1 shows the same W5500 and GameCube intersection as a commercial Ethernet adapter, not Joypad's experimental firmware path.
  • Swiss provides the console-software context for W5500-family networking. Joypad OS instead approaches the problem through Joybus, adapter firmware, and host tools.

โ“ FAQ

Q. Is gc2eth_feather a ready-to-flash v2.2.0 download? No. The source target exists, but it is excluded from the stable release application list and has no dedicated v2.2.0 UF2.

Q. Does this bridge connect directly to a physical GameCube? No. A real GBA connects through the link cable, while Dolphin provides the GameCube side.

Q. Does Joypad MCP send controller input over W5500? No. The current MCP server sends INPUT_EVENT packets through a 115200-baud serial connection to compatible UART-host firmware.

Q. Why does the W5500 target open two TCP sockets? Socket 0 carries the GBA command and response stream. Socket 1 maintains Dolphin's clock connection, and its incoming bytes are discarded.

Q. Can the AI tools already control a real console through this bridge? The public source does not demonstrate that integration. Its VLM and LeRobot workflows currently target a software NES emulator.

ํ•œ๊ตญ์–ด (Korean)

๐Ÿ“Œ ๊ฐœ์š”

Robert Dale Smith๋Š” Joypad์˜ ์„ค๋ฆฝ์ž์ด๋ฉฐ, ์ปจํŠธ๋กค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ, ์ปค์Šคํ…€ ์ปจํŠธ๋กค๋Ÿฌ, ๋ณด์กฐ ์ž…๋ ฅ ์žฅ์น˜๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ํŽŒ์›จ์–ด ํ”Œ๋žซํผ์ธ Joypad OS๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ €์žฅ์†Œ์—๋Š” W5500 ๊ธฐ๋ฐ˜ GBA-to-Dolphin Ethernet ๋ธŒ๋ฆฌ์ง€์™€ MCP, ๋น„์ „ ์—์ด์ „ํŠธ, ๋กœ๋ด‡ ํ•™์Šต ์‹คํ—˜์ด ํ•จ๊ป˜ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์€ "ํ•จ๊ป˜"๋ผ๋Š” ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. W5500 ํƒ€๊นƒ์€ ์‹ค์ œ GBA์˜ Joybus ํŠธ๋ž˜ํ”ฝ์„ TCP๋กœ Dolphin์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. MCP ๊ฒฝ๋กœ๋Š” UART๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์ƒํƒœ๋ฅผ ๋ณด๋‚ด๋ฉฐ, VLM๊ณผ LeRobot ๊ฒฝ๋กœ๋Š” ํ˜„์žฌ ์†Œํ”„ํŠธ์›จ์–ด NES ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ๋ฅผ ๊ณต์œ ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ end-to-end ์ „์†ก ๊ฒฝ๋กœ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

ํ•œ ๋ฌธ์žฅ์œผ๋กœ ๋ณด๋Š” Joypad OS: ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ ํ”Œ๋žซํผ ์•ˆ์— ์‹คํ—˜์ ์ธ W5500 ๋ธŒ๋ฆฌ์ง€์™€ ๋ณ„๋„์˜ AI ์ œ์–ด ๋„๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋‘ ๊ฒฝ๋กœ์˜ ๊ฒฝ๊ณ„๊ฐ€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค.

W5500 Ethernet ๊ฒฝ๋กœ์™€ AI ์ปจํŠธ๋กค๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ๋ถ„๋ฆฌํ•ด ๋ณด์—ฌ์ฃผ๋Š” ๊ฐœ๋ฐœ์ž ์ž‘์—…๋Œ€ ์ผ๋Ÿฌ์ŠคํŠธ ์ด ๊ธ€์„ ์œ„ํ•ด ์ƒ์„ฑํ•œ AI ํŽธ์ง‘ ์ผ๋Ÿฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. Joypad ์ œํ’ˆ ์‚ฌ์ง„์ด๋‚˜ ๋ฐฐ์„ ๋„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋ฒˆ ์—…๋ฐ์ดํŠธ๋Š” 2026๋…„ 7์›” 8์ผ ๊ณต๊ฐœ๋œ Joypad OS v2.2.0๊ณผ 7์›” 17์ผ์˜ main ์ปค๋ฐ‹ e62fcff๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. main ๋ธŒ๋žœ์น˜๋Š” ๋ฆด๋ฆฌ์Šค ํƒœ๊ทธ๋ณด๋‹ค ์•ž์„œ ์žˆ์œผ๋ฏ€๋กœ, ์ €์žฅ์†Œ์— ์†Œ์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด์„œ v2.2.0์šฉ ํ”Œ๋ž˜์‹œ ์ด๋ฏธ์ง€๊ฐ€ ์ œ๊ณต๋œ๋‹ค๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ, ๋ถ„๋ฆฌ๋œ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ

ํ˜„์žฌ ์†Œ์Šค์—๋Š” ์„œ๋กœ ๊ด€๋ จ๋˜์ง€๋งŒ ๊ตฌ๋ถ„๋˜๋Š” ์„ธ ๊ฐ€์ง€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. gc2eth_feather_usbhost๋Š” ์‹ค์ œ GBA ๋งํฌ ์ผ€์ด๋ธ” ์‹ ํ˜ธ๋ฅผ RP2040, W5500, ๋‘ ๊ฐœ์˜ TCP ์—ฐ๊ฒฐ์„ ๊ฑฐ์ณ Dolphin์œผ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  2. joypad-mcp๋Š” ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ด€์ฐฐ ๋™์ž‘์„ MCP ๋„๊ตฌ๋กœ ๋…ธ์ถœํ•˜๊ณ , ์›ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์ƒํƒœ ์ „์ฒด๋ฅผ 115200-baud serial link๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  3. joypad-bot๊ณผ LeRobot ํŒŒ์ผ์€ ์†Œํ”„ํŠธ์›จ์–ด์˜ nes-py๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์†Œ์Šค์—๋Š” ํ•ด๋‹น ๋ชจ๋ธ์ด W5500 ํƒ€๊นƒ์„ ๊ฑฐ์ณ ์‹ค์ œ ์ฝ˜์†”์„ ์กฐ์ž‘ํ•˜๋Š” ๊ตฌํ˜„์ด ์—†์Šต๋‹ˆ๋‹ค.

W5500 ๋ธŒ๋ฆฌ์ง€์™€ UART MCP ์ปจํŠธ๋กค๋Ÿฌ ๊ฒฝ๋กœ๋ฅผ ๋ถ„๋ฆฌํ•œ ๋‘ ๊ฒฝ๋กœ ๋‹ค์ด์–ด๊ทธ๋žจ ์ƒ์„ฑ ๊ธฐ์ˆ  ๋‹ค์ด์–ด๊ทธ๋žจ: Ethernet ๊ฒฝ๋กœ์™€ AI ๊ฒฝ๋กœ๋Š” Joypad OS ์ €์žฅ์†Œ๋ฅผ ๊ณต์œ ํ•˜์ง€๋งŒ ๊ฐ™์€ ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋นŒ๋“œ ์„ค์ •๋„ ๊ฐ™์€ ๊ฒฝ๊ณ„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. MCP traffic์€ W5500 target์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. W5500 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ํ˜„์žฌ MCP ์ „์†ก์— ํ•„์š”ํ•œ UART-host ์„ค์ •์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ MCP ํด๋ผ์ด์–ธํŠธ๋Š” gc2eth_feather์— ์ž…๋ ฅ์„ ์ฃผ์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

W5500 GBA-to-Dolphin ๋ธŒ๋ฆฌ์ง€

gc2eth_feather ์„ค์ •์€ Adafruit Feather RP2040 USB Host์™€ W5500 Ethernet FeatherWing์„ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ GBA๋Š” GameCube-to-GBA ๋งํฌ ์ผ€์ด๋ธ” ๋’ค์— ์žˆ๊ณ , Dolphin์ด GameCube ์ธก์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๋กœ์— ์‹ค์ œ GameCube ๋ณธ์ฒด๋Š” ์—†์Šต๋‹ˆ๋‹ค.

ํƒ€๊นƒ์˜ ํ•€๊ณผ ๋„คํŠธ์›Œํฌ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Joybus data๋Š” GP4๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • W5500์€ SPI1์„ ์‚ฌ์šฉํ•˜๋ฉฐ SCK GP14, MOSI GP15, MISO GP8, CS GP10์ž…๋‹ˆ๋‹ค.
  • ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ•ด๋‹น ๋ณด๋“œ์—์„œ SPI๋ฅผ 20 MHz๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ฆฌ์ง€ ๊ณ ์ • IP๋Š” 192.168.1.250, Dolphin host๋Š” 192.168.1.159์ž…๋‹ˆ๋‹ค.
  • socket 0์€ ๋ช…๋ น๊ณผ ์‘๋‹ต์„ ์œ„ํ•ด TCP 54970์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • socket 1์€ Dolphin clock ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด TCP 49420์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Dolphin, W5500, RP2040, ์‹ค์ œ GBA๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์„ธ๋กœํ˜• ํŒจํ‚ท ๋ฃจํ”„ ๋‹ค์ด์–ด๊ทธ๋žจ ํ˜„์žฌ app.h์™€ app.c ์„ค์ •์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑํ•œ ๊ธฐ์ˆ  ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

socket 1์€ ํŠน์ดํ•˜์ง€๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ž์ฒด๊ฐ€ Dolphin์˜ GBA ์žฅ์น˜๋ฅผ ์ง„ํ–‰์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ํŽŒ์›จ์–ด๋Š” ์ˆ˜์‹  ๋ฐ”์ดํŠธ๋ฅผ ๋น„์›Œ์„œ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. socket 0์€ RESET, STATUS, READ, WRITE ๊ตํ™˜์„ app.c ๋ธŒ๋ฆฌ์ง€ ๋กœ์ง์— ์ „๋‹ฌํ•˜๊ณ , ๋ธŒ๋ฆฌ์ง€ ๋กœ์ง์€ ํ•ด๋‹น Joybus ํŠธ๋žœ์žญ์…˜์„ ์‹คํ–‰ํ•œ ๋’ค ์‹ค์ œ ์žฅ์น˜ ์‘๋‹ต์„ ๋˜๋Œ๋ ค ๋ณด๋ƒ…๋‹ˆ๋‹ค.

20 MHz๋Š” ํ”„๋กœ์ ํŠธ ์„ค์ •์ด์ง€ W5500 ์žฅ์น˜์˜ ํ•œ๊ณ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. WIZnet์˜ ๊ณต์‹ W5500 ๋ฌธ์„œ๋Š” ์ตœ๋Œ€ 80 MHz SPI clock์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. Joypad ์†Œ์Šค๋Š” ํ…Œ์ŠคํŠธํ•œ PCB์—์„œ ๋” ๋†’์€ ์„ค์ •์ด jitter๋ฅผ ๋Š˜๋ ธ๋‹ค๊ณ  ๊ธฐ๋กํ•˜๋ฏ€๋กœ ์ด ์‹คํ—˜์—์„œ๋Š” ๋‚ฎ์€ ๊ฐ’์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ์ƒํƒœ์™€ ๋Ÿฐํƒ€์ž„ ๊ธฐ๋ณธ๊ฐ’

W5500 ๊ฒฝ๋กœ๋Š” ๋‹จ์ˆœํ•œ ํ‚ค์›Œ๋“œ ์–ธ๊ธ‰์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. CMake ํƒ€๊นƒ์€ ์ง์ ‘ ๊ตฌํ˜„ํ•œ w5500.c SPI driver๋ฅผ ๋นŒ๋“œํ•˜๋ฉฐ, lwIP๋‚˜ RP2040 software TCP/IP stack ์—†์ด W5500 hardware TCP socket๊ณผ buffer๋ฅผ ์ง์ ‘ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋™์‹œ์— ์ด ๊ธฐ๋Šฅ์€ ์‹คํ—˜์ ์ธ ์†Œ์Šค ๋นŒ๋“œ ํƒ€๊นƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ APPS ๋ชฉ๋ก์—๋Š” ์žˆ๊ณ  ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ:

make gc2eth_feather_usbhost

RELEASE_APPS์—๋Š” ์—†์œผ๋ฉฐ v2.2.0 ๋ฆด๋ฆฌ์Šค์—๋„ ์ „์šฉ W5500 Feather UF2๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณ ์ • IP ์ƒ์ˆ˜๋„ ์ž์‹ ์˜ ๋„คํŠธ์›Œํฌ์— ๋งž๊ฒŒ ๊ฒ€ํ† ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „, W5500 ๋นŒ๋“œ ์ƒํƒœ, MCP ์ „์†ก ๊ฒฝ๋กœ๋ฅผ ์ •๋ฆฌํ•œ ์†Œ์Šค ์Šค๋ƒ…์ƒท ํ˜„์žฌ VERSION, Makefile, CMake, ๋ธŒ๋ฆฌ์ง€, MCP ํŒŒ์ผ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑํ•œ ์†Œ์Šค ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ฆฌ์ง€์—๋Š” ์—ฌ๋Ÿฌ timing experiment๊ฐ€ ๋‚จ์•„ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์€ ๋ณด์ˆ˜์ ์ž…๋‹ˆ๋‹ค. STATUS cache๋Š” ๋„ค ๋ฒˆ ์ œ๊ณตํ•œ ๋’ค ๊ฐฑ์‹ ํ•˜๋ฉฐ, speculative STATUS, WRITE cache, READ cache๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. Intercept-and-replay๋Š” Madden์ด ๊ธฐ๋Œ€ํ•˜๋Š” ์‹ค์ œ JSTAT.RECV ๋ณ€ํ™”๋ฅผ ์ƒ์„ฑ ์‘๋‹ต์œผ๋กœ ์žฌํ˜„ํ•˜์ง€ ๋ชปํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋™์ž‘ ๊ฒฝ๋กœ๋Š” direct passthrough์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ์ฝ”๋ฉ˜ํŠธ์™€ ์ปค๋ฐ‹์ด ์„œ๋กœ ๋‹ค๋ฅธ workload์™€ ์ธก์ • ์ง€์ ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ธ€์—์„œ๋Š” ํ•˜๋‚˜์˜ latency ์ˆ˜์น˜๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์†Œ์Šค๋Š” ๊ตฌ์กฐ์™€ Madden multiboot ์—ฐ๊ตฌ ์„ฑ๊ณต์€ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ๋ชจ๋“  ๊ฒŒ์ž„๊ณผ ๋„คํŠธ์›Œํฌ์— ์ ์šฉ๋˜๋Š” ๋ฒ”์šฉ benchmark๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

AI ๊ฒฝ๋กœ: MCP, Vision, LeRobot

joypad-mcp๋Š” Node.js MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. MCP ์ž์ฒด๋Š” stdio๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , downstream SerialPort ์ „์†ก์€ INPUT_EVENT packet type 0x10์„ 115200 baud๋กœ ํ˜ธํ™˜๋˜๋Š” Joypad OS UART-host ํŽŒ์›จ์–ด์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.

ํ˜„์žฌ server.tool ๋“ฑ๋ก์„ ์„ธ๋ฉด 20๊ฐœ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ 4๊ฐœ, ์ž…๋ ฅ 8๊ฐœ, ๊ด€์ฐฐ 3๊ฐœ, ๋น„์ „ 5๊ฐœ์ž…๋‹ˆ๋‹ค. README์˜ 19๊ฐœ๋ผ๋Š” ๋ฌธ์žฅ๋ณด๋‹ค ํ•˜๋‚˜ ๋งŽ์œผ๋ฉฐ, ํ˜„์žฌ ์†Œ์Šค์—๋Š” list_cameras์™€ analyze_game_state๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Serial controller adapter๋ฅผ ์‚ฌ์šฉํ•œ see-decide-act workflow ์ผ๋Ÿฌ์ŠคํŠธ ๋ณ„๋„์˜ AI controller path๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑํ•œ AI ๊ฐœ๋… ์ผ๋Ÿฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. MCP๊ฐ€ ์—ฌ๊ธฐ์„œ W5500์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Ethernet hardware๋Š” ๊ทธ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋„๊ตฌ์˜ ๊ฒฝ๊ณ„๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. read_state๋Š” MCP๊ฐ€ ์š”์ฒญํ•œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ฝ˜์†” ์ „๋‹ฌ ๋˜๋Š” ์ ์šฉ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. joypad-bot V1 ์—ญ์‹œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋น„์ „ ๋ชจ๋ธ์ด nes-py ํ™”๋ฉด์„ ๋ณด๊ณ  ๋ฒ„ํŠผ ๋™์ž‘์„ ์„ ํƒํ•œ ๋’ค ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

LeRobot ๋ถ€๋ถ„์€ ์ด์ œ ๋‹จ์ˆœ ๊ณ„ํš๋ณด๋‹ค ์ง„์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค. recorder.py, train.py, inference.py๊ฐ€ emulator-side record, train, live inference ํ๋ฆ„์„ ์ œ๊ณตํ•˜๊ณ , ๊ด€๋ฆฌ์ž๋Š” Diffusion Policy end-to-end ์‹คํ–‰์„ ๊ธฐ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฐœ๋œ ์‹ค์ œ ์ฝ˜์†” ํ†ตํ•ฉ, dataset, checkpoint, ์„ฑ๊ณต๋ฅ  benchmark, W5500 ์—ฐ๊ฒฐ์€ ์—†์Šต๋‹ˆ๋‹ค.

โš™๏ธ W5500 ์—ญํ• ์ด ์ค‘์š”ํ•œ ์ด์œ 

W5500์€ timing-sensitive Joybus interface ์˜†์— MCU๊ฐ€ ์ œ์–ดํ•˜๋Š” ์œ ์„  TCP endpoint๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํŽŒ์›จ์–ด๊ฐ€ W5500 register์™€ socket์„ ๊ด€๋ฆฌํ•˜๊ณ , RP2040์€ protocol translation๊ณผ ์‹ค์ œ ์žฅ์น˜ I/O๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ค๊ณ„ ํŒจํ„ด์€ ์—ญํ•  ๋ถ„๋ฆฌ์ž…๋‹ˆ๋‹ค. W5500์ด ์œ ์„  TCP ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ณ , RP2040์ด ์žฅ์น˜ ์ธก ํŠธ๋žœ์žญ์…˜์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. embedded bridge๊ฐ€ ๋กœ์ปฌ I/O timing์„ ์œ ์ง€ํ•˜๋ฉด์„œ Ethernet์œผ๋กœ host์™€ frame data๋ฅผ ๊ตํ™˜ํ•ด์•ผ ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์˜ ํ˜„์žฌ ๋ฒ”์œ„๋Š” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด W5500 ๋นŒ๋“œ๋Š” ํŒ๋งค์šฉ ์–ด๋Œ‘ํ„ฐ, ์•ˆ์ • ๋ฆด๋ฆฌ์Šค ์ด๋ฏธ์ง€, AI-over-Ethernet appliance, ๋ฒ”์šฉ low-latency benchmark๊ฐ€ ์•„๋‹ˆ๋ผ research target์ž…๋‹ˆ๋‹ค. ํ•€, ๊ณ ์ • IP, ๋‘ TCP socket, direct W5500 access, Joybus forwarding, cache control, trace hook์ด ๋ชจ๋‘ ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ด ํ•ต์‹ฌ ๊ฐ€์น˜์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋งฅ๋ฝ

Joypad OS๋Š” USB2PCE์™€ USBRetro์—์„œ ๋” ๋„“์€ ํŽŒ์›จ์–ด ์ƒํƒœ๊ณ„๋กœ ๋ฐœ์ „ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ shop์€ ํ˜„์žฌ USB2USB, BT2USB, USB2GC, USB2PCE ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ W5500 ํƒ€๊นƒ์€ ์ด ์ œํ’ˆ๊ตฐ๊ณผ ๊ตฌ๋ถ„๋˜๋Š” research build์ž…๋‹ˆ๋‹ค.

๊ณต๊ฐœ ์ €์žฅ์†Œ์—๋Š” ์‚ฌ์šฉ์ž ์š”๊ตฌ๊ฐ€ ๊ฐœ๋ฐœ๋กœ ์ด์–ด์ง€๋Š” ๊ณผ์ •๋„ ๋ณด์ž…๋‹ˆ๋‹ค. 2026๋…„ Neo Geo tournament ์š”์ฒญ์€ tournament-safe remapping rule๊ณผ RP2040-Zero ์‹ค๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ contributor PR๋กœ ์ด์–ด์กŒ์Šต๋‹ˆ๋‹ค. W5500 ๋ธŒ๋ฆฌ์ง€ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ, ์‹ค์ œ ์ปจํŠธ๋กค๋Ÿฌ ์‚ฌ์šฉ ํ™˜๊ฒฝ์ด ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์— ๋ฐ˜์˜๋˜๋Š” ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค.

์ €์žฅ์†Œ๋Š” Apache License 2.0์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. Apache-2.0์€ Joypad ์ƒํ‘œ ์‚ฌ์šฉ๊ถŒ์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ WIZnet Maker ํ”„๋กœ์ ํŠธ

  • libogc2๋Š” GameCube/Wii homebrew SDK์— WIZnet network interface๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ด€์ ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ฐธ๊ณ  ์ž๋ฃŒ์ง€๋งŒ RP2040 GBA-to-Dolphin ๋˜๋Š” MCP bridge๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
  • W5500 Ethernet Adapter for GameCube: ETH2SP1์€ ๊ฐ™์€ W5500๊ณผ GameCube ๊ต์ฐจ์ ์„ ์ƒ์šฉ Ethernet adapter๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Joypad์˜ ์‹คํ—˜์  firmware path์™€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • Swiss๋Š” W5500 ๊ณ„์—ด GameCube networking์˜ console-software ๋งฅ๋ฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Joypad OS๋Š” Joybus, adapter firmware, host tool ๊ด€์ ์—์„œ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

โ“ FAQ

Q. gc2eth_feather๋ฅผ v2.2.0์—์„œ ๋ฐ”๋กœ ํ”Œ๋ž˜์‹œํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์•„๋‹ˆ์š”. ์†Œ์Šค ํƒ€๊นƒ์€ ์žˆ์ง€๋งŒ ์•ˆ์ • ๋ฆด๋ฆฌ์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชฉ๋ก์—์„œ ์ œ์™ธ๋˜์–ด ์žˆ๊ณ  ์ „์šฉ v2.2.0 UF2๋„ ์—†์Šต๋‹ˆ๋‹ค.

Q. ์ด ๋ธŒ๋ฆฌ์ง€๊ฐ€ ์‹ค์ œ GameCube ๋ณธ์ฒด์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋‚˜์š”? ์•„๋‹ˆ์š”. ์‹ค์ œ GBA๋Š” ๋งํฌ ์ผ€์ด๋ธ”๋กœ ์—ฐ๊ฒฐ๋˜๊ณ  Dolphin์ด GameCube ์ธก์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

Q. Joypad MCP๊ฐ€ W5500์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์ž…๋ ฅ์„ ๋ณด๋‚ด๋‚˜์š”? ์•„๋‹ˆ์š”. ํ˜„์žฌ MCP ์„œ๋ฒ„๋Š” ํ˜ธํ™˜๋˜๋Š” UART-host ํŽŒ์›จ์–ด์— 115200-baud serial connection์œผ๋กœ INPUT_EVENT packet์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

Q. W5500 ํƒ€๊นƒ์ด TCP socket์„ ๋‘ ๊ฐœ ์—ฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? socket 0์€ GBA command์™€ response stream์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. socket 1์€ Dolphin clock connection์„ ์œ ์ง€ํ•˜๋ฉฐ ์ˆ˜์‹  ๋ฐ”์ดํŠธ๋Š” ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

Q. AI ๋„๊ตฌ๊ฐ€ ์ด ๋ธŒ๋ฆฌ์ง€๋ฅผ ํ†ตํ•ด ์‹ค์ œ ์ฝ˜์†”์„ ์ด๋ฏธ ์ œ์–ดํ•˜๋‚˜์š”? ๊ณต๊ฐœ ์†Œ์Šค์—๋Š” ํ•ด๋‹น ํ†ตํ•ฉ์ด ์—†์Šต๋‹ˆ๋‹ค. VLM๊ณผ LeRobot workflow๋Š” ํ˜„์žฌ software NES emulator๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Documents

  • Joypad OS GitHub repository

    Open-source controller firmware platform containing the W5500 bridge and separate AI controller tools

  • Joypad OS v2.2.0 release

    Latest stable release checked for packaged application assets

  • W5500 bridge hardware configuration

    Joybus and SPI pins, static IP addresses, 20 MHz target setting, and both Dolphin TCP ports

  • W5500 bridge app source

    Dolphin TCP, Joybus passthrough, cache controls, tracing, and disabled intercept-replay experiment

  • W5500 driver source

    Direct W5500 SPI, register, hardware socket, TX-buffer, and RX-buffer implementation

  • joypad-mcp source

    MCP stdio server, 20 registered tools, screenshots, and 115200-baud UART INPUT_EVENT transport

  • joypad-bot and LeRobot tools

    Software NES vision loop plus emulator-side recording, training, and inference tools

  • W5500 official documentation

    Official WIZnet features, memory, interfaces, and electrical specifications

  • Apache License 2.0

    Repository license

Comments

Similar projects you might like

Comments