1
1
import argparse
2
2
import re
3
+ from jinja2 import Environment , FileSystemLoader , Template
3
4
from pathlib import Path
4
5
from stm32common import createFolder , deleteFolder , genSTM32List
5
6
26
27
# Out startup files
27
28
CMSIS_Startupfile = ""
28
29
29
- all_LL_file = "stm32yyxx_ll.h"
30
-
30
+ # List of STM32 series
31
31
stm32_series = []
32
32
33
+ # Templating
34
+ templates_dir = script_path / "templates"
35
+ all_ll_h_file = "stm32yyxx_ll.h"
36
+ ll_h_file = "stm32yyxx_ll_ppp.h"
37
+ c_file = "stm32yyxx_zz_ppp.c"
38
+
39
+ # Create the jinja2 environment.
40
+ j2_env = Environment (
41
+ loader = FileSystemLoader (str (templates_dir )), trim_blocks = True , lstrip_blocks = True
42
+ )
43
+ all_ll_header_file_template = j2_env .get_template (all_ll_h_file )
44
+ ll_h_file_template = j2_env .get_template (ll_h_file )
45
+ c_file_template = j2_env .get_template (c_file )
46
+ dsp_file_template = Template ('#include "../Source/{{ dsp }}/{{ dsp }}.c"' )
47
+
48
+ # re
49
+ peripheral_c_regex = re .compile (r"stm32\w+_[h]?[al][l]_(.*).c$" )
50
+ peripheral_h_regex = re .compile (r"stm32\w+_(\w+).h$" )
51
+
33
52
34
53
def checkConfig (arg_core , arg_cmsis ):
35
54
global core_path
@@ -69,24 +88,6 @@ def checkConfig(arg_core, arg_cmsis):
69
88
CMSIS_DSPSrc_path = CMSIS_path / "CMSIS" / "DSP" / "Source"
70
89
71
90
72
- # Add some pragma to ll header files to avoid several warnings
73
- # which will be corrected along Cube update
74
- def print_LL_header (open_file , name ):
75
- upper = name .upper ().replace ("." , "_" )
76
- open_file .write (
77
- """#ifndef _{0}_
78
- #define _{0}_
79
- /* LL raised several warnings, ignore them */
80
- #pragma GCC diagnostic push
81
- #pragma GCC diagnostic ignored \" -Wunused-parameter\"
82
- #pragma GCC diagnostic ignored \" -Wstrict-aliasing\"
83
-
84
- """ .format (
85
- upper
86
- )
87
- )
88
-
89
-
90
91
def printCMSISStartup (log ):
91
92
filelist = sorted (CMSIS_Device_ST_path .glob ("**/startup_*.s" ))
92
93
if len (filelist ):
@@ -159,7 +160,11 @@ def wrap(arg_core, arg_cmsis, log):
159
160
createFolder (LLoutInc_path )
160
161
if CMSIS_Startupfile .is_file ():
161
162
CMSIS_Startupfile .unlink ()
162
- full_ll_list = []
163
+ all_ll_h_list = []
164
+ # key: peripheral, value: serie list
165
+ ll_h_dict = {}
166
+ ll_c_dict = {}
167
+ hal_c_dict = {}
163
168
# Search all files for each series
164
169
for serie in stm32_series :
165
170
src = HALDrivers_path / ("STM32" + serie + "xx_HAL_Driver" ) / "Src"
@@ -169,64 +174,83 @@ def wrap(arg_core, arg_cmsis, log):
169
174
if log :
170
175
print ("Generating for " + serie + "..." )
171
176
lower = serie .lower ()
172
- # Generate stm32yyxx_[hal|ll]*.c file
177
+
178
+ # Search stm32yyxx_[hal|ll]*.c file
173
179
filelist = src .glob ("stm32" + lower + "xx_*.c" )
174
180
for fp in filelist :
175
181
# File name
176
182
fn = fp .name
183
+ found = peripheral_c_regex .match (fn )
177
184
if "_template" in fn :
178
185
continue
179
- outp = HALoutSrc_path
186
+ peripheral = found . group ( 1 ) if found else "hal"
180
187
if "_ll_" in fn :
181
- outp = LLoutSrc_path
182
- # Compute generic file name with path
183
- gp = outp / fn .replace (lower , "yy" )
184
- out_file = open (gp , "a" , newline = "\n " )
185
- # Amend file name under serie switch
186
- out_file .write ("#ifdef STM32" + serie + "xx\n " )
187
- out_file .write (' #include "' + fn + '"\n ' )
188
- out_file .write ("#endif\n " )
189
- out_file .close ()
190
- # Generate stm32yyxx_ll_*.h file
188
+ if peripheral in ll_c_dict :
189
+ ll_c_dict [peripheral ].append (lower )
190
+ else :
191
+ ll_c_dict [peripheral ] = [lower ]
192
+ else :
193
+ if peripheral in hal_c_dict :
194
+ hal_c_dict [peripheral ].append (lower )
195
+ else :
196
+ hal_c_dict [peripheral ] = [lower ]
197
+
198
+ # Search stm32yyxx_ll_*.h file
191
199
filelist = inc .glob ("stm32" + lower + "xx_ll_*.h" )
192
200
for fp in filelist :
193
- outp = LLoutInc_path
194
201
# File name
195
202
fn = fp .name
196
- # Compute generic file name
197
- gn = fn .replace (lower , "yy" )
198
- # with path
199
- gp = outp / gn
200
- out_file = open (gp , "a" , newline = "\n " )
201
- if gp .stat ().st_size == 0 :
202
- print_LL_header (out_file , gn )
203
- # Amend full LL header file
204
- full_ll_list .append (gn )
205
- # Amend file name under serie switch
206
- out_file .write ("#ifdef STM32" + serie + "xx\n " )
207
- out_file .write (' #include "' + fn + '"\n ' )
208
- out_file .write ("#endif\n " )
203
+ found = peripheral_h_regex .match (fn )
204
+ if not found :
205
+ continue
206
+ peripheral = found .group (1 )
207
+ # Amend all LL header list
208
+ all_ll_h_list .append (fn .replace (lower , "yy" ))
209
+ if peripheral in ll_h_dict :
210
+ ll_h_dict [peripheral ].append (lower )
211
+ else :
212
+ ll_h_dict [peripheral ] = [lower ]
213
+
214
+ # Generate stm32yyxx_hal_*.c file
215
+ for key , value in hal_c_dict .items ():
216
+ if key == "hal" :
217
+ filepath = HALoutSrc_path / c_file .replace ("zz" , "hal" ).replace (
218
+ "_ppp" , ""
219
+ )
220
+ else :
221
+ filepath = HALoutSrc_path / c_file .replace ("zz" , "hal" ).replace (
222
+ "ppp" , key
223
+ )
224
+ out_file = open (filepath , "w" , newline = "\n " )
225
+ out_file .write (
226
+ c_file_template .render (periph = key , type = "hal" , serieslist = value )
227
+ )
228
+ out_file .close ()
229
+ # Generate stm32yyxx_ll_*.c file
230
+ for key , value in ll_c_dict .items ():
231
+ filepath = LLoutSrc_path / c_file .replace ("zz" , "ll" ).replace (
232
+ "ppp" , key
233
+ )
234
+ out_file = open (filepath , "w" , newline = "\n " )
235
+ out_file .write (
236
+ c_file_template .render (periph = key , type = "ll" , serieslist = value )
237
+ )
238
+ out_file .close ()
239
+ # Generate stm32yyxx_ll_*.h file
240
+ for key , value in ll_h_dict .items ():
241
+ filepath = LLoutInc_path / ll_h_file .replace ("ppp" , key )
242
+ out_file = open (filepath , "w" , newline = "\n " )
243
+ out_file .write (ll_h_file_template .render (periph = key , serieslist = value ))
209
244
out_file .close ()
210
245
if log :
211
246
print ("done" )
212
247
213
- # Filter full LL header file
214
- full_ll_file = open (LLoutInc_path / all_LL_file , "w" , newline = "\n " )
215
- print_LL_header (full_ll_file , all_LL_file )
216
- full_ll_file .write ("/* Include Low Layers drivers */\n " )
217
- full_ll_list = sorted (set (full_ll_list ))
218
- for hn in full_ll_list :
219
- full_ll_file .write ('#include "' + hn + '"\n ' )
220
- full_ll_file .close ()
221
-
222
- # Search all LL header files to end guard
223
- filelist = LLoutInc_path .glob ("stm32yyxx_ll*.h" )
224
- for fp in filelist :
225
- out_file = open (fp , "a" , newline = "\n " )
226
- upper = fp .name .upper ().replace ("." , "_" )
227
- out_file .write ("#pragma GCC diagnostic pop\n " )
228
- out_file .write ("#endif /* _" + upper + "_ */\n " )
229
- out_file .close ()
248
+ # Filter all LL header file
249
+ all_ll_h_list = sorted (set (all_ll_h_list ))
250
+ # Generate the all LL header file
251
+ all_ll_file = open (LLoutInc_path / all_ll_h_file , "w" , newline = "\n " )
252
+ all_ll_file .write (all_ll_header_file_template .render (ll_header_list = all_ll_h_list ))
253
+ all_ll_file .close ()
230
254
231
255
# CMSIS startup files
232
256
printCMSISStartup (log )
@@ -249,7 +273,7 @@ def wrap(arg_core, arg_cmsis, log):
249
273
if not fdn .is_dir ():
250
274
createFolder (fdn )
251
275
out_file = open (fdn / (dn + ".c" ), "w" , newline = "\n " )
252
- out_file .write ('#include "../Source/{0}/{0}.c" \n ' . format ( dn ))
276
+ all_ll_file .write (dsp_file_template . render ( dsp_path = dn ))
253
277
out_file .close ()
254
278
return 0
255
279
0 commit comments