Fix STM footprint to include TI-style pad with vias
[hw/telegps] / packages / ufqfpn48.5c
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();