write out to mdwn file instead of stdout
[pinmux.git] / src / spec / m_class.py
1 #!/usr/bin/env python
2
3 from spec.interfaces import Pinouts
4
5 from spec.ifaceprint import display, display_fns, check_functions
6 from spec.ifaceprint import display_fixed
7
8
9 def pinspec(of):
10 pinbanks = {'A': 16,
11 'B': 28,
12 'C': 24,
13 'D': 24,
14 'E': 24,
15 'F': 10,
16 'G': 32,
17 }
18 bankspec = {}
19 pkeys = sorted(pinbanks.keys())
20 offs = 0
21 for kn in pkeys:
22 bankspec[kn] = offs
23 offs += pinbanks[kn]
24
25 pinouts = Pinouts(bankspec)
26
27 # Bank A, 0-15
28 pinouts.gpio("", ('A', 0), "A", 0, 0, 16)
29 pinouts.spi("0", ('A', 0), "A", 3)
30 pinouts.uartfull("1", ('A', 0), "A", 2)
31 pinouts.i2c("0", ('A', 4), "A", 2)
32 pinouts.emmc("", ('A', 0), "A", 1)
33 #pinouts.uart("0", ('A', 14), "A", 1)
34 pinouts.spi("1", ('A', 6), "A", 2)
35 pinouts.eint("", ('A', 10), "A", 1, start=0, limit=6)
36 pinouts.eint("", ('A', 4), "A", 3, start=0, limit=6)
37 pinouts.sdmmc("0", ('A', 10), "A", 2)
38 pinouts.jtag("0", ('A', 10), "A", 3)
39 pinouts.uart("0", ('A', 14), "A", 3)
40
41 # Bank B, 16-47
42 pinouts.gpio("", ('B', 0), "B", 0, 0, 28)
43 pinouts.rgbttl("0", ('B', 0), "B", 1)
44 pinouts.spi("0", ('B', 12), "B", 2)
45 pinouts.quadspi("", ('B', 4), "B", 2, limit=4)
46 pinouts.uart("1", ('B', 16), "B", 2)
47 pinouts.i2c("2", ('B', 18), "B", 2)
48 pinouts.pwm("", ('B', 9), "B", 2, start=0, limit=1)
49 pinouts.pwm("", ('B', 20), "B", 2, start=1, limit=2)
50 pinouts.sdmmc("0", ('B', 22), "B", 2)
51 pinouts.eint("", ('B', 0), "B", 3, start=6, limit=4)
52 pinouts.flexbus2("", ('B', 4), "B", 3)
53 pinouts.i2c("0", ('B', 0), "B", 2)
54 pinouts.uart("0", ('B', 2), "B", 2)
55 pinouts.uart("2", ('B', 10), "B", 2)
56
57 # Bank C, 48-71
58 pinouts.gpio("", ("C", 0), "C", 0, 0, 24)
59 pinouts.ulpi("0", ('C', 0), "C", 1)
60 pinouts.ulpi("1", ('C', 12), "C", 1)
61 pinouts.spi("1", ('C', 8), "C", 2)
62 #pinouts.spi("1", ('C', 28), "C", 2)
63 pinouts.uartfull("0", ('C', 20), "C", 3)
64 pinouts.eint("", ('C', 0), "C", 3, start=10, limit=8)
65 pinouts.jtag("1", ('C', 8), "C", 3)
66 pinouts.eint("", ('C', 12), "C", 3, start=22, limit=8)
67 pinouts.uart("0", ('C', 22), "C", 2)
68 pinouts.i2s("", ('C', 13), "C", 2)
69 pinouts.pwm("", ('C', 21), "C", 2, start=2, limit=1)
70
71 # Bank D, 72-96
72
73 # ok this is slightly complicated, basically there's extra
74 # functions that we want to be on the same pin (but a different mux)
75 # because their use is mutually-exclusive. you can't have FB_TS
76 # at the same time as FB_ALE for example. FB_BWE2 even has two
77 # mutually exclusive functions. these extra functions are
78 # specified here, so that when e.g. FB_BWE2 has been positioned,
79 # FB_A0 will be placed in bank d, mux column 3, *on the same pin*.
80 # this saves messing about, because if FB_BWE2 moved to a
81 # different pin so would FB_A0 (and FB_CS2) likewise have to be
82 # moved. and the rest.
83 flexspec = {
84 'FB_TS': ('FB_ALE', 2, "D"),
85 'FB_CS2': ('FB_BWE2', 2, "D"),
86 'FB_A0': ('FB_BWE2', 3, "D"),
87 'FB_CS3': ('FB_BWE3', 2, "D"),
88 'FB_A1': ('FB_BWE3', 3, "D"),
89 'FB_TBST': ('FB_OE', 2, "D"),
90 'FB_TSIZ0': ('FB_BWE0', 2, "D"),
91 'FB_TSIZ1': ('FB_BWE1', 2, "D"),
92 }
93 #pinouts.mcu8080("", 72, "D", 1)
94 pinouts.gpio("", ('D', 0), "D", 0, 0, 24)
95 pinouts.flexbus1("", ('D', 0), "D", 1, spec=flexspec)
96 pinouts.i2c("1", ('D', 8), "D", 3)
97 pinouts.pwm("", ('D', 21), "D", 1, start=0, limit=3)
98 pinouts.i2c("0", ('D', 10), "D", 3)
99 pinouts.i2c("2", ('D', 19), "D", 2)
100 pinouts.uartfull("0", ('D', 0), "D", 2)
101 pinouts.uart("1", ('D', 21), "D", 2)
102 pinouts.uart("2", ('D', 13), "D", 2)
103 pinouts.eint("", ('D', 19), "D", 3, start=18, limit=4)
104 pinouts.eint("", ('D', 23), "D", 3, start=9, limit=1)
105 pinouts.eint("", ('D', 13), "D", 3, start=5, limit=4)
106 pinouts.eint("", ('D', 0), "D", 3, start=30, limit=2)
107 pinouts.i2c("1", ('D', 2), "D", 3)
108 pinouts.sdmmc("1", ('D', 4), "D", 2)
109
110 # Bank E
111 pinouts.gpio("", ('E', 0), "E", 0, 0, 24)
112 pinouts.flexbus2("", ('E', 0), "E", 1)
113 pinouts.sdmmc("1", ('E', 0), "E", 2)
114 pinouts.sdmmc("2", ('E', 8), "E", 2)
115 pinouts.quadspi("", ('E', 18), "E", 2)
116 pinouts.uartfull("1", ('E', 14), "E", 2)
117 pinouts.i2c("1", ('E', 6), "E", 2)
118 pinouts.eint("", ('E', 0), "E", 3, start=10, limit=8)
119 pinouts.eint("", ('E', 8), "E", 3, start=22, limit=6)
120 pinouts.emmc("", ('E', 14), "E", 3)
121
122 # Bank F
123 pinouts.gpio("", ('F', 0), "F", 0, 0, 10)
124 pinouts.i2s("", ('F', 0), "F", 1)
125 pinouts.i2c("0", ('F', 6), "F", 2)
126 pinouts.pwm("", ('F', 8), "F", 2, start=0, limit=1)
127 pinouts.pwm("", ('F', 9), "F", 2, start=1, limit=1)
128 pinouts.uart("2", ('F', 8), "F", 1)
129 pinouts.sdmmc("2", ('F', 0), "F", 2)
130 pinouts.eint("", ('F', 0), "F", 3, start=18, limit=4)
131 pinouts.pwm("", ('F', 4), "F", 3, start=2, limit=1)
132 pinouts.eint("", ('F', 5), "F", 3, start=7, limit=1)
133 pinouts.eint("", ('F', 6), "F", 3, start=28, limit=4)
134
135 # Bank G
136 pinouts.gpio("", ('G', 0), "G", 0, 0, 32)
137 pinouts.rgmii("", ('G', 0), "G", 1)
138 pinouts.ulpi("2", ('G', 20), "G", 1)
139 pinouts.rgbttl("1", ('G', 0), "G", 2)
140 pinouts.quadspi("", ('G', 26), "G", 3)
141 pinouts.flexbus2("", ('G', 0), "G", 3)
142 pinouts.sdmmc("1", ('G', 24), "G", 3, limit=2)
143 pinouts.sdmmc("1", ('G', 28), "G", 2, start=2)
144
145 of.write ("""# Pinouts (PinMux)
146 auto-generated by [[pinouts.py]]
147
148 [[!toc ]]
149
150 """)
151 display(of, pinouts)
152
153 of.write ("\n# Pinouts (Fixed function)\n\n")
154
155 fixedpins = {
156 'DDR3': [
157 'SDQ0',
158 'SDQ1',
159 'SDQ2',
160 'SDQ3',
161 'SDQ4',
162 'SDQ5',
163 'SDQ6',
164 'SDQ7',
165 'SDQ8',
166 'SDQ9',
167 'SDQ10',
168 'SDQ11',
169 'SDQ12',
170 'SDQ13',
171 'SDQ14',
172 'SDQ15',
173 'SDQ16',
174 'SDQ17',
175 'SDQ18',
176 'SDQ19',
177 'SDQ20',
178 'SDQ21',
179 'SDQ22',
180 'SDQ23',
181 'SDQ24',
182 'SDQ25',
183 'SDQ26',
184 'SDQ27',
185 'SDQ28',
186 'SDQ29',
187 'SDQ30',
188 'SDQ31',
189 'SVREF0',
190 'SVREF1',
191 'SVREF2',
192 'SVREF3',
193 'SDQS0',
194 'SDQS0#',
195 'SDQS1',
196 'SDQS1#',
197 'SDQS2',
198 'SDQS2#',
199 'SDQS3',
200 'SDQS3#',
201 'SDQM0',
202 'SDQM1',
203 'SDQM2',
204 'SDQM3',
205 'SCK#',
206 'SCK',
207 'SCKE0',
208 'SCKE1',
209 'SA0',
210 'SA1',
211 'SA2',
212 'SA3',
213 'SA4',
214 'SA5',
215 'SA6',
216 'SA7',
217 'SA8',
218 'SA9',
219 'SA10',
220 'SA11',
221 'SA12',
222 'SA13',
223 'SA14',
224 'SBA0',
225 'SBA1',
226 'SBA2',
227 'SWE',
228 'SCAS',
229 'SRAS',
230 'SCS0',
231 'SCS1',
232 'SZQ',
233 'SRST',
234 'SDBG0',
235 'SDBG1',
236 'ADBG',
237 'ODT0',
238 'ODT1'],
239 'CTRL_SYS': [
240 'TEST',
241 'JTAG_SEL',
242 'UBOOT_SEL',
243 'NMI#',
244 'RESET#',
245 'CLK24M_IN',
246 'CLK24M_OUT',
247 'PLLTEST',
248 'PLLREGIO',
249 'PLLVP25',
250 'PLLDV',
251 'PLLVREG',
252 'PLLGND',
253 ],
254 'POWER_DRAM': [
255 'VCC0_DRAM',
256 'VCC1_DRAM',
257 'VCC2_DRAM',
258 'VCC3_DRAM',
259 'VCC4_DRAM',
260 'VCC5_DRAM',
261 'VCC6_DRAM',
262 'VCC7_DRAM',
263 'VCC8_DRAM',
264 'VCC9_DRAM',
265 'GND0_DRAM',
266 'GND1_DRAM',
267 'GND2_DRAM',
268 'GND3_DRAM',
269 'GND4_DRAM',
270 'GND5_DRAM',
271 'GND6_DRAM',
272 'GND7_DRAM',
273 'GND8_DRAM',
274 'GND9_DRAM',
275 ],
276 'POWER_CPU': [
277 'VDD0_CPU',
278 'VDD1_CPU',
279 'VDD2_CPU',
280 'VDD3_CPU',
281 'VDD4_CPU',
282 'VDD5_CPU',
283 'GND0_CPU',
284 'GND1_CPU',
285 'GND2_CPU',
286 'GND3_CPU',
287 'GND4_CPU',
288 'GND5_CPU',
289 ],
290 'POWER_DLL': [
291 'VDD0_DLL',
292 'VDD1_DLL',
293 'VDD2_DLL',
294 'GND0_DLL',
295 'GND1_DLL',
296 'GND2_DLL',
297 ],
298 'POWER_INT': [
299 'VDD0_INT',
300 'VDD1_INT',
301 'VDD2_INT',
302 'VDD3_INT',
303 'VDD4_INT',
304 'VDD5_INT',
305 'VDD6_INT',
306 'VDD7_INT',
307 'VDD8_INT',
308 'VDD9_INT',
309 'GND0_INT',
310 'GND1_INT',
311 'GND2_INT',
312 'GND3_INT',
313 'GND4_INT',
314 'GND5_INT',
315 'GND6_INT',
316 'GND7_INT',
317 'GND8_INT',
318 'GND9_INT',
319 ],
320 'POWER_GPIO': [
321 'VDD_GPIOA',
322 'VDD_GPIOB',
323 'VDD_GPIOC',
324 'VDD_GPIOD',
325 'VDD_GPIOE',
326 'VDD_GPIOF',
327 'VDD_GPIOG',
328 'GND_GPIOA',
329 'GND_GPIOB',
330 'GND_GPIOC',
331 'GND_GPIOD',
332 'GND_GPIOE',
333 'GND_GPIOF',
334 'GND_GPIOG',
335 ]}
336
337 fixedpins = display_fixed(of, fixedpins, len(pinouts))
338
339 of.write ("""# Functions (PinMux)
340
341 auto-generated by [[pinouts.py]]
342
343 """)
344
345 function_names = {'EINT': 'External Interrupt',
346 'FB': 'MC68k FlexBus',
347 'IIS': 'I2S Audio',
348 'JTAG0': 'JTAG (same as JTAG1, JTAG_SEL=LOW)',
349 'JTAG1': 'JTAG (same as JTAG0, JTAG_SEL=HIGH)',
350 'LCD': '24-pin RGB/TTL LCD',
351 'RG': 'RGMII Ethernet',
352 'MMC': 'eMMC 1/2/4/8 pin',
353 'PWM': 'PWM (pulse-width modulation)',
354 'SD0': 'SD/MMC 0',
355 'SD1': 'SD/MMC 1',
356 'SD2': 'SD/MMC 2',
357 'SPI0': 'SPI (Serial Peripheral Interface) 0',
358 'SPI1': 'SPI (Serial Peripheral Interface) 1',
359 'QSPI': 'Quad SPI (Serial Peripheral Interface) 1',
360 'TWI0': 'I2C 1',
361 'TWI1': 'I2C 2',
362 'TWI2': 'I2C 3',
363 'UARTQ0': 'UART (TX/RX/CTS/RTS) 0',
364 'UARTQ1': 'UART (TX/RX/CTS/RTS) 1',
365 'UART0': 'UART (TX/RX) 0',
366 'UART1': 'UART (TX/RX) 1',
367 'UART2': 'UART (TX/RX) 2',
368 'ULPI0': 'ULPI (USB Low Pin-count) 1',
369 'ULPI1': 'ULPI (USB Low Pin-count) 2',
370 'ULPI2': 'ULPI (USB Low Pin-count) 3',
371 }
372
373 fns = display_fns(of, bankspec, pinouts, function_names)
374 of.write('\n')
375
376 # Scenarios below can be spec'd out as either "find first interface"
377 # by name/number e.g. SPI0, or as "find in bank/mux" which must be
378 # spec'd as "BM:Name" where B is bank (A-F), M is Mux (0-3)
379 # EINT and PWM are grouped together, specially, but may still be spec'd
380 # using "BM:Name". Pins are removed in-order as listed from
381 # lists (interfaces, EINTs, PWMs) from available pins.
382
383 # EOMA68 scenario. not totally complete (some GPIO needed for PMIC)
384 # One interface to be connected to the MCU to give RTC and boot/dbg
385 # VBUS_EN, OTG_ID etc. are all not included below, there is plenty
386 # of spare GPIO.
387
388 eoma68 = ['B1:LCD/22', 'ULPI0/8', 'ULPI1', 'MMC', 'SD0', 'UART1',
389 'TWI2', 'SPI1', 'E2:SD1', ]
390 eoma68_eint = ['EINT_16', 'EINT_17', 'EINT_18', 'EINT_19']
391 eoma68_pwm = ['D1:PWM_2']
392 descriptions = {
393 'MMC': 'internal (on Card)',
394 'SD0': 'user-facing: internal (on Card), multiplexed with JTAG0\n'
395 'and UART0, for debug purposes',
396 'TWI2': 'EOMA68-compliance: must be entirely free of devices.\n'
397 'Address 0x51 used (externally) for EOMA68 EEPROM Id',
398 'E2:SD1': 'EOMA68-compliance',
399 'SPI1': 'EOMA68-compliance',
400 'UART1': 'EOMA68-compliance',
401 'B1:LCD/22': 'EOMA68-compliance, 18-bit RGB/TTL LCD',
402 'ULPI0/8': 'user-facing: internal (on Card), USB-OTG ULPI PHY',
403 'ULPI1': 'EOMA68-compliance: dual USB2 Host ULPI PHY'
404 }
405
406 unused_pins = check_functions(of, "EOMA68", bankspec, fns, pinouts,
407 eoma68, eoma68_eint, eoma68_pwm,
408 descriptions)
409
410 # Industrial scenario. not totally complete (some GPIO needed for PMIC)
411 # One interface to be connected to the MCU to give RTC, boot/dbg,
412 # option of CAN Bus, ADC, DAC, OWB, more GPIO, more PWM etc. etc.
413 # Focus is on getting as many UARTs, SPIs and TWIs as possible.
414 # OTG_ID (if to be used) would require dropping some functions in order
415 # to free up GPIO. LCD could be reduced to 15-bit (freeing 3).
416 # MMC could be reduced to 4-bit-wide, used as SD/MMC (freeing 4).
417 # QSPI could be used in 1-bit (MOSI/MISO) mode (freeing up 2 more).
418
419 industrial = ['D1:FB/17', 'E1:FB/8', 'B1:LCD/22', 'ULPI0/8', 'ULPI1/8',
420 'MMC', 'B2:SD0',
421 'JTAG0', 'A3:UART0', 'E2:UARTQ1', 'C3:UARTQ0',
422 'F2:TWI0', 'D2:TWI1', 'D2:TWI2', 'SPI1', 'QSPI', 'F2:SD2']
423 industrial_pwm = ['F2:PWM_0', 'F2:PWM_1', 'D1:PWM_2']
424 industrial_eint = ['EINT_24', 'EINT_25', 'EINT_26', 'EINT_27',
425 'EINT_20', 'EINT_21', 'EINT_22', 'EINT_23']
426
427 unused_pins = check_functions(of, "Industrial", bankspec, fns, pinouts,
428 industrial, industrial_eint, industrial_pwm)
429
430 # Industrial scenario, using an SPI-based LCD instead of RGB/TTL
431 # not totally complete (some GPIO needed for PMIC)
432 # One interface to be connected to the MCU to give RTC, boot/dbg,
433 # option of CAN Bus, ADC, DAC, OWB, more GPIO, more PWM etc. etc.
434 # Focus is on getting as many UARTs, SPIs and TWIs as possible,
435 # leaving some GPIO spare from the RGB/TTL bank (SPI CS#)
436 # also possibility of freeing up FlexBus CS# with a little reorg.
437
438 industrial = ['D1:FB/17', 'E1:FB/8', 'B2:SPI0', 'ULPI0/8', 'ULPI1/8',
439 'MMC', 'B2:SD0',
440 'JTAG0',
441 'A3:UART0', 'E2:UARTQ1', 'C3:UARTQ0', 'B2:UART2', 'B2:UART1',
442 'F2:TWI0', 'D2:TWI1', 'D2:TWI2', 'SPI1', 'QSPI', 'F2:SD2']
443 industrial_pwm = ['F2:PWM_0', 'F2:PWM_1', 'D1:PWM_2']
444 industrial_eint = ['EINT_24', 'EINT_25', 'EINT_26', 'EINT_27',
445 'EINT_20', 'EINT_21', 'EINT_22', 'EINT_23']
446 ind_descriptions = {
447 'B2:SPI0': 'Used for 320x240 or 640x480 etc. SPI-based LCD.\n'
448 'Frees up large numbers of GPIO from RGB/TTL bank'
449 }
450 unused_pins = check_functions(of, "Industrial with SPI-LCD",
451 bankspec, fns, pinouts,
452 industrial, industrial_eint, industrial_pwm,
453 ind_descriptions)
454
455 # Smartphone / Tablet - basically the same thing
456
457 tablet = ['B1:LCD/22', 'ULPI0/8', 'ULPI1/8',
458 'MMC', 'SD0',
459 'F1:IIS', # I2C Audio
460 'TWI1', # I2C Audio
461 'E2:UARTQ1', # WIFI/BT
462 'E2:SD1', # WIFI
463 'C3:UARTQ0', # GPS
464 'D2:UART1',
465 'D2:UART2',
466 'D3:TWI0', 'D2:TWI2', 'SPI1', 'QSPI']
467 tablet_pwm = ['F2:PWM_0', # LCD_BACKLIGHT
468 'F2:PWM_1', 'D1:PWM_2']
469 tablet_eint = ['EINT_24', # BT_HOST_WAKE
470 'EINT_25', # WIFI_HOST_WAKE
471 'EINT_26', # CTP_INT
472 'EINT_27', # GSENSOR_INT
473 'EINT_8', # GPS_INT
474 'EINT_7', # TILT_SENSOR_INT
475 'EINT_22', # COMPASS_INT
476 'EINT_23', # MCU_INT
477 'EINT_16', # PMIC_INT
478 'EINT_17', # PWR_BUTTON_INT
479 'EINT_30', # OTG_ID
480 'EINT_31',
481 ]
482 descriptions = {
483 'B1:LCD/22':
484 'RGB/TTL LCD, 800x480 or use SN75LVDS83b for up to 1440x900',
485 'MMC': 'eMMC: main internal storage',
486 'ULPI0/8': 'USB-OTG, connect to ULPI OTG PHY (for charging)\n'
487 'as well as USB Host or USB Device',
488 'ULPI1/8': 'USB2 Host, connect to ULPI PHY w/and 4-port USB2 Hub\n'
489 'for example GL850G or FE1.1. '
490 'Connects to 2/3/4G/LTE Modem, 2x USB-Camera (VC0345)',
491 'SD0': 'internal, multiplexed with JTAG0\n'
492 'and UART0, for debug purposes',
493 'F1:IIS': 'I2C Audio, connect to AC97 Audio IC',
494 'TWI1': 'Connect to AC97 Audio IC',
495 'E2:UARTQ1': 'Connect to BT on AP6234/AP6335',
496 'E2:SD1': 'Connect to WIFI on AP6234/AP6335',
497 'QSPI': 'Boot Storage (connection to companion / debug / boot MCU)\n'
498 'Only actually needs MISO/MOSI, bootstrap loader v. small\n'
499 'Bootstrap loader checks eMMC, USB-OTG, SD/MMC, SPI, etc.',
500 'SPI1': 'Spare? SPI, connect to higher-speed sensor?',
501 'D2:UART1': 'Spare? UART (or 2 extra GPIO / EINT)',
502 'D2:UART2': 'Spare? UART (or 2 extra GPIO)',
503 'D3:TWI0': 'Connect to PMIC',
504 'D2:TWI2': 'Connect to sensors (Trackpad? CTP GSENSOR TILT COMPASS)',
505 'GPIO': '9 spare GPIO pins for miscellaneous functions:\n'
506 'wake-up of BT, WIFI, LCD power, sensor power etc.\n'
507 '4 GPIO may be needed for PWM Audio from Modem.\n'
508 'LED lights for camera will be needed.\n'
509 'Some phones may have clam-shell or lid switch.\n'
510 'Some Modems have spare GPIO (over AT commandset).\n'
511 'AXP209 PMIC has 4x GPIO, accessible over I2C.\n'
512 'SPI1, UART1-4, PWM1-2 may also be spare (10 extra GPIO).\n'
513 'If more needed, companion MCU may be used (48+ pin variant)\n'
514 'which also includes ADC, DAC, more PWM etc.',
515 'F2:PWM_0': 'LCD Backlight',
516 'F2:PWM_1': 'Spare? PWM (or extra GPIO / EINT)',
517 'D1:PWM_2': 'Spare? PWM (or extra GPIO / EINT)',
518 'EINT_24': 'BT_HOST_WAKE',
519 'EINT_25': 'WIFI_HOST_WAKE',
520 'EINT_26': 'CTP_INT',
521 'EINT_27': 'GSENSOR_INT',
522 'EINT_8': 'GPS_INT',
523 'EINT_7': 'TILT_SENSOR_INT',
524 'EINT_22': 'COMPASS_INT',
525 'EINT_23': 'MCU_INT',
526 'EINT_16': 'PMIC_INT',
527 'EINT_17': 'PWR_BUTTON_INT',
528 'EINT_30': 'OTG_ID',
529 'EINT_31': 'Spare?',
530 }
531 unused_pins = check_functions(of, "Smartphone / Tablet",
532 bankspec, fns, pinouts,
533 tablet, tablet_eint, tablet_pwm,
534 descriptions)
535
536 # Laptop
537
538 laptop = ['D1:FB/17', 'E1:FB/8', 'B1:LCD/22', 'ULPI0/8', 'ULPI1/8',
539 'MMC', 'SD0',
540 'F1:IIS', # I2C Audio
541 'TWI1', # I2C Audio
542 'E2:UARTQ1', # WIFI/BT
543 'E2:SD2', # WIFI
544 'D2:TWI2', 'QSPI']
545 laptop_pwm = ['F2:PWM_0', # LCD_BACKLIGHT
546 ]
547 laptop_eint = ['EINT_20', # BT_HOST_WAKE
548 'EINT_21', # WIFI_HOST_WAKE
549 'EINT_9', # MCU_INT
550 'EINT_31', # PMIC_INT
551 ]
552 descriptions = {
553 'D1:FB/17': 'FlexBus. Connect to DM9000 or AX99896A MCU-style Bus\n'
554 '10/100 Ethernet PHY.',
555 'E1:FB/8': 'FlexBus bus bits 8-15, needed to make a 16-bit bus width',
556 'B1:LCD/22': 'RGB/TTL LCD, use SN75LVDS83b for '
557 'LVDS or SSD2828 for MIPI,\n'
558 'or a Chrontel CH7039, CH7038, CH7034 or CH7018 for dual\n'
559 'display output (eDP/LVDS and HDMI/VGA) '
560 'conversion.',
561 'MMC': 'eMMC: main internal storage',
562 'ULPI0/8': 'USB-OTG, connect to ULPI OTG PHY (for charging)\n'
563 'as well as USB Host or USB Device',
564 'ULPI1/8': 'USB2 Host, connect to ULPI PHY w/and 4-port USB2 Hub\n'
565 'for example GL850G or FE1.1. '
566 'Connects to USB-Camera (VC0345 and 3x external USB Ports)',
567 'SD0': 'internal, multiplexed with JTAG0\n'
568 'and UART0, for debug purposes',
569 'F1:IIS': 'I2C Audio, connect to AC97 Audio IC',
570 'TWI1': 'Connect to AC97 Audio IC',
571 'E2:UARTQ1': 'Connect to BT on AP6234/AP6335',
572 'E2:SD2': 'Connect to WIFI on AP6234/AP6335',
573 'QSPI': 'Boot Storage (connection to companion / debug / boot MCU)\n'
574 'Only actually needs MISO/MOSI, bootstrap loader v. small\n'
575 'Bootstrap loader checks eMMC, USB-OTG, SD/MMC, SPI, etc.\n'
576 'MCU implements keyboard-matrix for keyboard (also trackpad?)',
577 'D2:TWI2': 'Connect to PMIC',
578 'GPIO': 'Plenty of spare GPIO pins for miscellaneous functions\n'
579 'MCU EINT-capable GPIO may be used to generate extra EINTs\n'
580 'on the single MCU_INT line, if really needed',
581 'F2:PWM_0': 'LCD Backlight',
582 'EINT_20': 'BT_HOST_WAKE',
583 'EINT_21': 'WIFI_HOST_WAKE',
584 'EINT_9': 'MCU_INT',
585 'EINT_31': 'PMIC_INT',
586 }
587 unused_pins = check_functions(of, "Laptop / Netbook",
588 bankspec, fns, pinouts,
589 laptop, laptop_eint, laptop_pwm,
590 descriptions)
591
592 # IoT
593
594 iot = ['B1:LCD', 'ULPI1/8', 'ULPI0/8',
595 'MMC', 'SD0',
596 'F1:IIS', # I2C Audio
597 #'TWI1', # I2C Audio
598 'C3:UARTQ0', # HSPA UART
599 'E2:UARTQ1', # BT UART
600 'C2:SPI1', # HSPI SPI
601 'E2:SD2', # WIFI
602 'D3:TWI0', # sensors CTP,
603 'D2:TWI2', 'QSPI']
604 iot_pwm = ['F2:PWM_0', # LCD_BACKLIGHT
605 ]
606 iot_eint = ['EINT_5', # 'HSPA_MST_RDY',
607 'EINT_6', # 'HSPA_SL_RDY',
608 'EINT_7', # 'HSPA_RING',
609 'EINT_8', # 'WL_PMU_EN',
610 'EINT_9', # HSPA_GPIO1
611 'EINT_10', # IR_DT
612 'EINT_11', # 'BT_PCM_CLK',
613 'EINT_12', # 'BT_PCM_DIN',
614 'EINT_13', # 'BT_PCM_SYNC',
615 'EINT_14', # 'BT_PCM_DOUT',
616 'EINT_16', # 'USB_DRVVBUS',
617 'EINT_17', # 'USB_VBUSDET',
618 'EINT_21', # 'USB_ID',
619 'EINT_30', # 'CTP_INT',
620 'EINT_31', # 'SD_DET#',
621 ]
622 descriptions = {
623 'B1:LCD':
624 'RGB/TTL LCD, use SN75LVDS83b for LVDS or SSD2828 for MIPI,\n'
625 'or a Chrontel CH7039, CH7038, CH7034 or CH7018 for dual\n'
626 'display output (eDP/LVDS and HDMI/VGA) '
627 'conversion.',
628 'MMC': 'eMMC: main internal storage',
629 'F1:IIS': 'I2C Audio, connect to AC97 Audio IC',
630 'ULPI1/8': 'USB-OTG, connect to ULPI OTG PHY (for charging)\n'
631 'as well as USB Host or USB Device',
632 'ULPI0/8': 'USB2 Host, connect to ULPI PHY',
633 'SD0': 'internal, multiplexed with JTAG0\n'
634 'and UART0, for debug purposes',
635 'C3:UARTQ0': 'Connect to HSPA UART',
636 'E2:UARTQ1': 'Connect to BT UART',
637 'E2:SD2': 'Connect to WIFI',
638 'C2:SPI1': 'HSPA SPI',
639 'QSPI': 'Boot Storage (connection to companion / debug / boot MCU)\n'
640 'Only actually needs MISO/MOSI, bootstrap loader v. small\n'
641 'Bootstrap loader checks eMMC, USB-OTG, SD/MMC, SPI, etc.\n'
642 'MCU implements keyboard-matrix for keyboard (also trackpad?)',
643 'D2:TWI2': 'Connect to PMIC',
644 'D3:TWI0': 'Connect to sensors CTP',
645 'GPIO': 'Plenty of spare GPIO pins for miscellaneous functions\n'
646 'MCU EINT-capable GPIO may be used to generate extra EINTs\n'
647 'on the single MCU_INT line, if really needed',
648 'F2:PWM_0': 'LCD Backlight',
649 'GPIOD_D4': 'WL_WAKE_AP',
650 'GPIOD_D5': 'BT_WAKE_AP',
651 'GPIOD_D6': 'AP_WAKE_BT',
652 'GPIOD_D7': 'AP_CK32KO',
653 'GPIOD_D8': 'HSPA_PWRON',
654 'GPIOD_D9': 'BT_RST_N',
655 'GPIOE_E5': 'HSPA_ON_OFF',
656 'GPIOD_D2': 'HSPA_SHUTDOWN',
657 'GPIOD_D3': 'CTP_RST',
658 'GPIOD_D12': 'LCD_RDN',
659 'GPIOD_D17': 'LCD_WRN',
660 'GPIOD_D18': 'LCD_RS',
661 'GPIOD_D21': 'LCD_CSN',
662
663 'EINT_5': 'HSPA_MST_RDY',
664 'EINT_6': 'HSPA_SL_RDY',
665 'EINT_7': 'HSPA_RING',
666 'EINT_8': 'WL_PMU_EN',
667 'EINT_9': 'HSPA_GPIO1',
668 'EINT_10': 'IR_DT',
669 'EINT_11': 'BT_PCM_CLK',
670 'EINT_12': 'BT_PCM_DIN',
671 'EINT_13': 'BT_PCM_SYNC',
672 'EINT_14': 'BT_PCM_DOUT',
673
674 'EINT_16': 'USB_DRVVBUS',
675 'EINT_17': 'USB_VBUSDET',
676 'EINT_21': 'USB_ID',
677 'EINT_30': 'CTP_INT',
678 'EINT_31': 'SD_DETN',
679 }
680 unused_pins = check_functions(of, "IoT",
681 bankspec, fns, pinouts,
682 iot, iot_eint, iot_pwm,
683 descriptions)
684
685 of.write ("""# Reference Datasheets
686
687 datasheets and pinout links
688 * <http://datasheets.chipdb.org/AMD/8018x/80186/amd-80186.pdf>
689 * <http://hands.com/~lkcl/eoma/shenzen/frida/FRD144A2701.pdf>
690 * <http://pinouts.ru/Memory/sdcard_pinout.shtml>
691 * p8 <http://www.onfi.org/~/media/onfi/specs/onfi_2_0_gold.pdf?la=en>
692 * <https://www.heyrick.co.uk/blog/files/datasheets/dm9000aep.pdf>
693 * <http://cache.freescale.com/files/microcontrollers/doc/app_note/AN4393.pdf>
694 * <https://www.nxp.com/docs/en/data-sheet/MCF54418.pdf>
695 * ULPI OTG PHY, ST <http://www.st.com/en/interfaces-and-transceivers/stulpi01a.html>
696 * ULPI OTG PHY, TI TUSB1210 <http://ti.com/product/TUSB1210/>
697
698 """)
699
700 return pinouts, bankspec, pinbanks, fixedpins