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