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
components/QfnFootprint.tsx
import { Fragment } from "react";
export const QfnFootprint = ({
pins,
pitch,
padWidth,
padLength,
rowSpacing,
bodySize,
exposedPad,
}: {
pins: number;
pitch: number;
padWidth: number;
padLength: number;
rowSpacing: number;
bodySize: number;
exposedPad: number;
}) => {
const pinsPerSide = pins / 4;
const pasteRows = Math.max(2, Math.floor(exposedPad / 1.2));
const pastePitch = exposedPad / pasteRows;
const pasteOpening = exposedPad * Math.sqrt(0.6) / pasteRows;
return (
<footprint>
{Array.from({ length: pins }, (_, index) => {
const side = Math.floor(index / pinsPerSide);
const along = ((index % pinsPerSide) - (pinsPerSide - 1) / 2) * pitch;
const pcbX = [-rowSpacing / 2, along, rowSpacing / 2, -along][side];
const pcbY = [-along, -rowSpacing / 2, along, rowSpacing / 2][side];
return (
<Fragment key={index}>
<smtpad
portHints={[`pin${index + 1}`]}
shape="rect"
pcbX={pcbX}
pcbY={pcbY}
width={side % 2 ? padWidth : padLength}
height={side % 2 ? padLength : padWidth}
/>
</Fragment>
);
})}
<smtpad
portHints={[`pin${pins + 1}`]}
shape="rect"
width={exposedPad}
height={exposedPad}
noSolderPaste
/>
{Array.from({length:pasteRows*pasteRows},(_,index)=>(
<Fragment key={`paste-${index}`}><solderpaste shape="rect" width={pasteOpening} height={pasteOpening} pcbX={((index%pasteRows)-(pasteRows-1)/2)*pastePitch} pcbY={(Math.floor(index/pasteRows)-(pasteRows-1)/2)*pastePitch} layer="top" /></Fragment>
))}
<courtyardrect width={bodySize + 0.8} height={bodySize + 0.8} />
<silkscreencircle
pcbX={-bodySize / 2 - 0.35}
pcbY={bodySize / 2 + 0.35}
radius={0.15}
/>
</footprint>
);
};