Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c0c123e88b | |||
| ddb33b6a2c | |||
| a12e4af68b | |||
| 34c54d68b0 | |||
| 009a643698 | |||
| 6ba3447e58 | |||
| 1a7f0689ab |
@@ -0,0 +1,135 @@
|
|||||||
|
---
|
||||||
|
name: flash-re-bba-rb
|
||||||
|
description: Use when flashing the re-bba-rb board (GC BBA FPGA replacement) — programming the iCE40UP5K bitstream with iceprog from inside the devcontainer (native-Linux or WSL2 host USB passthrough). Covers USB prerequisites, best-seed bitstream selection, sudo/libusb access. WARNING: on V1 the FT2232H EEPROM (U7 93LC46B) is undersized and writing the product string SOFT-BRICKS enumeration — the skill documents why not to, and the CLK-to-GND recovery.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Flashing the re-bba-rb board
|
||||||
|
|
||||||
|
The board is FT2232H (USB) → iCE40UP5K (FPGA) + W5100S (ethernet). Two flashable
|
||||||
|
targets, done **in this order**:
|
||||||
|
|
||||||
|
1. **FPGA bitstream** via `iceprog` (MPSSE on FT2232H channel A) — the functional
|
||||||
|
flash. Do this first; it works with a blank EEPROM.
|
||||||
|
2. **FT2232H EEPROM** product string via `pyftdi` — cosmetic ("re-BBA-rb" instead
|
||||||
|
of "Dual RS232-HS"). Optional, do it only after the bitstream is proven.
|
||||||
|
|
||||||
|
Both need USB access to the FT2232H (VID:PID `0403:6010`) from inside the
|
||||||
|
container. The `vscode` user reaches the root-owned `/dev/bus/usb` nodes via
|
||||||
|
passwordless `sudo`.
|
||||||
|
|
||||||
|
## Prerequisites (once per session)
|
||||||
|
|
||||||
|
1. **Container built with USB access.** `.devcontainer/` must have `--privileged`,
|
||||||
|
the `/dev/bus/usb` bind mount, `sudo`, `libusb-1.0-0`, `libftdi1-2`, and
|
||||||
|
`pyftdi`. If `.devcontainer/` was just edited, the user must **rebuild the
|
||||||
|
container** — those changes are baked at build/create time.
|
||||||
|
2. **Device attached to WSL2.** On the Windows host, as Administrator:
|
||||||
|
`.devcontainer/attach-icebreaker.ps1` (wraps `usbipd attach`). Attach before
|
||||||
|
or after container start — the bind mount is live, so a later attach still
|
||||||
|
appears.
|
||||||
|
3. **Confirm the device is visible from inside the container:**
|
||||||
|
```bash
|
||||||
|
ls /dev/bus/usb/*/* # nodes must exist
|
||||||
|
sudo /opt/venv/bin/python -c "import usb.core,usb.backend.libusb1 as b; \
|
||||||
|
print(usb.core.find(idVendor=0x0403, idProduct=0x6010, backend=b.get_backend()))"
|
||||||
|
```
|
||||||
|
A non-`None` device object means libusb can see it. If `/dev/bus/usb` is empty,
|
||||||
|
the device is not attached (fix on the Windows side) — see Troubleshooting.
|
||||||
|
|
||||||
|
## Step 1 — Flash the FPGA bitstream
|
||||||
|
|
||||||
|
The design's `capture` domain (54 MHz) closes on only a **minority of seeds** —
|
||||||
|
always sweep and flash the **best passing** seed, never the default seed-1 build.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Build all 8 seeds (from workspace root). Prints the best passing seed + path.
|
||||||
|
python -m exi_bba.synth --seeds 8
|
||||||
|
```
|
||||||
|
Note the reported best seed, e.g. `Best seed: 4 ... build/seed4/top.bin`. (As of
|
||||||
|
the last build: **seed 4, `build/seed4/top.bin`, capture 58.36 MHz**, 4/8 pass.
|
||||||
|
`build/` is on the host bind mount, so it survives container rebuilds.)
|
||||||
|
|
||||||
|
Flash it (SRAM-less part → `iceprog` writes the SPI flash; the FPGA boots from
|
||||||
|
it):
|
||||||
|
```bash
|
||||||
|
sudo iceprog build/seed4/top.bin # substitute the reported best-seed path
|
||||||
|
```
|
||||||
|
Expect `iceprog` to detect the FTDI, erase, write, and **verify OK**. If it says
|
||||||
|
"Can't find iCE FTDI USB device", the USB passthrough is not working — see
|
||||||
|
Troubleshooting. After a successful flash, power-cycle / re-plug to boot the new
|
||||||
|
image.
|
||||||
|
|
||||||
|
`ICEPROG=/path/to/iceprog` overrides the binary if needed; the container's is on
|
||||||
|
`PATH`.
|
||||||
|
|
||||||
|
## Step 2 — FT2232H EEPROM product string — ⚠️ DO NOT DO THIS ON V1
|
||||||
|
|
||||||
|
**On the re-bba-rb V1 board, writing the EEPROM product string SOFT-BRICKS the
|
||||||
|
FT2232H.** U7 is a 93LC46B (128 B), too small for the FT2232H (which needs a
|
||||||
|
93LC56B / 256 B). A string write lands a partial, checksum-valid-but-garbage
|
||||||
|
config; the FT2232H reads it at power-up and **fails USB enumeration entirely —
|
||||||
|
dead silent, no `dmesg` attach.** It does NOT fall back to ROM defaults (only a
|
||||||
|
BLANK / checksum-invalid EEPROM does). Confirmed on hardware 2026-08-22.
|
||||||
|
|
||||||
|
`flash_ftdi_eeprom.py` **detects the mirrored/undersized chip and refuses the
|
||||||
|
write** — leave it that way. There is no way to program the string on V1; it
|
||||||
|
needs a 93LC56B at U7 (a future rev). The board is fully functional without it:
|
||||||
|
it enumerates on ROM defaults (`Dual RS232-HS`, `0403:6010`) and iceprog + the
|
||||||
|
channel-B UART work normally.
|
||||||
|
|
||||||
|
### Recovery — if U7 ever gets a bad config written (soft-brick)
|
||||||
|
|
||||||
|
Symptom: the FT2232H disappears from USB completely (no `dmesg` on plug) even
|
||||||
|
though it's powered (3.3 V on VCC/VPHY/RESET#/DP all present). Fix — the classic
|
||||||
|
FTDI EEPROM recovery, done on the V1 unit and confirmed working:
|
||||||
|
|
||||||
|
1. **Power the board on with U7's CLK pin shorted to GND.** This corrupts the
|
||||||
|
EEPROM read so the FT2232H can't load the bad config → it enumerates on ROM
|
||||||
|
defaults (`0403:6010`).
|
||||||
|
2. Release the short and immediately blank U7:
|
||||||
|
```bash
|
||||||
|
sudo /opt/venv/bin/python hardware/re-bba-rb/flash_ftdi_eeprom.py --erase --commit
|
||||||
|
```
|
||||||
|
(On the mirrored chip pyftdi's 256-byte verify trips even though the 0xFF
|
||||||
|
writes land — the script loops and checks actual content, so ignore the
|
||||||
|
per-attempt verify warnings; it reports "fully blank" when done.)
|
||||||
|
|
||||||
|
To restore a saved backup instead, write `eeprom-backup.bin` back as a raw image.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
- **`/dev/bus/usb` empty / device object is `None`** → the FT2232H isn't on the
|
||||||
|
host bus (the container's `/dev/bus/usb` mirrors the host live). On a **native
|
||||||
|
Linux host** (e.g. Arch — Docker directly): `lsusb | grep 0403` on the host; if
|
||||||
|
missing, re-plug the cable. On a **Windows/WSL2 host**: run
|
||||||
|
`.devcontainer/attach-icebreaker.ps1` (admin) and check `usbipd list` shows it
|
||||||
|
`Attached`.
|
||||||
|
- **Powered but totally silent on plug (no `dmesg` attach at all)** → most likely
|
||||||
|
a soft-bricked FT2232H EEPROM (see Step 2 recovery) if the EEPROM was ever
|
||||||
|
written; otherwise a severed USB power/data via from the board repair. A blank
|
||||||
|
EEPROM does NOT cause this — a *partial* write does.
|
||||||
|
- **`Permission denied` / `LIBUSB_ERROR_ACCESS`** → run the command under `sudo`
|
||||||
|
(the nodes are root-owned). Both `iceprog` and the pyftdi script need it.
|
||||||
|
- **`iceprog` can't find the device but `pyftdi` sees it (or vice-versa)** → a
|
||||||
|
kernel driver (`ftdi_sio`) may hold an interface. `iceprog`/`pyftdi` detach it
|
||||||
|
automatically under sudo; if stuck, `sudo modprobe -r ftdi_sio` (or re-attach
|
||||||
|
the device) and retry.
|
||||||
|
- **`iceprog` verify fails / flakey** → the drilled-out-via repair on this V1
|
||||||
|
unit may have damaged a flash/CDONE/CRESET trace; check continuity of the SPI
|
||||||
|
flash lines and CRESET_B/CDONE to the FPGA before assuming gateware fault.
|
||||||
|
- **FPGA boots but the GC won't enumerate the BBA** → this is a *timing* seed
|
||||||
|
issue, not a flash issue. Re-flash the reported **best passing** seed (the
|
||||||
|
capture domain fails on ~half of seeds). See CLAUDE.md "Current Implementation
|
||||||
|
State".
|
||||||
|
|
||||||
|
## Guardrails
|
||||||
|
|
||||||
|
- **Do NOT program the EEPROM string on V1 — it soft-bricks the FT2232H** (U7 is
|
||||||
|
an undersized 93LC46B; see Step 2). The script refuses by design; do not
|
||||||
|
`--force` it. Recovery is CLK-to-GND at boot + `--erase`.
|
||||||
|
- **Never change VID/PID** in the EEPROM — `iceprog` and D2XX look for
|
||||||
|
`0403:6010`. The script/conf keep it; don't override.
|
||||||
|
- **Always flash the swept best-seed** `.bin`, never a no-`--seeds` seed-1 build
|
||||||
|
(capture timing fails on it).
|
||||||
|
- A **blank** EEPROM is the correct, working state on V1; only a *partial* write
|
||||||
|
is dangerous.
|
||||||
@@ -4,18 +4,25 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
|||||||
ca-certificates \
|
ca-certificates \
|
||||||
git \
|
git \
|
||||||
git-lfs \
|
git-lfs \
|
||||||
|
sudo \
|
||||||
python3 \
|
python3 \
|
||||||
python3-venv \
|
python3-venv \
|
||||||
python3-pip \
|
python3-pip \
|
||||||
yosys \
|
yosys \
|
||||||
nextpnr-ice40 \
|
nextpnr-ice40 \
|
||||||
fpga-icestorm \
|
fpga-icestorm \
|
||||||
|
libusb-1.0-0 \
|
||||||
|
libftdi1-2 \
|
||||||
|
tshark \
|
||||||
nodejs npm \
|
nodejs npm \
|
||||||
graphviz \
|
graphviz \
|
||||||
poppler-utils \
|
poppler-utils \
|
||||||
kicad \
|
kicad \
|
||||||
kicad-libraries \
|
kicad-libraries \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
# libusb-1.0-0 + libftdi1-2: USB backend for `iceprog` (FPGA flash) and `pyftdi`
|
||||||
|
# (FT2232H EEPROM). sudo: the /dev/bus/usb nodes are root-owned, so the vscode
|
||||||
|
# user flashes via `sudo` (NOPASSWD, configured below).
|
||||||
|
|
||||||
# Debian marks the system Python as externally-managed (PEP 668), so install
|
# Debian marks the system Python as externally-managed (PEP 668), so install
|
||||||
# project deps into a venv. /opt/venv is first on PATH, so `python`/`pip` resolve
|
# project deps into a venv. /opt/venv is first on PATH, so `python`/`pip` resolve
|
||||||
@@ -24,12 +31,25 @@ ENV VIRTUAL_ENV=/opt/venv
|
|||||||
RUN python3 -m venv "$VIRTUAL_ENV"
|
RUN python3 -m venv "$VIRTUAL_ENV"
|
||||||
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
|
||||||
|
|
||||||
|
# ENV PATH alone is not enough: Debian's /etc/profile REsets PATH unconditionally,
|
||||||
|
# so any *login* shell (VS Code's integrated terminal, `su - vscode`, ssh) drops
|
||||||
|
# /opt/venv/bin and then `python` does not exist at all (slim has only python3).
|
||||||
|
# Re-prepend the venv for login shells so the documented `python -m exi_bba.synth`
|
||||||
|
# works everywhere.
|
||||||
|
RUN printf 'PATH="%s/bin:$PATH"\nexport PATH\n' "$VIRTUAL_ENV" > /etc/profile.d/10-venv.sh
|
||||||
|
|
||||||
RUN npm install -g @anthropic-ai/claude-code
|
RUN npm install -g @anthropic-ai/claude-code
|
||||||
|
|
||||||
COPY requirements.txt /tmp/requirements.txt
|
COPY requirements.txt /tmp/requirements.txt
|
||||||
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
||||||
|
|
||||||
RUN useradd -m -u 1000 -s /bin/bash vscode
|
# pyftdi: programs the FT2232H EEPROM over libusb, and (with pyserial) reads the
|
||||||
|
# FT2232H channel-B UART directly over libusb for bring-up diagnostics.
|
||||||
|
RUN pip install --no-cache-dir pyftdi pyserial
|
||||||
|
|
||||||
|
RUN useradd -m -u 1000 -s /bin/bash vscode \
|
||||||
|
&& echo 'vscode ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/vscode \
|
||||||
|
&& chmod 0440 /etc/sudoers.d/vscode
|
||||||
|
|
||||||
USER vscode
|
USER vscode
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,15 @@
|
|||||||
"workspaceFolder": "/workspace",
|
"workspaceFolder": "/workspace",
|
||||||
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
|
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
|
||||||
"mounts": [
|
"mounts": [
|
||||||
"source=${localEnv:HOME}${localEnv:USERPROFILE}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached"
|
"source=${localEnv:HOME}${localEnv:USERPROFILE}/.claude,target=/home/vscode/.claude,type=bind,consistency=cached",
|
||||||
|
"source=/dev/bus/usb,target=/dev/bus/usb,type=bind"
|
||||||
],
|
],
|
||||||
|
// --privileged + the /dev/bus/usb bind mount give libusb (iceprog, pyftdi)
|
||||||
|
// access to the FT2232H once it is usbipd-attached into WSL2. Attach the
|
||||||
|
// device on the Windows host BEFORE opening/rebuilding the container:
|
||||||
|
// .devcontainer/attach-icebreaker.ps1 (run as Administrator)
|
||||||
|
// New devices attached after start still appear (the bind mount is live).
|
||||||
|
"runArgs": ["--privileged"],
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": [
|
"extensions": [
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# The devcontainer build uses context ".." (the repo root) but only ever COPYs
|
||||||
|
# requirements.txt. Keep the context small so a rebuild doesn't ship the whole
|
||||||
|
# repo (~333 MB) to the docker daemon.
|
||||||
|
.git/
|
||||||
|
.venv/
|
||||||
|
build/
|
||||||
|
hardware/
|
||||||
|
docs/
|
||||||
|
diagrams/
|
||||||
|
examples/
|
||||||
|
*.vcd
|
||||||
|
*.pcapng
|
||||||
|
*.bin
|
||||||
|
*.asc
|
||||||
|
*.json.gz
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
@@ -20,8 +20,13 @@ _autosave-*
|
|||||||
.history/
|
.history/
|
||||||
hardware/re-bba-rb/gerbers
|
hardware/re-bba-rb/gerbers
|
||||||
hardware/sp1_insert/gerbers
|
hardware/sp1_insert/gerbers
|
||||||
|
hardware/re-bba-rb/production
|
||||||
*-bom.csv
|
*-bom.csv
|
||||||
*-cpl.csv
|
*-cpl.csv
|
||||||
|
*.rpt
|
||||||
|
# FT2232H EEPROM backup written by flash_ftdi_eeprom.py at runtime
|
||||||
|
hardware/re-bba-rb/eeprom-backup.bin
|
||||||
|
hardware/re-bba-rb/re-bba-rb-eeprom.bin
|
||||||
|
|
||||||
# Editor / OS cruft
|
# Editor / OS cruft
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|||||||
@@ -22,7 +22,12 @@ W5500 ethernet back-end".
|
|||||||
**Windows host + WSL2 devcontainer — USB flashing setup:**
|
**Windows host + WSL2 devcontainer — USB flashing setup:**
|
||||||
1. Install `usbipd-win` (https://github.com/dorssel/usbipd-win/releases)
|
1. Install `usbipd-win` (https://github.com/dorssel/usbipd-win/releases)
|
||||||
2. Run `.devcontainer/attach-icebreaker.ps1` as Administrator before opening the devcontainer
|
2. Run `.devcontainer/attach-icebreaker.ps1` as Administrator before opening the devcontainer
|
||||||
3. The devcontainer runs `--privileged` to pass through the USB device
|
3. The devcontainer runs `--privileged` AND bind-mounts `/dev/bus/usb` so libusb
|
||||||
|
(`iceprog`, `pyftdi`) can see the FT2232H; the `vscode` user flashes via
|
||||||
|
passwordless `sudo` (the USB nodes are root-owned). If you change
|
||||||
|
`.devcontainer/`, **rebuild the container** for it to take effect.
|
||||||
|
4. Flashing the re-bba-rb board (bitstream + FT2232H EEPROM) is documented as the
|
||||||
|
`flash-re-bba-rb` skill — see `.claude/skills/flash-re-bba-rb/SKILL.md`.
|
||||||
|
|
||||||
**Local venv (outside devcontainer):**
|
**Local venv (outside devcontainer):**
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
Binary file not shown.
+70
-19
@@ -59,8 +59,10 @@ from exi_bba.bba_top import BBATop
|
|||||||
# LEDs which are active-low. No physical button exists on this board (the
|
# LEDs which are active-low. No physical button exists on this board (the
|
||||||
# iCEbreaker's BTN_N was dev-board-only); panel_btn is tied idle instead.
|
# iCEbreaker's BTN_N was dev-board-only); panel_btn is tied idle instead.
|
||||||
# RGB status LED (D11=red/rx, D12=green/tx, D13=yellow/ready) is on the
|
# RGB status LED (D11=red/rx, D12=green/tx, D13=yellow/ready) is on the
|
||||||
# iCE40UP5K's dedicated SB_RGBA_DRV pins 39/40/41 — fixed by the chip
|
# iCE40UP5K's dedicated SB_RGBA_DRV pads 39/40/41. It IS declared as a
|
||||||
# package on any board, not board-specific, so no resource needed here.
|
# "rgb" resource and requested RAW (dir="-") so SB_RGBA_DRV drives the pads
|
||||||
|
# directly — leaving o_RGB* dangling (the old code) never bonds them and the
|
||||||
|
# LEDs stay dark. See the "rgb" Resource + elaborate() below, and BRINGUP.md.
|
||||||
|
|
||||||
# nextpnr P&R options. The binding constraint is the isolated 54 MHz capture
|
# nextpnr P&R options. The binding constraint is the isolated 54 MHz capture
|
||||||
# domain (the SPI Mode-3 bit engine); the 24 MHz sync domain has wide margin.
|
# domain (the SPI Mode-3 bit engine); the 24 MHz sync domain has wide margin.
|
||||||
@@ -75,6 +77,26 @@ from exi_bba.bba_top import BBATop
|
|||||||
# sync domain. Plain --opt-timing is the better baseline.
|
# sync domain. Plain --opt-timing is the better baseline.
|
||||||
_PNR_TIMING_OPTS = "--opt-timing"
|
_PNR_TIMING_OPTS = "--opt-timing"
|
||||||
|
|
||||||
|
# UART pin override for bring-up. The re-bba-rb V1 lab unit had its UART_RXD
|
||||||
|
# trace (FPGA pin 19 → FT2232H pin 39) severed by a via-repair drill hole, and
|
||||||
|
# the 0.5 mm FT2232H pitch is not hand-reworkable. Set env UART_J4=1 to relocate
|
||||||
|
# the UART onto the accessible J4 debug header — DBG0 = J4 pin 2 = FPGA pin 9
|
||||||
|
# (FPGA TX), DBG1 = J4 pin 3 = FPGA pin 10 (FPGA RX), GND = J4 pin 1 — so an
|
||||||
|
# external USB-UART dongle can drive the shell, bypassing the FT2232H channel B
|
||||||
|
# completely. Unset (default) keeps the normal FT2232H channel-B pins
|
||||||
|
# (tx = 19 = UART_RXD net, rx = 18 = UART_TXD net).
|
||||||
|
_UART_TX, _UART_RX = ("9", "10") if os.environ.get("UART_J4") else ("19", "18")
|
||||||
|
|
||||||
|
# ETH_D3 relocation for the damaged V1 lab unit: the W5100 data bit-3 trace
|
||||||
|
# (FPGA pin 28 → W5100 U11 pin 40, top copper) was nicked by a drill hole, and
|
||||||
|
# neither the 0.5 mm pin nor the 0.1 mm trace is hand-reworkable. Set
|
||||||
|
# ETH_D3_PIN=<n> to drive W5100 D3 from a coarse J4 header pad instead, and bodge
|
||||||
|
# that pad to the W5100 D3 net: DBG0=9 (J4 pin2), DBG1=10 (J4 pin3),
|
||||||
|
# DBG2=11 (J4 pin4), DBG3=12 (J4 pin5), DBG4=6 (J4 pin6). NOTE pin 9 collides
|
||||||
|
# with UART_J4 TX — fine for the W5100/eth test builds (no UART), not for the
|
||||||
|
# full UART_J4 design. Default = 28 (real board). See BRINGUP.md.
|
||||||
|
_ETH_D3 = os.environ.get("ETH_D3_PIN", "28")
|
||||||
|
|
||||||
|
|
||||||
class IceBreakerPlatform(LatticeICE40Platform):
|
class IceBreakerPlatform(LatticeICE40Platform):
|
||||||
device = "iCE40UP5K"
|
device = "iCE40UP5K"
|
||||||
@@ -99,7 +121,7 @@ class IceBreakerPlatform(LatticeICE40Platform):
|
|||||||
# W5100 indirect parallel bus
|
# W5100 indirect parallel bus
|
||||||
Resource("w5100", 0,
|
Resource("w5100", 0,
|
||||||
Subsignal("addr", Pins("42 38", dir="o")),
|
Subsignal("addr", Pins("42 38", dir="o")),
|
||||||
Subsignal("data", Pins("34 32 31 28 27 26 25 23", dir="io")),
|
Subsignal("data", Pins(f"34 32 31 {_ETH_D3} 27 26 25 23", dir="io")),
|
||||||
Subsignal("cs_n", Pins("43", dir="o")),
|
Subsignal("cs_n", Pins("43", dir="o")),
|
||||||
Subsignal("rd_n", Pins("37", dir="o")),
|
Subsignal("rd_n", Pins("37", dir="o")),
|
||||||
Subsignal("wr_n", Pins("36", dir="o")),
|
Subsignal("wr_n", Pins("36", dir="o")),
|
||||||
@@ -114,11 +136,23 @@ class IceBreakerPlatform(LatticeICE40Platform):
|
|||||||
Resource("ledr", 0, Pins("48", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS")),
|
Resource("ledr", 0, Pins("48", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||||
Resource("ledg", 0, Pins("47", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS")),
|
Resource("ledg", 0, Pins("47", dir="o"), Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||||
|
|
||||||
# UART debug console → FT2232H Channel B.
|
# RGB status LED on the iCE40UP5K's dedicated SB_RGBA_DRV pads
|
||||||
# On the PC: open the second USB serial port at 115200 8N1.
|
# (39=D11 red, 40=D12 green, 41=D13 yellow). Requested RAW (dir="-") in
|
||||||
|
# elaborate and wired straight from the SB_RGBA_DRV hard block — a normal
|
||||||
|
# buffered (dir="o") output fails nextpnr packing:
|
||||||
|
# "SB_RGB_DRV/SB_RGBA_DRV port connected to more than just package pin!"
|
||||||
|
# (Bug found at bring-up 2026-08-23: these were previously left dangling,
|
||||||
|
# so the rx/tx/ready RGB indicators never lit. See BRINGUP.md item 5.)
|
||||||
|
Resource("rgb", 0,
|
||||||
|
Subsignal("r", Pins("39", dir="o")),
|
||||||
|
Subsignal("g", Pins("40", dir="o")),
|
||||||
|
Subsignal("b", Pins("41", dir="o"))),
|
||||||
|
|
||||||
|
# UART debug console → FT2232H Channel B (or J4 header if UART_J4=1).
|
||||||
|
# On the PC: open the serial port at 115200 8N1.
|
||||||
Resource("uart", 0,
|
Resource("uart", 0,
|
||||||
Subsignal("tx", Pins("19", dir="o")),
|
Subsignal("tx", Pins(_UART_TX, dir="o")),
|
||||||
Subsignal("rx", Pins("18", dir="i")),
|
Subsignal("rx", Pins(_UART_RX, dir="i")),
|
||||||
Attrs(IO_STANDARD="SB_LVCMOS")),
|
Attrs(IO_STANDARD="SB_LVCMOS")),
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -170,20 +204,37 @@ class BBATopSynth(BBATop):
|
|||||||
if self._status_panel:
|
if self._status_panel:
|
||||||
ledr = platform.request("ledr", 0)
|
ledr = platform.request("ledr", 0)
|
||||||
ledg = platform.request("ledg", 0)
|
ledg = platform.request("ledg", 0)
|
||||||
|
rgb = platform.request("rgb", 0, dir="-") # raw pads (no buffer)
|
||||||
led = self.panel_led
|
led = self.panel_led
|
||||||
|
|
||||||
|
# Green-LED PWM dimming. Both green emitters are over-bright on
|
||||||
|
# the re-bba-rb V1 (bring-up 2026-08-23): the discrete LED_G/D6
|
||||||
|
# heartbeat has a wrong 49.9 Ohm series resistor (R37, should be
|
||||||
|
# ~330 Ohm), and the RGB green D12 die is very efficient even at
|
||||||
|
# the SB_RGBA_DRV minimum current code. The current code is
|
||||||
|
# already the minimum, so time-average both greens down with a
|
||||||
|
# low-duty PWM. Red (D11/LED_R) and yellow (D13) are fine — left
|
||||||
|
# solid. Tune _GRN_DUTY (0..15, /16 duty) at bring-up; see
|
||||||
|
# BRINGUP.md items 1 & 5. PWM freq = 24 MHz/16 = 1.5 MHz (no
|
||||||
|
# visible flicker).
|
||||||
|
_GRN_DUTY = 2 # ~1/8 duty
|
||||||
|
pwm_cnt = Signal(4)
|
||||||
|
grn_pwm = Signal()
|
||||||
|
m.d.sync += pwm_cnt.eq(pwm_cnt + 1)
|
||||||
|
m.d.comb += grn_pwm.eq(pwm_cnt < _GRN_DUTY)
|
||||||
|
|
||||||
m.d.comb += [
|
m.d.comb += [
|
||||||
ledg.o.eq(led[0]), # heartbeat (active-high LED)
|
ledg.o.eq(led[0] & grn_pwm), # heartbeat (green) — PWM-dimmed
|
||||||
ledr.o.eq(led[1]), # EXI activity (active-high LED)
|
ledr.o.eq(led[1]), # EXI activity (red) — fine
|
||||||
# all 3 bits idle/released (active-low idle = 1) — no
|
# all 3 bits idle/released (active-low idle = 1) — no
|
||||||
# physical button exists on this board to read
|
# physical button exists on this board to read
|
||||||
self.panel_btn.eq(C(0b111, 3)),
|
self.panel_btn.eq(C(0b111, 3)),
|
||||||
]
|
]
|
||||||
|
|
||||||
# iCEbreaker RGB LED has no series resistors — must use
|
# RGB LED has no series resistors — must use SB_RGBA_DRV (raw pad
|
||||||
# SB_RGBA_DRV (raw pad driver with built-in current source).
|
# driver with built-in current source). o_RGB* MUST connect
|
||||||
# RGB0=red→rx_act RGB1=green→tx_act RGB2=blue→ready
|
# directly to the pads (rgb.*.io) — a buffered output fails
|
||||||
# Verify colour-to-element mapping against schematic at bring-up.
|
# packing. RGB0=red→rx RGB1=green→tx RGB2=yellow→ready.
|
||||||
m.submodules.rgb_drv = Instance("SB_RGBA_DRV",
|
m.submodules.rgb_drv = Instance("SB_RGBA_DRV",
|
||||||
p_CURRENT_MODE="0b1",
|
p_CURRENT_MODE="0b1",
|
||||||
p_RGB0_CURRENT="0b000001",
|
p_RGB0_CURRENT="0b000001",
|
||||||
@@ -191,12 +242,12 @@ class BBATopSynth(BBATop):
|
|||||||
p_RGB2_CURRENT="0b000001",
|
p_RGB2_CURRENT="0b000001",
|
||||||
i_CURREN=Const(1, 1),
|
i_CURREN=Const(1, 1),
|
||||||
i_RGBLEDEN=Const(1, 1),
|
i_RGBLEDEN=Const(1, 1),
|
||||||
i_RGB0PWM=led[2],
|
i_RGB0PWM=led[2], # rx → red D11 (solid)
|
||||||
i_RGB1PWM=led[3],
|
i_RGB1PWM=led[3] & grn_pwm, # tx → green D12 (PWM-dimmed)
|
||||||
i_RGB2PWM=led[4],
|
i_RGB2PWM=led[4], # ready → yellow D13 (solid)
|
||||||
o_RGB0=Signal(name="rgb_r"),
|
o_RGB0=rgb.r.io,
|
||||||
o_RGB1=Signal(name="rgb_g"),
|
o_RGB1=rgb.g.io,
|
||||||
o_RGB2=Signal(name="rgb_b"),
|
o_RGB2=rgb.b.io,
|
||||||
)
|
)
|
||||||
|
|
||||||
# ── UART debug console/shell → FT2232H Channel B ───────────────
|
# ── UART debug console/shell → FT2232H Channel B ───────────────
|
||||||
|
|||||||
@@ -0,0 +1,180 @@
|
|||||||
|
(footprint "LED_1206_ReverseMount_Everlight_24-21"
|
||||||
|
(version 20260206)
|
||||||
|
(generator "pcbnew")
|
||||||
|
(generator_version "10.0")
|
||||||
|
(layer "F.Cu")
|
||||||
|
(descr "Everlight 24-21 series REVERSE-MOUNT 1206 LED. Part mounts on the component (F.Cu) side; light emits DOWN through a PCB light-window to the opposite (bottom / viewing) side. Land pattern is a standard 1206; the central Edge.Cuts light-window is o1.7 mm (datasheet-confirmed, spec 1.7 mm +/-0.1). Parts: C2892757 red / C2980185 green / C424133 amber. Pad 1 = cathode (silk bar side).")
|
||||||
|
(tags "LED reverse-mount 1206 Everlight 24-21 C2892757 C2980185 C424133")
|
||||||
|
(property "Reference" "REF**"
|
||||||
|
(at 0 -1.9 0)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "f1c7b965-1e2f-4f9b-8323-037693b45dc5")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1 1)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Value" "VAL**"
|
||||||
|
(at 0 1.9 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "f677d899-dab5-4e34-b8a7-9ec643551835")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 0.8 0.8)
|
||||||
|
(thickness 0.15)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Datasheet" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "7b814d22-58c5-415c-8cfb-2fe48410ce48")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(property "Description" ""
|
||||||
|
(at 0 0 0)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(hide yes)
|
||||||
|
(uuid "a09d9c63-c978-4752-b3d4-45331e0ce1be")
|
||||||
|
(effects
|
||||||
|
(font
|
||||||
|
(size 1.27 1.27)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
(attr smd)
|
||||||
|
(duplicate_pad_numbers_are_jumpers no)
|
||||||
|
(fp_line
|
||||||
|
(start -2.4 -1)
|
||||||
|
(end -2.4 1)
|
||||||
|
(stroke
|
||||||
|
(width 0.15)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.SilkS")
|
||||||
|
(uuid "92697e46-79a2-450b-a27b-d7366d52bb93")
|
||||||
|
)
|
||||||
|
(fp_circle
|
||||||
|
(center 0 0)
|
||||||
|
(end 0.85 0)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type default)
|
||||||
|
)
|
||||||
|
(fill no)
|
||||||
|
(layer "Edge.Cuts")
|
||||||
|
(uuid "f0c73ac2-4d87-4c3c-a99f-a702766c2628")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -2.7 -1.35)
|
||||||
|
(end 2.7 -1.35)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "b5ad59dd-6801-47e3-888e-f1e77bbe7d1d")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -2.7 1.35)
|
||||||
|
(end -2.7 -1.35)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "c87c834d-5754-4fa7-a4fd-7598ba43e1f6")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 2.7 -1.35)
|
||||||
|
(end 2.7 1.35)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "abcace6a-b285-4e5a-8dc4-e326cb560770")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 2.7 1.35)
|
||||||
|
(end -2.7 1.35)
|
||||||
|
(stroke
|
||||||
|
(width 0.05)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.CrtYd")
|
||||||
|
(uuid "7ee65e7b-4a3e-458f-ab93-7a5def98bd28")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.65 -0.95)
|
||||||
|
(end 1.65 -0.95)
|
||||||
|
(stroke
|
||||||
|
(width 0.1)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "7e01a69e-c830-4293-bc6a-ad6770bd6dd6")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.65 -0.6)
|
||||||
|
(end -1.3 -0.95)
|
||||||
|
(stroke
|
||||||
|
(width 0.1)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "7657bf8e-4a2d-4359-80be-594cffaee932")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start -1.65 0.95)
|
||||||
|
(end -1.65 -0.6)
|
||||||
|
(stroke
|
||||||
|
(width 0.1)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "c4ab4093-6d59-42ee-91d8-9ce9fdd6b23b")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 1.65 -0.95)
|
||||||
|
(end 1.65 0.95)
|
||||||
|
(stroke
|
||||||
|
(width 0.1)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "c22d87d0-8bda-481a-b3a0-8f844b9c68b1")
|
||||||
|
)
|
||||||
|
(fp_line
|
||||||
|
(start 1.65 0.95)
|
||||||
|
(end -1.65 0.95)
|
||||||
|
(stroke
|
||||||
|
(width 0.1)
|
||||||
|
(type solid)
|
||||||
|
)
|
||||||
|
(layer "F.Fab")
|
||||||
|
(uuid "709bccbc-e4c2-4a5f-b8ef-b66acd534efc")
|
||||||
|
)
|
||||||
|
(pad "1" smd roundrect
|
||||||
|
(at -1.4 0)
|
||||||
|
(size 0.8 1.8)
|
||||||
|
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||||
|
(roundrect_rratio 0.25)
|
||||||
|
(uuid "997a776b-eeb2-460d-a61e-3588d42b420e")
|
||||||
|
)
|
||||||
|
(pad "2" smd roundrect
|
||||||
|
(at 1.4 0)
|
||||||
|
(size 0.8 1.8)
|
||||||
|
(layers "F.Cu" "F.Mask" "F.Paste")
|
||||||
|
(roundrect_rratio 0.25)
|
||||||
|
(uuid "0a2975d4-8728-4643-b4e7-72c29613931d")
|
||||||
|
)
|
||||||
|
(embedded_fonts no)
|
||||||
|
)
|
||||||
@@ -56,8 +56,8 @@
|
|||||||
(attr smd)
|
(attr smd)
|
||||||
(duplicate_pad_numbers_are_jumpers no)
|
(duplicate_pad_numbers_are_jumpers no)
|
||||||
(fp_line
|
(fp_line
|
||||||
(start 0.6 -3.2)
|
(start 0.6 -3.125)
|
||||||
(end 0.6 -1.8)
|
(end 0.6 -1.875)
|
||||||
(stroke
|
(stroke
|
||||||
(width 0.05)
|
(width 0.05)
|
||||||
(type default)
|
(type default)
|
||||||
@@ -66,8 +66,8 @@
|
|||||||
(uuid "3aa70938-586c-4a3e-a93d-02a45af703e9")
|
(uuid "3aa70938-586c-4a3e-a93d-02a45af703e9")
|
||||||
)
|
)
|
||||||
(fp_line
|
(fp_line
|
||||||
(start 0.6 -3.2)
|
(start 0.6 -3.125)
|
||||||
(end 14.4 -3.2)
|
(end 14.4 -3.125)
|
||||||
(stroke
|
(stroke
|
||||||
(width 0.05)
|
(width 0.05)
|
||||||
(type default)
|
(type default)
|
||||||
@@ -76,8 +76,8 @@
|
|||||||
(uuid "34b53d18-e03e-4fbc-bf7a-c3cb36e989ef")
|
(uuid "34b53d18-e03e-4fbc-bf7a-c3cb36e989ef")
|
||||||
)
|
)
|
||||||
(fp_line
|
(fp_line
|
||||||
(start 0.6 -1.8)
|
(start 0.6 -1.875)
|
||||||
(end 14.4 -1.8)
|
(end 14.4 -1.875)
|
||||||
(stroke
|
(stroke
|
||||||
(width 0.05)
|
(width 0.05)
|
||||||
(type default)
|
(type default)
|
||||||
@@ -86,8 +86,8 @@
|
|||||||
(uuid "d865b53d-ba89-433e-9e88-6e1c8c56a37b")
|
(uuid "d865b53d-ba89-433e-9e88-6e1c8c56a37b")
|
||||||
)
|
)
|
||||||
(fp_line
|
(fp_line
|
||||||
(start 14.4 -1.8)
|
(start 14.4 -1.875)
|
||||||
(end 14.4 -3.2)
|
(end 14.4 -3.125)
|
||||||
(stroke
|
(stroke
|
||||||
(width 0.05)
|
(width 0.05)
|
||||||
(type default)
|
(type default)
|
||||||
|
|||||||
@@ -0,0 +1,184 @@
|
|||||||
|
# re-bba-rb — bring-up TODO / findings (first physical unit)
|
||||||
|
|
||||||
|
Findings from bringing up the first assembled V1 board (repaired: 7 shorted
|
||||||
|
vias drilled out, some collateral trace damage). Started 2026-08-23. This is a
|
||||||
|
running list — items are **not** being worked yet, just recorded.
|
||||||
|
|
||||||
|
## Established good so far (context)
|
||||||
|
|
||||||
|
- Bitstream flashes + verifies (`iceprog`, channel A); FPGA configures (heartbeat).
|
||||||
|
- FT2232H healthy (channel-A MPSSE + channel-B internal loopback both pass).
|
||||||
|
- **W5100 clock confirmed GOOD** (Y2 25 MHz crystal oscillating): the on-board
|
||||||
|
diagnostic (`scratchpad/w5100_check.py`) shows solid green — MR software-reset
|
||||||
|
self-clears, which only happens on the internal clock.
|
||||||
|
- W5100 register write/read-back works on 7 of 8 data lines.
|
||||||
|
|
||||||
|
## Known damage on THIS unit (self-inflicted, from the via repair — not design bugs)
|
||||||
|
|
||||||
|
- **UART_RXD trace broken** (FPGA pin 19 → FT2232H pin 39). Workaround built:
|
||||||
|
`UART_J4=1` synth build relocates the UART to the J4 header (DBG0=pin9=TX,
|
||||||
|
DBG1=pin10=RX, GND=J4 pin1) for an external USB-UART/Pi dongle.
|
||||||
|
- **ETH_D3 trace broken** (W5100 data bit 3): net `ETH_D3` = FPGA **U9 pin 28**
|
||||||
|
↔ W5100 **U11 pin 40**. Confirmed by the diagnostic's red blink-code (4 blinks
|
||||||
|
= D3). One bodge needed; bridge the drilled break (scrape to trace copper / a
|
||||||
|
via — no need to touch the 0.5 mm chip pads). Optional: remap the FPGA D3 bit
|
||||||
|
to a spare J4 pad (DBG2=pin11=J4 pin4) to make one end a coarse header pad.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## V2 schematic changes already applied (2026-08-25)
|
||||||
|
|
||||||
|
- **U7 EEPROM → 93LC56B** (LCSC C6164, MPN 93LC56BT-I/SN, same SOIC-8). Fixes the
|
||||||
|
soft-brick (256 B is the FT2232H's full EEPROM size). [TODO/REVIEW updated]
|
||||||
|
- **All 7 LEDs → Everlight 24-21 reverse-mount 1206** (bottom-viewed, top-populated
|
||||||
|
single-side assembly): red D7/D11 = **C2892757** (24-21SURC), green
|
||||||
|
D6/D8/D9/D12 = **C2980185** (24-21/G6C), amber D13 = **C424133** (24-21UYC).
|
||||||
|
All Vf ≈ 2.0 V (3.3 V-rail + SB_RGBA_DRV safe), moderate mcd. New footprint
|
||||||
|
`hardware/LED_1206_ReverseMount_Everlight_24-21.kicad_mod` (pad1=cathode,
|
||||||
|
**ø1.7 mm Edge.Cuts light-window — datasheet-confirmed** 2026-08-28, spec
|
||||||
|
1.7 mm ±0.1). Refdes text is 1.0 mm (JLC silk floor).
|
||||||
|
- **LED series resistors R37/R41/R42: 49.9 Ω → 330 Ω** (reused existing part
|
||||||
|
C25104; R38 already 330). ~3.9 mA vs the blinding ~26 mA — closes item 1's
|
||||||
|
resistor half. Green PWM (`_GRN_DUTY`) in gateware still applies to D6/D12; the
|
||||||
|
new green is only 18–45 mcd so it can likely be relaxed.
|
||||||
|
- **Gateware (`synth.py`):** RGB drive bug fixed (raw-pad `o_RGB*`) + green PWM
|
||||||
|
dimming — see items 1 & 5.
|
||||||
|
|
||||||
|
Still open below: GC_ON handover redesign (#2), the datasheet-aperture verify,
|
||||||
|
EXI/W5100 functional validation (needs a working board), plus the ground-plane
|
||||||
|
fill for fab.
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
### 1. LED brightness — LED_G and the two transistor-driven LEDs are blindingly bright
|
||||||
|
|
||||||
|
**Observation:** `LED_G` (D6, green) and the two transistor-driven LEDs are far
|
||||||
|
too bright; `LED_R` (D7, red) is fine.
|
||||||
|
|
||||||
|
**Root cause (from netlist):** the series resistors are wrong.
|
||||||
|
- `LED_R` (D7, red): **R38 = 330 Ω** → correct brightness (the reference).
|
||||||
|
- `LED_G` (D6, green): **R37 = 49.9 Ω** → ~25 mA, blinding.
|
||||||
|
- Transistor-driven: **D8** (green, via Q1 S8050) and **D9** (green, via Q2
|
||||||
|
S8550, collector → **R42 = 49.9 Ω** → D9) → same over-drive. (Confirm D8's
|
||||||
|
own series resistor value too.)
|
||||||
|
|
||||||
|
**Fix direction:** raise the 49.9 Ω LED series resistors (**R37**, **R42**, and
|
||||||
|
D8's) to ~**330 Ω–1 kΩ** to match D7. (The 49.9 Ω value looks copy-pasted from
|
||||||
|
the impedance-matching resistors — wrong part for an LED.) The RGB LED
|
||||||
|
(D11/D12/D13 via `SB_RGBA_DRV`, `RGB*_CURRENT=0b000001`) is separate and not
|
||||||
|
part of this complaint. BOM/PCB change for V2; a rework could tack larger
|
||||||
|
resistors on this unit if the brightness is a bench nuisance.
|
||||||
|
|
||||||
|
### 2. GC_ON was not a clean on/off (sat at 2.3 V; both handover LEDs on) — FIXED in schematic 2026-08-28
|
||||||
|
|
||||||
|
**Observation:** `GC_ON` measures **2.3 V** (not a clean rail). With **both USB
|
||||||
|
and GC connected**, both transistor-driven LEDs (D8, D9) are lit — the intent
|
||||||
|
was a power-handover indicator with only ever one active (USB vs GC).
|
||||||
|
|
||||||
|
**Analysis (from netlist):** `GC_ON` = TPS2116 status (net: U2.8 = mux ST,
|
||||||
|
U12.3, FPGA **U9 pin 21**, pulled up by R5 10 k to 3V3; drives Q1 base via R39
|
||||||
|
10 k and Q2 base via R40 10 k). The two indicator transistors are complementary
|
||||||
|
(Q1 = S8050 NPN, Q2 = S8550 PNP) expecting GC_ON to swing rail-to-rail:
|
||||||
|
- At **GC_ON ≈ 2.3 V**, the NPN (Q1, on when base ≳0.7 V) **and** the PNP (Q2, on
|
||||||
|
when base ≲2.6 V) **both conduct** → both D8 and D9 light. There is no clean
|
||||||
|
one-or-the-other point at this intermediate voltage.
|
||||||
|
|
||||||
|
**Root cause (identified 2026-08-28):** the intermediate ~2.3 V is **base-loading
|
||||||
|
of the open-drain ST node**. When GC is the source, ST is Hi-Z and *should* sit at
|
||||||
|
3V3 (R5 pull-up), but Q1's base (through R39 10 k) drags it down — R5‖R39 divide
|
||||||
|
3V3 to ~2.0 V — which is low enough that the PNP Q2's V_EB ≈ 1.3 V and it conducts
|
||||||
|
too. So both LEDs light, and the FPGA/EN see a soggy 2 V instead of 3V3.
|
||||||
|
TPS2116 ST is only characterised to sink **1 mA** (DS: V_OL @ I_ST = 1 mA,
|
||||||
|
t_ST @ R_ST = 10 k), so simply strengthening R5 is not allowed.
|
||||||
|
|
||||||
|
**Hardware fix — APPLIED 2026-08-28 (schematic):** raise the base resistors and
|
||||||
|
modestly lower the pull-up so GC_ON swings clean while ST stays ≤1 mA:
|
||||||
|
- **R5 10 k → 5.1 k** (C25905, reuses R6/R7 part)
|
||||||
|
- **R39 / R40 10 k → 33 k** (C25779, reuses R1 part)
|
||||||
|
Result: GC active → GC_ON ≈ **2.95 V** → Q1 saturates (D8/GC lit), Q2 V_EB ≈
|
||||||
|
0.35 V → OFF (D9/USB dark); USB active → ST low (sinks ~0.73 mA < 1 mA) → D9 lit,
|
||||||
|
D8 dark. Clean one-hot. **No new BOM lines, no PCB layout change** (resistor value
|
||||||
|
swaps only — run "Update PCB from Schematic" so the F.Fab values match). This also
|
||||||
|
**resolves the gateware concern below**: GC_ON now reads a solid ~2.95 V (well
|
||||||
|
above the iCE40 V_IH) instead of a marginal 2.3 V. D8/D9 = GC/USB is the confirmed
|
||||||
|
assignment (TPS2116 ST "low when VIN1 not used", VIN1 = GC priority — see
|
||||||
|
REVIEW.md); the B.SilkS labels are correct.
|
||||||
|
- ~~**Gateware:** GC_ON marginal at 2.3 V for the FPGA pin-21 read~~ — addressed
|
||||||
|
by the fix above (now ~2.95 V). The "gate all outputs on GC_ON" work (TODO)
|
||||||
|
can now assume a clean level; still verify on the reworked bench unit.
|
||||||
|
|
||||||
|
### 3. Functional W5100 test — send a packet capturable in Wireshark (works around broken D3?)
|
||||||
|
|
||||||
|
**Goal:** a test bitstream that makes the W5100 transmit a frame on the wire,
|
||||||
|
captured with Wireshark on the laptop (magjack J2 → laptop).
|
||||||
|
|
||||||
|
**Feasible:** reuse `W5100ParallelMaster` (MACRAW socket 0, or the UDP socket
|
||||||
|
path) with a small periodic trigger + a canned frame. Init runs on NCRA/startup.
|
||||||
|
|
||||||
|
**Caveat — the broken ETH_D3:** every byte written to the W5100 has data bit 3
|
||||||
|
corrupted, so a frame sent *now* would have wrong MAC/ethertype/payload bytes —
|
||||||
|
Wireshark might see a malformed frame (or the W5100 may reject a bad length).
|
||||||
|
- A garbled frame appearing at all would still prove **TX path + PHY + magnetics**
|
||||||
|
work on the wire.
|
||||||
|
- For a **clean, valid** packet capture, do the **ETH_D3 bodge first** (item in
|
||||||
|
"Known damage"). Recommended order: bodge D3 → re-run `w5100_check` (red should
|
||||||
|
go dark) → then this packet test.
|
||||||
|
|
||||||
|
### 4. Bit-bang EXI from a Raspberry Pi to test the FPGA's EXI capture
|
||||||
|
|
||||||
|
**Goal:** validate the EXI Mode-3 capture front-end without a GameCube, by having
|
||||||
|
a Pi emulate the GC EXI master.
|
||||||
|
|
||||||
|
**Approach:** Pi SPI **master, Mode 3 (CPOL=1, CPHA=1)**, 3.3 V (both sides
|
||||||
|
3.3 V — no shifting). Drive the EXI **device-ID query** and check the response:
|
||||||
|
write `0x0000` (2 bytes) then read 4 bytes → must be **`0x04 0x02 0x02 0x00`**.
|
||||||
|
In SPI terms: assert CS, clock out `00 00 xx xx xx xx`, the last 4 MISO bytes are
|
||||||
|
the device ID. A match proves ExiCapture → register file → MISO end-to-end.
|
||||||
|
|
||||||
|
**Connections (FPGA EXI pins):** CLK=44, MOSI=4, MISO=3, CS=45 (INT=46) — reach
|
||||||
|
them at the SP1 edge connector J3 or the damper resistors (R21/R25). Map to Pi:
|
||||||
|
Pi SCLK→CLK, Pi MOSI→MOSI(FPGA in), Pi MISO←MISO(FPGA out), Pi CE→CS, GND↔GND.
|
||||||
|
|
||||||
|
**Notes:** run the Pi SPI **slow** (e.g., 1 MHz) — the capture domain oversamples
|
||||||
|
the EXI clock, so a slow clock is *easier* than the real 27 MHz and fully
|
||||||
|
exercises the Mode-3 logic + register file. Good first EXI smoke test before
|
||||||
|
trusting it against a real console.
|
||||||
|
|
||||||
|
### 5. RGB LEDs (D11 red / D12 green / D13 yellow) — drive bug + brightness
|
||||||
|
|
||||||
|
Two findings, from lighting them for the first time at bring-up:
|
||||||
|
|
||||||
|
**(a) DRIVE BUG — they don't light in the current gateware (functional, not cosmetic).**
|
||||||
|
`SB_RGBA_DRV`'s `o_RGB0/1/2` outputs are left as dangling internal signals in
|
||||||
|
`synth.py` (and were in the first test builds). nextpnr never bonds them to the
|
||||||
|
dedicated RGB pads (pins 39/40/41 — confirmed absent from the PCF), so the driver
|
||||||
|
outputs float and **the LEDs never light**. This means the **rx / tx / ready RGB
|
||||||
|
indicators are non-functional in the default build.**
|
||||||
|
- **Fix (confirmed on the bench):** request the RGB pins *raw* (no SB_IO buffer)
|
||||||
|
and connect the driver outputs directly to the pads:
|
||||||
|
```python
|
||||||
|
rgb = platform.request("rgbpad", 0, dir="-") # Resource: r=39 g=40 b=41
|
||||||
|
Instance("SB_RGBA_DRV", ...,
|
||||||
|
o_RGB0=rgb.r.io, o_RGB1=rgb.g.io, o_RGB2=rgb.b.io)
|
||||||
|
```
|
||||||
|
Connecting through a normal `dir="o"` request fails packing:
|
||||||
|
`ERROR: SB_RGB_DRV/SB_RGBA_DRV port connected to more than just package pin!`
|
||||||
|
- **APPLIED 2026-08-23** in `synth.py`: added a raw `rgb` Resource (39/40/41) and
|
||||||
|
wired `o_RGB0/1/2 = rgb.{r,g,b}.io`; the RGB indicators now light.
|
||||||
|
|
||||||
|
**(b) BRIGHTNESS — only GREEN (D12) is too bright; red (D11) and yellow (D13)
|
||||||
|
are fine.** Measured with the corrected drive at the driver's *minimum* current
|
||||||
|
(`CURRENT_MODE` half, `RGBx_CURRENT=0b000001`). The green die is much more
|
||||||
|
efficient per mA, so at the same minimum current it's blinding while red/yellow
|
||||||
|
look right. Since the current code is already at minimum, the fix is **PWM
|
||||||
|
dimming on green only** — feed a low-duty PWM into `RGB1PWM` (green) instead of a
|
||||||
|
static `1`, and leave red/yellow (`RGB0PWM`/`RGB2PWM`) driven solid.
|
||||||
|
- **APPLIED 2026-08-23** in `synth.py`: a `_GRN_DUTY` (default 2/16 ≈ 1/8) PWM now
|
||||||
|
gates **both** green emitters — `RGB1PWM` (D12) and `LED_G`/D6 (the discrete
|
||||||
|
heartbeat, over-bright from R37 — item 1). Red/yellow/LED_R stay solid. Tune
|
||||||
|
`_GRN_DUTY` (0..15) at the bench. Gateware mitigation; the proper V2 hardware
|
||||||
|
fix for D6 is still R37 → ~330 Ω (item 1).
|
||||||
|
|
||||||
|
### 6. (reserved — Dennis to add)
|
||||||
|
|
||||||
|
_Placeholder for the item Dennis was trying to recall._
|
||||||
@@ -34,7 +34,7 @@ lands 2×N off instead of correct.
|
|||||||
|
|
||||||
## How to reapply — copy this exact dict, don't reconstruct it from memory
|
## How to reapply — copy this exact dict, don't reconstruct it from memory
|
||||||
|
|
||||||
This is the complete, current correction set (all 16 parts). **Copy-paste
|
This is the complete, current correction set (all 20 parts). **Copy-paste
|
||||||
this block, don't retype it from the table below or from memory** — the one
|
this block, don't retype it from the table below or from memory** — the one
|
||||||
time it was retyped from a section of prose instead of copied whole, U4 got
|
time it was retyped from a section of prose instead of copied whole, U4 got
|
||||||
silently dropped and shipped with a wrong rotation.
|
silently dropped and shipped with a wrong rotation.
|
||||||
@@ -49,12 +49,17 @@ corrections = {
|
|||||||
'D1': -90, 'D4': -90, 'D5': -90, 'U12': -90, # SOT-23-6, reconstructed hypothesis
|
'D1': -90, 'D4': -90, 'D5': -90, 'U12': -90, # SOT-23-6, reconstructed hypothesis
|
||||||
'U1': -180, # SOT-23-5, confirmed (two -90 corrections)
|
'U1': -180, # SOT-23-5, confirmed (two -90 corrections)
|
||||||
'U4': -90, # SOT-23-5, confirmed ("U4 is good")
|
'U4': -90, # SOT-23-5, confirmed ("U4 is good")
|
||||||
'Q1': 180, 'Q2': 180, # SOT-23 bottom layer, confirmed "upside down"
|
'Q1': 180, 'Q2': 180, # SOT-23; moved bottom->F.Cu in the 2026-08-28 rework, +180 re-confirmed on the top side (JLC preview)
|
||||||
'D2': -90, # custom footprint, confirmed "90 CW"
|
'D2': -90, # custom footprint, confirmed "90 CW"
|
||||||
'D3': 180, # SMA diode, confirmed "180"
|
'D3': 180, # SMA diode, confirmed "180"
|
||||||
'C65': 180, # electrolytic cap, confirmed "180"
|
'C65': 180, # electrolytic cap, confirmed "180"
|
||||||
'U2': -90, # SOT-583-8, confirmed "90 CW"
|
'U2': -90, # SOT-583-8, confirmed "90 CW"
|
||||||
'U3': 180, # custom SOT95P280X110-6N footprint, confirmed "180"
|
'U3': 180, # custom SOT95P280X110-6N footprint, confirmed "180"
|
||||||
|
# LED rework 2026-08-28: 7 LEDs -> reverse-mount 1206 (hardware:LED_1206_ReverseMount_Everlight_24-21),
|
||||||
|
# and the "Moved all components to F.Cu" commit put every part (incl. the former bottom-layer D8/D9/Q1/Q2)
|
||||||
|
# on the top side. Only the GREEN 24-21 parts (C2980185) need a flip — their die polarity is opposite the
|
||||||
|
# red (C2892757) / yellow (C424133) parts of the SAME footprint, so D7/D11/D13 take NO correction.
|
||||||
|
'D6': 180, 'D8': 180, 'D9': 180, 'D12': 180, # GREEN 24-21 only — confirmed via JLC placement preview 2026-08-28
|
||||||
} # positive = CCW, negative = CW
|
} # positive = CCW, negative = CW
|
||||||
|
|
||||||
with open('re-bba-rb-cpl.csv', newline='') as f:
|
with open('re-bba-rb-cpl.csv', newline='') as f:
|
||||||
@@ -100,8 +105,11 @@ it."
|
|||||||
entirely on that same weakened report. Treat both as **unverified**, not
|
entirely on that same weakened report. Treat both as **unverified**, not
|
||||||
settled — re-check them in the placement preview before assembly. Do not
|
settled — re-check them in the placement preview before assembly. Do not
|
||||||
cite "all large chips are right" as evidence again.
|
cite "all large chips are right" as evidence again.
|
||||||
- **D8, D9 (LED_0603, bottom layer)** — verified 2026-07-31 by tracing the
|
- ~~**D8, D9 (LED_0603, bottom layer)** — no correction.~~ **SUPERSEDED
|
||||||
circuit rather than by eye, see "D8/D9 polarity" below. No correction.
|
2026-08-28.** D8/D9 were swapped to the reverse-mount 1206 footprint and moved
|
||||||
|
to F.Cu; they now take **+180°** and live in the corrections table (green
|
||||||
|
24-21, C2980185). The old "D8/D9 polarity" tracing section below is retained
|
||||||
|
for the schematic-net polarity logic but its *rotation* conclusion is stale.
|
||||||
- **J2 (HR911105A magjack, rot=90° in the PCB file)** — not a CPL-rotation
|
- **J2 (HR911105A magjack, rot=90° in the PCB file)** — not a CPL-rotation
|
||||||
question (J2 doesn't need per-part correction below, it's not in the CPL
|
question (J2 doesn't need per-part correction below, it's not in the CPL
|
||||||
correction set), but its physical orientation was independently verified:
|
correction set), but its physical orientation was independently verified:
|
||||||
@@ -127,12 +135,18 @@ Each row: designator, package, raw→corrected, confidence.
|
|||||||
| U12 | SOT-23-6 | 180° | **90°** | Reconstructed hypothesis — not independently re-confirmed |
|
| U12 | SOT-23-6 | 180° | **90°** | Reconstructed hypothesis — not independently re-confirmed |
|
||||||
| U1 | SOT-23-5 | 180° | **0°** (two corrections: -90° then another -90°, user-confirmed both times) | **Confirmed** by direct user feedback, twice |
|
| U1 | SOT-23-5 | 180° | **0°** (two corrections: -90° then another -90°, user-confirmed both times) | **Confirmed** by direct user feedback, twice |
|
||||||
| U4 | SOT-23-5 | 0° | **270°** (-90°, the same family correction as D1/D4/D5/U12) | **Confirmed** — user checked and said "U4 is good" after this delta, no second correction needed (unlike U1) |
|
| U4 | SOT-23-5 | 0° | **270°** (-90°, the same family correction as D1/D4/D5/U12) | **Confirmed** — user checked and said "U4 is good" after this delta, no second correction needed (unlike U1) |
|
||||||
| Q1 | SOT-23 (bottom layer) | -90° | **90°** | **Confirmed** ("upside down" = 180°, direction-agnostic) |
|
| Q1 | SOT-23 (now F.Cu; was bottom) | -90° | **90°** | **Confirmed** ("upside down" = 180°, direction-agnostic; +180 re-confirmed on top after the 2026-08-28 F.Cu move, JLC preview) |
|
||||||
| Q2 | SOT-23 (bottom layer) | -90° | **90°** | **Confirmed** (same as Q1) |
|
| Q2 | SOT-23 (now F.Cu; was bottom) | -90° | **90°** | **Confirmed** (same as Q1; re-confirmed on top 2026-08-28) |
|
||||||
| D2 | custom `SON50P110X213X50-7` | 0° | **270°** | **Confirmed** ("90° clockwise") |
|
| D2 | custom `SON50P110X213X50-7` | 0° | **270°** | **Confirmed** ("90° clockwise") |
|
||||||
| D3 | `Diode_SMD:D_SMA` | 180° | **0°** | **Confirmed** ("180°", direction-agnostic) |
|
| D3 | `Diode_SMD:D_SMA` | 180° | **0°** | **Confirmed** ("180°", direction-agnostic) |
|
||||||
| C65 | `Capacitor_SMD:CP_Elec_6.3x7.7` | 0° | **180°** | **Confirmed** ("180°", direction-agnostic) |
|
| C65 | `Capacitor_SMD:CP_Elec_6.3x7.7` | 0° | **180°** | **Confirmed** ("180°", direction-agnostic) |
|
||||||
| U2 | SOT-583-8 | 180° | **90°** | **Confirmed** ("90° clockwise") |
|
| U2 | SOT-583-8 | 180° | **90°** | **Confirmed** ("90° clockwise") |
|
||||||
|
| D6 | `hardware:LED_1206_ReverseMount_Everlight_24-21` (green C2980185) | -90° | **90°** (+180°) | **Confirmed** (JLC preview 2026-08-28) |
|
||||||
|
| D8 | `…24-21` (green C2980185) | 0° | **180°** (+180°) | **Confirmed** (JLC preview 2026-08-28) |
|
||||||
|
| D9 | `…24-21` (green C2980185) | 180° | **0°** (+180°) | **Confirmed** (JLC preview 2026-08-28) |
|
||||||
|
| D12 | `…24-21` (green C2980185) | -90° | **90°** (+180°) | **Confirmed** (JLC preview 2026-08-28) |
|
||||||
|
| D7, D11 | `…24-21` (red C2892757) | -90° | **-90°** (none) | **Confirmed no correction** — same footprint as the green parts but opposite die polarity (JLC preview 2026-08-28) |
|
||||||
|
| D13 | `…24-21` (yellow C424133) | -90° | **-90°** (none) | **Confirmed no correction** (JLC preview 2026-08-28) |
|
||||||
|
|
||||||
**"Reconstructed hypothesis" parts (U7, U10, D1, D4, D5, U12) explained:**
|
**"Reconstructed hypothesis" parts (U7, U10, D1, D4, D5, U12) explained:**
|
||||||
the user reported "SOIC and SOT chips are rotated 90°, direction unsure."
|
the user reported "SOIC and SOT chips are rotated 90°, direction unsure."
|
||||||
|
|||||||
@@ -4509,7 +4509,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 25.4 88.9 180)
|
(at 25.4 88.9 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -4542,7 +4542,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603Y"
|
(property "MPN" "24-21UYC/S530-A3/TR8"
|
||||||
(at 25.4 88.9 180)
|
(at 25.4 88.9 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -4553,7 +4553,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C2287"
|
(property "LCSC" "C424133"
|
||||||
(at 25.4 88.9 180)
|
(at 25.4 88.9 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -4564,7 +4564,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 25.4 88.9 180)
|
(at 25.4 88.9 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5997,7 +5997,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 246.38 88.9 0)
|
(at 246.38 88.9 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -6030,7 +6030,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603R"
|
(property "MPN" "24-21SURC/S530-A3/TR8"
|
||||||
(at 135.89 327.66 0)
|
(at 135.89 327.66 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -6041,7 +6041,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 135.89 327.66 0)
|
(at 135.89 327.66 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -6052,7 +6052,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C2286"
|
(property "LCSC" "C2892757"
|
||||||
(at 135.89 327.66 0)
|
(at 135.89 327.66 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7133,7 +7133,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 25.4 83.82 180)
|
(at 25.4 83.82 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7166,7 +7166,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603R"
|
(property "MPN" "24-21SURC/S530-A3/TR8"
|
||||||
(at 25.4 83.82 180)
|
(at 25.4 83.82 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7177,7 +7177,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C2286"
|
(property "LCSC" "C2892757"
|
||||||
(at 25.4 83.82 180)
|
(at 25.4 83.82 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7188,7 +7188,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 25.4 83.82 180)
|
(at 25.4 83.82 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9488,7 +9488,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 237.49 88.9 0)
|
(at 237.49 88.9 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9521,7 +9521,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603G"
|
(property "MPN" "24-21/G6C-BM1N2L/2A"
|
||||||
(at 127 314.96 0)
|
(at 127 314.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9532,7 +9532,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 127 314.96 0)
|
(at 127 314.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9543,7 +9543,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C12624"
|
(property "LCSC" "C2980185"
|
||||||
(at 127 314.96 0)
|
(at 127 314.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9737,7 +9737,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 25.4 86.36 180)
|
(at 25.4 86.36 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9770,7 +9770,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603G"
|
(property "MPN" "24-21/G6C-BM1N2L/2A"
|
||||||
(at 25.4 86.36 180)
|
(at 25.4 86.36 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9781,7 +9781,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C12624"
|
(property "LCSC" "C2980185"
|
||||||
(at 25.4 86.36 180)
|
(at 25.4 86.36 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -9792,7 +9792,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 25.4 86.36 180)
|
(at 25.4 86.36 180)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -10574,7 +10574,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "49.9"
|
(property "Value" "330"
|
||||||
(at 239.522 79.375 0)
|
(at 239.522 79.375 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -10618,7 +10618,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "0402WGF4999TCE"
|
(property "MPN" "0402WGF3300TCE"
|
||||||
(at 5.08 -24.13 0)
|
(at 5.08 -24.13 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -10640,7 +10640,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C25120"
|
(property "LCSC" "C25104"
|
||||||
(at 5.08 -24.13 0)
|
(at 5.08 -24.13 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
|
|||||||
@@ -3938,7 +3938,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 33.02 60.96 0)
|
(at 33.02 60.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -3971,7 +3971,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603G"
|
(property "MPN" "24-21/G6C-BM1N2L/2A"
|
||||||
(at 33.02 60.96 0)
|
(at 33.02 60.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -3982,7 +3982,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C12624"
|
(property "LCSC" "C2980185"
|
||||||
(at 33.02 60.96 0)
|
(at 33.02 60.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -3993,7 +3993,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 33.02 60.96 0)
|
(at 33.02 60.96 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5211,7 +5211,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Footprint" "LED_SMD:LED_0603_1608Metric"
|
(property "Footprint" "hardware:LED_1206_ReverseMount_Everlight_24-21"
|
||||||
(at 48.26 78.74 0)
|
(at 48.26 78.74 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5244,7 +5244,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "KT-0603G"
|
(property "MPN" "24-21/G6C-BM1N2L/2A"
|
||||||
(at 48.26 78.74 0)
|
(at 48.26 78.74 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5255,7 +5255,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C12624"
|
(property "LCSC" "C2980185"
|
||||||
(at 48.26 78.74 0)
|
(at 48.26 78.74 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5266,7 +5266,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Manufacturer" "Hubei KENTO"
|
(property "Manufacturer" "Everlight"
|
||||||
(at 48.26 78.74 0)
|
(at 48.26 78.74 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5314,7 +5314,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "10k"
|
(property "Value" "33k"
|
||||||
(at 62.23 61.15 0)
|
(at 62.23 61.15 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -5358,7 +5358,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "0402WGF1002TCE"
|
(property "MPN" "0402WGF3302TCE"
|
||||||
(at 62.23 57.15 0)
|
(at 62.23 57.15 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5369,7 +5369,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C25744"
|
(property "LCSC" "C25779"
|
||||||
(at 62.23 57.15 0)
|
(at 62.23 57.15 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5758,7 +5758,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "49.9"
|
(property "Value" "330"
|
||||||
(at 36.83 56.07 0)
|
(at 36.83 56.07 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -5802,7 +5802,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "0402WGF4999TCE"
|
(property "MPN" "0402WGF3300TCE"
|
||||||
(at 36.83 52.07 0)
|
(at 36.83 52.07 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -5813,7 +5813,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C25120"
|
(property "LCSC" "C25104"
|
||||||
(at 36.83 52.07 0)
|
(at 36.83 52.07 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7123,7 +7123,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "49.9"
|
(property "Value" "330"
|
||||||
(at 52.07 76.39 0)
|
(at 52.07 76.39 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -7167,7 +7167,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "0402WGF4999TCE"
|
(property "MPN" "0402WGF3300TCE"
|
||||||
(at 52.07 72.39 0)
|
(at 52.07 72.39 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7178,7 +7178,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C25120"
|
(property "LCSC" "C25104"
|
||||||
(at 52.07 72.39 0)
|
(at 52.07 72.39 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7314,7 +7314,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "10k"
|
(property "Value" "5.1k"
|
||||||
(at 132.08 44.45 0)
|
(at 132.08 44.45 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -7358,7 +7358,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "0402WGF1002TCE"
|
(property "MPN" "0402WGF5101TCE"
|
||||||
(at 0 0 0)
|
(at 0 0 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -7380,7 +7380,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C25744"
|
(property "LCSC" "C25905"
|
||||||
(at 0 0 0)
|
(at 0 0 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -8143,7 +8143,7 @@
|
|||||||
(justify left)
|
(justify left)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "10k"
|
(property "Value" "33k"
|
||||||
(at 17.78 72.58 0)
|
(at 17.78 72.58 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -8187,7 +8187,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "0402WGF1002TCE"
|
(property "MPN" "0402WGF3302TCE"
|
||||||
(at 17.78 68.58 0)
|
(at 17.78 68.58 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -8198,7 +8198,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C25744"
|
(property "LCSC" "C25779"
|
||||||
(at 17.78 68.58 0)
|
(at 17.78 68.58 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
|
|||||||
@@ -42,6 +42,15 @@ datasheet extraction, WebSearch/WebFetch for parts and reference designs.
|
|||||||
FPGA-GC_ON use. USB-only fallback verified via truth table (MODE≤0.35 V row).
|
FPGA-GC_ON use. USB-only fallback verified via truth table (MODE≤0.35 V row).
|
||||||
PR1 divider was marginal (1.10 V vs VREF 1.0±8 %) → **fixed: R3=150k**
|
PR1 divider was marginal (1.10 V vs VREF 1.0±8 %) → **fixed: R3=150k**
|
||||||
(switchover 2.30–2.70 V). Abs max (6 V) fine.
|
(switchover 2.30–2.70 V). Abs max (6 V) fine.
|
||||||
|
**D8/D9 handover-indicator base-loading fixed 2026-08-28:** the complementary
|
||||||
|
Q1(NPN)/Q2(PNP) indicator bases hung on the open-drain ST/GC_ON node through
|
||||||
|
R39/R40 10 k; with R5 10 k they divided GC_ON to ~2 V on GC power, turning BOTH
|
||||||
|
LEDs on and giving the FPGA/EN a soggy level (BRINGUP #2). ST is only
|
||||||
|
characterised to 1 mA sink, so R5 can't just be strengthened. Fix: **R5 10k→5.1k
|
||||||
|
(C25905), R39/R40 10k→33k (C25779)** → GC_ON ≈ 2.95 V on GC (Q1 sat / Q2 off,
|
||||||
|
D8=GC only), ST sinks ~0.73 mA on USB (Q2 on, D9=USB only). Clean one-hot;
|
||||||
|
reuses existing parts; no PCB layout change. D8=GC / D9=USB assignment confirmed
|
||||||
|
(ST low when VIN1 not used, VIN1=GC priority).
|
||||||
- **AP2112K-1.2 (U1) / AP2112K-3.3 (U4)**: 1 µF X5R in/out present (DS
|
- **AP2112K-1.2 (U1) / AP2112K-3.3 (U4)**: 1 µF X5R in/out present (DS
|
||||||
requirement), 600 mA rating vs load fine, dropout headroom checked (1.2 V
|
requirement), 600 mA rating vs load fine, dropout headroom checked (1.2 V
|
||||||
version has 1.0–1.3 V dropout — OK from 3.3 V), EN=VIN OK.
|
version has 1.0–1.3 V dropout — OK from 3.3 V), EN=VIN OK.
|
||||||
@@ -74,8 +83,34 @@ datasheet extraction, WebSearch/WebFetch for parts and reference designs.
|
|||||||
change); TEST→GND, AGND→GND.
|
change); TEST→GND, AGND→GND.
|
||||||
- **EEPROM 93LC46B (U7)**: interface **was wrong** (DO+DI both direct to
|
- **EEPROM 93LC46B (U7)**: interface **was wrong** (DO+DI both direct to
|
||||||
EEDATA) → fixed per DS Table 3.4: EE_DO net, R30 2.2k (C25879) to EE_DATA,
|
EEDATA) → fixed per DS Table 3.4: EE_DO net, R30 2.2k (C25879) to EE_DATA,
|
||||||
R31 10k (C25744) pull-up to 3V3, DI direct. 93LC46B = fixed 16-bit org =
|
R31 10k (C25744) pull-up to 3V3, DI direct. 93LC46B = fixed 16-bit org (that
|
||||||
correct for FT2232H. Verified in netlist.
|
part of the earlier verdict stands). **Interface wiring verified in netlist.**
|
||||||
|
- **⚠️ U7 PART IS UNDERSIZED — found at bring-up 2026-08-22 (overturns the old
|
||||||
|
"93LC46B = correct for FT2232H" note, which only checked ORG, not size).**
|
||||||
|
The 93LC46B is **1 Kbit = 128 bytes**; the FT2232H addresses a **256-byte**
|
||||||
|
EEPROM (`max_eeprom_size=256`) and its config does not fit in 128 B. FTDI
|
||||||
|
specs a **93LC56B (256 B)** or 93LC66B for the H-series — the 93LC46 is for the
|
||||||
|
FT232R / FT2232**D**. Empirical evidence (pyftdi on the repaired V1 unit): the
|
||||||
|
128-byte chip mirrors into the upper half (`has_mirroring=True`); a config
|
||||||
|
write mirror-clobbers word 0x80→0x00 and **fails verify at word 0x02**; and
|
||||||
|
`set_property` indexes past byte 128. **Consequence:** the "re-BBA-rb" product
|
||||||
|
string CANNOT be stored on V1 — and worse, **attempting the write SOFT-BRICKS
|
||||||
|
the FT2232H** (confirmed 2026-08-22): the partial/mirrored write leaves a
|
||||||
|
checksum-valid-but-garbage config, and the FT2232H then **fails USB enumeration
|
||||||
|
entirely** (dead silent — no `dmesg` attach at all). It does NOT cleanly fall
|
||||||
|
back to ROM defaults; only a BLANK or checksum-INVALID EEPROM does that. (An
|
||||||
|
earlier note here wrongly said a bad EEPROM always falls back and still
|
||||||
|
enumerates — that is FALSE for a partial write; corrected.)
|
||||||
|
**RECOVERY (done on this unit, works):** short U7's **CLK to GND while powering
|
||||||
|
on** so the FT2232H can't read a valid EEPROM → forces ROM defaults →
|
||||||
|
enumerates → then **erase U7** (`flash_ftdi_eeprom.py --erase --commit`, or
|
||||||
|
FT_PROG). Classic FTDI EEPROM recovery. With U7 blank the board runs on ROM
|
||||||
|
defaults ("Dual RS232-HS", 0403:6010); iceprog (bitstream flash — VERIFY OK on
|
||||||
|
this unit) + the channel-B UART are unaffected.
|
||||||
|
**DO NOT run the string write on this board.** `flash_ftdi_eeprom.py` now
|
||||||
|
detects the mirroring and refuses (use --force only to deliberately re-soft-
|
||||||
|
brick for testing; `--erase` blanks). **Fix for a future rev:** fit a 93LC56B
|
||||||
|
at U7 (same SOIC-8, fixed 16-bit org, pin-compatible).
|
||||||
- **EE_CS pull-down (R43, 10 kΩ) — ADDED 2026-07-31.** FT2232H DS Table 3.4
|
- **EE_CS pull-down (R43, 10 kΩ) — ADDED 2026-07-31.** FT2232H DS Table 3.4
|
||||||
states EECS/EECLK/EEDATA are all **"Tri-State during device reset"**, so CS
|
states EECS/EECLK/EEDATA are all **"Tri-State during device reset"**, so CS
|
||||||
floats while the FT2232H is in reset. The Microchip 93LC46B DS is explicit:
|
floats while the FT2232H is in reset. The Microchip 93LC46B DS is explicit:
|
||||||
@@ -102,7 +137,10 @@ datasheet extraction, WebSearch/WebFetch for parts and reference designs.
|
|||||||
CDONE=ADBUS6, CRESET=ADBUS7 (verified against iceprog.c; old ADBUS3/ACBUS0/
|
CDONE=ADBUS6, CRESET=ADBUS7 (verified against iceprog.c; old ADBUS3/ACBUS0/
|
||||||
ACBUS1 now NC). R11/R12 10k pull-ups on CRESET/CDONE intact.
|
ACBUS1 now NC). R11/R12 10k pull-ups on CRESET/CDONE intact.
|
||||||
- **EEPROM contents decision**: ship blank (default 0403:6010 = what iceprog
|
- **EEPROM contents decision**: ship blank (default 0403:6010 = what iceprog
|
||||||
opens). Documented in TODO.
|
opens). Documented in TODO. **Update 2026-08-22:** on V1 this is now *forced*
|
||||||
|
blank, not just a choice — U7 (93LC46B) is too small to hold an FT2232H config
|
||||||
|
(see the U7-undersized note above), so the product string can't be programmed
|
||||||
|
until a 93LC56B is fitted. Blank is the correct, working state.
|
||||||
|
|
||||||
## 4. FPGA sheet (`Fpga.kicad_sch`) — FULLY REVIEWED, PASS
|
## 4. FPGA sheet (`Fpga.kicad_sch`) — FULLY REVIEWED, PASS
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,29 @@ Major work this session:
|
|||||||
convenience one-command multi-seed workflow needs debugging if
|
convenience one-command multi-seed workflow needs debugging if
|
||||||
wanted again.
|
wanted again.
|
||||||
|
|
||||||
|
## V2 rework — silkscreen & mechanical (added 2026-08-28)
|
||||||
|
|
||||||
|
Cosmetic/mechanical items for the in-progress V2 rework (EEPROM→93LC56B,
|
||||||
|
reverse-mount LEDs, J3 slot already done). These are PCB-layout tasks, not
|
||||||
|
schematic changes.
|
||||||
|
|
||||||
|
- [x] **1. Add the project name in silkscreen — DONE 2026-08-28** (commit
|
||||||
|
"Added Silkscreen labels"). "ReBBArb V2" (2 mm) on B.SilkS, mid-board.
|
||||||
|
Free-floating over some copper (silk_over_copper warning, JLC clips it) —
|
||||||
|
reposition to taste if wanted.
|
||||||
|
- [ ] ~~**2. Extend the board to the ethernet socket for a flush GC fit.**~~
|
||||||
|
**DROPPED 2026-08-28** — Dennis decided against extending the outline;
|
||||||
|
board ships at its current length.
|
||||||
|
- [x] **3. Back-side silkscreen LED legends — DONE 2026-08-28** (same commit).
|
||||||
|
On B.SilkS (mirrored): RX (D11) / TX (D12) / RDY (D13) / HB (D6, heartbeat)
|
||||||
|
/ EXI (D7) as vertical labels above the LED-window row; USB (D9) / GC (D8)
|
||||||
|
above the two power LEDs. Semantics confirmed against `synth.py`.
|
||||||
|
D8/D9 = GC/USB assignment **confirmed** (TPS2116 ST low when VIN1 not used,
|
||||||
|
VIN1 = GC priority) and the handover indicator **circuit fixed** 2026-08-28
|
||||||
|
(R5 10k→5.1k, R39/R40 10k→33k — see BRINGUP #2 / REVIEW.md), so the labels
|
||||||
|
are correct and the indicator is now clean one-hot. "ReBBArb V2" name
|
||||||
|
position confirmed fine by Dennis.
|
||||||
|
|
||||||
## Critical — ALL RESOLVED (schematic + PCB, verified 2026-07-18)
|
## Critical — ALL RESOLVED (schematic + PCB, verified 2026-07-18)
|
||||||
|
|
||||||
- [x] **EXI DO/DI swapped at J3 — FIXED 2026-07-17** (all copper unchanged).
|
- [x] **EXI DO/DI swapped at J3 — FIXED 2026-07-17** (all copper unchanged).
|
||||||
@@ -358,6 +381,23 @@ Major work this session:
|
|||||||
|
|
||||||
## Minor / BOM
|
## Minor / BOM
|
||||||
|
|
||||||
|
- [x] **U7 EEPROM undersized — swap 93LC46B → 93LC56B — DONE (schematic,
|
||||||
|
2026-08-25):** U7 now 93LC56B, MPN 93LC56BT-I/SN, LCSC **C6164**, same
|
||||||
|
SOIC-8 footprint. 256 B is the FT2232H's full EEPROM size (confirmed:
|
||||||
|
pyftdi `EXT_EEPROM_SIZES=(128,256)`, `max_eeprom_size=256`), so this fully
|
||||||
|
resolves the soft-brick. Found at bring-up 2026-08-22. The 93LC46B is 128 B; the FT2232H needs ≥256 B (93LC56B /
|
||||||
|
93LC66B) to hold its config, so the "re-BBA-rb" USB product string can't be
|
||||||
|
programmed on V1. **⚠️ Worse than cosmetic: ATTEMPTING the write SOFT-BRICKS
|
||||||
|
the FT2232H** — the partial/mirrored write leaves a checksum-valid-garbage
|
||||||
|
config and the chip then fails USB enumeration entirely (dead silent, no
|
||||||
|
dmesg). It does NOT fall back to ROM defaults; only a blank/invalid EEPROM
|
||||||
|
does. **Recovery (done, works):** power on with U7 CLK shorted to GND →
|
||||||
|
forces ROM defaults → enumerates → then erase U7. See REVIEW.md "U7 PART IS
|
||||||
|
UNDERSIZED". **Do NOT run the string write on V1** (`flash_ftdi_eeprom.py`
|
||||||
|
refuses via mirroring detection). Blank U7 is the correct state: iceprog
|
||||||
|
bitstream flash (VERIFY OK on the repaired unit) + the channel-B UART work
|
||||||
|
normally. 93LC56B is the same SOIC-8 / fixed-16-bit-org, pin-compatible
|
||||||
|
drop-in (e.g. 93LC56BT-I/SN) for the respin.
|
||||||
- [x] RSET_BG 12.4 k — ACCEPTED 2026-07-18 (closed, no change): datasheet
|
- [x] RSET_BG 12.4 k — ACCEPTED 2026-07-18 (closed, no change): datasheet
|
||||||
says 12.3 kΩ, but that is an E192 value with no JLC Basic part —
|
says 12.3 kΩ, but that is an E192 value with no JLC Basic part —
|
||||||
WIZnet's own reference synthesizes it as 12 k + 300 Ω. The 0.8 %
|
WIZnet's own reference synthesizes it as 12 k + 300 Ω. The 0.8 %
|
||||||
|
|||||||
@@ -10006,7 +10006,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "Value" "93LC46B"
|
(property "Value" "93LC56B"
|
||||||
(at 238.506 229.108 0)
|
(at 238.506 229.108 0)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
(do_not_autoplace no)
|
(do_not_autoplace no)
|
||||||
@@ -10049,7 +10049,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "MPN" "93LC46BT-I/SN"
|
(property "MPN" "93LC56BT-I/SN"
|
||||||
(at -73.66 5.08 0)
|
(at -73.66 5.08 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
@@ -10071,7 +10071,7 @@
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
(property "LCSC" "C16253"
|
(property "LCSC" "C6164"
|
||||||
(at -73.66 5.08 0)
|
(at -73.66 5.08 0)
|
||||||
(hide yes)
|
(hide yes)
|
||||||
(show_name no)
|
(show_name no)
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""EXI device-ID query for re-bba-rb bring-up — run on a Raspberry Pi wired to
|
||||||
|
the FPGA's EXI pins, to validate the GameCube-facing capture path with NO W5100
|
||||||
|
involved (so it works even on a unit whose W5100/ethernet side is dead).
|
||||||
|
|
||||||
|
It bit-bangs the EXI SPI the way the GameCube does: CLK idles HIGH; the FPGA
|
||||||
|
samples MOSI on the falling edge and drives MISO on the rising edge. It sends
|
||||||
|
the device-ID read header (read 4 bytes @ addr 0 = 0x00 0x03), then pauses (the
|
||||||
|
GC pauses the clock between the header and the data so the FPGA can prefetch the
|
||||||
|
response), then clocks read bytes and looks for the reply 04 02 02 00.
|
||||||
|
|
||||||
|
Wiring (Pi BCM GPIO -> FPGA EXI, all 3.3 V, shared GND):
|
||||||
|
CLK -> EXI CLK (FPGA pin 44)
|
||||||
|
MOSI -> EXI MOSI (FPGA pin 4, an FPGA *input*)
|
||||||
|
MISO <- EXI MISO (FPGA pin 3, an FPGA *output*)
|
||||||
|
CS -> EXI CS (FPGA pin 45)
|
||||||
|
GND <-> GND
|
||||||
|
Reach these at the SP1 edge connector (J3) or on the series damper resistors.
|
||||||
|
Edit the BCM pin numbers below to match your wiring. Run: sudo python3 exi_devid_rpi.py
|
||||||
|
|
||||||
|
Requires the FPGA to be running the full BBA design (e.g. build/seed3/top.bin)
|
||||||
|
and its 12 MHz clock (X1) alive — both independent of the W5100.
|
||||||
|
"""
|
||||||
|
import time
|
||||||
|
try:
|
||||||
|
import RPi.GPIO as GPIO
|
||||||
|
except ImportError:
|
||||||
|
raise SystemExit("needs RPi.GPIO -> sudo apt install python3-rpi.gpio")
|
||||||
|
|
||||||
|
# ---- set these to your actual Pi BCM pin numbers ----
|
||||||
|
CLK, MOSI, MISO, CS = 11, 10, 9, 8
|
||||||
|
|
||||||
|
GPIO.setmode(GPIO.BCM)
|
||||||
|
GPIO.setup(CLK, GPIO.OUT, initial=1) # CPOL=1: clock idles HIGH
|
||||||
|
GPIO.setup(MOSI, GPIO.OUT, initial=0)
|
||||||
|
GPIO.setup(CS, GPIO.OUT, initial=1) # inactive HIGH
|
||||||
|
GPIO.setup(MISO, GPIO.IN)
|
||||||
|
|
||||||
|
|
||||||
|
def xfer(b):
|
||||||
|
"""Clock one byte MSB-first; FPGA samples MOSI on falling, drives MISO on rising."""
|
||||||
|
r = 0
|
||||||
|
for i in range(7, -1, -1):
|
||||||
|
GPIO.output(MOSI, (b >> i) & 1) # MOSI stable while CLK is high
|
||||||
|
GPIO.output(CLK, 0) # falling edge -> FPGA samples MOSI
|
||||||
|
GPIO.output(CLK, 1) # rising edge -> FPGA drives MISO
|
||||||
|
r = (r << 1) | GPIO.input(MISO)
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
|
GPIO.output(CS, 0) # assert CS (active low)
|
||||||
|
xfer(0x00) # header byte 0: read, addr[12:6]=0
|
||||||
|
xfer(0x03) # header byte 1: addr[5:0]=0, len-1=3 (4 B)
|
||||||
|
time.sleep(0.001) # gap so the FPGA can prefetch the reply
|
||||||
|
resp = [xfer(0x00) for _ in range(6)] # clock a few read bytes
|
||||||
|
GPIO.output(CS, 1) # deassert CS
|
||||||
|
GPIO.cleanup()
|
||||||
|
|
||||||
|
print("read bytes:", " ".join("%02x" % x for x in resp))
|
||||||
|
want = [0x04, 0x02, 0x02, 0x00]
|
||||||
|
found = any(resp[i:i + 4] == want for i in range(len(resp) - 3))
|
||||||
|
if found:
|
||||||
|
print("EXI device-ID 04 02 02 00 -> FOUND. EXI capture path works!")
|
||||||
|
else:
|
||||||
|
print("device-ID not found. Try: swap to mode-2 edges (move the MISO sample "
|
||||||
|
"to just before the falling edge), check wiring/GND, confirm the FPGA "
|
||||||
|
"is running the BBA design and its 12 MHz clock is alive.")
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Program the re-bba-rb FT2232H EEPROM so the unit enumerates as "re-BBA-rb".
|
||||||
|
|
||||||
|
Uses pyftdi (libusb) — the in-container tool, since debian's libftdi1-2 ships
|
||||||
|
only the runtime lib, not the `ftdi_eeprom` binary. The intended descriptor
|
||||||
|
values mirror hardware/re-bba-rb/ftdi_eeprom.conf.
|
||||||
|
|
||||||
|
DRY-RUN BY DEFAULT: prints the diff and writes a raw backup, but does NOT touch
|
||||||
|
the EEPROM unless you pass --commit. Keeps the stock VID/PID 0403:6010.
|
||||||
|
|
||||||
|
Usage (inside the devcontainer, FT2232H attached):
|
||||||
|
sudo /opt/venv/bin/python hardware/re-bba-rb/flash_ftdi_eeprom.py # dry-run + backup
|
||||||
|
sudo /opt/venv/bin/python hardware/re-bba-rb/flash_ftdi_eeprom.py --erase --commit # blank U7
|
||||||
|
|
||||||
|
⚠️⚠️ re-bba-rb V1: DO NOT PROGRAM THE STRINGS — IT SOFT-BRICKS THE FT2232H. ⚠️⚠️
|
||||||
|
U7 is a 93LC46B (128-byte / 1 Kbit) EEPROM, TOO SMALL for the FT2232H — the
|
||||||
|
H-series needs a 93LC56B (256 B) or 93LC66B (the 93LC46 is for the FT232R /
|
||||||
|
FT2232D). The FT2232H config mirrors in the 128-byte chip, so a string write
|
||||||
|
lands a PARTIAL, checksum-valid-but-garbage config. The FT2232H then reads it at
|
||||||
|
power-up and **FAILS USB ENUMERATION ENTIRELY** — dead silent, no dmesg attach.
|
||||||
|
It does NOT fall back to ROM defaults (only a BLANK / checksum-INVALID EEPROM
|
||||||
|
does that). This was confirmed on hardware 2026-08-22. The script therefore
|
||||||
|
REFUSES the write when it detects mirroring; --force exists only to reproduce the
|
||||||
|
soft-brick deliberately.
|
||||||
|
|
||||||
|
RECOVERY if U7 ever gets a bad config written (done on the V1 unit, works):
|
||||||
|
1. Power the board on with U7's CLK pin shorted to GND — the FT2232H then can't
|
||||||
|
read a valid EEPROM and enumerates on ROM defaults ("Dual RS232-HS",
|
||||||
|
0403:6010).
|
||||||
|
2. Release the short and immediately blank U7:
|
||||||
|
sudo /opt/venv/bin/python hardware/re-bba-rb/flash_ftdi_eeprom.py --erase --commit
|
||||||
|
(Classic FTDI EEPROM recovery.) With U7 blank the board is fully functional;
|
||||||
|
iceprog + the channel-B UART work normally. Fix for a future rev: 93LC56B at U7.
|
||||||
|
|
||||||
|
reset_device() is intentionally NOT called — it re-enumerates the FT2232H and can
|
||||||
|
drop a usbip attachment; re-plug / re-attach manually instead.
|
||||||
|
"""
|
||||||
|
import argparse
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
VID = 0x0403
|
||||||
|
PID = 0x6010
|
||||||
|
URL = f"ftdi://0x{VID:04x}:0x{PID:04x}/1"
|
||||||
|
|
||||||
|
MANUFACTURER = "hashru"
|
||||||
|
PRODUCT = "re-BBA-rb"
|
||||||
|
SERIAL = "RBBARB001"
|
||||||
|
|
||||||
|
BACKUP = Path(__file__).with_name("eeprom-backup.bin")
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
ap = argparse.ArgumentParser(description=__doc__)
|
||||||
|
ap.add_argument("--commit", action="store_true",
|
||||||
|
help="actually write the EEPROM (default: dry-run only)")
|
||||||
|
ap.add_argument("--erase", action="store_true",
|
||||||
|
help="blank U7 to 0xFF (FT2232H falls back to ROM defaults)")
|
||||||
|
ap.add_argument("--force", action="store_true",
|
||||||
|
help="attempt the string write even if U7 reports mirroring "
|
||||||
|
"(undersized 93LC46B) — WILL SOFT-BRICK the FT2232H on "
|
||||||
|
"V1 (fails USB enumeration; recover via CLK-to-GND + erase)")
|
||||||
|
ap.add_argument("--url", default=URL, help=f"pyftdi device URL (default {URL})")
|
||||||
|
args = ap.parse_args()
|
||||||
|
|
||||||
|
try:
|
||||||
|
from pyftdi.eeprom import FtdiEeprom
|
||||||
|
except ImportError:
|
||||||
|
print("pyftdi not installed. In the devcontainer it is preinstalled; "
|
||||||
|
"otherwise: pip install pyftdi", file=sys.stderr)
|
||||||
|
return 2
|
||||||
|
|
||||||
|
eeprom = FtdiEeprom()
|
||||||
|
try:
|
||||||
|
eeprom.open(args.url)
|
||||||
|
except Exception as exc: # noqa: BLE001 - surface the real libusb error
|
||||||
|
print(f"Could not open {args.url}: {exc}", file=sys.stderr)
|
||||||
|
print("Is the FT2232H usbipd-attached, and are you running under sudo?",
|
||||||
|
file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
|
# 1) Backup the current EEPROM image before any change.
|
||||||
|
try:
|
||||||
|
BACKUP.write_bytes(bytes(eeprom.data))
|
||||||
|
print(f"Backed up current EEPROM ({len(eeprom.data)} bytes) -> {BACKUP}")
|
||||||
|
except Exception as exc: # noqa: BLE001
|
||||||
|
print(f"WARNING: could not write backup ({exc}); aborting.", file=sys.stderr)
|
||||||
|
eeprom.close()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
# --- Erase mode: blank U7 back to 0xFF (FT2232H then uses ROM defaults). ---
|
||||||
|
if args.erase:
|
||||||
|
return _erase(eeprom, args.commit)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# HARDWARE NOTE — U7 on re-bba-rb V1 is a 93LC46B (1 Kbit = 128 bytes).
|
||||||
|
# The FT2232H addresses a 256-byte EEPROM and its config does NOT fit in
|
||||||
|
# 128 bytes: pyftdi sees the 128-byte chip mirror into the upper half
|
||||||
|
# (has_mirroring=True), the config write mirror-clobbers word 0x80->0x00,
|
||||||
|
# and verify fails. FTDI specs a 93LC56B (256 B) / 93LC66B for the H-series
|
||||||
|
# (the 93LC46 is for the FT232R / FT2232D). Writing the strings leaves a
|
||||||
|
# PARTIAL checksum-valid-but-garbage config that SOFT-BRICKS the FT2232H: it
|
||||||
|
# then fails USB enumeration entirely (dead silent — does NOT fall back to
|
||||||
|
# ROM defaults). Recovery: power on with U7 CLK shorted to GND, then --erase.
|
||||||
|
# So REFUSE the write — do not half-brick the chip.
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
if eeprom.has_mirroring and not args.force:
|
||||||
|
print("\nREFUSING: U7 reports EEPROM mirroring — it is a 128-byte chip "
|
||||||
|
"(93LC46B), too small for the FT2232H's 256-byte config.\n"
|
||||||
|
"Writing the 're-BBA-rb' strings SOFT-BRICKS the FT2232H on this "
|
||||||
|
"board (partial config -> fails USB enumeration; recover by shorting "
|
||||||
|
"U7 CLK to GND at boot then --erase; see header / REVIEW.md).\n"
|
||||||
|
"Use --erase to blank U7; --force ONLY to reproduce the soft-brick.",
|
||||||
|
file=sys.stderr)
|
||||||
|
eeprom.close()
|
||||||
|
return 3
|
||||||
|
|
||||||
|
# Stage a COMPLETE FT2232H default config, then overlay our strings.
|
||||||
|
print(f"\nEEPROM currently blank: {eeprom.is_empty} — staging FT2232H defaults.")
|
||||||
|
eeprom.initialize()
|
||||||
|
|
||||||
|
cfg = eeprom._config # decoded config dict (no public accessor in pyftdi 0.57)
|
||||||
|
print("\nCurrent (staged-base) descriptors:")
|
||||||
|
print(f" vendor_id = 0x{cfg.get('vendor_id', 0):04x}")
|
||||||
|
print(f" product_id = 0x{cfg.get('product_id', 0):04x}")
|
||||||
|
|
||||||
|
# Stage the new strings (VID/PID/channel config untouched).
|
||||||
|
eeprom.set_manufacturer_name(MANUFACTURER)
|
||||||
|
eeprom.set_product_name(PRODUCT)
|
||||||
|
eeprom.set_serial_number(SERIAL)
|
||||||
|
|
||||||
|
print("\nStaged descriptors:")
|
||||||
|
print(f" manufacturer = {MANUFACTURER!r}")
|
||||||
|
print(f" product = {PRODUCT!r}")
|
||||||
|
print(f" serial = {SERIAL!r}")
|
||||||
|
|
||||||
|
if not args.commit:
|
||||||
|
print("\nDRY-RUN — nothing written. Re-run with --commit to program.")
|
||||||
|
eeprom.close()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
eeprom.commit(dry_run=False)
|
||||||
|
except Exception as exc: # noqa: BLE001
|
||||||
|
print(f"\nWRITE FAILED ({exc}). U7 may be partially written — run with "
|
||||||
|
"--erase to blank it back to ROM-default fallback.", file=sys.stderr)
|
||||||
|
eeprom.close()
|
||||||
|
return 1
|
||||||
|
eeprom.close()
|
||||||
|
# NOTE: do NOT call reset_device() — it re-enumerates the FT2232H, which
|
||||||
|
# drops the usbipd attachment on WSL2. Re-plug / re-attach manually instead.
|
||||||
|
print("\nEEPROM written. Re-attach USB (usbipd) so the host shows 're-BBA-rb'.")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def _erase(eeprom, commit: bool) -> int:
|
||||||
|
"""Blank U7 to 0xFF so the FT2232H falls back to ROM defaults.
|
||||||
|
|
||||||
|
On the mirrored 128-byte chip pyftdi's 256-byte verify trips even though the
|
||||||
|
0xFF writes land, so we loop and check the actual content instead of trusting
|
||||||
|
commit()'s verify.
|
||||||
|
"""
|
||||||
|
if not commit:
|
||||||
|
print("\n--erase DRY-RUN: would write 0xFF over U7. Add --commit to do it.")
|
||||||
|
eeprom.close()
|
||||||
|
return 0
|
||||||
|
for attempt in range(5):
|
||||||
|
data = bytes(eeprom.data)
|
||||||
|
nonff = sum(1 for b in data if b != 0xFF)
|
||||||
|
print(f"erase attempt {attempt}: non-0xFF bytes = {nonff}")
|
||||||
|
if nonff == 0:
|
||||||
|
print("U7 is fully blank — FT2232H will use ROM defaults.")
|
||||||
|
eeprom.close()
|
||||||
|
return 0
|
||||||
|
eeprom.erase(0xFF)
|
||||||
|
try:
|
||||||
|
eeprom.commit(dry_run=False)
|
||||||
|
except Exception as exc: # noqa: BLE001 - mirrored-chip verify trips; writes still land
|
||||||
|
print(f" (commit verify raised, expected on mirrored chip: {exc})")
|
||||||
|
# Re-read fresh next loop without reset_device() (which drops usbip).
|
||||||
|
eeprom.sync()
|
||||||
|
print("Could not fully blank U7 after retries — re-run --erase after re-attach.",
|
||||||
|
file=sys.stderr)
|
||||||
|
eeprom.close()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
raise SystemExit(main())
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# FT2232H EEPROM config for the re-bba-rb board (libftdi `ftdi_eeprom`).
|
||||||
|
#
|
||||||
|
# NOTE: the devcontainer does NOT ship the `ftdi_eeprom` binary (debian's
|
||||||
|
# libftdi1-2 is the runtime lib only). Inside the container program the EEPROM
|
||||||
|
# with the pyftdi script instead — it applies the SAME values as this file:
|
||||||
|
# sudo /opt/venv/bin/python hardware/re-bba-rb/flash_ftdi_eeprom.py --commit
|
||||||
|
# This .conf remains the value spec, and works as-is with `ftdi_eeprom` on a host
|
||||||
|
# that has the libftdi tools, or as a reference when using FT_PROG on Windows.
|
||||||
|
#
|
||||||
|
# Purpose: give the on-board FT2232H a product string so the unit shows up as
|
||||||
|
# "re-BBA-rb" instead of the generic "Dual RS232-HS".
|
||||||
|
#
|
||||||
|
# SAFE BY DESIGN — this KEEPS the stock VID/PID (0403:6010) and the default
|
||||||
|
# dual-channel config, so `iceprog` (MPSSE on interface A) and the channel-B
|
||||||
|
# UART keep working exactly as before. Only the descriptor strings change.
|
||||||
|
#
|
||||||
|
# ⚠️ Before writing: back up whatever is there (it should be blank/default):
|
||||||
|
# ftdi_eeprom --device i:0x0403:0x6010 --read-eeprom --to-file eeprom-backup.bin
|
||||||
|
# Then flash the bitstream FIRST and confirm iceprog works; program this
|
||||||
|
# EEPROM only after that's proven (the string is cosmetic).
|
||||||
|
#
|
||||||
|
# Program with:
|
||||||
|
# ftdi_eeprom --device i:0x0403:0x6010 --flash-eeprom ftdi_eeprom.conf
|
||||||
|
# (re-plug the USB afterwards so the host re-reads the descriptors.)
|
||||||
|
|
||||||
|
vendor_id=0x0403 # KEEP 0403 — iceprog/D2XX look for this
|
||||||
|
product_id=0x6010 # KEEP 6010 — FT2232H default; iceprog looks for this
|
||||||
|
max_power=500 # mA; board draws well under this over USB
|
||||||
|
|
||||||
|
manufacturer=hashru # <- your name/org; free text
|
||||||
|
product=re-BBA-rb # <- this is what makes it show as "re-BBA-rb"
|
||||||
|
|
||||||
|
use_serial=true
|
||||||
|
serial=RBBARB001 # <- optional; bump per unit if you want unique serials
|
||||||
|
|
||||||
|
# Bus-powered while flashing over USB (GC not attached). If you ever program
|
||||||
|
# it while powered from SP1 only, this is still fine — it's a hint to the host.
|
||||||
|
self_powered=false
|
||||||
|
remote_wakeup=false
|
||||||
|
|
||||||
|
# Leave the two channels at their FT2232H defaults (UART/serial). MPSSE (used
|
||||||
|
# by iceprog) is a runtime mode on interface A and works regardless, so there
|
||||||
|
# is no need to set cha_type/chb_type here.
|
||||||
|
|
||||||
|
filename=re-bba-rb-eeprom.bin # ftdi_eeprom writes the built image here too
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,18 @@
|
|||||||
(condition "A.memberOfFootprint('J3') || B.memberOfFootprint('J3')")
|
(condition "A.memberOfFootprint('J3') || B.memberOfFootprint('J3')")
|
||||||
(constraint edge_clearance (min -0.5mm)))
|
(constraint edge_clearance (min -0.5mm)))
|
||||||
|
|
||||||
|
# Reverse-mount LED light-windows (D6/D7/D8/D9/D11/D12/D13, Everlight 24-21).
|
||||||
|
# Each footprint has an Edge.Cuts light-window cutout under the LED body; the
|
||||||
|
# datasheet land places the solder pads ~0.15mm from that cutout - below the
|
||||||
|
# JLCPCB 0.3mm copper-to-edge default, but the intended, manufacturer-recommended
|
||||||
|
# geometry (the copper sits under the part, not exposed). Relax edge_clearance to
|
||||||
|
# 0.1mm for these footprints so the deliberate geometry doesn't spam DRC, while
|
||||||
|
# still catching a genuinely-too-tight future edit (<0.1mm). Test BOTH items: the
|
||||||
|
# violated pair is (pad) vs (the footprint's own Edge.Cuts window segment).
|
||||||
|
(rule "Reverse-mount LED light-window - allow pad-to-cutout clearance"
|
||||||
|
(condition "A.memberOfFootprint('D6') || A.memberOfFootprint('D7') || A.memberOfFootprint('D8') || A.memberOfFootprint('D9') || A.memberOfFootprint('D11') || A.memberOfFootprint('D12') || A.memberOfFootprint('D13') || B.memberOfFootprint('D6') || B.memberOfFootprint('D7') || B.memberOfFootprint('D8') || B.memberOfFootprint('D9') || B.memberOfFootprint('D11') || B.memberOfFootprint('D12') || B.memberOfFootprint('D13')")
|
||||||
|
(constraint edge_clearance (min 0.1mm)))
|
||||||
|
|
||||||
# Power-integrity: flag any power-rail track narrower than its netclass width.
|
# Power-integrity: flag any power-rail track narrower than its netclass width.
|
||||||
# A netclass "track width" is only the DEFAULT for new routing - KiCad does NOT
|
# A netclass "track width" is only the DEFAULT for new routing - KiCad does NOT
|
||||||
# enforce it - so without these rules an under-width power trace passes DRC
|
# enforce it - so without these rules an under-width power trace passes DRC
|
||||||
@@ -124,22 +136,13 @@
|
|||||||
# it's the one thing the routing was actually for.
|
# it's the one thing the routing was actually for.
|
||||||
# USB_DP: 0.25mm width / 0.15mm gap -> ~91ohm (target 90ohm +/-15%)
|
# USB_DP: 0.25mm width / 0.15mm gap -> ~91ohm (target 90ohm +/-15%)
|
||||||
# ETH_DP: 0.20mm width / 0.14mm gap -> ~100ohm (target 100ohm +/-15%)
|
# ETH_DP: 0.20mm width / 0.14mm gap -> ~100ohm (target 100ohm +/-15%)
|
||||||
# track_width keeps a +/-0.02mm max band (routing precision). diff_pair_gap
|
# track_width +/-0.02mm tolerance bands are routing precision, not re-derived
|
||||||
# has NO max: a max bound sounds right but false-flags normal pad fanout,
|
# targets. diff_pair_gap has a min (catches traces routed too close, below fab
|
||||||
# where P/N necessarily diverge for a few mm right at the pad before
|
# clearance) and opt, but intentionally NO max: a gap-max false-flags normal pad
|
||||||
# converging into the coupled run - DRC can't tell that apart from a
|
# fanout, where P/N necessarily diverge over a sub-mm stub right at the pads
|
||||||
# genuinely uncoupled long run, and real routing hit gaps of 0.65-1.65mm on
|
# before converging into the coupled run - KiCad can't tell that apart from a
|
||||||
# fanout stubs vs a ~0.16mm max here. min still catches the case that matters
|
# genuinely uncoupled long run (a length-matching/loss question, not one this
|
||||||
# (traces routed too close, i.e. below the fab clearance floor); max on gap
|
# board-wide per-segment rule can judge). Do NOT re-add a diff_pair_gap max.
|
||||||
# only matters over a long uncoupled run, which is a length-matching/loss
|
|
||||||
# question, not something this board-wide rule can safely judge per-segment.
|
|
||||||
#
|
|
||||||
# Covers both halves of the D1/D4/D5 split-net TVS pattern: USB_DP now
|
|
||||||
# matches FT_DP/FT_DN (D1's chip-side pins) alongside USB_D+/USB_D-, and
|
|
||||||
# ETH_DP matches PHY_TX_P/PHY_TX_N/PHY_RX_P/PHY_RX_N (D4/D5's chip-side pins)
|
|
||||||
# alongside ETH_TX_P/N and ETH_RX_P/N - see netclass_patterns in
|
|
||||||
# re-bba-rb.kicad_pro. Without that, the chip-side half of each pair falls
|
|
||||||
# back to Default and silently skips the impedance target.
|
|
||||||
|
|
||||||
(rule "USB differential pair width/gap (target ~90ohm)"
|
(rule "USB differential pair width/gap (target ~90ohm)"
|
||||||
(severity error)
|
(severity error)
|
||||||
|
|||||||
+24094
-25068
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,753 @@
|
|||||||
|
{
|
||||||
|
"board": {
|
||||||
|
"3dviewports": [],
|
||||||
|
"design_settings": {
|
||||||
|
"defaults": {
|
||||||
|
"apply_defaults_to_fp_barcodes": false,
|
||||||
|
"apply_defaults_to_fp_dimensions": false,
|
||||||
|
"apply_defaults_to_fp_fields": false,
|
||||||
|
"apply_defaults_to_fp_shapes": false,
|
||||||
|
"apply_defaults_to_fp_text": false,
|
||||||
|
"board_outline_line_width": 0.05,
|
||||||
|
"copper_line_width": 0.2,
|
||||||
|
"copper_text_italic": false,
|
||||||
|
"copper_text_size_h": 1.5,
|
||||||
|
"copper_text_size_v": 1.5,
|
||||||
|
"copper_text_thickness": 0.3,
|
||||||
|
"copper_text_upright": false,
|
||||||
|
"courtyard_line_width": 0.05,
|
||||||
|
"dimension_precision": 4,
|
||||||
|
"dimension_units": 3,
|
||||||
|
"dimensions": {
|
||||||
|
"arrow_length": 1270000,
|
||||||
|
"extension_offset": 500000,
|
||||||
|
"keep_text_aligned": true,
|
||||||
|
"suppress_zeroes": true,
|
||||||
|
"text_position": 0,
|
||||||
|
"units_format": 0
|
||||||
|
},
|
||||||
|
"fab_line_width": 0.1,
|
||||||
|
"fab_text_italic": false,
|
||||||
|
"fab_text_size_h": 1.0,
|
||||||
|
"fab_text_size_v": 1.0,
|
||||||
|
"fab_text_thickness": 0.15,
|
||||||
|
"fab_text_upright": false,
|
||||||
|
"other_line_width": 0.1,
|
||||||
|
"other_text_italic": false,
|
||||||
|
"other_text_size_h": 1.0,
|
||||||
|
"other_text_size_v": 1.0,
|
||||||
|
"other_text_thickness": 0.15,
|
||||||
|
"other_text_upright": false,
|
||||||
|
"pads": {
|
||||||
|
"drill": 0.8,
|
||||||
|
"height": 1.27,
|
||||||
|
"width": 2.54
|
||||||
|
},
|
||||||
|
"silk_line_width": 0.1,
|
||||||
|
"silk_text_italic": false,
|
||||||
|
"silk_text_size_h": 1.0,
|
||||||
|
"silk_text_size_v": 1.0,
|
||||||
|
"silk_text_thickness": 0.1,
|
||||||
|
"silk_text_upright": false,
|
||||||
|
"zones": {
|
||||||
|
"border_display_style": 2,
|
||||||
|
"border_hatch_pitch": 0.5,
|
||||||
|
"corner_radius": 0.0,
|
||||||
|
"corner_smoothing": 0,
|
||||||
|
"fill_mode": 0,
|
||||||
|
"hatch_gap": 1.5,
|
||||||
|
"hatch_orientation": 0.0,
|
||||||
|
"hatch_smoothing_level": 0,
|
||||||
|
"hatch_smoothing_value": 0.1,
|
||||||
|
"hatch_thickness": 1.0,
|
||||||
|
"min_clearance": 0.5,
|
||||||
|
"min_island_area": 10.0,
|
||||||
|
"min_thickness": 0.25,
|
||||||
|
"pad_connection": 1,
|
||||||
|
"remove_islands": 0,
|
||||||
|
"thermal_relief_gap": 0.5,
|
||||||
|
"thermal_relief_spoke_width": 0.5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"diff_pair_dimensions": [],
|
||||||
|
"drc_exclusions": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
"rule_severities": {
|
||||||
|
"annular_width": "error",
|
||||||
|
"clearance": "error",
|
||||||
|
"connection_width": "warning",
|
||||||
|
"copper_edge_clearance": "error",
|
||||||
|
"copper_sliver": "warning",
|
||||||
|
"courtyards_overlap": "error",
|
||||||
|
"creepage": "error",
|
||||||
|
"diff_pair_gap_out_of_range": "error",
|
||||||
|
"diff_pair_uncoupled_length_too_long": "error",
|
||||||
|
"drill_out_of_range": "error",
|
||||||
|
"duplicate_footprints": "warning",
|
||||||
|
"extra_footprint": "warning",
|
||||||
|
"footprint": "error",
|
||||||
|
"footprint_filters_mismatch": "ignore",
|
||||||
|
"footprint_symbol_field_mismatch": "warning",
|
||||||
|
"footprint_symbol_mismatch": "warning",
|
||||||
|
"footprint_type_mismatch": "ignore",
|
||||||
|
"hole_clearance": "error",
|
||||||
|
"hole_to_hole": "warning",
|
||||||
|
"holes_co_located": "warning",
|
||||||
|
"invalid_outline": "error",
|
||||||
|
"isolated_copper": "warning",
|
||||||
|
"item_on_disabled_layer": "error",
|
||||||
|
"items_not_allowed": "error",
|
||||||
|
"length_out_of_range": "error",
|
||||||
|
"lib_footprint_issues": "warning",
|
||||||
|
"lib_footprint_mismatch": "warning",
|
||||||
|
"malformed_courtyard": "error",
|
||||||
|
"microvia_drill_out_of_range": "error",
|
||||||
|
"mirrored_text_on_front_layer": "warning",
|
||||||
|
"missing_courtyard": "ignore",
|
||||||
|
"missing_footprint": "warning",
|
||||||
|
"missing_tuning_profile": "warning",
|
||||||
|
"net_conflict": "warning",
|
||||||
|
"nonmirrored_text_on_back_layer": "warning",
|
||||||
|
"npth_inside_courtyard": "error",
|
||||||
|
"padstack": "warning",
|
||||||
|
"pth_inside_courtyard": "error",
|
||||||
|
"shorting_items": "error",
|
||||||
|
"silk_edge_clearance": "warning",
|
||||||
|
"silk_over_copper": "warning",
|
||||||
|
"silk_overlap": "warning",
|
||||||
|
"skew_out_of_range": "error",
|
||||||
|
"solder_mask_bridge": "error",
|
||||||
|
"starved_thermal": "error",
|
||||||
|
"text_height": "warning",
|
||||||
|
"text_on_edge_cuts": "error",
|
||||||
|
"text_thickness": "warning",
|
||||||
|
"through_hole_pad_without_hole": "error",
|
||||||
|
"too_many_vias": "error",
|
||||||
|
"track_angle": "error",
|
||||||
|
"track_dangling": "warning",
|
||||||
|
"track_not_centered_on_via": "ignore",
|
||||||
|
"track_on_post_machined_layer": "error",
|
||||||
|
"track_segment_length": "error",
|
||||||
|
"track_width": "error",
|
||||||
|
"tracks_crossing": "error",
|
||||||
|
"tuning_profile_track_geometries": "ignore",
|
||||||
|
"unconnected_items": "error",
|
||||||
|
"unresolved_variable": "error",
|
||||||
|
"via_dangling": "warning",
|
||||||
|
"zones_intersect": "error"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"max_error": 0.005,
|
||||||
|
"min_clearance": 0.0,
|
||||||
|
"min_connection": 0.0,
|
||||||
|
"min_copper_edge_clearance": 0.5,
|
||||||
|
"min_groove_width": 0.0,
|
||||||
|
"min_hole_clearance": 0.25,
|
||||||
|
"min_hole_to_hole": 0.25,
|
||||||
|
"min_microvia_diameter": 0.2,
|
||||||
|
"min_microvia_drill": 0.1,
|
||||||
|
"min_resolved_spokes": 2,
|
||||||
|
"min_silk_clearance": 0.0,
|
||||||
|
"min_text_height": 0.8,
|
||||||
|
"min_text_thickness": 0.08,
|
||||||
|
"min_through_hole_diameter": 0.3,
|
||||||
|
"min_track_width": 0.2,
|
||||||
|
"min_via_annular_width": 0.1,
|
||||||
|
"min_via_diameter": 0.5,
|
||||||
|
"solder_mask_to_copper_clearance": 0.0,
|
||||||
|
"use_height_for_length_calcs": true
|
||||||
|
},
|
||||||
|
"teardrop_options": [
|
||||||
|
{
|
||||||
|
"td_onpthpad": true,
|
||||||
|
"td_onroundshapesonly": false,
|
||||||
|
"td_onsmdpad": true,
|
||||||
|
"td_ontrackend": false,
|
||||||
|
"td_onvia": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"teardrop_parameters": [
|
||||||
|
{
|
||||||
|
"td_allow_use_two_tracks": true,
|
||||||
|
"td_curve_segcount": 0,
|
||||||
|
"td_height_ratio": 1.0,
|
||||||
|
"td_length_ratio": 0.5,
|
||||||
|
"td_maxheight": 2.0,
|
||||||
|
"td_maxlen": 1.0,
|
||||||
|
"td_on_pad_in_zone": false,
|
||||||
|
"td_target_name": "td_round_shape",
|
||||||
|
"td_width_to_size_filter_ratio": 0.9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"td_allow_use_two_tracks": true,
|
||||||
|
"td_curve_segcount": 0,
|
||||||
|
"td_height_ratio": 1.0,
|
||||||
|
"td_length_ratio": 0.5,
|
||||||
|
"td_maxheight": 2.0,
|
||||||
|
"td_maxlen": 1.0,
|
||||||
|
"td_on_pad_in_zone": false,
|
||||||
|
"td_target_name": "td_rect_shape",
|
||||||
|
"td_width_to_size_filter_ratio": 0.9
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"td_allow_use_two_tracks": true,
|
||||||
|
"td_curve_segcount": 0,
|
||||||
|
"td_height_ratio": 1.0,
|
||||||
|
"td_length_ratio": 0.5,
|
||||||
|
"td_maxheight": 2.0,
|
||||||
|
"td_maxlen": 1.0,
|
||||||
|
"td_on_pad_in_zone": false,
|
||||||
|
"td_target_name": "td_track_end",
|
||||||
|
"td_width_to_size_filter_ratio": 0.9
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"track_widths": [],
|
||||||
|
"tuning_pattern_settings": {
|
||||||
|
"diff_pair_defaults": {
|
||||||
|
"corner_radius_percentage": 80,
|
||||||
|
"corner_style": 1,
|
||||||
|
"max_amplitude": 1.0,
|
||||||
|
"min_amplitude": 0.2,
|
||||||
|
"single_sided": false,
|
||||||
|
"spacing": 1.0
|
||||||
|
},
|
||||||
|
"diff_pair_skew_defaults": {
|
||||||
|
"corner_radius_percentage": 80,
|
||||||
|
"corner_style": 1,
|
||||||
|
"max_amplitude": 1.0,
|
||||||
|
"min_amplitude": 0.2,
|
||||||
|
"single_sided": false,
|
||||||
|
"spacing": 0.6
|
||||||
|
},
|
||||||
|
"single_track_defaults": {
|
||||||
|
"corner_radius_percentage": 80,
|
||||||
|
"corner_style": 1,
|
||||||
|
"max_amplitude": 1.0,
|
||||||
|
"min_amplitude": 0.2,
|
||||||
|
"single_sided": false,
|
||||||
|
"spacing": 0.6
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"via_dimensions": [],
|
||||||
|
"zones_allow_external_fillets": false
|
||||||
|
},
|
||||||
|
"ipc2581": {
|
||||||
|
"bom_rev": "",
|
||||||
|
"dist": "",
|
||||||
|
"distpn": "",
|
||||||
|
"internal_id": "",
|
||||||
|
"mfg": "",
|
||||||
|
"mpn": "",
|
||||||
|
"sch_revision": ""
|
||||||
|
},
|
||||||
|
"layer_pairs": [],
|
||||||
|
"layer_presets": [],
|
||||||
|
"viewports": []
|
||||||
|
},
|
||||||
|
"boards": [],
|
||||||
|
"component_class_settings": {
|
||||||
|
"assignments": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"sheet_component_classes": {
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cvpcb": {
|
||||||
|
"equivalence_files": []
|
||||||
|
},
|
||||||
|
"erc": {
|
||||||
|
"erc_exclusions": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"pin_map": [
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
[
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"rule_severities": {
|
||||||
|
"bus_definition_conflict": "error",
|
||||||
|
"bus_entry_needed": "error",
|
||||||
|
"bus_to_bus_conflict": "error",
|
||||||
|
"bus_to_net_conflict": "error",
|
||||||
|
"different_unit_footprint": "error",
|
||||||
|
"different_unit_net": "error",
|
||||||
|
"duplicate_reference": "error",
|
||||||
|
"duplicate_sheet_names": "error",
|
||||||
|
"endpoint_off_grid": "warning",
|
||||||
|
"extra_units": "error",
|
||||||
|
"field_name_whitespace": "warning",
|
||||||
|
"footprint_filter": "ignore",
|
||||||
|
"footprint_link_issues": "warning",
|
||||||
|
"four_way_junction": "ignore",
|
||||||
|
"ground_pin_not_ground": "warning",
|
||||||
|
"hier_label_mismatch": "error",
|
||||||
|
"isolated_pin_label": "warning",
|
||||||
|
"label_dangling": "error",
|
||||||
|
"label_multiple_wires": "warning",
|
||||||
|
"lib_symbol_issues": "warning",
|
||||||
|
"lib_symbol_mismatch": "warning",
|
||||||
|
"missing_bidi_pin": "warning",
|
||||||
|
"missing_input_pin": "warning",
|
||||||
|
"missing_power_pin": "error",
|
||||||
|
"missing_unit": "warning",
|
||||||
|
"multiple_net_names": "warning",
|
||||||
|
"net_not_bus_member": "warning",
|
||||||
|
"no_connect_connected": "warning",
|
||||||
|
"no_connect_dangling": "warning",
|
||||||
|
"pin_not_connected": "error",
|
||||||
|
"pin_not_driven": "error",
|
||||||
|
"pin_to_pin": "warning",
|
||||||
|
"power_pin_not_driven": "error",
|
||||||
|
"same_local_global_label": "warning",
|
||||||
|
"similar_label_and_power": "warning",
|
||||||
|
"similar_labels": "warning",
|
||||||
|
"similar_power": "warning",
|
||||||
|
"simulation_model_issue": "ignore",
|
||||||
|
"single_global_label": "ignore",
|
||||||
|
"stacked_pin_name": "warning",
|
||||||
|
"unannotated": "error",
|
||||||
|
"unconnected_wire_endpoint": "warning",
|
||||||
|
"undefined_netclass": "error",
|
||||||
|
"unit_value_mismatch": "error",
|
||||||
|
"unresolved_variable": "error",
|
||||||
|
"wire_dangling": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"pinned_footprint_libs": [],
|
||||||
|
"pinned_symbol_libs": []
|
||||||
|
},
|
||||||
|
"meta": {
|
||||||
|
"filename": "re-bba-rb.kicad_pro",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"net_settings": {
|
||||||
|
"classes": [
|
||||||
|
{
|
||||||
|
"bus_width": 12,
|
||||||
|
"clearance": 0.2,
|
||||||
|
"diff_pair_gap": 0.25,
|
||||||
|
"diff_pair_via_gap": 0.25,
|
||||||
|
"diff_pair_width": 0.2,
|
||||||
|
"line_style": 0,
|
||||||
|
"microvia_diameter": 0.3,
|
||||||
|
"microvia_drill": 0.1,
|
||||||
|
"name": "Default",
|
||||||
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"priority": 2147483647,
|
||||||
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
|
"track_width": 0.2,
|
||||||
|
"tuning_profile": "",
|
||||||
|
"via_diameter": 0.6,
|
||||||
|
"via_drill": 0.3,
|
||||||
|
"wire_width": 6
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"meta": {
|
||||||
|
"version": 5
|
||||||
|
},
|
||||||
|
"net_colors": null,
|
||||||
|
"netclass_assignments": null,
|
||||||
|
"netclass_patterns": []
|
||||||
|
},
|
||||||
|
"pcbnew": {
|
||||||
|
"last_paths": {
|
||||||
|
"idf": "",
|
||||||
|
"netlist": "",
|
||||||
|
"plot": "",
|
||||||
|
"specctra_dsn": "",
|
||||||
|
"vrml": ""
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": ""
|
||||||
|
},
|
||||||
|
"schematic": {
|
||||||
|
"annotate_start_num": 0,
|
||||||
|
"annotation": {
|
||||||
|
"method": 0,
|
||||||
|
"sort_order": 0
|
||||||
|
},
|
||||||
|
"bom_export_filename": "${PROJECTNAME}.csv",
|
||||||
|
"bom_fmt_presets": [],
|
||||||
|
"bom_fmt_settings": {
|
||||||
|
"field_delimiter": ",",
|
||||||
|
"keep_line_breaks": false,
|
||||||
|
"keep_tabs": false,
|
||||||
|
"name": "CSV",
|
||||||
|
"ref_delimiter": ",",
|
||||||
|
"ref_range_delimiter": "",
|
||||||
|
"string_delimiter": "\""
|
||||||
|
},
|
||||||
|
"bom_presets": [],
|
||||||
|
"bom_settings": {
|
||||||
|
"exclude_dnp": false,
|
||||||
|
"fields_ordered": [
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Reference",
|
||||||
|
"name": "Reference",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Qty",
|
||||||
|
"name": "${QUANTITY}",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": true,
|
||||||
|
"label": "Value",
|
||||||
|
"name": "Value",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": true,
|
||||||
|
"label": "DNP",
|
||||||
|
"name": "${DNP}",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": true,
|
||||||
|
"label": "Exclude from BOM",
|
||||||
|
"name": "${EXCLUDE_FROM_BOM}",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": true,
|
||||||
|
"label": "Exclude from Board",
|
||||||
|
"name": "${EXCLUDE_FROM_BOARD}",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": true,
|
||||||
|
"label": "Footprint",
|
||||||
|
"name": "Footprint",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Datasheet",
|
||||||
|
"name": "Datasheet",
|
||||||
|
"show": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Check_prices",
|
||||||
|
"name": "Check_prices",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Manufacturer",
|
||||||
|
"name": "Manufacturer",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "MF",
|
||||||
|
"name": "MF",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "MP",
|
||||||
|
"name": "MP",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Package",
|
||||||
|
"name": "Package",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Price",
|
||||||
|
"name": "Price",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Purchase-URL",
|
||||||
|
"name": "Purchase-URL",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "SnapEDA_Link",
|
||||||
|
"name": "SnapEDA_Link",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Availability",
|
||||||
|
"name": "Availability",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "Description",
|
||||||
|
"name": "Description",
|
||||||
|
"show": false
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group_by": false,
|
||||||
|
"label": "#",
|
||||||
|
"name": "${ITEM_NUMBER}",
|
||||||
|
"show": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filter_string": "",
|
||||||
|
"group_symbols": true,
|
||||||
|
"include_excluded_from_bom": true,
|
||||||
|
"name": "",
|
||||||
|
"sort_asc": true,
|
||||||
|
"sort_field": "Reference"
|
||||||
|
},
|
||||||
|
"bus_aliases": {},
|
||||||
|
"connection_grid_size": 50.0,
|
||||||
|
"drawing": {
|
||||||
|
"dashed_lines_dash_length_ratio": 12.0,
|
||||||
|
"dashed_lines_gap_length_ratio": 3.0,
|
||||||
|
"default_line_thickness": 6.0,
|
||||||
|
"default_text_size": 50.0,
|
||||||
|
"field_names": [],
|
||||||
|
"hop_over_size_choice": 0,
|
||||||
|
"intersheets_ref_own_page": false,
|
||||||
|
"intersheets_ref_prefix": "",
|
||||||
|
"intersheets_ref_short": false,
|
||||||
|
"intersheets_ref_show": false,
|
||||||
|
"intersheets_ref_suffix": "",
|
||||||
|
"junction_size_choice": 3,
|
||||||
|
"label_size_ratio": 0.375,
|
||||||
|
"operating_point_overlay_i_precision": 3,
|
||||||
|
"operating_point_overlay_i_range": "~A",
|
||||||
|
"operating_point_overlay_v_precision": 3,
|
||||||
|
"operating_point_overlay_v_range": "~V",
|
||||||
|
"overbar_offset_ratio": 1.23,
|
||||||
|
"pin_symbol_size": 25.0,
|
||||||
|
"text_offset_ratio": 0.15
|
||||||
|
},
|
||||||
|
"legacy_lib_dir": "",
|
||||||
|
"legacy_lib_list": [],
|
||||||
|
"meta": {
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"page_layout_descr_file": "",
|
||||||
|
"plot_directory": "",
|
||||||
|
"reuse_designators": true,
|
||||||
|
"subpart_first_id": 65,
|
||||||
|
"subpart_id_separator": 0,
|
||||||
|
"top_level_sheets": [
|
||||||
|
{
|
||||||
|
"filename": "re-bba-rb.kicad_sch",
|
||||||
|
"name": "ReBBaRb",
|
||||||
|
"uuid": "dbb182a6-d579-468e-b98b-6f0950da9e3a"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"used_designators": "#PWR0ffa1,J1-4,#PWR04cfa1,#PWR019b1,#PWR05fc1,#PWR0d1,#PWR0c80c1,R1-18,#PWR0670d1,L1,#PWR0d9d1,#PWR0e1,#PWR035b1,#PWR0Y1-2,#PWR0C1,C1-60,#FLG0USBVBUS1,#PWR08d1,#FLG0USBGND1,#PWR1-41,#PWR45,Y1-2,#FLG0GC3V1,#PWR0772b1,#PWR03d6c1,FB1-3,#FLG01V2ETH1,#PWR076f1,#PWR07dc1,#PWR091b1,#FLG012VEXI1,X1,U1-13,#PWR04fe1,#FLG0SP13V1,#PWR03bde1,#PWR06d1,#PWR0eff1,#PWR090e1,#PWR064c1-2,#PWR0AD1-4,#PWR0fa1-2,#FLG0VPHY1,D1,#PWR082e1,#PWR0b0ce1,#PWR0fb6f1,#PWR0df1,#PWR0SW1-2,#PWR050d1,#PWR0f3c1,#PWR0f1,#PWR0b4ee1,#PWR0c3b1,#PWR0cb1,#PWR09e1,#PWR0a5b1",
|
||||||
|
"variants": []
|
||||||
|
},
|
||||||
|
"sheets": [
|
||||||
|
[
|
||||||
|
"dbb182a6-d579-468e-b98b-6f0950da9e3a",
|
||||||
|
"ReBBaRb"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"69f32f10-d46b-43fd-9030-7f4135d40b78",
|
||||||
|
"Power"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"64033f5d-a512-44d7-9483-4c31ef84bd56",
|
||||||
|
"Usb Connector"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"73763384-ff95-4826-8da6-2de53070e62f",
|
||||||
|
"fpga"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"c2ddb95f-8a63-4bb0-b3f2-a27a372fea3a",
|
||||||
|
"ethernet"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"1b071f68-b4ea-469c-942f-de06380c9077",
|
||||||
|
"exi"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"text_variables": {},
|
||||||
|
"tuning_profiles": {
|
||||||
|
"meta": {
|
||||||
|
"version": 0
|
||||||
|
},
|
||||||
|
"tuning_profiles_impedance_geometric": []
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"board": {
|
"board": {
|
||||||
"active_layer": 2,
|
"active_layer": 0,
|
||||||
"active_layer_preset": "",
|
"active_layer_preset": "",
|
||||||
"auto_track_width": true,
|
"auto_track_width": true,
|
||||||
"hidden_netclasses": [],
|
"hidden_netclasses": [],
|
||||||
|
|||||||
@@ -159,7 +159,7 @@
|
|||||||
"min_text_height": 0.8,
|
"min_text_height": 0.8,
|
||||||
"min_text_thickness": 0.08,
|
"min_text_thickness": 0.08,
|
||||||
"min_through_hole_diameter": 0.2,
|
"min_through_hole_diameter": 0.2,
|
||||||
"min_track_width": 0.1,
|
"min_track_width": 0.2,
|
||||||
"min_via_annular_width": 0.05,
|
"min_via_annular_width": 0.05,
|
||||||
"min_via_diameter": 0.3,
|
"min_via_diameter": 0.3,
|
||||||
"solder_mask_to_copper_clearance": 0.0,
|
"solder_mask_to_copper_clearance": 0.0,
|
||||||
@@ -535,7 +535,7 @@
|
|||||||
"microvia_drill": 0.1,
|
"microvia_drill": 0.1,
|
||||||
"name": "ETH_DP",
|
"name": "ETH_DP",
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"priority": 5,
|
"priority": 3,
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"track_width": 0.2,
|
"track_width": 0.2,
|
||||||
"tuning_profile": "",
|
"tuning_profile": "",
|
||||||
@@ -543,43 +543,6 @@
|
|||||||
"via_drill": 0.3,
|
"via_drill": 0.3,
|
||||||
"wire_width": 6
|
"wire_width": 6
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"bus_width": 12,
|
|
||||||
"clearance": 0.25,
|
|
||||||
"diff_pair_gap": 0.25,
|
|
||||||
"diff_pair_via_gap": 0.25,
|
|
||||||
"diff_pair_width": 0.2,
|
|
||||||
"line_style": 0,
|
|
||||||
"microvia_diameter": 0.3,
|
|
||||||
"microvia_drill": 0.1,
|
|
||||||
"name": "FB_Sense",
|
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"priority": 7,
|
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"track_width": 0.15,
|
|
||||||
"tuning_profile": "",
|
|
||||||
"via_diameter": 0.6,
|
|
||||||
"via_drill": 0.3,
|
|
||||||
"wire_width": 6
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bus_width": 12,
|
|
||||||
"clearance": 0.15,
|
|
||||||
"diff_pair_gap": 0.25,
|
|
||||||
"diff_pair_width": 0.2,
|
|
||||||
"line_style": 0,
|
|
||||||
"microvia_diameter": 0.3,
|
|
||||||
"microvia_drill": 0.1,
|
|
||||||
"name": "LED",
|
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"priority": 2,
|
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"track_width": 0.15,
|
|
||||||
"tuning_profile": "",
|
|
||||||
"via_diameter": 0.6,
|
|
||||||
"via_drill": 0.3,
|
|
||||||
"wire_width": 6
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"bus_width": 12,
|
"bus_width": 12,
|
||||||
"clearance": 0.15,
|
"clearance": 0.15,
|
||||||
@@ -590,7 +553,7 @@
|
|||||||
"microvia_drill": 0.1,
|
"microvia_drill": 0.1,
|
||||||
"name": "Power",
|
"name": "Power",
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"priority": 1,
|
"priority": 0,
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"track_width": 0.3,
|
"track_width": 0.3,
|
||||||
"tuning_profile": "",
|
"tuning_profile": "",
|
||||||
@@ -608,7 +571,7 @@
|
|||||||
"microvia_drill": 0.1,
|
"microvia_drill": 0.1,
|
||||||
"name": "PowerLV",
|
"name": "PowerLV",
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"priority": 3,
|
"priority": 1,
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"track_width": 0.25,
|
"track_width": 0.25,
|
||||||
"tuning_profile": "",
|
"tuning_profile": "",
|
||||||
@@ -616,40 +579,6 @@
|
|||||||
"via_drill": 0.3,
|
"via_drill": 0.3,
|
||||||
"wire_width": 6
|
"wire_width": 6
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"clearance": 0.1,
|
|
||||||
"diff_pair_gap": 0.25,
|
|
||||||
"diff_pair_width": 0.2,
|
|
||||||
"microvia_diameter": 0.3,
|
|
||||||
"microvia_drill": 0.1,
|
|
||||||
"name": "Signal",
|
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"priority": 0,
|
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"track_width": 0.1,
|
|
||||||
"tuning_profile": "",
|
|
||||||
"via_diameter": 0.6,
|
|
||||||
"via_drill": 0.3
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"bus_width": 12,
|
|
||||||
"clearance": 0.15,
|
|
||||||
"diff_pair_gap": 0.25,
|
|
||||||
"diff_pair_via_gap": 0.25,
|
|
||||||
"diff_pair_width": 0.2,
|
|
||||||
"line_style": 0,
|
|
||||||
"microvia_diameter": 0.3,
|
|
||||||
"microvia_drill": 0.1,
|
|
||||||
"name": "Termination",
|
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"priority": 6,
|
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
|
||||||
"track_width": 0.3,
|
|
||||||
"tuning_profile": "",
|
|
||||||
"via_diameter": 0.6,
|
|
||||||
"via_drill": 0.3,
|
|
||||||
"wire_width": 6
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"bus_width": 12,
|
"bus_width": 12,
|
||||||
"clearance": 0.15,
|
"clearance": 0.15,
|
||||||
@@ -660,7 +589,7 @@
|
|||||||
"microvia_drill": 0.1,
|
"microvia_drill": 0.1,
|
||||||
"name": "USB_DP",
|
"name": "USB_DP",
|
||||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"priority": 4,
|
"priority": 2,
|
||||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||||
"track_width": 0.25,
|
"track_width": 0.25,
|
||||||
"tuning_profile": "",
|
"tuning_profile": "",
|
||||||
@@ -758,274 +687,6 @@
|
|||||||
{
|
{
|
||||||
"netclass": "USB_DP",
|
"netclass": "USB_DP",
|
||||||
"pattern": "*FT_DN*"
|
"pattern": "*FT_DN*"
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "/fpga/LED_G"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "/fpga/LED_R"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D6-A*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D7-A*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D8-A*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D8-K*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D9-A*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D11-K*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D12-K*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*D13-K*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*Q2-C*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_A*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_D*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Power",
|
|
||||||
"pattern": "/exi/EXI_GND"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_RD*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_WR*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*RSET_BG*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_INT*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_RST*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*ETH_CS*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*LED_LNK*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*LED_ACT*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*FLASH_CS*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*FLASH_MISO*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*WP*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*FLASH_SCK*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*FLASH_MOSI*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*CRESET*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*UART_RXD*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*UART_TXD*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*J2-Pad9*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*J2-Pad12*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*CDONE*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*DBG*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EXI_CLK*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EXI_CS*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EXI_INT*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EXI_MISO*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EXI_MOSI*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EE_CLK*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EE_CS*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EE_DATA*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EE_DO*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*RESET*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*CLK12*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*EXTIN*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*GC_ON*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*CC1*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*CC2*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*PR1*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*U8-REF*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*XTAL_*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*OSCI*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*OSCO*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Signal",
|
|
||||||
"pattern": "*XSCO*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*Q1-B*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "LED",
|
|
||||||
"pattern": "*Q2-B*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "ETH_DP",
|
|
||||||
"pattern": "*MDI_TX_P*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "ETH_DP",
|
|
||||||
"pattern": "*MDI_TX_N*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "ETH_DP",
|
|
||||||
"pattern": "*MDI_RX_P*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "ETH_DP",
|
|
||||||
"pattern": "*MDI_RX_N*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "PowerLV",
|
|
||||||
"pattern": "*VPHY*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Power",
|
|
||||||
"pattern": "GND"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Power",
|
|
||||||
"pattern": "*VBST*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Termination",
|
|
||||||
"pattern": "*C18-Pad1*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "Termination",
|
|
||||||
"pattern": "*C19-Pad1*"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"netclass": "FB_Sense",
|
|
||||||
"pattern": "*VFB*"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -1035,6 +696,7 @@
|
|||||||
"netlist": "",
|
"netlist": "",
|
||||||
"plot": "gerbers/",
|
"plot": "gerbers/",
|
||||||
"specctra_dsn": "",
|
"specctra_dsn": "",
|
||||||
|
"step": "",
|
||||||
"vrml": ""
|
"vrml": ""
|
||||||
},
|
},
|
||||||
"page_layout_descr_file": ""
|
"page_layout_descr_file": ""
|
||||||
@@ -1295,7 +957,7 @@
|
|||||||
"uuid": "dbb182a6-d579-468e-b98b-6f0950da9e3a"
|
"uuid": "dbb182a6-d579-468e-b98b-6f0950da9e3a"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"used_designators": "",
|
"used_designators": "C17,#PWR090e1-3,#PWR44-50,R20-21",
|
||||||
"variants": []
|
"variants": []
|
||||||
},
|
},
|
||||||
"sheets": [
|
"sheets": [
|
||||||
|
|||||||
@@ -4,5 +4,4 @@
|
|||||||
(lib (name "TPS562201DDCR")(type "KiCad")(uri "${KIPRJMOD}/../TPS562201DDCR.kicad_sym")(options "")(descr "TPS562201 buck (custom)"))
|
(lib (name "TPS562201DDCR")(type "KiCad")(uri "${KIPRJMOD}/../TPS562201DDCR.kicad_sym")(options "")(descr "TPS562201 buck (custom)"))
|
||||||
(lib (name "HR911105A")(type "KiCad")(uri "${KIPRJMOD}/../HR911105A.kicad_sym")(options "")(descr "HanRun HR911105A RJ45 magjack (custom)"))
|
(lib (name "HR911105A")(type "KiCad")(uri "${KIPRJMOD}/../HR911105A.kicad_sym")(options "")(descr "HanRun HR911105A RJ45 magjack (custom)"))
|
||||||
(lib (name "PUSB3AB6Z_ES")(type "KiCad")(uri "${KIPRJMOD}/../PUSB3AB6Z_ES.kicad_sym")(options "")(descr "Nexperia PUSB3AB6Z 6-ch 3.3V 0.15pF TVS array (ElecSuper 2nd source)"))
|
(lib (name "PUSB3AB6Z_ES")(type "KiCad")(uri "${KIPRJMOD}/../PUSB3AB6Z_ES.kicad_sym")(options "")(descr "Nexperia PUSB3AB6Z 6-ch 3.3V 0.15pF TVS array (ElecSuper 2nd source)"))
|
||||||
(lib (name "TPS25961")(type "KiCad")(uri "${KIPRJMOD}/../TPS25961.kicad_sym")(options "")(descr "TI TPS25961 eFuse, 6-pin SON (custom)"))
|
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user