gokul/usb3-sd-hub
Engineering draft: four-layer, computer-powered USB 3 hub with one USB-C host socket, two USB-C and two USB-A accessory sockets, and a full-size SD slot. Board and three schematic previews are available. Routing and production checks are incomplete; not fabrication ready.
- Version
- 0.1.4
- License
- unset
- Stars
- 0
design/connections.ts
import { hubPinNames, readerPinNames } from "./pinouts";
export const hubConnections = Object.fromEntries(
hubPinNames.flatMap((label) => {
if (label.startsWith("VDD33")) return [[label, "net.VDD33"]];
if (label.startsWith("VDD12")) return [[label, "net.VDD12"]];
if (
label === "EP" ||
label === "TESTEN" ||
label === "CC_POL" ||
label === "ALT_MUX_EN"
)
return [[label, "net.GND"]];
if (
label === "AB1" ||
label.startsWith("C_ATTACH") ||
label === "D6_DP" ||
label === "D6_DM"
)
return [[label, "net.VDD33"]];
if (label === "RBIAS") return [[label, "net.HUB_RBIAS"]];
if (label === "CFG_STRAP") return [[label, "net.HUB_CFG"]];
if (label === "RESET_N") return [[label, "net.RESET_N"]];
if (label === "VBUS_DET") return [[label, "net.HOST_VBUS_DET"]];
if (label === "XTALI" || label === "XTALO")
return [[label, `net.HUB_${label}`]];
if (
label.startsWith("UP_") ||
/^D[1-5]_(DP|DM|TXP|TXN|RXP|RXN)$/.test(label) ||
label.startsWith("PWR")
)
return [[label, `net.${label}`]];
if (label === "SPI_CLK") return [[label, "net.HUB_SPI_CLK"]];
if (label === "SPI_DO") return [[label, "net.HUB_SPI_MOSI"]];
if (label === "SPI_DI_CFG_BC") return [[label, "net.HUB_SPI_MISO"]];
if (label === "SPI_CS_CFG_NONREM") return [[label, "net.HUB_SPI_CS"]];
if (
label === "SMBDATA" ||
label === "SMBCLK" ||
label === "HOST_TYPE0" ||
label === "SUSP_IND"
)
return [[label, `net.HUB_${label}`]];
return [];
}),
);
export const readerConnections = Object.fromEntries(
readerPinNames.flatMap((label) => {
if (
label.startsWith("VDD33") ||
label.startsWith("VDDA33") ||
label === "REG_EN"
)
return [[label, "net.SD_VDD33"]];
if (label === "EP" || label.startsWith("TEST")) return [[label, "net.GND"]];
if (label === "USB_DP") return [[label, "net.D5_DP"]];
if (label === "USB_DM") return [[label, "net.D5_DM"]];
if (label.startsWith("SD_") || label === "CRD_PWR")
return [[label, `net.${label}`]];
if (
[
"VDD18",
"VDD18PLL",
"RESET_N",
"RBIAS",
"XTAL1",
"XTAL2",
"VBUS_DET",
"EEP_SCL",
"EEP_SDA",
].includes(label)
)
return [[label, `net.SD_${label}`]];
return [];
}),
);
export const usbCConnections = ({
prefix,
vbus,
}: { prefix: string; vbus: string }) => ({
A1: "net.GND",
A12: "net.GND",
B1: "net.GND",
B12: "net.GND",
SHIELD: "net.GND",
A4: `net.${vbus}`,
A9: `net.${vbus}`,
B4: `net.${vbus}`,
B9: `net.${vbus}`,
A5: `net.${prefix}_CC1`,
B5: `net.${prefix}_CC2`,
A6: `net.${prefix}_DP`,
B6: `net.${prefix}_DP`,
A7: `net.${prefix}_DM`,
B7: `net.${prefix}_DM`,
A2: `net.${prefix}_TX1P`,
A3: `net.${prefix}_TX1N`,
B2: `net.${prefix}_TX2P`,
B3: `net.${prefix}_TX2N`,
B11: `net.${prefix}_RX1P`,
B10: `net.${prefix}_RX1N`,
A11: `net.${prefix}_RX2P`,
A10: `net.${prefix}_RX2N`,
});
export const muxConnections = ({
prefix,
source,
upstream,
vbus,
}: {
prefix: string;
source: string;
upstream: boolean;
vbus: string;
}) => ({
CC1: `net.${prefix}_CC1`,
CC2: `net.${prefix}_CC2`,
CURRENT_MODE: "net.GND",
PORT: upstream ? "net.GND" : "net.VBUS_HUB",
VBUS_DET: `net.${prefix}_VBUS_SENSE`,
VDD5: "net.VBUS_HOST",
VCC33: "net.VDD33",
GND1: "net.GND",
GND2: "net.GND",
EP: "net.GND",
ENn_CC: "net.GND",
ENn_MUX: "net.GND",
TXp: `net.${source}_TXP_AC`,
TXn: `net.${source}_TXN_AC`,
RXp: `net.${source}_RXP`,
RXn: `net.${source}_RXN`,
TX1p: `net.${prefix}_TX1P`,
TX1n: `net.${prefix}_TX1N`,
TX2p: `net.${prefix}_TX2P`,
TX2n: `net.${prefix}_TX2N`,
RX1p: `net.${prefix}_RX1P`,
RX1n: `net.${prefix}_RX1N`,
RX2p: `net.${prefix}_RX2P`,
RX2n: `net.${prefix}_RX2N`,
DIR: `net.${prefix}_DIR`,
ID: `net.${prefix}_ID`,
...(upstream
? { OUT1: "net.HOST_CURRENT_GE_1A5_N", OUT2: "net.HOST_CURRENT_3A_N" }
: {}),
});