c4a4de66e2071002ba3c1ce1665fef99b6627e51
[hw/altusmetrum] / packages / microSDpush.py
1 #!/usr/bin/python3
2 # Copyright 2023 by Bdale Garbee <bdale@gag.com>.  GPLv3
3 #
4 # Program to emit PCB footprint for GCT MEM2051-00-195-00-A micro SD connector
5 # this is a push-push style connector with normally open card detection pin
6 #
7
8 # dimensions in mm from gct/mem2051.pdf
9 MntFWidth = 1.50
10 MntFHeight = 2.00
11 MntRWidth = 1.30
12 MntRHeight = 1.40
13 MntYR = MntRHeight/2 - 0.3
14 MntYFL = MntYR + MntRHeight/2 + 11.50 + MntFHeight/2
15 MntYFR = MntYR + MntRHeight/2 + 12.50 + MntFHeight/2
16 MntXRL = -11.50/2 + MntRWidth/2
17 MntXRR = -11.50/2 + 5.70 + MntRWidth/2
18 MntXFL = -11.50/2 - MntFWidth/2
19 MntXFR = 11.50/2 + MntFWidth/2
20
21 CDWidth = 1.00
22 CDHeight = 0.95
23 CDX = -11.50/2 + 1.54 + CDWidth/2
24 CDY = CDHeight/2 - 0.3
25
26 PinWidth = 0.80
27 PinHeight = 1.50
28 PinSpacing = 1.10
29 PinY = MntYR + MntRHeight/2 + 9.41 + PinHeight/2
30 PinY2 = PinY - 0.4
31 PinY46 = PinY + 0.2
32
33 BoxX = 14.00
34 BoxYleft = 14.20
35 BoxYright = 15.20
36 ArcWidth = 10.80
37 ArcHeight = 1.30
38 ArcOffset = 1.3
39 LineWidth = 1000
40
41 Clearance = 0.32
42
43 MaskAdd = 0.15
44
45 import sys
46
47 # we're going to use the 1/100 of a mil fundamental unit form
48 def mm2mils100( mm ):
49         return int( mm / 25.4 * 1000.0 * 100.0 + 0.5 )
50
51 print('# author: Bdale Garbee')
52 print('# email: bdale@gag.com')
53 print('# dist-license: GPL 3')
54 print('# use-license: unlimited')
55
56 print('Element[0x0 "microSD" "" "" 0 0 0 0 0 100 0x0]')
57 print("(")
58
59 # mounting pads
60 print('   Pad[',\
61         mm2mils100(MntXFL), \
62         mm2mils100(MntYFL - MntFHeight/2 + MntFWidth/2), \
63         mm2mils100(MntXFL), \
64         mm2mils100(MntYFL + MntFHeight/2 - MntFWidth/2), \
65         mm2mils100(MntFWidth), \
66         mm2mils100(Clearance), \
67         mm2mils100(MntFWidth + MaskAdd), \
68         '"10" "10" 0x0100]')
69
70 print('   Pad[',\
71         mm2mils100(MntXFR), \
72         mm2mils100(MntYFR - MntFHeight/2 + MntFWidth/2), \
73         mm2mils100(MntXFR), \
74         mm2mils100(MntYFR + MntFHeight/2 - MntFWidth/2), \
75         mm2mils100(MntFWidth), \
76         mm2mils100(Clearance), \
77         mm2mils100(MntFWidth + MaskAdd), \
78         '"10" "10" 0x0100]')
79
80 print('   Pad[',\
81         mm2mils100(MntXRL), \
82         mm2mils100(MntYR - MntRHeight/2 + MntRWidth/2), \
83         mm2mils100(MntXRL), \
84         mm2mils100(MntYR + MntRHeight/2 - MntRWidth/2), \
85         mm2mils100(MntRWidth), \
86         mm2mils100(Clearance), \
87         mm2mils100(MntRWidth + MaskAdd), \
88         '"10" "10" 0x0100]')
89
90 print('   Pad[',\
91         mm2mils100(MntXRR), \
92         mm2mils100(MntYR - MntRHeight/2 + MntRWidth/2), \
93         mm2mils100(MntXRR), \
94         mm2mils100(MntYR + MntRHeight/2 - MntRWidth/2), \
95         mm2mils100(MntRWidth), \
96         mm2mils100(Clearance), \
97         mm2mils100(MntRWidth + MaskAdd), \
98         '"10" "10" 0x0100]')
99
100 # signal pads
101 for pin in range (1,9):
102
103     myPinY = PinY
104     if pin == 2:
105       myPinY = PinY2
106     elif (pin == 4 or pin == 6):
107       myPinY = PinY46
108     else:
109       myPinY = PinY
110
111     print('   Pad[',\
112         mm2mils100(CDX + (6-pin) * PinSpacing), \
113         mm2mils100(myPinY-(PinHeight/2)+(PinWidth/2)), \
114         mm2mils100(CDX + (6-pin) * PinSpacing), \
115         mm2mils100(myPinY+(PinHeight/2)-(PinWidth/2)), \
116         mm2mils100(PinWidth), \
117         mm2mils100(Clearance), \
118         mm2mils100(PinWidth + MaskAdd), \
119         '"pin%i"' % (pin), '"%i"' % (pin), '0x0100]')
120
121 # card detect pad
122     print('   Pad[',\
123         mm2mils100(CDX - CDHeight/2 + CDWidth/2), \
124         mm2mils100(CDY), \
125         mm2mils100(CDX + CDHeight/2 - CDWidth/2), \
126         mm2mils100(CDY), \
127         mm2mils100(CDHeight), \
128         mm2mils100(Clearance), \
129         mm2mils100(CDHeight + MaskAdd), \
130         '"9" "9" 0x0100]')
131
132 # keepout area
133 print('   ElementLine[', \
134         mm2mils100(CDX - 2.10/2), \
135         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
136         mm2mils100(CDX + 2.10/2), \
137         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
138         LineWidth, ']')
139
140 print('   ElementLine[', \
141         mm2mils100(CDX + 2.10/2), \
142         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
143         mm2mils100(CDX + 2.10/2), \
144         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
145         LineWidth, ']')
146
147 print('   ElementLine[', \
148         mm2mils100(CDX - 2.10/2), \
149         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
150         mm2mils100(CDX - 2.10/2), \
151         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 4.37), \
152         LineWidth, ']')
153
154 print('   ElementLine[', \
155         mm2mils100(-14.00/2 + 0.75), \
156         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
157         mm2mils100(CDX - 2.10/2), \
158         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
159         LineWidth, ']')
160
161 print('   ElementLine[', \
162         mm2mils100(14.00/2 - 4.55), \
163         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
164         mm2mils100(14.00/2 - 4.55), \
165         mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
166         LineWidth, ']')
167
168 print('   ElementLine[', \
169         mm2mils100(-14.00/2 + 0.75), \
170         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
171         mm2mils100(-14.00/2 + 0.75), \
172         mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
173         LineWidth, ']')
174
175 print('   ElementLine[', \
176         mm2mils100(CDX + 2.10/2), \
177         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
178         mm2mils100(14.00/2 - 4.55), \
179         mm2mils100(MntYFR - MntFHeight/2 - 7.37 - 2.30), \
180         LineWidth, ']')
181
182 print('   ElementLine[', \
183         mm2mils100(-14.00/2 + 0.75), \
184         mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
185         mm2mils100(14.00/2 - 4.55), \
186         mm2mils100(MntYFR - MntFHeight/2 - 7.37), \
187         LineWidth, ']')
188
189
190 # silkscreen box
191 print('   ElementLine[', \
192         mm2mils100(BoxX/2), \
193         mm2mils100(0), \
194         mm2mils100(BoxX/2), \
195         mm2mils100(BoxYright), \
196         LineWidth, ']')
197
198 print('   ElementLine[', \
199         mm2mils100(-BoxX/2), \
200         mm2mils100(0), \
201         mm2mils100(-BoxX/2), \
202         mm2mils100(BoxYleft), \
203         LineWidth, ']')
204
205 print('   ElementLine[', \
206         mm2mils100(-BoxX/2), \
207         mm2mils100(0), \
208         mm2mils100(+BoxX/2), \
209         mm2mils100(0), \
210         LineWidth, ']')
211
212 print('   ElementLine[', \
213         mm2mils100(+BoxX/2-2*ArcHeight), \
214         mm2mils100(BoxYleft), \
215         mm2mils100(+BoxX/2-2*ArcHeight), \
216         mm2mils100(BoxYright), \
217         LineWidth, ']')
218
219 print('   ElementLine[', \
220         mm2mils100(+BoxX/2-5), \
221         mm2mils100(BoxYleft-1), \
222         mm2mils100(+BoxX/2-5), \
223         mm2mils100(BoxYright), \
224         LineWidth, ']')
225
226 print('   ElementLine[', \
227         mm2mils100(+BoxX/2-5), \
228         mm2mils100(BoxYright), \
229         mm2mils100(+BoxX/2), \
230         mm2mils100(BoxYright), \
231         LineWidth, ']')
232
233 print('   ElementArc[', \
234         mm2mils100(-ArcOffset), \
235         mm2mils100((BoxYleft*2-3.75)-ArcHeight), \
236         mm2mils100(ArcWidth), \
237         mm2mils100(ArcHeight), \
238         238, \
239         64, \
240         LineWidth, ']')
241
242 print(")")