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/placement.ts

// Explicit board coordinates, verified against complete component courtyards.
const positions: Record<string, [number, number]> = {
	J_A1: [5.5, 21.5],
	J_A2: [23, 21.5],
	J_C1: [38, 0],
	J_C2: [38, -15],
	J_HOST: [-38, 19],
	J_SD: [-26, -17.5],
	U_33_REG: [-10, 26],
	U_ATTACH_AND: [15, -7],
	U_ATTACH_INV: [15, -2],
	U_C1_MUX: [28.5, 4],
	U_C4_MUX: [29, -13],
	U_CORE_REG: [-24, 30],
	U_HUB: [0, 5],
	U_HUB_FLASH: [13, -21],
	U_INPUT_LIMIT: [-29, 20],
	U_P1_SW: [22, 0],
	U_P2_SW: [12, 14],
	U_P3_SW: [26, 14],
	U_P4_SW: [22, -15],
	U_POWER_LOGIC: [-18, 24],
	U_RESET: [-12, 16],
	U_SD: [-4, -17],
	U_SD_EEPROM: [7, -23],
	U_SD_POWER: [-7.25, -5.4],
	U_SD_RESET: [5, -29],
	U_UP_MUX: [-25, 11],
	C_33_OUT: [-4.9, 30],
	C_CORE_OUT: [-16, 29],
	C_P1_OUT: [23, -7.5],
	C_P2_OUT: [14, 6.5],
	C_P3_OUT: [36, 13],
	C_P4_OUT: [23, -25],
	L_33: [-6, 26],
	L_CORE: [-22.75, 26.25],
	Y_HUB: [-10, 12],
	Y_SD: [-4, -10.8],
	D_A2_1: [5, 17.2],
	D_A2_2: [6.8, 17.2],
	D_A2_3: [8.6, 17.2],
	D_A2_4: [10.4, 17.2],
	D_A2_5: [5, 15.9],
	D_A2_6: [6.8, 15.9],
	D_A3_1: [21, 17.2],
	D_A3_2: [22.8, 17.2],
	D_A3_3: [24.6, 17.2],
	D_A3_4: [26.4, 17.2],
	D_A3_5: [21, 15.9],
	D_A3_6: [22.8, 15.9],
	D_C1_1: [26.5, 0],
	D_C1_10: [30.1, -1.3],
	D_C1_11: [30.1, -2.6],
	D_C1_12: [30.1, -3.9],
	D_C1_2: [26.5, -1.3],
	D_C1_3: [26.5, -2.6],
	D_C1_4: [24.75, -3.15],
	D_C1_5: [28.3, 0],
	D_C1_6: [28.3, -1.3],
	D_C1_7: [28.3, -2.6],
	D_C1_8: [28.8, -5.4],
	D_C1_9: [30.1, 0],
	D_C4_1: [26.5, -15.5],
	D_C4_10: [30.1, -16.3],
	D_C4_11: [30.1, -17.6],
	D_C4_12: [30.1, -18.9],
	D_C4_2: [26.5, -16.8],
	D_C4_3: [26.5, -18.1],
	D_C4_4: [26.5, -19.4],
	D_C4_5: [28.3, -15.5],
	D_C4_6: [28.3, -16.8],
	D_C4_7: [28.3, -18.1],
	D_C4_8: [28.3, -19.4],
	D_C4_9: [30.1, -10.5],
	D_HOST_1: [-34, 12],
	D_HOST_10: [-30.4, 10.7],
	D_HOST_11: [-30.4, 9.4],
	D_HOST_12: [-30.4, 8.1],
	D_HOST_2: [-34, 10.7],
	D_HOST_3: [-34, 9.4],
	D_HOST_4: [-34, 8.1],
	D_HOST_5: [-32.2, 12],
	D_HOST_6: [-32.2, 10.7],
	D_HOST_7: [-32.2, 9.4],
	D_HOST_8: [-32.2, 8.1],
	D_HOST_9: [-30.4, 12],
	D_SD_1: [-29, 1.3],
	D_SD_2: [-27.2, 1.3],
	D_SD_3: [-25.4, 1.3],
	D_SD_4: [-23.6, 1.3],
	D_SD_5: [-29, 0],
	D_SD_6: [-27.2, 0],
	C_33_IN: [-13.75, 24],
	C_ATTACH_AND: [10.5, -7],
	C_ATTACH_INV: [10.5, -4.5],
	C_CARD: [-16, 0],
	C_CARD_HF: [-20, 1.5],
	C_CORE_IN: [-28, 30],
	C_D1_33: [27, 8.5],
	C_D1_5: [24.75, 8.5],
	C_D1_TXN: [-7.4, 6.3],
	C_D1_TXP: [-7.4, 7.3],
	C_D2_TXN: [-2.6, -2.4],
	C_D2_TXP: [-3.6, -2.4],
	C_D3_TXN: [0.3, -2.4],
	C_D3_TXP: [-0.7, -2.4],
	C_D4_33: [24.5, -17.5],
	C_D4_5: [24.5, -18.75],
	C_D4_TXN: [3.5, -2.4],
	C_D4_TXP: [2.5, -2.4],
	C_EEP: [8, -14],
	C_FLASH: [11, -14.5],
	C_HOST: [-29, 23],
	C_HUB_10: [-9.5, 6.2],
	C_HUB_17: [-8, 3.4],
	C_HUB_2: [-8, 9.4],
	C_HUB_26: [-4.8, -2.4],
	C_HUB_27: [-5.85, -2.4],
	C_HUB_32: [-1.65, -2.4],
	C_HUB_39: [1.4, -2.4],
	C_HUB_42: [1.4, -4.5],
	C_HUB_47: [5.6, -2.4],
	C_HUB_5: [-9.5, 8.2],
	C_HUB_54: [8, 1.4],
	C_HUB_59: [8, 3.4],
	C_HUB_64: [8, 5.4],
	C_HUB_72: [8, 8.6],
	C_HUB_78: [3, 15],
	C_HUB_83: [1.75, 13],
	C_HUB_90: [-0.8, 13],
	C_HUB_93: [-5.25, 15.05],
	C_HUB_98: [-5.25, 13],
	C_HUB_X1: [-15.25, 14],
	C_HUB_X2: [-14, 12.8],
	C_P1_IN: [19, -3.25],
	C_P2_IN: [7.7, 14],
	C_P3_IN: [23.25, 11.5],
	C_P4_IN: [17.7, -15],
	C_POWER_LOGIC: [-18, 21],
	C_RESET: [-14, 19],
	C_SD_12: [-9.1, -19.75],
	C_SD_16: [-5.25, -22.1],
	C_SD_18: [-7.5, -22],
	C_SD_25: [-1.3, -22.1],
	C_SD_26: [0.85, -22.1],
	C_SD_33A: [-1, -7],
	C_SD_33B: [-8, -31],
	C_SD_34: [1.1, -15.25],
	C_SD_41: [-0.75, -11.9],
	C_SD_48: [-7.25, -11.9],
	C_SD_5: [-9.1, -16.25],
	C_SD_IN: [-8.9, -10],
	C_SD_MAIN: [-8, -27.5],
	C_SD_PLL: [-0.75, -10.25],
	C_SD_RESET: [1.75, -27],
	C_SD_X1: [-7.25, -8.8],
	C_SD_X2: [-0.75, -9.05],
	C_UP_33: [-24, 7.5],
	C_UP_5: [-26.25, 7.5],
	C_UP_TXN: [-3.9, 13.0],
	C_UP_TXP: [-2.9, 13.0],
	C_VBUS: [-24.75, 22.75],
	LED_CARD_PRESENT: [-33, 0],
	LED_P1: [39, 8],
	LED_P2: [0.25, 15],
	LED_P3: [40, 19],
	LED_P4: [39, -23],
	LED_POWER: [-24, 3],
	LED_SD_POWER: [-36, 3],
	Q_ILIM_CC: [-35, 29],
	Q_ILIM_SS: [-30, 27],
	R_33_FB1: [-8, 23],
	R_33_FB2: [-10.25, 23],
	R_BC_DISABLE: [12, 2],
	R_CARD_CD: [-35, 1.5],
	R_CARD_LED: [-36, 0],
	R_CARD_WP: [-32.75, 1.5],
	R_CORE_FB1: [-20.25, 21],
	R_CORE_FB2: [-26.25, 27],
	R_CORE_PG: [-26.25, 25.75],
	R_D1_DIR: [29, -7],
	R_D1_ID: [31.25, -7],
	R_D1_SENSE: [33.5, -7],
	R_D4_DIR: [29, -22],
	R_D4_ID: [31.25, -22],
	R_D4_SENSE: [33.5, -22],
	R_EEP_SCL: [5.75, -14],
	R_EEP_SDA: [3.5, -14],
	R_HOST_CURRENT: [-21.75, 23.25],
	R_HOST_CURRENT3: [-22.5, 21],
	R_HOST_DIR: [-21, 11],
	R_HOST_SPEED: [-19.25, 26.5],
	R_HUB_BIAS: [-12, 8.5],
	R_HUB_CFG: [-11.5, 6],
	R_ILIM_BASE: [-27, 16],
	R_ILIM_LOW: [-31, 16],
	R_ILIM_MID: [-29, 14.75],
	R_INPUT_FAULT: [-24.75, 17],
	R_LED_P1: [35.7, 8],
	R_LED_P2: [-2.55, 15],
	R_LED_P3: [36.7, 19],
	R_LED_P4: [35.7, -23],
	R_LED_POWER: [-27.3, 3],
	R_LED_SD_POWER: [-39.3, 3],
	R_NON_REM: [12, 0.5],
	R_P1_CTRL: [21.25, -3.25],
	R_P1_ILIM: [18.5, -2],
	R_P2_CTRL: [7.7, 12.5],
	R_P2_ILIM: [9, 11],
	R_P3_CTRL: [21.7, 13.5],
	R_P3_ILIM: [20.95, 12.25],
	R_P4_CTRL: [17.7, -16.5],
	R_P4_ILIM: [19, -18],
	R_PULL_SD_CMD: [-20, -0.5],
	R_PULL_SD_D0: [-28, 5],
	R_PULL_SD_D1: [-25.75, 5],
	R_PULL_SD_D2: [-23.5, 5],
	R_PULL_SD_D3: [-21.25, 4],
	R_RESET: [-11.75, 19],
	R_SD_BIAS: [-3.75, -8.25],
	R_SD_CLK: [-12, 0],
	R_SD_CTRL: [-9.5, 0],
	R_SD_ILIM: [-6.65, -7.75],
	R_SD_RESET: [-0.5, -27.25],
	R_SD_VBUS1: [1.5, -10],
	R_SD_VBUS2: [1.5, -8.75],
	R_SMB_SCL: [9, -2.5],
	R_SMB_SDA: [9, -1],
	R_UP_VSENSE: [-21, 9],
	R_VBUS_DET1: [-11, 4.5],
	R_VBUS_DET2: [-11, 3],
};

export const placementFor = (
	name?: string,
): { pcbX?: string; pcbY?: string } => {
	const position = name ? positions[name] : undefined;
	return position ? { pcbX: `${position[0]}mm`, pcbY: `${position[1]}mm` } : {};
};

export const coordinatesFor = (name: string): [number, number] => {
	const position = positions[name];
	if (!position) throw new Error(`Unknown component: ${name}`);
	return position;
};