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.5
License
MIT
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 = ({
	invertSuperspeedPolarity = false,
	prefix,
	source,
	upstream,
	vbus,
}: {
	prefix: string;
	source: string;
	upstream: boolean;
	invertSuperspeedPolarity?: 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}_${invertSuperspeedPolarity ? "TXN_AC" : "TXP_AC"}`,
	TXn: `net.${source}_${invertSuperspeedPolarity ? "TXP_AC" : "TXN_AC"}`,
	RXp: `net.${source}_${invertSuperspeedPolarity ? "RXN" : "RXP"}`,
	RXn: `net.${source}_${invertSuperspeedPolarity ? "RXP" : "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" }
		: {}),
});