
Finalized bluetooth remote
3pnguyen/esp32-bluetooth-media-keyboard
Electronic project that provides the same control as wireless earbuds.

Mostek OCTOSPI/QUADSPI/SPI <-> SFP na FPGA Gowin GW1N-9: lacze swiatlowodowe 100 Mbaud 8b/10b z programowym odzyskiem zegara, biblioteka C dla STM32
SFP xSPI Bridge is an open-source printed circuit board by bartkepl, from the bartkepl/SFP-xSPI_Bridge repository on GitHub, published under the MIT licence. It is a 4-layer board of 68 × 29.3 mm with 53 parts on 52 nets, routed with 479 tracks and 494 vias.
It is built around the XL-1608SYGC-06, OT322525MJBA4SL and SMF3.3A. Its parts include 19 capacitors, 17 resistors, 3 diodes, 3 connectors and 2 inductors. It belongs with the fPGA and programmable logic and interfaces and adapters boards and the FPGA and CPLD boards of this library.
Moduł łączący dwa mikrokontrolery STM32 łączem światłowodowym punkt–punkt, bez stosu IP. Host zapisuje i odczytuje ramki przez OCTOSPI, QUADSPI lub zwykłe SPI; FPGA koduje je w 8b/10b i wysyła przez moduł SFP z prędkością 100 Mbaud, a po drugiej stronie odzyskuje zegar programowo (soft-CDR z nadpróbkowaniem). Tryb przezroczysty UART pozwala użyć pary mostków jako „przedłużacza” portu szeregowego, bez żadnego sterownika.
Status: projekt FPGA ukończony i zweryfikowany w symulacji (testy modułów i testy end-to-end dwóch kompletnych mostków), biblioteka C dla STM32 gotowa i przetestowana na modelu mostka, schemat i PCB rev. A zweryfikowane (raport), pliki produkcyjne wygenerowane — przed zamówieniem prototypu. Uruchomienie sprzętowe według planu.
STM32 ══ xSPI ══ GW1N-9 ══ LVDS ══ SFP ~~~ światłowód ~~~ SFP ══ LVDS ══ GW1N-9 ══ xSPI ══ STM32
| Góra (TOP) | Dół (BOTTOM) |
|---|---|
![]() | ![]() |
Płytka 4-warstwowa (JLC04161H-7628): pary LVDS na warstwie zewnętrznej nad ciągłą masą, płaszczyzna 3,3 V na warstwie wewnętrznej. Na płytce: klatka SFP, złącze hosta 2 × 10 (raster 1,27 mm), złącze programowania Tag-Connect TC2050 i zworka wyboru trybu. Zasilanie wyłącznie 3,3 V z hosta.
Wygenerowane PDF-y: schemat · PCB · interaktywny BOM.
HOST_IRQ_N.#define, z portami HAL dla OCTOSPI, XSPI, QUADSPI i SPI.| Parametr | Wartość |
|---|---|
| FPGA | Gowin GW1N-UV9QN48C6/I5 (GW1N-9C), konfiguracja AUTOBOOT z wewnętrznej pamięci Flash |
| Łącze | 100 Mbaud, 8b/10b, ramki z CRC-32, bez retransmisji (błędy zgłaszane hostowi) |
| Przepustowość | do ok. 9,9 MB/s treści (ramki 1024 B) |
| Interfejs hosta | SPI 1-x-1, QSPI 1-0-4, OCTOSPI 1-0-8; SDR, tryb 0, SCLK ≤ 40 MHz |
| Bufory | FIFO TX 4 KiB, FIFO RX 8 KiB (BSRAM) |
| Tryb UART | 8N1, 115 200 bit/s (do ok. 3 Mbit/s), opcjonalnie RTS/CTS |
| Moduły SFP | INF-8074i, bez wewnętrznego CDR; SFP+ nieobsługiwane |
| Złącze hosta | 2 × 10, raster 1,27 mm: 3,3 V, SCLK, CS, IO0…IO7, DQS, IRQ, RST |
| Zasilanie | 3,3 V, ok. 0,45 A (moduł SFP do 300 mA) |
| PCB | 4 warstwy, 68 × 29,3 mm, 1,6 mm |
| Zajętość FPGA | 4483 LUT/ALU (52 %), 7 z 26 BSRAM; clk_sys 50 MHz (Fmax 56 MHz) |
xSPI (SCLK ≤ 40 MHz) LVDS 100 Mbaud
STM32 ════════════════════════╗ ╔════════════════ SFP
▼ │
xspi_slave ─▶ csr_regs ─┬─▶ FIFO TX ─▶ framer + CRC ─▶ 8b/10b ─▶ OSER8 ─▶ TLVDS_OBUF ─▶ TD±
│
├─◀ FIFO RX ◀─ deframer + CRC ◀─ 8b/10b ◀─ comma align ◀─ soft-CDR ◀─ IDES8 ◀─ RD±
│
├─▶ I2C master + DDM ─▶ SFP SCL / SDA
└─▶ sygnały SFP, LED, HOST_IRQ_N
tryb UART: UART_RX ─▶ pakietyzacja (ramki TYPE 0x01) ─▶ FIFO TX FIFO RX ─▶ UART_TX
zegary: CLK_25M ─▶ rPLL 200 MHz (serializery) ─▶ CLKDIV /4 ─▶ clk_sys 50 MHz (logika)Decyzje projektowe z uzasadnieniem: rejestr ADR. Pełna koncepcja (piny, zegary, warstwa fizyczna, PCB, moduły, komendy, rejestry, uruchomienie): doc/sfp-xspi-bridge-plan.md.
| Arkusz | Plik | Zawartość |
|---|---|---|
| root | SFP_xSPI_Bridge.kicad_sch | połączenia hierarchiczne, otwory montażowe |
| EXT_IO | ext_io.kicad_sch | FPGA (zasilanie, konfiguracja, magistrala hosta), złącze hosta J3, Tag-Connect J2, zworki, TVS |
| SFP | sfp.kicad_sch | klatka SFP, filtry zasilania modułu, terminacja i bias RX, generator 25 MHz, diody LED |
| Dokument | Zawartość |
|---|---|
| Interfejs hosta (datasheet) | wyprowadzenia J3, parametry czasowe, komendy xSPI, mapa rejestrów, tryb UART, przykłady |
| Biblioteka C (STM32) | konfiguracja, porty HAL, API, weryfikacja |
| Koncepcja konstrukcji | architektura, przydział pinów, zegary, PCB, moduły, uruchomienie |
| Weryfikacja płytki rev. A | DRC / ERC, zgodność z przydziałem pinów i INF-8074i, pary LVDS, zasilanie, pliki produkcyjne |
| Projekt FPGA | moduły VHDL, testbenche, symulacja, wyniki syntezy |
| Testy end-to-end | dwa mostki połączone łączem: SPI, QSPI, OSPI, UART — z przebiegami |
| Decyzje (ADR) | kontekst, warianty i konsekwencje decyzji projektowych |
Dokumentacja jako serwis MkDocs (mkdocs 1.6, mkdocs-material 9.x):
python -m mkdocs serve # podgląd: http://127.0.0.1:8000FPGA — Gowin EDA (projekt vhdl/sfp_bridge/sfp_bridge.gprj, VHDL-2008):
cd vhdl/sfp_bridge
gw_sh build.tcl # synteza, PnR i bitstreamBitstream: vhdl/sfp_bridge/impl/pnr/sfp_bridge.fs, programowanie przez JTAG (Gowin Programmer lub openFPGALoader).
Symulacja — GHDL 5 (VHDL-2008), na Windows w WSL; modele prymitywów z instalacji Gowin EDA:
$env:GOWIN_SIMLIB = "<Gowin EDA>\IDE\simlib\gw1n" # PowerShell
cd vhdl\sim
.\run_tests.ps1 # wszystkie testbenche; .\view.ps1 <tb> — przebieg w GTKWaveFirmware — biblioteka w firmware/sfp_bridge/: skopiować config/sfpb_config_template.h jako sfpb_config.h, ustawić transport i uchwyt peryferium, wywołać sfpb_init(&dev, NULL). Testy na PC: make -C firmware/tests.
Bez hosta — dwa mostki ze zwartą zworką MODE_SEL i dwa konwertery USB-UART (115 200 8N1) tworzą przezroczysty kanał szeregowy przez światłowód.
| Obszar | Zakres | Wynik |
|---|---|---|
| Moduły FPGA | 24 samosprawdzające testbenche GHDL, testy mutacyjne | PASS |
| Łącze | dwa końce z odchyłką 200 ppm i jitterem, CDR do ±1000 ppm i ±0,3 UI | PASS |
| End-to-end | dwa kompletne mostki (modele prymitywów Gowin): SPI, QSPI, OSPI, UART zworką i rejestrem | PASS |
| Synteza | pełny układ, ograniczenia czasowe spełnione (clk_sys 56 MHz, clk_host 44 MHz) | OK |
| Biblioteka C | 207 sprawdzeń na modelu mostka, 17 mutacji wykrytych; kompilacja portów dla L4R5, H563, F446, L476, G0B1 | PASS |
| PCB | DRC i ERC bez błędów, przydział pinów 100 % zgodny z .cst, pary LVDS w regułach | OK |
| Sprzęt | uruchomienie prototypu rev. A | do wykonania |
.
├── doc/ # dokumentacja (MkDocs): koncepcja, datasheet, ADR, opisy modułów, testy end-to-end
├── firmware/ # biblioteka C dla STM32 (sfp_bridge), przykład, testy na PC
├── media/ # rendery 3D płytki
├── pcb/ # projekt KiCad 10 (schemat hierarchiczny, PCB, reguły DRC, biblioteka lokalna, jobsety)
├── prod/ # pliki produkcyjne: Gerbery (.zip), PDF schematu i PCB, interaktywny BOM
└── vhdl/ # projekt FPGA (Gowin EDA): źródła, ograniczenia, testbenche i skrypty symulacjiPliki produkcyjne generują jobsety KiCad: gen_prod.kicad_jobset (PDF, BOM), gen_gerber.kicad_jobset (Gerbery, wiercenia), gen_media.kicad_jobset (rendery 3D).
MIT © 2026 bartkepl
| Qty | Value | Footprint | References |
|---|---|---|---|
| 12 | 100n | Capacitor_SMD:C_0603_1608Metric | C1, C2, C3, C4, C5, C6, C7, C8, C10, C12, C13, C19 |
| 7 | 10k | Resistor_SMD:R_0603_1608Metric | R1, R3, R4, R5, R6, R8, R16 |
| 7 | 10u | Capacitor_SMD:C_0603_1608Metric | C9, C11, C14, C15, C16, C17, C18 |
| 4 | 1k | Resistor_SMD:R_0603_1608Metric | R2, R7, R14, R15 |
| 4 | MountingHole_Pad | MountingHole:MountingHole_2.7mm_M2.5_DIN965_Pad | H1, H2, H3, H4 |
| 2 | 1uH | Inductor_SMD:L_0805_2012Metric | L1, L2 |
| 2 | 4.7k | Resistor_SMD:R_0603_1608Metric | R13, R17 |
| 2 | 49.9 1% | Resistor_SMD:R_0402_1005Metric | R9, R10 |
| 2 | LED | LED_SMD:LED_0603_1608Metric | D2, D3 |
| 2 | SolderJumper_2_Open | Jumper:SolderJumper-2_P1.3mm_Open_TrianglePad1.0x1.5mm | JP1, JP3 |
| 1 | 1.2k | Resistor_SMD:R_0603_1608Metric | R12 |
| 1 | 2.1k | Resistor_SMD:R_0603_1608Metric | R11 |
| 1 | Conn_02x10_Odd_Even | Connector_PinHeader_1.27mm:PinHeader_2x10_P1.27mm_Vertical | J3 |
| 1 | GW1N-6&9_QN48 | Package_DFN_QFN:QFN-48-1EP_6x6mm_P0.4mm_EP4.2x4.2mm_ThermalVias | U1 |
| 1 | OT322525MJBA4SL | Oscillator:Oscillator_SMD_Abracon_ASE-4Pin_3.2x2.5mm | Y1 |
| 1 | SFP | Connector:Connector_SFP_and_Cage | J1 |
| 1 | SMF3.3A | Diode_SMD:D_SOD-123F | D1 |
| 1 | SolderJumper_3_Open | Jumper:SolderJumper-3_P2.0mm_Open_TrianglePad1.0x1.5mm | JP2 |
| 1 | TC2050 | Connector:Tag-Connect_TC2050-IDC-NL_2x05_P1.27mm_Vertical | J2 |

3pnguyen/esp32-bluetooth-media-keyboard
Electronic project that provides the same control as wireless earbuds.

d0ng3o/esp32_turd_scooter_controller
Open-source ESP32-C3 replacement control board + ESP-IDF firmware for a decommissioned Bird One e-scooter, plus the reverse-engineered Lishui one-wire bus protocol.

/NEWSuperCapacitorController-master/hardware/SuperCap2024_Control_V1.1R_F3_ISOPWR/SuperCap2024Control_V1.1R_F3_ISOPWR.kicad_pcb.jpg?size=s&soon)


festlv/rioctrl-hw
Hardware design for modular CNC controller

johonkanen/efinix_soc_board
Efinix Ti135N484I3 Linux control card for the AC lab PSU baseboard (KiCad 10, scripted schematic)

KarpelesLab/ledger_implant_detector
A small hand-held tool for spotting extra conductive structures hidden inside the plastic shell of a hardware wallet (e.g. a Ledger).
It measures 68 × 29.3 mm and has 4 copper layers, 1.61 mm thick.
53 parts, built around the XL-1608SYGC-06, OT322525MJBA4SL and SMF3.3A. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
From the bartkepl/SFP-xSPI_Bridge repository on GitHub, at the commit this page was made from: the board is pcb/SFP_xSPI_Bridge.kicad_pcb and its schematic pcb/SFP_xSPI_Bridge.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).