shibosoftwaredev/f1c100s-linux-nema8-stepper-controller

Restores component part numbers and CAD models, removes test-point 3D bodies, and validates that solder paste exists only on top-side SMT pads without altering copper or DRC.

Version
0.3.5
License
unset
Stars
0

pd-power.tsx

import { TYPE_C_31_M_12 } from "./imports/TYPE_C_31_M_12"
import { HUSB238A_BB001_QN16R } from "./imports/HUSB238A_BB001_QN16R"
import { TPS54302DDCR } from "./imports/TPS54302DDCR"
import { FHD4020S_100MT } from "./imports/FHD4020S_100MT"

const wire = (name: string, from: string, to: string, thickness = 0.15) =>
  <trace name={name} from={from} to={to} thickness={thickness} />

const r0402 = (name: string, value: string, lcsc: string, x: number, y: number) =>
  <resistor name={name} resistance={value} footprint="0402"
    supplierPartNumbers={{jlcpcb:[lcsc]}} pcbX={x} pcbY={y} schX={x} schY={y} />

const c0402 = (name: string, value: string, lcsc: string, x: number, y: number, voltage = 50) =>
  <capacitor name={name} capacitance={value} footprint="0402" maxVoltageRating={voltage}
    supplierPartNumbers={{jlcpcb:[lcsc]}} pcbX={x} pcbY={y} schX={x} schY={y} />

/**
 * J_USB_PWR is a dedicated USB-PD power input. USB2 is deliberately isolated
 * from this receptacle so a charger cable cannot be mistaken for the Linux
 * programming connection. HUSB238A GPIO mode uses 11 kOhm VSET and 21 kOhm
 * ISET for a 15 V / 3 A fixed-PDO request.
 *
 * J_USB_DATA stays in the original, signal-integrity-checked USB position. The
 * new J_USB_PWR is rendered after the rest of the board by UsbPowerPort below.
 * DATA VBUS is intentionally unconnected: the PD port powers the board while
 * the data port is attached to a host, so the two sources cannot backfeed.
 */
export function PdPower() {
  return <group name="PD_POWER" pcbX={0} pcbY={0} schX={13} schY={-21.5} schSheetName="pd_power">
    <TYPE_C_31_M_12 name="J_USB_DATA" pcbX={4} pcbY={27.8} pcbRotation={180}
      schX={0} schY={24}
      noConnect={["SBU1","SBU2","VBUS1","VBUS2"]} />

    {/* Shell and receptacle grounds. */}
    {[2,3,4,14].map(pin => wire(`USB_GND_${pin}`, `.J_USB_DATA > .pin${pin}`, "net.BOARD_GND", 0.3))}
    {wire("USB_GND_1", ".J_USB_DATA > .pin1", "net.BOARD_GND", 0.3)}
    <trace name="USB_GND_BRIDGE" from=".J_USB_DATA > .pin1" to=".J_USB_DATA > .pin13" thickness={0.3}
      pcbPath={[".J_USB_DATA > .pin1",{x:5.2,y:-0.4},{x:-5,y:-0.4},{x:-5,y:3},".J_USB_DATA > .pin13"]} />
    {/* Raw receptacle VBUS terminates at the protected high-side switch. */}
    {wire("USB_VBUS_A", ".J_USB_PWR > .pin15", ".Q_VBUS > .pin1", 0.8)}
    <trace name="USB_VBUS_JOIN" from=".J_USB_PWR > .pin15" to=".J_USB_PWR > .pin16" thickness={0.4}
      maxViaCount={4}
      pcbPath={[".J_USB_PWR > .pin15",{x:2.4,y:5},{x:-2.4,y:5},".J_USB_PWR > .pin16"]} />
    {wire("USB_DM_A", ".J_USB_DATA > .pin7", "net.USB_N")}
    <trace name="USB_DM_JOIN" from=".J_USB_DATA > .pin7" to=".J_USB_DATA > .pin9" thickness={0.15}
      pcbPath={[".J_USB_DATA > .pin7",
        {x:-0.75,y:3}, {x:-0.75,y:3,via:true,fromLayer:"top",toLayer:"inner1"}, {x:-0.75,y:3},
        {x:0.25,y:3}, {x:0.25,y:3,via:true,fromLayer:"inner1",toLayer:"top"}, {x:0.25,y:3},
        ".J_USB_DATA > .pin9"]} />
    {wire("USB_DP_A", ".J_USB_DATA > .pin8", "net.USB_P")}
    <trace name="USB_DP_JOIN" from=".J_USB_DATA > .pin8" to=".J_USB_DATA > .pin10" thickness={0.15}
      pcbPath={[".J_USB_DATA > .pin8",
        {x:-0.25,y:3.6}, {x:-0.25,y:3.6,via:true,fromLayer:"top",toLayer:"inner2"}, {x:-0.25,y:3.6},
        {x:0.75,y:3.6}, {x:0.75,y:3.6,via:true,fromLayer:"inner2",toLayer:"top"}, {x:0.75,y:3.6},
        ".J_USB_DATA > .pin10"]} />

    <HUSB238A_BB001_QN16R name="U_PD" pcbX={-5.5} pcbY={24} pcbRotation={90}
      schX={-8} schY={24}
      noConnect={["D_POS","D_NEG","EN_HVDCP_OUT1","ADDR_ORIENT","INT_N","FAULT_OUT2","FLGIN"]} />
    <capacitor name="C_PD_VDD" capacitance="1uF" footprint="0402" maxVoltageRating={25}
      manufacturerPartNumber="CL05A105KA5NQNC" supplierPartNumbers={{jlcpcb:["C52923"]}}
      pcbX={-4.2} pcbY={27.3} pcbRotation={270}
      schX={-12} schY={23} maxDecouplingTraceLength={15} />
    <resistor name="R_PD_VSET" resistance="11k" footprint="0402"
      supplierPartNumbers={{jlcpcb:["C25749"]}} pcbX={-9} pcbY={26.3} pcbRotation={180}
      schX={-2.5} schY={18.5} />
    <resistor name="R_PD_ISET" resistance="21k" footprint="0402"
      supplierPartNumbers={{jlcpcb:["C25766"]}} pcbX={-9} pcbY={24.25} pcbRotation={180}
      schX={-1} schY={20.5} />
    <resistor name="R_PD_DEBUG" resistance="910k" footprint="0402"
      supplierPartNumbers={{jlcpcb:["C25800"]}} pcbX={-13} pcbY={28.5} pcbRotation={180}
      schX={-13} schY={28.5} />
    <resistor name="R_PD_GOOD_PU" resistance="49.9k" footprint="0402"
      supplierPartNumbers={{jlcpcb:["C25794"]}} pcbX={-11} pcbY={21.6} pcbRotation={180}
      schX={-5.5} schY={29.5} />
    {wire("PD_CC1", ".J_USB_PWR > .pin6", ".U_PD > .CC1")}
    {wire("PD_CC2", ".J_USB_PWR > .pin12", ".U_PD > .CC2")}
    {wire("PD_VDD", ".U_PD > .VDD", "net.V3V3")}
    <trace name="PD_VDD_CAP" from=".C_PD_VDD > .pin1" to=".U_PD > .VDD" thickness={0.15}
      pcbPath={[".C_PD_VDD > .pin1", {x:-0.51,y:0.9}, {x:1.6,y:0.9}, ".U_PD > .VDD"]} />
    <trace name="PD_VDD_CAP_GND" from=".C_PD_VDD > .pin2" to=".U_PD > .GND" thickness={0.3}
      pcbPath={[".C_PD_VDD > .pin2",
        {x:0.51,y:-0.6}, {x:0.51,y:-0.6,via:true,fromLayer:"top",toLayer:"inner2"}, {x:0.51,y:-0.6},
        {x:3.3,y:-1.3}, {x:3.3,y:-1.3,via:true,fromLayer:"inner2",toLayer:"top"}, {x:3.3,y:-1.3},
        ".U_PD > .GND"]} />
    <trace name="PD_VBUS_SENSE" from=".U_PD > .VBUS" to=".J_USB_PWR > .pin15"
      thickness={0.25} maxViaCount={4} />
    <trace name="PD_VSET_15V" from=".U_PD > .SNK_VSET" to=".R_PD_VSET > .pin1"
      thickness={0.15} pcbStraightLine />
    {wire("PD_VSET_GND", ".R_PD_VSET > .pin2", "net.BOARD_GND")}
    <trace name="PD_ISET_3A" from=".U_PD > .SNK_ISET" to=".R_PD_ISET > .pin1"
      thickness={0.15} pcbStraightLine />
    {wire("PD_ISET_GND", ".R_PD_ISET > .pin2", "net.BOARD_GND")}
    <trace name="PD_DEBUG_BIAS" from=".U_PD > .DBG_N" to=".R_PD_DEBUG > .pin1" thickness={0.15}
      pcbPath={[".U_PD > .DBG_N", {x:2.3,y:-0.25}, {x:3,y:1}, {x:4.5,y:7}, ".R_PD_DEBUG > .pin1"]} />
    {wire("PD_DEBUG_BIAS_GND", ".R_PD_DEBUG > .pin2", "net.BOARD_GND")}
    {wire("PD_ENABLE", ".U_PD > .EN_N", "net.BOARD_GND")}
    {wire("PD_GROUND", ".U_PD > .GND", "net.BOARD_GND", 0.3)}
    <trace name="PD_GOOD_PULLUP" from=".U_PD > .GATE" to=".R_PD_GOOD_PU > .pin1"
      thickness={0.15} maxViaCount={0}
      pcbPath={[".U_PD > .GATE", {x:-2.4,y:-0.25}, {x:-2.4,y:5}, ".R_PD_GOOD_PU > .pin1"]} />
    {/* GATE is open drain. Pull it to the pass-FET source so loss of the PD
        controller turns the high-side switch off instead of leaving VBUS on. */}
    {wire("PD_GOOD_PULLUP_VDD", ".R_PD_GOOD_PU > .pin2", ".Q_VBUS > .pin1")}

    {/* TI 5 V / 3 A reference topology. The actual Linux load is well below 3 A. */}
    <TPS54302DDCR name="U_BUCK" pcbX={-17.5} pcbY={20} pcbRotation={90}
      schX={-22} schY={18} />
    <FHD4020S_100MT name="L_BUCK" pcbX={-13} pcbY={18} pcbRotation={90}
      schX={-16} schY={17} />
    <capacitor name="C_BUCK_IN" capacitance="10uF" maxVoltageRating={25} footprint="0805"
      manufacturerPartNumber="CL21A106KAYNNNE" supplierPartNumbers={{jlcpcb:["C15850"]}}
      pcbX={-22.5} pcbY={20} schX={-26} schY={19} />
    {c0402("C_BUCK_IN_HF", "100nF", "C307331", -20.5, 17.5)}
    {c0402("C_BUCK_BOOT", "100nF", "C307331", -17.5, 15.8)}
    {[[-7,20],[-7,16.5]] .map(([x,y], index) =>
      <capacitor key={index} name={`C_BUCK_OUT${index+1}`} capacitance="22uF"
        maxVoltageRating={25} footprint="0805" manufacturerPartNumber="CL21A226MAQNNNE"
        supplierPartNumbers={{jlcpcb:["C45783"]}} pcbX={x} pcbY={y} schX={-10} schY={18-index*2} />)}
    {r0402("R_BUCK_TOP", "100k", "C25741", -12, 13.8)}
    {r0402("R_BUCK_BOTTOM", "13.3k", "C122547", -9.5, 13.8)}
    {r0402("R_BUCK_FF", "51", "C881405", -14.5, 13.8)}
    <capacitor name="C_BUCK_FF" capacitance="75pF" footprint="0402" maxVoltageRating={50}
      manufacturerPartNumber="CC0402JRNPO9BN750" supplierPartNumbers={{jlcpcb:["C107010"]}}
      pcbX={-17} pcbY={13.8} schX={-12} schY={14} />
    {wire("BUCK_VIN", "net.VBUS_PD", ".U_BUCK > .VIN", 0.5)}
    {wire("BUCK_ENABLE", ".U_BUCK > .EN", "net.VBUS_PD")}
    {wire("BUCK_GND", ".U_BUCK > .GND", "net.BOARD_GND", 0.5)}
    {wire("BUCK_IN_CAP", ".C_BUCK_IN > .pin1", "net.VBUS_PD", 0.5)}
    {wire("BUCK_IN_CAP_GND", ".C_BUCK_IN > .pin2", "net.BOARD_GND", 0.5)}
    {wire("BUCK_IN_HF", ".C_BUCK_IN_HF > .pin1", "net.VBUS_PD")}
    {wire("BUCK_IN_HF_GND", ".C_BUCK_IN_HF > .pin2", "net.BOARD_GND")}
    {wire("BUCK_SW", ".U_BUCK > .SW", ".L_BUCK > .pin1", 0.8)}
    {wire("BUCK_OUT", ".L_BUCK > .pin2", "net.V5_LOGIC", 0.8)}
    {wire("BUCK_BOOT", ".U_BUCK > .BOOT", ".C_BUCK_BOOT > .pin1")}
    {wire("BUCK_BOOT_RETURN", ".C_BUCK_BOOT > .pin2", ".U_BUCK > .SW")}
    {[1,2].map(index => <group key={index} pcbX={0} pcbY={0} schX={0} schY={0}>
      {wire(`BUCK_OUT${index}`, `.C_BUCK_OUT${index} > .pin1`, "net.V5_LOGIC", 0.5)}
      {wire(`BUCK_OUT${index}_GND`, `.C_BUCK_OUT${index} > .pin2`, "net.BOARD_GND", 0.5)}
    </group>)}
    {wire("BUCK_FB_TOP", "net.V5_LOGIC", ".R_BUCK_TOP > .pin1")}
    {wire("BUCK_FB", ".R_BUCK_TOP > .pin2", ".U_BUCK > .FB")}
    {wire("BUCK_FB_BOTTOM", ".R_BUCK_BOTTOM > .pin1", ".U_BUCK > .FB")}
    {wire("BUCK_FB_GND", ".R_BUCK_BOTTOM > .pin2", "net.BOARD_GND")}
    {wire("BUCK_FF_SERIES", "net.V5_LOGIC", ".R_BUCK_FF > .pin1")}
    {wire("BUCK_FF_CAP", ".R_BUCK_FF > .pin2", ".C_BUCK_FF > .pin1")}
    {wire("BUCK_FF_RETURN", ".C_BUCK_FF > .pin2", ".U_BUCK > .FB")}

    <silkscreentext text="DATA / USB2 FEL" pcbX={4} pcbY={22.5} fontSize={0.75} />
  </group>
}

/** Dedicated USB-PD input plus the DATA-port Type-C Rd resistors. These are
 * rendered last to preserve the verified component and route identifiers. */
export function UsbPowerPort() {
  return <group name="USB_PORT_SPLIT" pcbX={0} pcbY={0} schX={-22} schY={-24} schSheetName="pd_power">
    <TYPE_C_31_M_12 name="J_USB_PWR" pcbX={25} pcbY={27.8} pcbRotation={180}
      schX={14} schY={31}
      internallyConnectedPins={[["pin1","pin2","pin3","pin4"]]}
      noConnect={["SBU1","SBU2","DN2","DP1","DN1","DP2"]} />
    <resistor name="R_USB_DATA_CC1" resistance="5.1k" footprint="0402"
      manufacturerPartNumber="0402WGF5101TCE" supplierPartNumbers={{jlcpcb:["C25905"]}}
      pcbX={6.45} pcbY={23.7} schX={10} schY={27} />
    <resistor name="R_USB_DATA_CC2" resistance="5.1k" footprint="0402"
      manufacturerPartNumber="0402WGF5101TCE" supplierPartNumbers={{jlcpcb:["C25905"]}}
      pcbX={1.5} pcbY={23.7} schX={18} schY={27} />

    <trace name="USB_DATA_CC1_RD" from=".J_USB_DATA > .CC1" to=".R_USB_DATA_CC1 > .pin1"
      thickness={0.15}
      pcbPath={[".J_USB_DATA > .CC1", {x:-1.25,y:3.1}, {x:-1.94,y:3.6}, ".R_USB_DATA_CC1 > .pin1"]} />
    <trace name="USB_DATA_CC2_RD" from=".J_USB_DATA > .CC2" to=".R_USB_DATA_CC2 > .pin2"
      thickness={0.15}
      pcbPath={[".J_USB_DATA > .CC2", {x:1.75,y:3.1}, {x:1.99,y:3.6}, ".R_USB_DATA_CC2 > .pin2"]} />
    <trace name="USB_DATA_CC1_GND" from=".R_USB_DATA_CC1 > .pin2" to=".J_USB_DATA > .pin13"
      thickness={0.15} pcbStraightLine />
    <trace name="USB_DATA_CC2_GND" from=".R_USB_DATA_CC2 > .pin1" to=".J_USB_DATA > .pin14"
      thickness={0.15} pcbStraightLine />
    <trace name="USB_PWR_SIGNAL_GND" from=".J_USB_PWR > .pin13" to=".J_USB_PWR > .pin14"
      thickness={0.3}
      pcbPath={[".J_USB_PWR > .pin13", {x:-3.2,y:6.3}, {x:3.2,y:6.3}, ".J_USB_PWR > .pin14"]} />
    <trace name="USB_PWR_SHELL_GND" from=".J_USB_PWR > .pin1" to=".J_USB_PWR > .pin14"
      thickness={0.3} pcbStraightLine />
    <trace name="USB_PWR_BOARD_GND" from=".J_USB_PWR > .pin14" to=".J_USB_DATA > .pin13"
      thickness={0.3} pcbStraightLine />

    <silkscreentext text="PWR / USB-PD 15V" pcbX={25} pcbY={22.5} fontSize={0.75} />
  </group>
}