gokul/usb-hub-board

A 4-layer 100×66 mm USB 2.0 hub board with a USB‑C upstream port, four protected downstream USB‑C/USB‑A ports, an integrated SD card reader, USB hub controllers, 3.3 V regulation, ESD protection, current-limited power switches, crystal oscillators, and filtering/passive components.

Version
1.0.6
License
unset
Stars
1

lib/usb-hub-board.tsx

import { AF_90_WJDG } from "../imports/AF_90_WJDG"
import { AP2112K_3_3TRG1 } from "../imports/AP2112K_3_3TRG1"
import { AP22653W6_7 } from "../imports/AP22653W6_7"
import { DM1AA_SF_PEJ_82_ } from "../imports/DM1AA_SF_PEJ_82_"
import { TAXM24M4RFBCCT2T } from "../imports/TAXM24M4RFBCCT2T"
import { TYPE_C_16PIN_2MD_073_ } from "../imports/TYPE_C_16PIN_2MD_073_"
import { TYPE_C_24P_GTJB_040 } from "../imports/TYPE_C_24P_GTJB_040"
import { USB2244_AEZG_06 } from "../imports/USB2244_AEZG_06"
import { USB2517I_JZX } from "../imports/USB2517I_JZX"
import { USBLC6_2SC6 } from "../imports/USBLC6_2SC6"

const hubNoConnectPins = [
  "SDA",
  "LED_A1_N",
  "LED_A2_N",
  "LED_A3_N",
  "LED_A4_N",
  "LED_A5_N",
  "LED_A6_N",
  "LED_A7_N",
  "LED_B1_N",
  "LED_B2_N",
  "LED_B3_N",
  "LED_B4_N",
  "LED_B5_N",
  "LED_B6_N",
  "LED_B7_N",
  "PRTPWR5",
  "PRTPWR6",
  "PRTPWR7",
  "OCS5_N",
  "OCS6_N",
  "OCS7_N",
  "USBDN6_DP",
  "USBDN6_DM",
  "USBDN7_DP",
  "USBDN7_DM",
] as const

const readerNoConnectPins = [
  "NC1",
  "NC2",
  "NC3",
  "NC4",
  "NC5",
  "NC6",
  "NC7",
  "SD_D4",
  "SD_D5",
  "SD_D6",
  "SD_D7",
  "SDA",
  "SCK",
] as const

const upstreamPlugNoConnectPins = [
  "SSTXP1",
  "SSTXn1",
  "SSRXp1",
  "SSRXn1",
  "SSTXp2",
  "SSTXn2",
  "SSRXp2",
  "SSRXn2",
  "SBU1",
  "SBU2",
] as const

const dataTraceWidth = "0.2mm"
const supplyTraceWidth = "1mm"
const inputSupplyTraceWidth = "2mm"

const HubController = () => (
  <USB2517I_JZX
    name="U1"
    pcbX={-11}
    pcbY={8}
    pcbRotation={0}
    noSchematicRepresentation
    noConnect={hubNoConnectPins}
  />
)

const UpstreamAndPowerSheet = () => (
  <schematicsheet
    name="Upstream and Power"
    displayName="Upstream USB-C and Power"
    sheetIndex={0}
  >
    <schematicbox
      name="U1A"
      chipRef=".U1"
      title="USB2517 Upstream / Power"
      width="3.1mm"
      height="3mm"
      pinLabels={{
        pin1: "USBUP_DP",
        pin2: "USBUP_DM",
        pin3: "VBUS_DET",
        pin4: "RESET_N",
        pin5: "CFG_SEL0",
        pin6: "CFG_SEL1",
        pin7: "CFG_SEL2",
        pin8: "XTAL1",
        pin9: "XTAL2",
        pin10: "RBIAS",
        pin11: "LOCAL_PWR",
        pin12: "VDD33",
        pin13: "VDD33CR",
        pin14: "VDD33PLL",
        pin15: "VDDA331",
        pin16: "VDDA332",
        pin17: "VDDA333",
        pin18: "VDDA334",
        pin19: "VDD18",
        pin20: "VDD18PLL",
        pin21: "TEST",
        pin22: "VSS",
      }}
      schPinArrangement={{
        leftSide: ["pin1", "pin2", "pin3", "pin4", "pin5", "pin6", "pin7"],
        rightSide: ["pin8", "pin9", "pin10", "pin11"],
        topSide: ["pin12", "pin13", "pin14", "pin15", "pin16", "pin17", "pin18"],
        bottomSide: ["pin19", "pin20", "pin21", "pin22"],
      }}
    />

    <TYPE_C_24P_GTJB_040
      name="J1"
      pcbX={-45}
      pcbY={-8}
      pcbRotation={-90}
      noConnect={[...upstreamPlugNoConnectPins]}
    />
    <USBLC6_2SC6 name="U3" pcbX={-37} pcbY={-8} pcbRotation={90} />
    <fuse
      name="F1"
      currentRating="3A"
      voltageRating="32V"
      footprint="1206"
      supplierPartNumbers={{ jlcpcb: ["C2691997"] }}
      schOrientation="vertical"
      pcbX={-34}
      pcbY={-3}
    />
    <AP2112K_3_3TRG1 name="U4" schHeight="0.6mm" pcbX={-27} pcbY={19} pcbRotation={90} />
    <TAXM24M4RFBCCT2T
      name="Y1"
      pcbX={-22}
      pcbY={8}
      pcbRotation={90}
    />

    <resistor name="R1" resistance="5.1k" footprint="0603" pcbX={-42} pcbY={-15} />
    <resistor name="R2" resistance="5.1k" footprint="0603" pcbX={-38} pcbY={-15} />
    <resistor name="R3" resistance="12k" footprint="0603" pcbX={-15} pcbY={1} />
    <resistor name="R4" resistance="1M" footprint="0603" pcbX={-26} pcbY={8} />
    <resistor name="R5" resistance="100k" footprint="0603" pcbX={0} pcbY={14} />
    <resistor name="R6" resistance="100k" footprint="0603" pcbX={4} pcbY={14} />
    <resistor name="R7" resistance="100k" footprint="0603" pcbX={8} pcbY={14} />
    <resistor name="R8" resistance="10k" footprint="0603" pcbX={1} pcbY={9} pcbRotation={180} />
    <resistor name="R9" resistance="10k" footprint="0603" pcbX={5} pcbY={9} />

    <capacitor name="C1" capacitance="10uF" footprint="0805" pcbX={-31} pcbY={22} />
    <capacitor name="C2" capacitance="10uF" footprint="0805" pcbX={-23} pcbY={22} />
    <capacitor name="C3" capacitance="18pF" footprint="0603" pcbX={-23} pcbY={4} />
    <capacitor name="C4" capacitance="18pF" footprint="0603" pcbX={-23} pcbY={12} />
    <capacitor name="C5" capacitance="100nF" footprint="0603" pcbX={0} pcbY={11} pcbRotation={180} />
    <capacitor name="C6" capacitance="1uF" footprint="0603" maxDecouplingTraceLength="30mm" pcbX={-4} pcbY={5} />
    <capacitor name="C7" capacitance="1uF" footprint="0603" maxDecouplingTraceLength="30mm" pcbX={-18} pcbY={4} pcbRotation={180} />
    <capacitor name="C8" capacitance="100nF" footprint="0603" pcbX={-12} pcbY={15} pcbRotation={180} />
    <capacitor name="C9" capacitance="100nF" footprint="0603" pcbX={-8} pcbY={15} />
    <capacitor name="C10" capacitance="100nF" footprint="0603" pcbX={-18} pcbY={7} pcbRotation={180} />
    <capacitor name="C11" capacitance="100nF" footprint="0603" pcbX={-18} pcbY={11} pcbRotation={180} />
    <capacitor name="C12" capacitance="100nF" footprint="0603" pcbX={-15} pcbY={15} />
    <capacitor name="C13" capacitance="100nF" footprint="0603" pcbX={-11} pcbY={19} />
    <capacitor name="C14" capacitance="1uF" footprint="0603" pcbX={-4} pcbY={15} />
    <capacitor name="C39" capacitance="10uF" footprint="0805" pcbX={-31} pcbY={17} />
    <capacitor name="C40" capacitance="100nF" footprint="0603" pcbX={-31} pcbY={13} />
    <diode
      name="D2"
      footprint="smb"
      supplierPartNumbers={{ jlcpcb: ["C169448"] }}
      manufacturerPartNumber="SMBJ5.0A"
      pcbX={-38}
      pcbY={1}
    />

    <trace from="J1.DP1" to="U3.IO1_PORT" width={dataTraceWidth} />
    <trace from="J1.DP2" to="U3.IO1_PORT" width={dataTraceWidth} />
    <trace from="J1.DM1" to="U3.IO2_PORT" width={dataTraceWidth} />
    <trace from="J1.DM2" to="U3.IO2_PORT" width={dataTraceWidth} />
    <trace name="USB_UP_DP" from="U3.IO1_IC" to="U1.USBUP_DP" width={dataTraceWidth} />
    <trace name="USB_UP_DM" from="U3.IO2_IC" to="U1.USBUP_DM" width={dataTraceWidth} />
    <differentialpair
      name="USB_UPSTREAM_PAIR"
      positiveConnection="USB_UP_DP"
      negativeConnection="USB_UP_DM"
      maxLengthSkew="15mm"
      targetDifferentialImpedance="90ohm"
      pcbTraceGap="0.15mm"
      maxUncoupledLength="3mm"
    />
    <trace from="U3.VBUS" to="net.VBUS_RAW" />
    <trace from="U3.GND" to="net.GND" />

    <trace from="J1.CC1" to="R1.pin1" />
    <trace from="R1.pin2" to="net.GND" />
    <trace from="J1.CC2" to="R2.pin1" />
    <trace from="R2.pin2" to="net.GND" />
    <trace from="J1.VBUS1" to="net.VBUS_RAW" width={supplyTraceWidth} />
    <trace from="J1.VBUS2" to="net.VBUS_RAW" width={supplyTraceWidth} />
    <trace from="J1.VBUS3" to="net.VBUS_RAW" width={supplyTraceWidth} />
    <trace from="J1.VBUS4" to="net.VBUS_RAW" width={supplyTraceWidth} />
    <trace from="J1.GND1" to="net.GND" width={supplyTraceWidth} />
    <trace from="J1.GND2" to="net.GND" width={supplyTraceWidth} />
    <trace from="J1.GND3" to="net.GND" width={supplyTraceWidth} />
    <trace from="J1.GND4" to="net.GND" width={supplyTraceWidth} />
    <trace from="J1.GND5" to="net.GND" width={supplyTraceWidth} />
    <trace from="J1.GND6" to="net.GND" width={supplyTraceWidth} />
    <trace
      from="J1.VBUS3"
      to="J1.VBUS1"
      width="0.2mm"
      pcbPathRelativeTo="J1.VBUS3"
      pcbPath={[
        { x: 1.25, y: 2.5 },
        { x: 1.25, y: 2.5, via: true, fromLayer: "bottom", toLayer: "top" },
        { x: 1.25, y: 2.5 },
      ]}
    />
    <trace
      from="J1.VBUS4"
      to="J1.VBUS2"
      width="0.2mm"
      pcbPathRelativeTo="J1.VBUS4"
      pcbPath={[
        { x: -1.25, y: 2.5 },
        { x: -1.25, y: 2.5, via: true, fromLayer: "bottom", toLayer: "top" },
        { x: -1.25, y: 2.5 },
      ]}
    />
    <trace
      from="J1.GND4"
      to="J1.GND1"
      width="0.2mm"
      pcbPathRelativeTo="J1.GND4"
      pcbPath={[
        { x: 2.75, y: 2.5 },
        { x: 2.75, y: 2.5, via: true, fromLayer: "bottom", toLayer: "top" },
        { x: 2.75, y: 2.5 },
      ]}
    />
    <trace
      from="J1.GND5"
      to="J1.GND2"
      width="0.2mm"
      pcbPathRelativeTo="J1.GND5"
      pcbPath={[
        { x: -2.75, y: 2.5 },
        { x: -2.75, y: 2.5, via: true, fromLayer: "bottom", toLayer: "top" },
        { x: -2.75, y: 2.5 },
      ]}
    />
    <trace from="F1.pin1" to="net.VBUS_RAW" width={inputSupplyTraceWidth} />
    <trace from="F1.pin2" to="net.VBUS_5V" width={inputSupplyTraceWidth} />
    <trace from="D2.cathode" to="net.VBUS_RAW" width={supplyTraceWidth} />
    <trace from="D2.anode" to="net.GND" width={supplyTraceWidth} />
    <trace from="C39.pin1" to="net.VBUS_5V" width={supplyTraceWidth} />
    <trace from="C39.pin2" to="net.GND" />
    <trace from="C40.pin1" to="net.VBUS_5V" />
    <trace from="C40.pin2" to="net.GND" />
    <trace from="U4.VIN" to="net.VBUS_5V" width={supplyTraceWidth} />
    <trace from="U4.EN" to="net.VBUS_5V" />
    <trace from="U4.GND" to="net.GND" />
    <trace from="U4.VOUT" to="net.V3_3" width="0.5mm" />
    <trace from="C1.pin1" to="net.VBUS_5V" />
    <trace from="C1.pin2" to="net.GND" />
    <trace from="C2.pin1" to="net.V3_3" />
    <trace from="C2.pin2" to="net.GND" />

    <trace from="U1.VBUS_DET" to="net.VBUS_RAW" />
    <trace from="U1.RBIAS" to="R3.pin1" />
    <trace from="R3.pin2" to="net.GND" />
    <trace from="U1.TEST" to="net.GND" />
    <trace from="U1.VSS" to="net.GND" width={supplyTraceWidth} />
    <trace from="U1.LOCAL_PWR" to="R9.pin1" />
    <trace from="R9.pin2" to="net.GND" />

    <trace from="U1.XTAL1" to="Y1.pin1" maxViaCount={4} />
    <trace from="U1.XTAL2" to="Y1.pin3" maxViaCount={4} />
    <trace from="Y1.pin2" to="net.GND" />
    <trace from="Y1.pin4" to="net.GND" />
    <trace from="Y1.pin1" to="C3.pin1" maxViaCount={2} />
    <trace from="C3.pin2" to="net.GND" />
    <trace from="Y1.pin3" to="C4.pin1" maxViaCount={2} />
    <trace from="C4.pin2" to="net.GND" />
    <trace from="Y1.pin1" to="R4.pin1" maxViaCount={2} />
    <trace from="Y1.pin3" to="R4.pin2" maxViaCount={2} />

    <trace from="U1.CFG_SEL2" to="R5.pin1" />
    <trace from="R5.pin2" to="net.V3_3" />
    <trace from="U1.CFG_SEL1" to="R6.pin1" />
    <trace from="R6.pin2" to="net.GND" />
    <trace from="U1.CFG_SEL0" to="R7.pin1" />
    <trace from="R7.pin2" to="net.V3_3" />
    <trace from="U1.RESET_N" to="R8.pin1" />
    <trace from="R8.pin2" to="net.V3_3" />
    <trace from="U1.RESET_N" to="C5.pin1" />
    <trace from="C5.pin2" to="net.GND" />

    <trace from="U1.VDD18" to="C6.pin1" />
    <trace from="C6.pin2" to="net.GND" />
    <trace from="U1.VDD18PLL" to="C7.pin1" />
    <trace from="C7.pin2" to="net.GND" />
    <trace from="U1.VDD33" to="net.V3_3" />
    <trace from="U1.VDD33CR" to="net.V3_3" />
    <trace from="U1.VDD33PLL" to="net.V3_3" />
    <trace from="U1.VDDA331" to="net.V3_3" />
    <trace from="U1.VDDA332" to="net.V3_3" />
    <trace from="U1.VDDA333" to="net.V3_3" />
    <trace from="U1.VDDA334" to="net.V3_3" />
    <trace from="C8.pin1" to="net.V3_3" />
    <trace from="C8.pin2" to="net.GND" />
    <trace from="C9.pin1" to="net.V3_3" />
    <trace from="C9.pin2" to="net.GND" />
    <trace from="C10.pin1" to="net.V3_3" />
    <trace from="C10.pin2" to="net.GND" />
    <trace from="C11.pin1" to="net.V3_3" />
    <trace from="C11.pin2" to="net.GND" />
    <trace from="C12.pin1" to="net.V3_3" />
    <trace from="C12.pin2" to="net.GND" />
    <trace from="C13.pin1" to="net.V3_3" />
    <trace from="C13.pin2" to="net.GND" />
    <trace from="C14.pin1" to="net.V3_3" />
    <trace from="C14.pin2" to="net.GND" />
  </schematicsheet>
)

const PortPowerChannel = ({ index, x, y }: { index: 1 | 2 | 3 | 4; x: number; y: number }) => {
  const switchName = `U${index + 4}`
  const limitResistorName = `R${20 + index}`
  const inputCapacitorName = `C${20 + index}`
  const outputCapacitorName = `C${24 + index}`
  const portPowerNet = `net.VBUS_P${index}`

  return (
    <>
      <AP22653W6_7 name={switchName} pcbX={x} pcbY={y} />
      <resistor name={limitResistorName} resistance="43.2k" footprint="0603" pcbX={x} pcbY={y + 3} pcbRotation={180} />
      <capacitor name={inputCapacitorName} capacitance="100nF" footprint="0603" pcbX={x + 1} pcbY={y - 3} />
      <capacitor name={outputCapacitorName} capacitance="120uF" footprint="electrolytic_d6.3mm_p2.5mm" pcbX={x - 7} pcbY={y} />
      <trace from={`${switchName}.IN`} to="net.VBUS_5V" width={supplyTraceWidth} />
      <trace from={`${switchName}.GND`} to="net.GND" />
      <trace from={`${switchName}.EN`} to={`U1.PRTPWR${index}`} />
      <trace from={`${switchName}.FAULT`} to={`U1.OCS${index}_N`} />
      <trace from={`${switchName}.ILIM`} to={`${limitResistorName}.pin1`} />
      <trace from={`${limitResistorName}.pin2`} to="net.GND" />
      <trace from={`${switchName}.OUT`} to={portPowerNet} width={supplyTraceWidth} />
      <trace from={`${inputCapacitorName}.pin1`} to="net.VBUS_5V" />
      <trace from={`${inputCapacitorName}.pin2`} to="net.GND" />
      <trace from={`${outputCapacitorName}.pin1`} to={portPowerNet} width={supplyTraceWidth} />
      <trace from={`${outputCapacitorName}.pin2`} to="net.GND" width={supplyTraceWidth} />
    </>
  )
}

const UsbCPort = ({ connectorName, esdName, index, y }: { connectorName: "J2" | "J3"; esdName: "U9" | "U10"; index: 1 | 2; y: number }) => {
  const cc1ResistorName = index === 1 ? "R11" : "R13"
  const cc2ResistorName = index === 1 ? "R12" : "R14"
  const portPowerNet = `net.VBUS_P${index}`

  return (
    <>
      <TYPE_C_16PIN_2MD_073_ name={connectorName} pcbX={46} pcbY={y} pcbRotation={90} noConnect={["SBU1", "SBU2"]} />
      <USBLC6_2SC6 name={esdName} pcbX={37} pcbY={y} pcbRotation={90} />
      <resistor name={cc1ResistorName} resistance="56k" footprint="0603" pcbX={41} pcbY={y + 3} />
      <resistor name={cc2ResistorName} resistance="56k" footprint="0603" pcbX={41} pcbY={y - 3} />
      <trace from={`${connectorName}.DP1`} to={`${esdName}.IO1_PORT`} width={dataTraceWidth} />
      <trace from={`${connectorName}.DP2`} to={`${esdName}.IO1_PORT`} width={dataTraceWidth} />
      <trace from={`${connectorName}.DM1`} to={`${esdName}.IO2_PORT`} width={dataTraceWidth} />
      <trace from={`${connectorName}.DM2`} to={`${esdName}.IO2_PORT`} width={dataTraceWidth} />
      <trace name={`USB_P${index}_DP`} from={`${esdName}.IO1_IC`} to={`U1.USBDN${index}_DP`} width={dataTraceWidth} />
      <trace name={`USB_P${index}_DM`} from={`${esdName}.IO2_IC`} to={`U1.USBDN${index}_DM`} width={dataTraceWidth} />
      <differentialpair
        name={`USB_PORT_${index}_PAIR`}
        positiveConnection={`USB_P${index}_DP`}
        negativeConnection={`USB_P${index}_DM`}
        maxLengthSkew="10mm"
        targetDifferentialImpedance="90ohm"
        pcbTraceGap="0.15mm"
        maxUncoupledLength="3mm"
      />
      <trace from={`${esdName}.VBUS`} to={portPowerNet} />
      <trace from={`${esdName}.GND`} to="net.GND" />
      <trace from={`${connectorName}.VBUS1`} to={portPowerNet} width={supplyTraceWidth} />
      <trace from={`${connectorName}.VBUS2`} to={portPowerNet} width={supplyTraceWidth} />
      <trace from={`${connectorName}.GND1`} to="net.GND" width={supplyTraceWidth} />
      <trace from={`${connectorName}.GND2`} to="net.GND" width={supplyTraceWidth} />
      <trace from={`${connectorName}.pin13`} to="net.GND" />
      <trace from={`${connectorName}.pin14`} to="net.GND" />
      <trace from={`${connectorName}.CC1`} to={`${cc1ResistorName}.pin1`} />
      <trace from={`${cc1ResistorName}.pin2`} to={portPowerNet} />
      <trace from={`${connectorName}.CC2`} to={`${cc2ResistorName}.pin1`} />
      <trace from={`${cc2ResistorName}.pin2`} to={portPowerNet} />
    </>
  )
}

const UsbAPort = ({ connectorName, esdName, index, y }: { connectorName: "J4" | "J5"; esdName: "U11" | "U12"; index: 3 | 4; y: number }) => {
  const portPowerNet = `net.VBUS_P${index}`

  return (
    <>
      <AF_90_WJDG name={connectorName} schHeight="0.6mm" pcbX={46} pcbY={y} pcbRotation={90} />
      <USBLC6_2SC6 name={esdName} pcbX={37} pcbY={y} pcbRotation={90} />
      <trace from={`${connectorName}.D_POS`} to={`${esdName}.IO1_PORT`} width={dataTraceWidth} />
      <trace from={`${connectorName}.D_NEG`} to={`${esdName}.IO2_PORT`} width={dataTraceWidth} />
      <trace name={`USB_P${index}_DP`} from={`${esdName}.IO1_IC`} to={`U1.USBDN${index}_DP`} width={dataTraceWidth} />
      <trace name={`USB_P${index}_DM`} from={`${esdName}.IO2_IC`} to={`U1.USBDN${index}_DM`} width={dataTraceWidth} />
      <differentialpair
        name={`USB_PORT_${index}_PAIR`}
        positiveConnection={`USB_P${index}_DP`}
        negativeConnection={`USB_P${index}_DM`}
        maxLengthSkew="10mm"
        targetDifferentialImpedance="90ohm"
        pcbTraceGap="0.15mm"
        maxUncoupledLength="3mm"
      />
      <trace from={`${esdName}.VBUS`} to={portPowerNet} />
      <trace from={`${esdName}.GND`} to="net.GND" />
      <trace from={`${connectorName}.VCC`} to={portPowerNet} width={supplyTraceWidth} />
      <trace from={`${connectorName}.GND`} to="net.GND" width={supplyTraceWidth} />
      <trace from={`${connectorName}.SHLD`} to="net.GND" />
    </>
  )
}

const DownstreamPortsSheet = () => (
  <schematicsheet name="Downstream Ports" displayName="Four Protected USB 2.0 Ports" sheetIndex={1}>
    <schematicbox
      name="U1B"
      chipRef=".U1"
      title="USB2517 Ports 1-4"
      width="3mm"
      height="1.8mm"
      pinLabels={{
        pin1: "USBDN1_DP", pin2: "USBDN1_DM", pin3: "PRTPWR1", pin4: "OCS1_N",
        pin5: "USBDN2_DP", pin6: "USBDN2_DM", pin7: "PRTPWR2", pin8: "OCS2_N",
        pin9: "USBDN3_DP", pin10: "USBDN3_DM", pin11: "PRTPWR3", pin12: "OCS3_N",
        pin13: "USBDN4_DP", pin14: "USBDN4_DM", pin15: "PRTPWR4", pin16: "OCS4_N",
      }}
      schPinArrangement={{
        leftSide: ["pin1", "pin2", "pin3", "pin4", "pin5", "pin6", "pin7", "pin8"],
        rightSide: ["pin9", "pin10", "pin11", "pin12", "pin13", "pin14", "pin15", "pin16"],
      }}
    />
    <PortPowerChannel index={1} x={28} y={24} />
    <PortPowerChannel index={2} x={28} y={8} />
    <PortPowerChannel index={3} x={28} y={-6} />
    <PortPowerChannel index={4} x={28} y={-24} />
    <UsbCPort connectorName="J2" esdName="U9" index={1} y={24} />
    <UsbCPort connectorName="J3" esdName="U10" index={2} y={8} />
    <UsbAPort connectorName="J4" esdName="U11" index={3} y={-6} />
    <UsbAPort connectorName="J5" esdName="U12" index={4} y={-24} />
  </schematicsheet>
)

const SdReaderSheet = () => (
  <schematicsheet name="SD Reader" displayName="USB 2.0 SD Card Reader" sheetIndex={2}>
    <schematicbox
      name="U1C"
      chipRef=".U1"
      title="USB2517 Internal Port 5"
      width="2.5mm"
      height="0.6mm"
      pinLabels={{ pin1: "USBDN5_DP", pin2: "USBDN5_DM" }}
      schPinArrangement={{ leftSide: ["pin1", "pin2"] }}
    />
    <USB2244_AEZG_06 name="U13" schHeight="3.8mm" pcbX={-22} pcbY={-14} noConnect={readerNoConnectPins} />
    <DM1AA_SF_PEJ_82_ name="J6" pcbX={-2} pcbY={-14} pcbRotation={-90} />
    <TAXM24M4RFBCCT2T name="Y2" pcbX={-34} pcbY={-14} />
    <resistor name="R31" resistance="12k" footprint="0603" pcbX={-31} pcbY={-7} pcbRotation={180} />
    <resistor name="R32" resistance="10k" footprint="0603" pcbX={-27} pcbY={-5} pcbRotation={180} />
    <resistor name="R33" resistance="1M" footprint="0603" pcbX={-39} pcbY={-19} />
    <resistor name="R34" resistance="1k" footprint="0603" pcbX={-34} pcbY={-27} pcbRotation={180} />
    <led
      name="D1"
      color="green"
      footprint="0603"
      supplierPartNumbers={{ jlcpcb: ["C22371299"] }}
      manufacturerPartNumber="PSC-1608U49GC-G4"
      pinLabels={{
        pin1: ["cathode", "neg"],
        pin2: ["anode", "pos"],
      }}
      schOrientation="horizontal"
      pcbX={-30}
      pcbY={-27}
    />
    <capacitor name="C31" capacitance="18pF" footprint="0603" pcbX={-34} pcbY={-19} />
    <capacitor name="C32" capacitance="18pF" footprint="0603" pcbX={-31} pcbY={-21} />
    <capacitor name="C33" capacitance="1uF" footprint="0603" maxDecouplingTraceLength="30mm" pcbX={-25} pcbY={-23} pcbRotation={180} />
    <capacitor name="C34" capacitance="1uF" footprint="0603" maxDecouplingTraceLength="30mm" pcbX={-28} pcbY={-7} pcbRotation={180} />
    <capacitor name="C35" capacitance="100nF" footprint="0603" pcbX={-29} pcbY={-10} />
    <capacitor name="C36" capacitance="100nF" footprint="0603" pcbX={-29} pcbY={-13} />
    <capacitor name="C37" capacitance="100nF" footprint="0603" pcbX={-29} pcbY={-16} />
    <capacitor name="C38" capacitance="1uF" footprint="0603" pcbX={-29} pcbY={-19} />
    <capacitor name="C41" capacitance="4.7uF" footprint="0805" pcbX={-3} pcbY={2.5} />

    <via name="U13_EP_VIA_1" pcbX={-23} pcbY={-15} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_2" pcbX={-22} pcbY={-15} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_3" pcbX={-21} pcbY={-15} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_4" pcbX={-23} pcbY={-14} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_5" pcbX={-22} pcbY={-14} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_6" pcbX={-21} pcbY={-14} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_7" pcbX={-23} pcbY={-13} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_8" pcbX={-22} pcbY={-13} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />
    <via name="U13_EP_VIA_9" pcbX={-21} pcbY={-13} holeDiameter="0.3mm" outerDiameter="0.6mm" connectsTo="net.GND" />

    <trace name="USB_SD_DP" from="U1.USBDN5_DP" to="U13.USB_POS" width={dataTraceWidth} />
    <trace name="USB_SD_DM" from="U1.USBDN5_DM" to="U13.USB_NEG" width={dataTraceWidth} />
    <differentialpair
      name="USB_SD_PAIR"
      positiveConnection="USB_SD_DP"
      negativeConnection="USB_SD_DM"
      maxLengthSkew="7mm"
      targetDifferentialImpedance="90ohm"
      pcbTraceGap="0.15mm"
      maxUncoupledLength="3mm"
    />
    <trace from="U13.VDD331" to="net.V3_3" />
    <trace from="U13.VDD332" to="net.V3_3" />
    <trace from="U13.VDD333" to="net.V3_3" />
    <trace from="U13.VDD33A" to="net.V3_3" />
    <trace from="U13.EP" to="net.GND" width={supplyTraceWidth} />
    <trace from="U13.TEST" to="net.GND" />
    <trace from="U13.RBIAS" to="R31.pin1" />
    <trace from="R31.pin2" to="net.GND" />
    <trace from="U13.RESET_N" to="R32.pin1" />
    <trace from="R32.pin2" to="net.V3_3" />
    <trace from="U13.VDD18" to="C33.pin1" />
    <trace from="C33.pin2" to="net.GND" />
    <trace from="U13.VDD18PLL" to="C34.pin1" />
    <trace from="C34.pin2" to="net.GND" />
    <trace from="C35.pin1" to="net.V3_3" />
    <trace from="C35.pin2" to="net.GND" />
    <trace from="C36.pin1" to="net.V3_3" />
    <trace from="C36.pin2" to="net.GND" />
    <trace from="C37.pin1" to="net.V3_3" />
    <trace from="C37.pin2" to="net.GND" />
    <trace from="C38.pin1" to="net.V3_3" />
    <trace from="C38.pin2" to="net.GND" />
    <trace from="U13.XTAL1" to="Y2.pin1" maxViaCount={4} />
    <trace from="U13.XTAL2" to="Y2.pin3" maxViaCount={4} />
    <trace from="Y2.pin2" to="net.GND" />
    <trace from="Y2.pin4" to="net.GND" />
    <trace from="Y2.pin1" to="C31.pin1" maxViaCount={2} />
    <trace from="C31.pin2" to="net.GND" />
    <trace from="Y2.pin3" to="C32.pin1" maxViaCount={2} />
    <trace from="C32.pin2" to="net.GND" />
    <trace from="Y2.pin1" to="R33.pin1" maxViaCount={2} />
    <trace from="Y2.pin3" to="R33.pin2" maxViaCount={2} />
    <trace from="U13.LED" to="D1.neg" />
    <trace from="D1.pos" to="R34.pin1" />
    <trace from="R34.pin2" to="net.V3_3" />
    <trace from="U13.SD_D3" to="J6.DAT3" />
    <trace from="U13.SD_CMD" to="J6.CMD" />
    <trace from="U13.CARD_PWR" to="J6.VDD" width="0.4mm" />
    <trace from="C41.pin1" to="J6.VDD" width="0.4mm" />
    <trace from="C41.pin2" to="net.GND" width="0.4mm" />
    <trace from="U13.SD_CLK" to="J6.CLK" />
    <trace from="U13.SD_D0" to="J6.DAT0" />
    <trace from="U13.SD_D1" to="J6.DAT1" />
    <trace from="U13.SD_D2" to="J6.DAT2" />
    <trace from="U13.SD_nCD" to="J6.CARD_DET" />
    <trace from="U13.SD_WP" to="J6.WRITE_PROTECT" />
    <trace from="J6.SW_COM" to="net.GND" />
    <trace from="J6.GND1" to="net.GND" width="0.4mm" />
    <trace from="J6.GND2" to="net.GND" width="0.4mm" />
    <trace from="J6.SHIELD1" to="net.GND" />
    <trace from="J6.SHIELD2" to="net.GND" />
    <trace from="J6.SHIELD3" to="net.GND" />
    <trace from="J6.SHIELD4" to="net.GND" />
  </schematicsheet>
)

const UnusedHubPortsSheet = () => (
  <schematicsheet name="Reserved Hub Ports" displayName="Reserved USB2517 Ports 6 and 7" sheetIndex={3}>
    <schematicbox
      name="U1D"
      chipRef=".U1"
      title="Reserved Hub Ports"
      width="3mm"
      height="0.6mm"
      pinLabels={{ pin1: "USBDN6_DP", pin2: "USBDN6_DM", pin3: "USBDN7_DP", pin4: "USBDN7_DM" }}
      schPinArrangement={{ leftSide: ["pin1", "pin2"], rightSide: ["pin3", "pin4"] }}
    />
  </schematicsheet>
)

const BoardMechanicalFeatures = () => (
  <>
    <hole name="H1" diameter="3.2mm" pcbX={-43} pcbY={28} />
    <hole name="H2" diameter="3.2mm" pcbX={12} pcbY={28} />
    <hole name="H3" diameter="3.2mm" pcbX={-43} pcbY={-28} />
    <silkscreentext text="USB 2.0 HUB + SD" pcbX={-13} pcbY={29} fontSize="1.3mm" />
    <silkscreentext text="MAC DATA + POWER" pcbX={-43} pcbY={2} fontSize="0.9mm" pcbRotation={90} />
    <silkscreentext text="USB-C 1" pcbX={41} pcbY={29} fontSize="0.8mm" />
    <silkscreentext text="USB-C 2" pcbX={41} pcbY={13} fontSize="0.8mm" />
    <silkscreentext text="USB-A 1" pcbX={41} pcbY={-3} fontSize="0.8mm" />
    <silkscreentext text="USB-A 2" pcbX={41} pcbY={-19} fontSize="0.8mm" />
    <silkscreentext text="SD CARD" pcbX={5} pcbY={-29} fontSize="0.9mm" />
  </>
)

export const UsbHubBoard = () => (
  <board
    title="USB-C Male 4-Port USB 2.0 Hub with SD Reader"
    width="100mm"
    height="66mm"
    layers={4}
    thickness="1.6mm"
    borderRadius="2mm"
    solderMaskColor="blue"
    silkscreenColor="white"
    fabricatorPreset="jlcpcb_standard"
    defaultViaTenting="top_and_bottom_tented"
    isViaInPadAllowed
    minTraceWidth="0.15mm"
    minViaHoleDiameter="0.2mm"
    minViaPadDiameter="0.45mm"
    minTraceToPadEdgeClearance="0.1mm"
    minBoardEdgeClearance="0.2mm"
    autorouter={{ preset: "auto_local", allowViaInPad: false, traceClearance: "0.1mm" }}
    autorouterEffortLevel="1x"
    schAutoLayoutEnabled
    schTraceAutoLabelEnabled
  >
    <HubController />
    <UpstreamAndPowerSheet />
    <DownstreamPortsSheet />
    <SdReaderSheet />
    <UnusedHubPortsSheet />
    <BoardMechanicalFeatures />
    <copperpour
      name="GND_PLANE_INNER1"
      layer="inner1"
      connectsTo="net.GND"
      clearance="0.25mm"
      boardEdgeMargin="0.5mm"
    />
  </board>
)