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>
	);
};