Fix STM footprint to include TI-style pad with vias
authorKeith Packard <keithp@keithp.com>
Fri, 28 Dec 2012 00:50:00 +0000 (16:50 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 28 Dec 2012 01:15:14 +0000 (17:15 -0800)
Signed-off-by: Keith Packard <keithp@keithp.com>
packages/footprint.5c
packages/ufqfpn48.5c
packages/ufqfpn48.fp
symbols/STM32L151-48.sym

index 7d6fdcb05f0bc8c319552ba2ff425fcdace1a737..885c21a081060430889094610d992693a74fc5f1 100644 (file)
@@ -41,13 +41,59 @@ namespace Footprint {
                printf (")\n");
        }
        
-       public void pad_mm_clear(real center_x,
-                                real center_y,
-                                real width,
-                                real height,
-                                real clearance,
-                                string name,
-                                string num)
+       public void pad_mm_clear_mask_options(real center_x,
+                                             real center_y,
+                                             real width,
+                                             real height,
+                                             real clearance,
+                                             real mask,
+                                             string name,
+                                             string num,
+                                             string options)
+       {
+               real    x1 = 0;
+               real    y1 = 0;
+               real    x2 = 0;
+               real    y2 = 0;
+               real    thickness = 0;
+
+               if (width > height) {
+                       thickness = height;
+                       y1 = center_y;
+                       x1 = center_x - (width - height) / 2;
+                       y2 = center_y;
+                       x2 = center_x + (width - height) / 2;
+               } else {
+                       thickness = width;
+                       x1 = center_x;
+                       y1 = center_y - (height - width) / 2;
+                       x2 = center_x;
+                       y2 = center_y + (height - width) / 2;
+               }
+
+
+               printf ("    Pad[");
+               printf (" %6d %6d %6d %6d",
+                       mm2mils100(x1),
+                       mm2mils100(y1),
+                       mm2mils100(x2),
+                       mm2mils100(y2));
+               printf (" %6d %6d %6d",
+                       mm2mils100(thickness),
+                       mm2mils100(clearance),
+                       mm2mils100(mask));
+               printf (" \"%s\" \"%s\" \"square%s%s\"]\n",
+                       name, num, options == "" ? "" : ",", options);
+       }
+
+       public void pad_mm_clear_options(real center_x,
+                                        real center_y,
+                                        real width,
+                                        real height,
+                                        real clearance,
+                                        string name,
+                                        string num,
+                                        string options)
        {
                real    x1 = 0;
                real    y1 = 0;
@@ -81,8 +127,26 @@ namespace Footprint {
                        mm2mils100(thickness),
                        mm2mils100(clearance),
                        mm2mils100(mask));
-               printf (" \"%s\" \"%s\" \"square\"]\n",
-                       name, num);
+               printf (" \"%s\" \"%s\" \"square%s%s\"]\n",
+                       name, num, options == "" ? "" : ",", options);
+       }
+
+       public void pad_mm_clear(real center_x,
+                                real center_y,
+                                real width,
+                                real height,
+                                real clearance,
+                                string name,
+                                string num)
+       {
+               pad_mm_clear_options(center_x,
+                                    center_y,
+                                    width,
+                                    height,
+                                    clearance,
+                                    name,
+                                    num,
+                                    "");
        }
 
        public void pad_mm(real center_x,
@@ -122,6 +186,26 @@ namespace Footprint {
                       
        }
 
+       public void pin_mm_clear_mask(real x, real y,
+                                     real drill, real copper, real clearance, real mask,
+                                     string name, string number)
+       {
+               real thickness = drill + copper * 2;
+               printf("    Pin[");
+               printf(" %6d %6d",
+                      mm2mils100(x),
+                      mm2mils100(y));
+               printf(" %6d %6d %6d %6d",
+                      mm2mils100(thickness),
+                      mm2mils100(clearance),
+                      mm2mils100(mask),
+                      mm2mils100(drill));
+               printf (" \"%s\" \"%s\"",
+                       name, number);
+               printf (" \"\"]\n");
+                      
+       }
+
        public void pin_mm(real x, real y, real drill, real copper,
                        string name,
                        string number)
index 8657dd02b3e46d2dfb356f6c0dfb95ed0da7309f..082bfd0dc667a9a5712596c72d70d24a126369e8 100644 (file)
@@ -21,6 +21,7 @@ import Footprint;
 real pad_width = 0.55;
 real pad_height = 0.30;
 real pad_spacing = 0.50;
+real pad_clearance = 8 / 1000 * 25.4;  /* 2 mil gap for solder mask */
 
 real pad_x_off = 6.20 / 2;
 real pad_y_off = 6.20 / 2;
@@ -61,42 +62,83 @@ line(-package_width/2 + dot_off, -package_height/2 + dot_off,
 for (pad = 0; pad < num_pad; pad++) {
        /* left side (1-12) */
 
-       pad_mm(-pad_x_off - pad_width / 2,
-              pad_off(pad),
-              pad_width,
-              pad_height,
-              sprintf("%d", pad + 1),
-              sprintf("%d", pad + 1));
+       pad_mm_clear(-pad_x_off - pad_width / 2,
+                    pad_off(pad),
+                    pad_width,
+                    pad_height,
+                    pad_clearance,
+                    sprintf("%d", pad + 1),
+                    sprintf("%d", pad + 1));
        
        /* bottom (13-24) */
 
-       pad_mm(pad_off(pad),
-              pad_y_off + pad_width / 2,
-              pad_height,
-              pad_width,
-              sprintf("%d", pad + 13),
-              sprintf("%d", pad + 13));
+       pad_mm_clear(pad_off(pad),
+                    pad_y_off + pad_width / 2,
+                    pad_height,
+                    pad_width,
+                    pad_clearance,
+                    sprintf("%d", pad + 13),
+                    sprintf("%d", pad + 13));
        
        /* right side (25-36) */
 
-       pad_mm(pad_x_off + pad_width / 2,
-              -pad_off(pad),
-              pad_width,
-              pad_height,
-              sprintf("%d", pad + 25),
-              sprintf("%d", pad + 25));
+       pad_mm_clear(pad_x_off + pad_width / 2,
+                    -pad_off(pad),
+                    pad_width,
+                    pad_height,
+                    pad_clearance,
+                    sprintf("%d", pad + 25),
+                    sprintf("%d", pad + 25));
        
        /* top (37-48) */
 
-       pad_mm(-pad_off(pad),
-              -pad_y_off - pad_width / 2,
-              pad_height,
-              pad_width,
-              sprintf("%d", pad + 37),
-              sprintf("%d", pad + 37));
+       pad_mm_clear(-pad_off(pad),
+                    -pad_y_off - pad_width / 2,
+                    pad_height,
+                    pad_width,
+                    pad_clearance,
+                    sprintf("%d", pad + 37),
+                    sprintf("%d", pad + 37));
        
 }
 
-pad_mm(0, 0, center_width, center_height, "GND", "GND");
+int pad_blocks = 3;
+
+real block_width = center_width / pad_blocks;
+real block_height = center_height / pad_blocks;
+
+real block_x(int x) = (x - (pad_blocks - 1)/2) * block_width;
+real block_y(int y) = (y - (pad_blocks - 1)/2) * block_height;
+
+bool via_block(int x, int y) {
+       return (x & 1) == 0 && (y & 1) == 0;
+}
+
+real via_hole = 15/1000 * 25.4;                /* 15 mil drill */
+real via_copper = 3.5/1000 * 25.4;     /* 7 mil anulus */
+
+for (int pad_y = 0; pad_y < pad_blocks; pad_y++) {
+       for (int pad_x = 0; pad_x < pad_blocks; pad_x++)
+               if (via_block(pad_x, pad_y)) {
+                       pin_mm_clear_mask(block_x(pad_x), block_y(pad_y),
+                                         via_hole, via_copper * 2, pad_clearance, 0,
+                                         "GND", "GND");
+                       pad_mm_clear_mask_options(block_x(pad_x), block_y(pad_y),
+                                                 block_width, block_height,
+                                                 pad_clearance, 0,
+                                                 "GND", "GND","nopaste");
+               } else {
+                       /* full square of metal */
+                       pad_mm_clear_options(block_x(pad_x), block_y(pad_y),
+                                            block_width, block_height,
+                                            0,
+                                            "GND", "GND","nopaste");
+                       /* 1/4 full of solder paste */
+                       pad_mm_clear_options(block_x(pad_x), block_y(pad_y),
+                                            block_width/2, block_height/2,
+                                            0,
+                                            "GND", "GND","");
+               }
+}
 
 element_end();
index 73d6a1dcbe29ece9438de43797cfbfafd8f2462a..678d927e8e9aa3d983b78f71615f4921384a0807 100644 (file)
@@ -13,53 +13,70 @@ Element ["" "ufqfpn-48" "" "" 0 0 0 0 0 100 ""]
     ElementLine[  13780  13780  12205  13780 1000]
     ElementLine[  13780  13780  13780  12205 1000]
     ElementLine[ -12598 -12598 -12598 -12598 1000]
-    Pad[ -13780 -10827 -12795 -10827   1181   2362   2362 "1" "1" "square"]
-    Pad[ -10827  12795 -10827  13780   1181   2362   2362 "13" "13" "square"]
-    Pad[  12795  10827  13780  10827   1181   2362   2362 "25" "25" "square"]
-    Pad[  10827 -13780  10827 -12795   1181   2362   2362 "37" "37" "square"]
-    Pad[ -13780  -8858 -12795  -8858   1181   2362   2362 "2" "2" "square"]
-    Pad[  -8858  12795  -8858  13780   1181   2362   2362 "14" "14" "square"]
-    Pad[  12795   8858  13780   8858   1181   2362   2362 "26" "26" "square"]
-    Pad[   8858 -13780   8858 -12795   1181   2362   2362 "38" "38" "square"]
-    Pad[ -13780  -6890 -12795  -6890   1181   2362   2362 "3" "3" "square"]
-    Pad[  -6890  12795  -6890  13780   1181   2362   2362 "15" "15" "square"]
-    Pad[  12795   6890  13780   6890   1181   2362   2362 "27" "27" "square"]
-    Pad[   6890 -13780   6890 -12795   1181   2362   2362 "39" "39" "square"]
-    Pad[ -13780  -4921 -12795  -4921   1181   2362   2362 "4" "4" "square"]
-    Pad[  -4921  12795  -4921  13780   1181   2362   2362 "16" "16" "square"]
-    Pad[  12795   4921  13780   4921   1181   2362   2362 "28" "28" "square"]
-    Pad[   4921 -13780   4921 -12795   1181   2362   2362 "40" "40" "square"]
-    Pad[ -13780  -2953 -12795  -2953   1181   2362   2362 "5" "5" "square"]
-    Pad[  -2953  12795  -2953  13780   1181   2362   2362 "17" "17" "square"]
-    Pad[  12795   2953  13780   2953   1181   2362   2362 "29" "29" "square"]
-    Pad[   2953 -13780   2953 -12795   1181   2362   2362 "41" "41" "square"]
-    Pad[ -13780   -984 -12795   -984   1181   2362   2362 "6" "6" "square"]
-    Pad[   -984  12795   -984  13780   1181   2362   2362 "18" "18" "square"]
-    Pad[  12795    984  13780    984   1181   2362   2362 "30" "30" "square"]
-    Pad[    984 -13780    984 -12795   1181   2362   2362 "42" "42" "square"]
-    Pad[ -13780    984 -12795    984   1181   2362   2362 "7" "7" "square"]
-    Pad[    984  12795    984  13780   1181   2362   2362 "19" "19" "square"]
-    Pad[  12795   -984  13780   -984   1181   2362   2362 "31" "31" "square"]
-    Pad[   -984 -13780   -984 -12795   1181   2362   2362 "43" "43" "square"]
-    Pad[ -13780   2953 -12795   2953   1181   2362   2362 "8" "8" "square"]
-    Pad[   2953  12795   2953  13780   1181   2362   2362 "20" "20" "square"]
-    Pad[  12795  -2953  13780  -2953   1181   2362   2362 "32" "32" "square"]
-    Pad[  -2953 -13780  -2953 -12795   1181   2362   2362 "44" "44" "square"]
-    Pad[ -13780   4921 -12795   4921   1181   2362   2362 "9" "9" "square"]
-    Pad[   4921  12795   4921  13780   1181   2362   2362 "21" "21" "square"]
-    Pad[  12795  -4921  13780  -4921   1181   2362   2362 "33" "33" "square"]
-    Pad[  -4921 -13780  -4921 -12795   1181   2362   2362 "45" "45" "square"]
-    Pad[ -13780   6890 -12795   6890   1181   2362   2362 "10" "10" "square"]
-    Pad[   6890  12795   6890  13780   1181   2362   2362 "22" "22" "square"]
-    Pad[  12795  -6890  13780  -6890   1181   2362   2362 "34" "34" "square"]
-    Pad[  -6890 -13780  -6890 -12795   1181   2362   2362 "46" "46" "square"]
-    Pad[ -13780   8858 -12795   8858   1181   2362   2362 "11" "11" "square"]
-    Pad[   8858  12795   8858  13780   1181   2362   2362 "23" "23" "square"]
-    Pad[  12795  -8858  13780  -8858   1181   2362   2362 "35" "35" "square"]
-    Pad[  -8858 -13780  -8858 -12795   1181   2362   2362 "47" "47" "square"]
-    Pad[ -13780  10827 -12795  10827   1181   2362   2362 "12" "12" "square"]
-    Pad[  10827  12795  10827  13780   1181   2362   2362 "24" "24" "square"]
-    Pad[  12795 -10827  13780 -10827   1181   2362   2362 "36" "36" "square"]
-    Pad[ -10827 -13780 -10827 -12795   1181   2362   2362 "48" "48" "square"]
-    Pad[      0      0      0      0  22047   2362  23228 "GND" "GND" "square"]
+    Pad[ -13780 -10827 -12795 -10827   1181    800   1581 "1" "1" "square"]
+    Pad[ -10827  12795 -10827  13780   1181    800   1581 "13" "13" "square"]
+    Pad[  12795  10827  13780  10827   1181    800   1581 "25" "25" "square"]
+    Pad[  10827 -13780  10827 -12795   1181    800   1581 "37" "37" "square"]
+    Pad[ -13780  -8858 -12795  -8858   1181    800   1581 "2" "2" "square"]
+    Pad[  -8858  12795  -8858  13780   1181    800   1581 "14" "14" "square"]
+    Pad[  12795   8858  13780   8858   1181    800   1581 "26" "26" "square"]
+    Pad[   8858 -13780   8858 -12795   1181    800   1581 "38" "38" "square"]
+    Pad[ -13780  -6890 -12795  -6890   1181    800   1581 "3" "3" "square"]
+    Pad[  -6890  12795  -6890  13780   1181    800   1581 "15" "15" "square"]
+    Pad[  12795   6890  13780   6890   1181    800   1581 "27" "27" "square"]
+    Pad[   6890 -13780   6890 -12795   1181    800   1581 "39" "39" "square"]
+    Pad[ -13780  -4921 -12795  -4921   1181    800   1581 "4" "4" "square"]
+    Pad[  -4921  12795  -4921  13780   1181    800   1581 "16" "16" "square"]
+    Pad[  12795   4921  13780   4921   1181    800   1581 "28" "28" "square"]
+    Pad[   4921 -13780   4921 -12795   1181    800   1581 "40" "40" "square"]
+    Pad[ -13780  -2953 -12795  -2953   1181    800   1581 "5" "5" "square"]
+    Pad[  -2953  12795  -2953  13780   1181    800   1581 "17" "17" "square"]
+    Pad[  12795   2953  13780   2953   1181    800   1581 "29" "29" "square"]
+    Pad[   2953 -13780   2953 -12795   1181    800   1581 "41" "41" "square"]
+    Pad[ -13780   -984 -12795   -984   1181    800   1581 "6" "6" "square"]
+    Pad[   -984  12795   -984  13780   1181    800   1581 "18" "18" "square"]
+    Pad[  12795    984  13780    984   1181    800   1581 "30" "30" "square"]
+    Pad[    984 -13780    984 -12795   1181    800   1581 "42" "42" "square"]
+    Pad[ -13780    984 -12795    984   1181    800   1581 "7" "7" "square"]
+    Pad[    984  12795    984  13780   1181    800   1581 "19" "19" "square"]
+    Pad[  12795   -984  13780   -984   1181    800   1581 "31" "31" "square"]
+    Pad[   -984 -13780   -984 -12795   1181    800   1581 "43" "43" "square"]
+    Pad[ -13780   2953 -12795   2953   1181    800   1581 "8" "8" "square"]
+    Pad[   2953  12795   2953  13780   1181    800   1581 "20" "20" "square"]
+    Pad[  12795  -2953  13780  -2953   1181    800   1581 "32" "32" "square"]
+    Pad[  -2953 -13780  -2953 -12795   1181    800   1581 "44" "44" "square"]
+    Pad[ -13780   4921 -12795   4921   1181    800   1581 "9" "9" "square"]
+    Pad[   4921  12795   4921  13780   1181    800   1581 "21" "21" "square"]
+    Pad[  12795  -4921  13780  -4921   1181    800   1581 "33" "33" "square"]
+    Pad[  -4921 -13780  -4921 -12795   1181    800   1581 "45" "45" "square"]
+    Pad[ -13780   6890 -12795   6890   1181    800   1581 "10" "10" "square"]
+    Pad[   6890  12795   6890  13780   1181    800   1581 "22" "22" "square"]
+    Pad[  12795  -6890  13780  -6890   1181    800   1581 "34" "34" "square"]
+    Pad[  -6890 -13780  -6890 -12795   1181    800   1581 "46" "46" "square"]
+    Pad[ -13780   8858 -12795   8858   1181    800   1581 "11" "11" "square"]
+    Pad[   8858  12795   8858  13780   1181    800   1581 "23" "23" "square"]
+    Pad[  12795  -8858  13780  -8858   1181    800   1581 "35" "35" "square"]
+    Pad[  -8858 -13780  -8858 -12795   1181    800   1581 "47" "47" "square"]
+    Pad[ -13780  10827 -12795  10827   1181    800   1581 "12" "12" "square"]
+    Pad[  10827  12795  10827  13780   1181    800   1581 "24" "24" "square"]
+    Pad[  12795 -10827  13780 -10827   1181    800   1581 "36" "36" "square"]
+    Pad[ -10827 -13780 -10827 -12795   1181    800   1581 "48" "48" "square"]
+    Pin[  -7349  -7349   2900    800      0   1500 "GND" "GND" ""]
+    Pad[  -7349  -7349  -7349  -7349   7349    800      0 "GND" "GND" "square,nopaste"]
+    Pad[      0  -7349      0  -7349   7349      0   7349 "GND" "GND" "square,nopaste"]
+    Pad[      0  -7349      0  -7349   3675      0   3675 "GND" "GND" "square"]
+    Pin[   7349  -7349   2900    800      0   1500 "GND" "GND" ""]
+    Pad[   7349  -7349   7349  -7349   7349    800      0 "GND" "GND" "square,nopaste"]
+    Pad[  -7349      0  -7349      0   7349      0   7349 "GND" "GND" "square,nopaste"]
+    Pad[  -7349      0  -7349      0   3675      0   3675 "GND" "GND" "square"]
+    Pad[      0      0      0      0   7349      0   7349 "GND" "GND" "square,nopaste"]
+    Pad[      0      0      0      0   3675      0   3675 "GND" "GND" "square"]
+    Pad[   7349      0   7349      0   7349      0   7349 "GND" "GND" "square,nopaste"]
+    Pad[   7349      0   7349      0   3675      0   3675 "GND" "GND" "square"]
+    Pin[  -7349   7349   2900    800      0   1500 "GND" "GND" ""]
+    Pad[  -7349   7349  -7349   7349   7349    800      0 "GND" "GND" "square,nopaste"]
+    Pad[      0   7349      0   7349   7349      0   7349 "GND" "GND" "square,nopaste"]
+    Pad[      0   7349      0   7349   3675      0   3675 "GND" "GND" "square"]
+    Pin[   7349   7349   2900    800      0   1500 "GND" "GND" ""]
+    Pad[   7349   7349   7349   7349   7349    800      0 "GND" "GND" "square,nopaste"]
 )
index 6fbbe7f866bca534b3ec43a0063bbfa098a13def..cca5186f8ab0111740767ecde4b2e6da0a8c01eb 100644 (file)
@@ -16,9 +16,9 @@ description=STM32L151CBT
 T -6400 -1300 8 10 0 0 0 0 1
 numslots=1
 T -6400 -1600 8 10 0 0 0 0 1
-device=STM32L151CBT
-T 2750 17450 9 30 1 0 0 0 1
-STM32L151CBT
+device=IC
+T 2750 17450 9 30 1 1 0 0 1
+value=STM32L151CBT
 T -6400 -1000 8 10 0 0 0 0 1
 slot=1
 T 400 20100 8 10 1 1 0 0 1
@@ -540,3 +540,14 @@ pinseq=21
 T 4400 20400 5 10 0 1 270 2 1
 pintype=pwr
 }
+P 5000 0 5000 400 1 0 0
+{
+T 5000 0 5 10 0 0 0 0 1
+pintype=unknown
+T 5000 455 5 10 1 1 90 0 1
+pinlabel=GND
+T 4950 405 5 10 1 1 90 6 1
+pinnumber=GND
+T 5000 0 5 10 0 0 0 0 1
+pinseq=0
+}