3 """ define functions here, with their pin names and the pin type.
5 each function returns a pair of lists
6 (or objects with a __getitem__ function)
8 the first list (or object) contains pin name plus type specifications.
12 * "-" for an input pin,
13 * "+" for an output pin,
14 * "*" for an in/out pin
16 each function is then added to the pinspec tuple, below, as a ("NAME",
19 different functions may be added multiple times under the same NAME,
20 so that complex (or large) functions can be split into one or more
21 groups (and placed on different pinbanks).
23 eint, pwm and gpio are slightly odd in that instead of a fixed list
24 an object is returned with a __getitem__ function that accepts a
25 slice object. in this way the actual generation of the pin name
26 is delayed until it is known precisely how many pins are to be
27 generated, and that's not known immediately (or it would be if
28 every single one of the functions below had a start and end parameter
29 added). see spec.interfaces.PinGen class slice on pingroup
31 the second list is the names of pins that are part of an inout bus.
32 this list of pins (a ganged group) will need to be changed under
33 the control of the function, as a group. for example: sdmmc's
34 D0-D3 pins are in-out, they all change from input to output at
35 the same time under the control of the function, therefore there's
36 no point having multiple in-out switch/control wires, as the
37 sdmmc is never going to do anything other than switch this entire
38 bank all at once. so in this particular example, sdmmc returns:
40 (['CMD+', 'CLK+', 'D0*', 'D1*', 'D2*', 'D3*'] # pin names
41 ['D0*', 'D1*', 'D2*', 'D3*']) # ganged bus names
45 def i2s(suffix
, bank
):
46 return (['MCK+', 'BCK+', 'LRCK+', 'DI-', 'DO+'],
50 def emmc(suffix
, bank
, pincount
=8):
51 emmcpins
= ['CMD+', 'CLK+']
53 for i
in range(pincount
):
55 emmcpins
.append(pname
)
57 return (emmcpins
, inout
)
60 def sdmmc(suffix
, bank
):
61 return emmc(suffix
, bank
, pincount
=4)
64 def spi(suffix
, bank
):
65 pins
= ['CLK*', 'NSS*', 'MOSI*', 'MISO*']
69 def quadspi(suffix
, bank
):
70 qpins
= ['CK*', 'NSS*']
79 def i2c(suffix
, bank
):
80 return (['SDA*', 'SCL*'], [])
83 def jtag(suffix
, bank
):
84 return (['TMS+', 'TDI-', 'TDO+', 'TCK+'], [])
87 def uart(suffix
, bank
):
88 return (['TX+', 'RX-'], [])
91 def ulpi(suffix
, bank
):
92 ulpipins
= ['CK+', 'DIR+', 'STP+', 'NXT+']
94 ulpipins
.append('D%d*' % i
)
98 def uartfull(suffix
, bank
):
99 return (['TX+', 'RX-', 'CTS-', 'RTS+'],
103 def rgbttl(suffix
, bank
):
104 ttlpins
= ['CK+', 'DE+', 'HS+', 'VS+']
106 ttlpins
.append("D%d+" % i
)
110 def rgmii(suffix
, bank
):
113 buspins
.append("ERXD%d-" % i
)
115 buspins
.append("ETXD%d+" % i
)
116 buspins
+= ['ERXCK-', 'ERXERR-', 'ERXDV-',
118 'ETXEN+', 'ETXCK+', 'ECRS-',
123 def flexbus1(suffix
, bank
):
128 buspins
.append(pname
)
131 buspins
.append("CS%d+" % i
)
132 buspins
+= ['ALE', 'OE', 'RW', 'TA', 'CLK+',
133 'A0', 'A1', 'TS', 'TBST',
136 buspins
.append("BWE%d" % i
)
137 for i
in range(2, 6):
138 buspins
.append("CS%d+" % i
)
139 return (buspins
, inout
)
142 def flexbus2(suffix
, bank
):
144 for i
in range(8, 32):
145 buspins
.append("AD%d*" % i
)
146 return (buspins
, buspins
)
149 def sdram1(suffix
, bank
):
153 pname
= "SDRDQM%d*" % i
154 buspins
.append(pname
)
157 buspins
.append("SDRAD%d+" % i
)
159 buspins
.append("SDRDQ%d+" % i
)
161 buspins
.append("SDRCS%d#+" % i
)
163 buspins
.append("SDRDQ%d+" % i
)
165 buspins
.append("SDRBA%d+" % i
)
166 buspins
+= ['SDRCKE+', 'SDRRAS#+', 'SDRCAS#+', 'SDRWE#+',
168 return (buspins
, inout
)
171 def sdram2(suffix
, bank
):
174 for i
in range(3, 6):
175 buspins
.append("SDRCS%d#+" % i
)
176 for i
in range(16, 32):
177 pname
= "SDRDQM%d*" % i
178 buspins
.append(pname
)
180 return (buspins
, inout
)
183 def mcu8080(suffix
, bank
):
187 pname
= "MCUD%d*" % i
188 buspins
.append(pname
)
191 buspins
.append("MCUAD%d+" % (i
+ 8))
193 buspins
.append("MCUCS%d+" % i
)
195 buspins
.append("MCUNRB%d+" % i
)
196 buspins
+= ['MCUCD+', 'MCURD+', 'MCUWR+', 'MCUCLE+', 'MCUALE+',
198 return (buspins
, inout
)
201 class RangePin(object):
202 def __init__(self
, suffix
, prefix
=None):
204 self
.prefix
= prefix
or ''
206 def __getitem__(self
, s
):
208 for idx
in range(s
.start
or 0, s
.stop
or -1, s
.step
or 1):
209 res
.append("%s%d%s" % (self
.prefix
, idx
, self
.suffix
))
213 def eint(suffix
, bank
):
214 return (RangePin("-"), [])
217 def pwm(suffix
, bank
):
218 return (RangePin("+"), [])
221 def gpio(suffix
, bank
):
222 return (("GPIO%s" % bank
, RangePin(prefix
=bank
, suffix
="*")), [])
225 # list functions by name here
227 pinspec
= (('IIS', i2s
),