11import glob
22import hashlib
3- import yaml
4- import os
3+ import re
54
65import modm_devices
76
@@ -106,6 +105,66 @@ def __getitem__(self, item) -> modm_devices.device.Device:
106105 return value
107106
108107
108+ def map_signal (s ):
109+ if s is None :
110+ return None
111+
112+ if s ["driver" ] == "tim" and s ["name" ].startswith ("ch" ):
113+ return {
114+ "func" : "timer" ,
115+ "af" : int (s .get ("af" , "-1" )),
116+ "instance" : int (s ["instance" ]),
117+ "name" : s ["name" ],
118+ }
119+ elif s ["driver" ] == "spi" and (
120+ s ["name" ] == "sck"
121+ or s ["name" ] == "mosi"
122+ or s ["name" ] == "miso"
123+ or s ["name" ] == "tx"
124+ or s ["name" ] == "rx"
125+ ):
126+ return {
127+ "func" : "spi" ,
128+ "af" : int (s .get ("af" , "-1" )),
129+ "instance" : int (s ["instance" ]),
130+ "name" : {"tx" : "mosi" , "rx" : "miso" }.get (s ["name" ], s ["name" ]),
131+ }
132+ elif (s ["driver" ] == "uart" or s ["driver" ] == "usart" ) and (
133+ s ["name" ] == "rx" or s ["name" ] == "tx"
134+ ):
135+ return {
136+ "func" : "serial" ,
137+ "af" : int (s .get ("af" , "-1" )),
138+ "instance" : int (s ["instance" ]),
139+ "name" : s ["name" ],
140+ }
141+ elif s ["driver" ] == "adc" and re .match (r"in\d+" , s .get ("name" , "in0" )):
142+ return {
143+ "func" : "adc" ,
144+ "af" : - 1 ,
145+ "instance" : int (s ["instance" ]),
146+ "name" : s .get ("name" , "in0xff" )[2 :],
147+ }
148+ else :
149+ return None
150+
151+
152+ def map_tag (f ):
153+ if f is None :
154+ return None
155+
156+ if f ["func" ] == "timer" :
157+ return f"TIMER_TAG(TIMER{ f ['instance' ]} , TIMER_{ f ['name' ]} )" .upper ()
158+ elif f ["func" ] == "spi" :
159+ return f"SPI_TAG(SPI_PORT{ f ['instance' ]} , RES_SPI_{ f ['name' ]} )" .upper ()
160+ elif f ["func" ] == "serial" :
161+ return f"SERIAL_TAG(SERIAL_PORT{ f ['instance' ]} , RES_SERIAL_{ f ['name' ]} )" .upper ()
162+ elif f ["func" ] == "adc" :
163+ return f"ADC_TAG(ADC_DEVICE{ f ['instance' ]} , { f ['name' ]} )" .upper ()
164+ else :
165+ return None
166+
167+
109168devices = [
110169 "stm32f405rg" ,
111170 "stm32f411re" ,
@@ -123,100 +182,58 @@ def __getitem__(self, item) -> modm_devices.device.Device:
123182 pins = {}
124183 key = next ((x for x in caches .keys () if x .startswith (device )), None )
125184
126- for driver in caches [key ].get_all_drivers ("gpio" ):
127- for pin in driver ["gpio" ]:
128- funcs = []
185+ with open (f"src/system/{ device [:9 ]} /gpio_pins.in" , "w" ) as file :
186+ for driver in caches [key ].get_all_drivers ("gpio" ):
187+ for pin in driver ["gpio" ]:
188+ file .write (f"GPIO_PIN({ pin ['port' ]} , { pin ['pin' ]} )\n " .upper ())
189+ if "signal" not in pin :
190+ continue
129191
130- if "signal" in pin :
131192 for s in pin ["signal" ]:
132- if s ["driver" ] == "tim" and s ["name" ].startswith ("ch" ):
133- funcs .append (
134- {
135- "func" : "timer" ,
136- "af" : int (s ["af" ]),
137- "instance" : int (s ["instance" ]),
138- "name" : s ["name" ],
139- }
140- )
141-
142- if s ["driver" ] == "spi" and (
143- s ["name" ] == "sck" or s ["name" ] == "mosi" or s ["name" ] == "miso"
144- ):
145- funcs .append (
146- {
147- "func" : "spi" ,
148- "af" : int (s ["af" ]),
149- "instance" : int (s ["instance" ]),
150- "name" : s ["name" ],
151- }
152- )
153-
154- if (s ["driver" ] == "uart" or s ["driver" ] == "usart" ) and (
155- s ["name" ] == "rx" or s ["name" ] == "tx"
156- ):
157- funcs .append (
158- {
159- "func" : "serial" ,
160- "af" : int (s ["af" ]),
161- "instance" : int (s ["instance" ]),
162- "name" : s ["name" ],
163- }
164- )
165-
166- if s ["driver" ] == "adc" and not (
167- s ["name" ].startswith ("inp" ) or s ["name" ].startswith ("inn" )
168- ):
169- funcs .append (
170- {
171- "func" : "adc" ,
172- "af" : - 1 ,
173- "instance" : int (s ["instance" ]),
174- "name" : s ["name" ][2 :],
175- }
176- )
177-
178- pins [f"P{ pin ['port' ]} { pin ['pin' ]} " .upper ()] = funcs
179-
180- with open (f"src/system/{ device [:9 ]} /gpio_pins.yaml" , "w" ) as file :
181- documents = yaml .dump (pins , file , sort_keys = False )
182-
183- for filename in glob .glob ("src/system/*/gpio_pins.yaml" ):
184- dir = os .path .dirname (filename )
185-
186- with open (filename , "r" ) as f :
187- pins = yaml .load (f , Loader = yaml .Loader )
188-
189- with open (f"{ dir } /gpio_pins.in" , "w" ) as file :
190- for k , funcs in pins .items ():
191- port = k [1 ]
192- pin = k [2 :]
193- file .write (f"GPIO_PIN({ port } , { pin } )\n " )
194-
195- for f in funcs :
196- line = f"GPIO_AF(PIN_{ port } { pin } , { f ['af' ]} , "
197-
198- if f ["func" ] == "timer" :
199- line = (
200- line
201- + f"TIMER_TAG(TIMER{ f ['instance' ]} , TIMER_{ f ['name' ].upper ()} ))\n "
202- )
203-
204- if f ["func" ] == "spi" :
205- line = (
206- line
207- + f"SPI_TAG(SPI_PORT{ f ['instance' ]} , RES_SPI_{ f ['name' ].upper ()} ))\n "
208- )
209-
210- if f ["func" ] == "serial" :
211- line = (
212- line
213- + f"SERIAL_TAG(SERIAL_PORT{ f ['instance' ]} , RES_SERIAL_{ f ['name' ].upper ()} ))\n "
214- )
215-
216- if f ["func" ] == "adc" :
217- line = (
218- line
219- + f"ADC_TAG(ADC_DEVICE{ f ['instance' ]} , { f ['name' ].upper ()} ))\n "
193+ f = map_signal (s )
194+ s = map_tag (f )
195+ if s is None :
196+ continue
197+ file .write (
198+ f"GPIO_AF(PIN_{ pin ['port' ]} { pin ['pin' ]} , { f ['af' ]} , { s } )\n " .upper ()
220199 )
221200
222- file .write (line )
201+ with open (f"src/system/{ device [:9 ]} /dma.in" , "w" ) as file :
202+ for driver in caches [key ].get_all_drivers ("dma" ):
203+ if "streams" in driver :
204+ for dma in driver ["streams" ]:
205+ for stream in dma ["stream" ]:
206+ for channel in stream ["channel" ]:
207+ funcs = [
208+ r
209+ for s in channel ["signal" ]
210+ if (r := map_tag (map_signal (s ))) is not None
211+ ]
212+ for func in funcs :
213+ entry = ", " .join (
214+ [
215+ f".tag = { func } " ,
216+ f".port_index = { dma ['instance' ]} " ,
217+ f".stream_index = { stream ['position' ]} " ,
218+ f".channel = LL_DMA_CHANNEL_{ channel ['position' ]} " ,
219+ ]
220+ )
221+ file .write ("{ " + entry + " },\n " )
222+ if "requests" in driver :
223+ for dma in driver ["requests" ]:
224+ for request in dma ["request" ]:
225+ funcs = [
226+ r
227+ for s in request ["signal" ]
228+ if (r := map_tag (map_signal (s ))) is not None
229+ ]
230+ for func in funcs :
231+ entry = ", " .join (
232+ [
233+ f".tag = { func } " ,
234+ f".port_index = -1" ,
235+ f".stream_index = -1" ,
236+ f".request = { request ['position' ]} " ,
237+ ]
238+ )
239+ file .write ("{ " + entry + " },\n " )
0 commit comments