diff --git a/AUTHORS b/AUTHORS index 6f430f5..2241da4 100644 --- a/AUTHORS +++ b/AUTHORS @@ -8,12 +8,14 @@ Werner Almesberger components/8_10-card.lib components/vga.lib - modules/pads.fpd - modules/stdpass.fpd - modules/8_10-card.fpd - modules/fiducial.fpd components/74x1g08_5.lib (based on 74x1g00_5.lib) components/74x1g08_6.lib (based on 74x1g00_5.lib) components/74x1g07_5.lib components/74x1g07_4.lib components/74x1g07_6.lib + modules/pads.fpd + modules/stdpass.fpd + modules/8_10-card.fpd + modules/fiducial.fpd + modules/qfn.fpd + modules/qfp.fpd diff --git a/modules/INFO b/modules/INFO index e73414e..b448679 100644 --- a/modules/INFO +++ b/modules/INFO @@ -16,3 +16,51 @@ F: 8_10-card # Fiducial (1 mm copper pad, 2 mm solder mask clearance) F: fiducial + +# "Generic" simple QFN +F: qfn +# +# The information for these packages comes from various sources: +# +# - the C8051F326 data sheet, for the QFN28 footprint (N: mcu) +# - the AT86F326 data sheet, for the QFN32 package dimensions (N: txrx) +# - Atmel's general recommendations for QFN land patterns (N: atmel-qfn) +# - NXP's SOT617-1 and SOT617-3, for package and land pattern: +# http://www.nxp.com/package/SOT617-1.html +# http://www.nxp.com/package/SOT617-3.html +# +# Solder paste: +# +# Footprint Center pad Closest NXP (with complete land pattern) +# QFN28-Atmel 2.4 mm for further study +# QFN28-SiLabs 3.3 mm use SiLab's specification +# QFN32-VHHD-2 3.7 mm between SOT818-1 and SOT788-1 +# QFN32-VHHD-6 3.4 mm SOT818-1 +# +# From NXP: +# +# Package Pad Paste zone Islands Isl. size Isl. gap +# SiLabs 3.25 3.1 3 x 3 0.9 +# SOT818-1 3.4 1.75 2 x 2 0.75 0.25 +# SOT788-1 4.0 2.4 3 x 3 0.6 0.3 +# +# NXP rules (AN10365): +# - paste zone = 35% of pad area +# - paste coverge = 20% of pad area +# +# Our parameters: +# +# Package Pad Paste zone Islands Isl. size Isl. gap Zone Coverage +# QFN32-VHHD-2 3.7 2.15 3 x 3 0.55 0.25 34% 20% +# QFN32-VHHD-6 3.4 1.95 2 x 2 0.75 0.45 33% 19% +# +# Known bugs: +# +# - really ought to merge all the various QFN definitions (we have more +# over at gta02-core) into a single QFN file with a big mean table of +# everything +# +N: sot617-3-lp + +# "Generic" simple QFP (for now, just for Silabs' C8051F320) +F: qfp diff --git a/modules/Makefile b/modules/Makefile index eed120b..94c5fbd 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -1,4 +1,4 @@ -MODULES=8_10-card fiducial pads stdpass +MODULES=8_10-card fiducial pads qfn qfp stdpass .SUFFIXES: .fpd .mod .PHONY: all clean diff --git a/modules/qfn.fpd b/modules/qfn.fpd new file mode 100644 index 0000000..a9b15cc --- /dev/null +++ b/modules/qfn.fpd @@ -0,0 +1,124 @@ +/* MACHINE-GENERATED ! */ + +frame paste_pad { + __0: vec @(SX/2, SY/2) + __1: vec @(-SX/2, -SY/2) + pad " " . __0 paste +} + +frame paste { + set x = SE*(xi-SNX/2-0.5) + + set y = SE*(yi-SNY/2-0.5) + + loop xi = 1, SNX + + loop yi = 1, SNY + + __0: vec @(x, y) + frame paste_pad . +} + +frame center { + set pin = pins+1 + + __0: vec @(X2/2, Y2/2) + __1: vec @(-X2/2, -Y2/2) + pad "$pin" . __0 bare + frame paste @ +} + +frame pad { + set px = (dx*X1+dy*Y1)/2 + + set py = (dy*X1+dx*Y1)/2 + + set pin = side*pins/4+i+1 + + __0: vec @(px, py) + __1: vec @(-px, -py) + pad "$pin" __0 . + __2: vec @(px, -py) +} + +frame side { + set pos = i-(pins/4-1)/2 + + loop i = 0, pins/4-1 + + __0: vec @(E*pos*dx, E*pos*dy) + frame pad . +} + +frame pads { + table + { side, dx, dy } + { 0, 0, -1 } + { 1, 1, 0 } + { 2, 0, 1 } + { 3, -1, 0 } + + __0: vec @(dy*C1/2, -dx*C2/2) + frame side . +} + +frame index { +} + +frame outline { + table + { index, dx, _, dy } + { 1, -1, 0, 0 } + { 0, 0, 0, -1 } + { 0, 1, 0, 0 } + { 0, 0, 0, 1 } + + set mx = dx*C1/2 + + set my = dy*C2/2 + + set cx = mx+my + + set cy = my-mx + + set ax = -Y1/2*dx + + set ay = -Y1/2*dy + + set bx = -Y1/2*dy + + set by = Y1/2*dx + + __0: vec @(cx, cy) + w: vec .(ax, ay) + line __0 . w + __2: vec __0(bx, by) + line __0 . w + __1: vec .(index*(ax-bx), index*(ay-by)) + line __2 . w +} + +package "QFN$pins-$variant" +unit auto + +table + { pins, variant, X1, Y1, X2, Y2, E, C1, C2, SE, SNX, SNY, SX, SY } + { 28, "Atmel", 0.24mm, 0.7mm, 2.4mm, 2.4mm, 0.45mm, 4.1mm, 4.1mm, 1mm, 2, 2, 0.8mm, 0.8mm } + { 28, "SiLabs", 0.25mm, 0.9mm, 3.3mm, 3.3mm, 0.5mm, 4.8mm, 4.8mm, 1.1mm, 3, 3, 0.9mm, 0.9mm } + { 32, "VHHD-2", 0.26mm, 0.69mm, 3.7mm, 3.7mm, 0.5mm, 5.1mm, 5.1mm, 0.8mm, 3, 3, 0.55mm, 0.55mm } + { 32, "VHHD-6", 0.26mm, 0.69mm, 3.4mm, 3.4mm, 0.5mm, 5.1mm, 5.1mm, 1.2mm, 2, 2, 0.75mm, 0.75mm } + +set w = 5mil + +frame pads @ +frame center @ +frame outline @ +measy side.__0 >> side.__0 3mm +meas side.__0 -> side.__0 -1mm +measy center.__1 >> center.__0 2.3mm +measy pad.__1 >> pad.__1 3.5mm +measy pad.__1 -> pad.__0 1mm +meas pad.__1 -> pad.__2 -1mm +measy paste_pad.__1 -> paste_pad.__0 1.8mm +measy paste.__0 -> paste.__0 -C1 +measy paste_pad.__1 >> paste_pad.__0 -C1-1mm diff --git a/modules/qfp.fpd b/modules/qfp.fpd new file mode 100644 index 0000000..7b7c5b9 --- /dev/null +++ b/modules/qfp.fpd @@ -0,0 +1,73 @@ +/* MACHINE-GENERATED ! */ + +frame pad { + set px = (dx*X1+dy*Y1)/2 + + set py = (dy*X1+dx*Y1)/2 + + set pin = side*pins/4+i+1 + + __0: vec @(px, py) + __1: vec @(-px, -py) + pad "$pin" __0 . +} + +frame side { + set pos = i-(pins/4-1)/2 + + loop i = 0, pins/4-1 + + __0: vec @(e*pos*dx, e*pos*dy) + frame pad . +} + +frame pads { + table + { side, dx, dy } + { 0, 0, -1 } + { 1, 1, 0 } + { 2, 0, 1 } + { 3, -1, 0 } + + __0: vec @(dy*C1/2, -dx*C2/2) + frame side . +} + +frame index { +} + +frame outline { + set mx = D1/2 + + set my = E1/2 + + set cf = 0.8 + + set rf = (1-cf)/2 + + set r = mx*rf + + __0: vec @(mx, my) + __1: vec @(-mx, -my) + rect . __0 w + __2: vec @(-mx*cf, my*cf) + __3: vec .(0mm, r) + circ __2 . w +} + +package "$name" +unit mm + +table + { name, pins, X1, Y1, e, C1, C2, D1, E1 } + { "LQFP32", 32, 0.55mm, 1.3mm, 0.8mm, 8.45mm, 8.45mm, 7mm, 7mm } + +set X2 = X1+(pins/4-1)*E + +set Y2 = X2 + +set w = 5mil + +frame pads @ +frame outline @ +measy pad.__1 -> pad.__0 1mm