Driving WIZnet W5100S Without an SDK on a Custom RP2354B
Custom RP2354B computer runs its own OS and drives WIZnet W5100S directly over SPI, implementing hardware sockets, blocking I/O, and a TCP server.
0
Project description
๐ ์ง์ ๋ง๋ ์ปดํจํฐ์์ ์ง์ ๋ง๋ OS๋ฅผ ์คํํ๋ค
GeT Computer๋ RP2354B ๊ธฐ๋ฐ์ ์ปค์คํ ์ฑ๊ธ๋ณด๋ ์ปดํจํฐ์ ๋๋ค. VGA, PS/2 keyboard, microSD์ ํจ๊ป ์ ์ Ethernet์ ์ํ WIZnet W5100S๋ฅผ ์ฌ์ฉํ๋ฉฐ, KiCad ํ๋ก๋์ PCB layout, BOM, Gerber ๋ฑ์ ํ๋์จ์ด ์ค๊ณ ์๋ฃ๊ฐ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
์ด ํ๋ก์ ํธ์ ํน์ง์ ํ๋์จ์ด๋ฟ ์๋๋ผ GeT OS๊น์ง ์ง์ ๊ตฌํํ๋ค๋ ์ ์ ๋๋ค. GeT OS๋ ARM Assembly์ C ๊ธฐ๋ฐ์ monolithic kernel์ด๋ฉฐ, Pico SDK๋ RTOS, WIZnet ioLibrary ์์ด W5100S Ethernet driver๊น์ง ์ง์ ๊ตฌํํฉ๋๋ค.
No Pico SDK ยท No ioLibrary ยท No RTOS

๐ W5100S๋ฅผ SPI Register๋ก ์ง์ ์ ์ด
GeT OS๋ SPI0๋ฅผ ํตํด W5100S์ ์ง์ ํต์ ํฉ๋๋ค.
| Signal | GPIO |
|---|---|
| MISO | GPIO 16 |
| CS | GPIO 17 |
| SCK | GPIO 18 |
| MOSI | GPIO 19 |
| INT | GPIO 21 |
Write์๋ 0xF0, Read์๋ 0x0F opcode๋ฅผ ์ฌ์ฉํ๊ณ , ์ดํ 16-bit register address์ data๋ฅผ ์ ๋ฌํฉ๋๋ค.
GeT OS โ Custom SPI Driver โ W5100S Register
Driver๋ software reset, retransmission ์ค์ , socket TX/RX buffer ์ค์ ๋ ์ง์ ์ฒ๋ฆฌํ๋ฉฐ, VERR๋ฅผ ์ฝ์ด 0x51์ ํ์ธํ๋ ๋ฐฉ์์ผ๋ก W5100S๋ฅผ ์๋ณํฉ๋๋ค.

๐ W5100S Hardware Socket์ OS Socket์ผ๋ก ์ฐ๊ฒฐ
GeT OS๋ W5100S์ hardware socket์ ์์ฒด socket/file abstraction๊ณผ ์ฐ๊ฒฐํฉ๋๋ค.
open_socket(), bind_socket(), listen_socket(), accept_socket(), connect_socket()์ SN_CR, SN_SR ๋ฑ์ W5100S socket register๋ฅผ ์ด์ฉํด ๋์ํฉ๋๋ค.
| Direction | Flow |
|---|---|
| TX | SN_TX_FSR โ TX Buffer โ SN_TX_WR โ CMD_SEND |
| RX | SN_RX_RSR โ RX Buffer โ SN_RX_RD โ CMD_RECV |
Application์์๋ ์ผ๋ฐ์ ์ธ read()์ write()๋ฅผ ์ฌ์ฉํ์ง๋ง, ๊ทธ ์๋์์๋ W5100S hardware socket์ด ์ง์ ๋์ํฉ๋๋ค.
Test code์๋ port 8080์์ connection์ acceptํ๊ณ HTTP/1.1 200 OK์ ๊ฐ๋จํ HTML์ ๋ฐํํ๋ TCP server๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
โฑ๏ธ RTOS ์์ด ๊ตฌํํ Blocking I/O
TCP socket์์ read()๋ฅผ ํธ์ถํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์์ง ์๋ค๋ฉด process๋ฅผ WAITING_FOR_RESOURCE ์ํ๋ก ๋ณ๊ฒฝํ๊ณ ๋ค๋ฅธ process๋ก context switchํฉ๋๋ค.
์ดํ W5100S์ INT๊ฐ ๋ฐ์ํ๋ฉด eth_irq()๊ฐ SN_IR์ ํ์ธํ๊ณ ํด๋น socket์ ๊ธฐ๋ค๋ฆฌ๋ process๋ฅผ ๋ค์ READY ์ํ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
Blocking read() โ WAITING โ W5100S INT โ READY
W5100S์ hardware socket event๋ฅผ ์ง์ ๋ง๋ OS scheduler์ ์ฐ๊ฒฐํ๋ค๋ ์ ์ด ์ด ํ๋ก์ ํธ์ ํต์ฌ์ ์ธ ํน์ง์ ๋๋ค.

๐งฉ ์ด ํ๋ก์ ํธ์์ W5100S์ ์ญํ
W5100S๋ ๋จ์ Ethernet MAC/PHY๊ฐ ์๋๋ผ Hardwired TCP/IP Ethernet Controller๋ก ์ฌ์ฉ๋ฉ๋๋ค.
TCP client/server๋ W5100S์ hardware TCP/IP socket์ ์ด์ฉํ๊ณ , RP2354B์์๋ SPI register access์ OS-level socket abstraction์ ๋ด๋นํฉ๋๋ค.
SDK๋ ioLibrary abstraction์ด ์๊ธฐ ๋๋ฌธ์ W5100S์ register์ hardware socket์ด ์ค์ OS API๊น์ง ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง๋ฅผ ์ฝ๋ ์์ค์์ ํ์ธํ ์ ์์ต๋๋ค.
โ ๏ธ ํ์ฌ ์ํ
GeT OS๋ ์์ง experimental ๋จ๊ณ์ ๋๋ค.
W5100S๋ 4๊ฐ์ hardware socket์ ์ ๊ณตํ๋ฉฐ, ํ์ฌ ๊ตฌํ์์๋ ํ๋๋ฅผ raw/MACRAW ์ฉ๋๋ก ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ ๋๋ค. Source comment์๋ ํฅํ MACRAW ๊ธฐ๋ฐ software TCP/IP stack๊ณผ Modbus ๊ตฌํ๋ ์ธ๊ธ๋์ด ์์ต๋๋ค.
Standalone bootloader๋ ์์ง ์์ผ๋ฉฐ ํ์ฌ Raspberry Pi Debug Probe๋ฅผ ํตํด code๋ฅผ loadํฉ๋๋ค.
๐ ๋น์ทํ WIZnet Maker ํ๋ก์ ํธ์ ๋น๊ต
| Project | Platform / SW | W5100S ์ฌ์ฉ ๋ฐฉ์ | GeT Computer์์ ์ฐจ์ด |
|---|---|---|---|
| GeT Computer | RP2354B + GeT OS | Direct SPI register + Hardware Socket | No SDK / No RTOS / ์์ฒด OS |
| Zephyr์ฉ W5100S-EVB-Pico ์ปค์คํ ๋ณด๋ ์ ์ | RP2040 + Zephyr RTOS | Zephyr ๋ณด๋ ์ ์๋ฅผ ๋ง๋ค์ด Zephyr ์์ฒด ๋คํธ์ํฌ ์คํ์ ์ฐ๊ฒฐ | ์ฒ์๋ถํฐ ๋ง๋ OS๊ฐ ์๋๋ผ, ๊ธฐ์กด RTOS(Zephyr) ์์ ๋ณด๋ ์ง์๋ง ์ถ๊ฐ |
| Modbus TCP Server Example | RP2040 + Pico SDK (RTOS ์์) | WIZnet ๊ณต์ ioLibrary_Driver๋ก ์์ผ ์ํ(Sn_SR)๋ฅผ ํด๋ง | Pico SDK์ ioLibrary๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ โ GeT OS๋ ์ด ๊ณ์ธต ์์ฒด๋ฅผ ๊ฑท์ด๋ด๊ณ ์ง์ ๊ตฌํ |
| W5100S-EVB-Pico Ethernet Communication Basics with Arduino IDE | RP2040 + Arduino IDE | Arduino Ethernet.h ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Ethernet.begin() ํ ์ค ํธ์ถ) | ๊ฐ์ฅ ๋์ ์์ค์ ์ถ์ํ โ GeT OS์ ๋ ์ง์คํฐ ์ง์ ์ ์ด์ ์ ๋ฐ๋ ๊ทน๋จ |
| Ultra Small Ethernet + RP2040 Board Production Record | RP2040(XIAO) ์ปค์คํ PCB | ํ์ค Pico SDK / ioLibrary ํ์จ์ด | ํ๋์จ์ด๋ GeT Computer์ฒ๋ผ ์ฒ์๋ถํฐ ์ค๊ณํ์ง๋ง, ์ํํธ์จ์ด๋ ํ์ค ์คํ ๊ทธ๋๋ก ์ฌ์ฉ |
Zephyr์ฉ W5100S-EVB-Pico ์ปค์คํ ๋ณด๋ ์ ์
W5100S-EVB-Pico๋ฅผ Zephyr RTOS์์ ์ธ์์ํค๊ธฐ ์ํด boards/arm/w5100s_evb_pico/ ์๋์ board.cmake, devicetree(.dts), Kconfig ๋ฑ์ ์ง์ ์์ฑํ ์ฌ๋ก์
๋๋ค.
GeT Computer์ ๋ง์ฐฌ๊ฐ์ง๋ก "๋ณด๋๋ฅผ ์ ์ํํธ์จ์ด ํ๊ฒฝ์ ํธ์ ์ํค๋" ์์ ์ด์ง๋ง, Zephyr๋ผ๋ ๊ธฐ์กด RTOS์ ๊ทธ ๋คํธ์ํฌ ์คํ ์์ ์น๋๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค. GeT OS๋ ๊ทธ RTOS ์์ฒด๊ฐ ์๊ณ ์ค์ผ์ค๋ฌยทVFSยท์์ผ ๊ณ์ธต๊น์ง ์ ๋ถ ์์ฒด ๊ตฌํํฉ๋๋ค.
Modbus TCP Server Example
RP2040 + W5100S(๋๋ W5500)๋ก Modbus TCP ์๋ฒ๋ฅผ ๊ตฌํํ ํํ ๋ฆฌ์ผ์
๋๋ค. WIZnet ๊ณต์ ioLibrary_Driver๋ฅผ ์ฌ์ฉํด wizchip_initialize(), getSn_SR(), listen(), send() ๊ฐ์ ํจ์๋ก ์์ผ์ ๋ค๋ฃน๋๋ค.
Pico SDK ๊ธฐ๋ฐ bare-metal(RTOS ์์)์ด๋ผ๋ ์ ์ GeT OS์ ๋น์ทํ์ง๋ง, W5100S ๋ ์ง์คํฐ ์ ๊ทผ์ ioLibrary๊ฐ ๋์ ์ฒ๋ฆฌํด์ค๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ๋๋ค. GeT OS๋ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ์ธต์ ์์ ๊ณ SPI ๋ ์ง์คํฐ๋ฅผ ์ง์ ๋๋๋ฆฝ๋๋ค.
W5100S-EVB-Pico Ethernet Communication Basics with Arduino IDE
Arduino IDE์ Ethernet.h ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก Ethernet ์ด๊ธฐํ, TCP/UDP ํด๋ผ์ด์ธํธยท์๋ฒ, ์น ์๋ฒ ๋ฑ 11๊ฐ์ง ์์ ๋ฅผ ์ ๊ณตํ๋ ํํ ๋ฆฌ์ผ ์ ์ฅ์์
๋๋ค. Ethernet.init(csPin), Ethernet.begin(mac) ๊ฐ์ ํ๋ ์ค์ ํจ์ ํธ์ถ๋ก ๋คํธ์ํน์ด ๋๋ฉ๋๋ค.
์ด ํ๋ก์ ํธ๊ฐ ์คํํธ๋ผ์ ํ์ชฝ ๋(์ต๋ ์ถ์ํ)์ด๋ผ๋ฉด, GeT Computer๋ ๋ฐ๋์ชฝ ๋(์ถ์ํ ์์)์ ๋๋ค. ๊ฐ์ W5100S๋ฅผ ๋ค๋ฃจ๋ฉด์๋ ๊ฐ๋ฐ์๊ฐ ๋ณด๊ฒ ๋๋ ์ฝ๋์ ๊น์ด๊ฐ ์์ ํ ๋ค๋ฆ ๋๋ค.
Ultra Small Ethernet + RP2040 Board Production Record
W5100S๋ฅผ Seeed XIAO RP2040 ๋ณด๋์ ๊ฒฐํฉํด ์ด์ํ Ethernet ๋ณด๋๋ฅผ ์ง์ ์ค๊ณยท์ ์ํ ๊ธฐ๋ก์ ๋๋ค.
GeT Computer ๋ณด๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋์จ์ด๋ฅผ ์ฒ์๋ถํฐ ์ค๊ณํ๋ค๋ ์ ์ ๊ฐ์ง๋ง, ๊ทธ ์์์ ๋๋ ์ํํธ์จ์ด๋ ํ์ค Pico SDK/ioLibrary ํ์จ์ด์ ๋๋ค. GeT Computer๋ ํ๋์จ์ด๋ฟ ์๋๋ผ ๊ทธ ์์ OS์ ๋๋ผ์ด๋ฒ๊น์ง ์ ๋ถ ์์ฒด ์ ์ํ๋ค๋ ์ ์์ ํ ๋จ๊ณ ๋ ๋์๊ฐ๋๋ค.
โ FAQ
Q. WIZnet ioLibrary๋ Pico SDK๋ฅผ ์ฌ์ฉํ๋์?
์๋์. W5100S register๋ฅผ SPI๋ก ์ง์ ์ฝ๊ณ ์ฐ๋ Ethernet driver๋ฅผ ์ง์ ๊ตฌํํ์ต๋๋ค.
Q. TCP/IP stack๋ RP2354B์์ ์ง์ ๊ตฌํํ๋์?
ํ์ฌ TCP client/server๋ W5100S Hardwired TCP/IP socket์ ์ฌ์ฉํฉ๋๋ค. MACRAW ๊ธฐ๋ฐ software TCP/IP stack์ ํฅํ ์์
์ผ๋ก ์ธ๊ธ๋์ด ์์ต๋๋ค.
Q. ์ค์ TCP Server๊ฐ ๋์ํ๋์?
๋ค. Port 8080์์ connection์ acceptํ๊ณ HTTP response์ HTML body๋ฅผ ๋ฐํํ๋ test server๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Q. Wi-Fi๋ ์ฌ์ฉํ๋์?
PCB์๋ Raspberry Pi Radio Module 2์ฉ footprint๊ฐ ์์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ฅ๋์ด ์์ง ์์ผ๋ฉฐ, ํ์ฌ GeT OS์์ ๊ตฌํ๋ networking path๋ W5100S wired Ethernet์
๋๋ค.
English
๐ A Custom Computer Running a Custom OS
GeT Computer is a custom single-board computer based on the RP2354B MCU. It combines VGA, PS/2 keyboard, microSD, and a WIZnet W5100S for wired Ethernet.
The unusual part is GeT OS, a custom monolithic kernel written primarily in ARM assembly and C. Instead of using the Pico SDK, an RTOS, or WIZnet ioLibrary, the project implements its own W5100S Ethernet driver and accesses the controller directly through SPI registers.
No Pico SDK ยท No ioLibrary ยท No RTOS

๐ Direct SPI Control of W5100S
The driver connects SPI0 directly to W5100S.
| Signal | GPIO |
|---|---|
| MISO | GPIO 16 |
| CS | GPIO 17 |
| SCK | GPIO 18 |
| MOSI | GPIO 19 |
| INT | GPIO 21 |
Writes use opcode 0xF0, while reads use 0x0F.
GeT OS โ Custom SPI Driver โ W5100S Registers
The driver also handles software reset, retransmission configuration, socket-buffer setup, and checks VERR for the expected 0x51 value.

๐ Hardware Sockets as OS Sockets
GeT OS maps W5100S hardware sockets into its own socket/file abstraction.
Functions such as open_socket(), bind_socket(), listen_socket(), accept_socket(), and connect_socket() operate directly on registers including SN_CR and SN_SR.
| Direction | Flow |
|---|---|
| TX | SN_TX_FSR โ TX Buffer โ SN_TX_WR โ CMD_SEND |
| RX | SN_RX_RSR โ RX Buffer โ SN_RX_RD โ CMD_RECV |
Applications can use read() and write() while the kernel maps those operations to W5100S hardware sockets.
The repository also contains a port 8080 TCP server that accepts a connection and returns HTTP/1.1 200 OK with a small HTML body.
โฑ๏ธ Blocking I/O Without an RTOS
When a blocking read() has no data available, GeT OS places the process into WAITING_FOR_RESOURCE and schedules another process.
When W5100S asserts INT, eth_irq() checks the socket interrupt registers and returns the corresponding process to READY.
Blocking read() โ WAITING โ W5100S INT โ READY
This directly connects W5100S hardware socket events with the custom OS scheduler.

๐งฉ Why W5100S Matters
W5100S is used as a Hardwired TCP/IP Ethernet Controller, not simply as an Ethernet MAC or PHY.
Its hardware TCP/IP sockets handle the current TCP client/server networking while the RP2354B implements SPI access and the OS-level socket abstraction.
This makes the project a useful reference for seeing how a WIZnet hardware TCP/IP controller can be integrated into a custom OS without an existing networking SDK.
โ ๏ธ Current Status
GeT OS is still experimental.
The W5100S provides four hardware sockets, with one currently used for raw/MACRAW operation. Source comments also mention future work on a software TCP/IP stack over MACRAW and possible Modbus support.
There is no standalone bootloader yet, and code is currently loaded through a Raspberry Pi Debug Probe.
๐ Comparison with Related WIZnet Maker Projects
| Project | Platform / Software | W5100S Approach | Difference from GeT Computer |
|---|---|---|---|
| GeT Computer | RP2354B + custom GeT OS | Direct SPI register + hardware socket | No SDK / No RTOS / custom OS |
| Custom W5100S-EVB-Pico Board for Zephyr | RP2040 + Zephyr RTOS | Custom Zephyr board definition wired into Zephyr's own network stack | Adds board support to an existing RTOS rather than writing an OS from scratch |
| Modbus TCP Server Example | RP2040 + Pico SDK (no RTOS) | WIZnet's official ioLibrary_Driver polling socket status (Sn_SR) | Uses the Pico SDK and ioLibrary as-is; GeT OS removes that layer entirely and talks to registers directly |
| W5100S-EVB-Pico Ethernet Communication Basics with Arduino IDE | RP2040 + Arduino IDE | Arduino Ethernet.h library (Ethernet.begin()) | The most abstracted end of the spectrum \u2014 the opposite extreme from GeT OS's direct register access |
| Ultra Small Ethernet + RP2040 Board Production Record | RP2040 (XIAO) custom PCB | Standard Pico SDK / ioLibrary firmware | Hardware designed from scratch like GeT Computer, but the software stays on the standard SDK |
Custom W5100S-EVB-Pico Board for Zephyr
This project hand-writes Zephyr board files (board.cmake, devicetree, Kconfig) under boards/arm/w5100s_evb_pico/ so the RTOS recognizes the W5100S-EVB-Pico board.
Like GeT Computer, it's about bringing a board into a new software environment \u2014 but here that environment is an existing RTOS (Zephyr) and its own network stack. GeT OS has no underlying RTOS at all; its scheduler, VFS, and socket layer are all custom.
Modbus TCP Server Example
A tutorial implementing a Modbus TCP server on RP2040 with W5100S (or W5500), using WIZnet's official ioLibrary_Driver \u2014 functions like wizchip_initialize(), getSn_SR(), listen(), and send() handle the sockets.
Like GeT OS, it's bare-metal on the Pico SDK with no RTOS, but ioLibrary does the W5100S register work here. GeT OS removes that library layer and drives the SPI registers itself.
W5100S-EVB-Pico Ethernet Communication Basics with Arduino IDE
A tutorial repository of eleven Arduino IDE examples (Ethernet init, TCP/UDP client and server, web server, and more) built on the Ethernet.h library, where networking comes down to a line or two like Ethernet.init(csPin) and Ethernet.begin(mac).
If this project sits at the most-abstracted end of the spectrum, GeT Computer sits at the opposite end. Both drive the same chip, but the amount of code a developer actually sees is completely different.
Ultra Small Ethernet + RP2040 Board Production Record
A build log for a custom, ultra-compact Ethernet board pairing a W5100S with a Seeed XIAO RP2040.
Like the GeT Computer board, the hardware is designed from scratch \u2014 but the firmware on top of it is standard Pico SDK / ioLibrary. GeT Computer goes a step further by also writing its own OS and driver instead of the standard stack.
โ FAQ
Does it use WIZnet ioLibrary or the Pico SDK?
No. The Ethernet driver directly accesses W5100S registers over SPI.
Is TCP/IP implemented in software on the RP2354B?
The current TCP client/server uses W5100S Hardwired TCP/IP sockets. A software stack over MACRAW is future work.
Does the TCP server actually run?
Yes. The repository contains a port 8080 server that accepts connections and returns an HTTP response.
Does it use Wi-Fi?
The PCB includes an unpopulated Raspberry Pi Radio Module 2 footprint, but the networking path currently implemented by GeT OS is W5100S wired Ethernet.