@@ -32,7 +32,7 @@ def build(env):
32
32
driver = device .get_driver ("rcc" )
33
33
regs = env .query (":cmsis:device:registers" )
34
34
35
- properties = {}
35
+ properties = {"regs" : regs }
36
36
properties ["target" ] = target = device .identifier
37
37
properties ["partname" ] = device .partname
38
38
properties ["core" ] = core = device .get_driver ("core" )["type" ]
@@ -64,23 +64,34 @@ def build(env):
64
64
properties ["lsi_frequency" ] = 32_000
65
65
properties ["boot_frequency" ] = properties ["hsi_frequency" ]
66
66
67
+ properties ["hsi48" ] = regs .search (r"RCC_(.*?)_HSI48ON" )
68
+ properties ["bdcr" ] = regs .search (r"RCC_(.*?)_RTCSEL_\d" )
69
+ properties ["usbprescaler" ] = regs .search ("RCC_CFGR_USBPRE" )
70
+ properties ["pll_input_range" ] = regs .findall ("RCC_.*?_PLL1RGE_\d" )
71
+
72
+ # STM32H7 map of domains to APB bus index
73
+ name_map = {
74
+ "D1" : 3 , "D21" : 1 , "D22" : 2 , "D3" : 4 ,
75
+ "CD" : 3 , "CD1" : 1 , "CD2" : 2 , "SRD" : 4 }
76
+ bus_prescalers = defaultdict (list )
77
+ for whole , reg , domain , index , div in regs .findall ("(RCC_(.*?)_(.*?)PPRE(\d?)_DIV(\d+))" ):
78
+ bus_prescalers [name_map .get (domain + index , index )].append ((whole , reg , div ))
79
+ # Not all header define the _DIV enumerations, so we manually add them here…
80
+ if not bus_prescalers :
81
+ for whole , reg , domain , index in regs .findall ("(RCC_(.*?)_(.*?)PPRE(\d?))" ):
82
+ for div , value in enumerate ((0b000 , 0b100 , 0b101 , 0b110 , 0b111 )):
83
+ value = (f"{ value } << { whole } _Pos" , reg , 2 ** div )
84
+ bus_prescalers [name_map .get (domain + index , index )].append (value )
85
+ properties ["bus_prescalers" ] = bus_prescalers
86
+ import pprint
87
+ pprint .pprint (bus_prescalers )
88
+
67
89
# TODO: Move this data into the device files
68
- properties ["usbprescaler" ] = device .has_driver ("usb" ) and target .family in ["f0" , "f1" , "f3" ]
69
90
properties ["pllprediv" ] = \
70
91
(target ["family" ] in ["f0" , "f3" ] or (target ["family" ] == "f1" and target ["name" ] in ["00" , "05" , "07" ]))
71
92
properties ["pllprediv2" ] = False # FIXME: not sure what value this should have
72
93
properties ["pll_hse_prediv2" ] = target ["family" ] == "f1" and target ["name" ] in ["01" , "02" , "03" ]
73
- properties ["hsi48" ] = \
74
- (target ["family" ] == "f0" and target ["name" ] in ["42" , "48" , "71" , "72" , "78" , "91" , "98" ]) or \
75
- (target ["family" ] == "l4" and target ["name" ][0 ] not in ["7" , "8" ]) or \
76
- (target ["family" ] == "l5" ) or \
77
- (target ["family" ] == "u5" )
78
- if target ["family" ] in ["l4" , "l5" ]:
79
- properties ["hsi48_cr" ] = "CRRCR"
80
- elif target ["family" ] in ["c0" , "u5" ]:
81
- properties ["hsi48_cr" ] = "CR"
82
- else :
83
- properties ["hsi48_cr" ] = "CR2"
94
+
84
95
properties ["pll_p" ] = ((target ["family" ] == "l4" and target ["name" ] not in ["12" , "22" ]) or target ["family" ] == "g4" )
85
96
properties ["overdrive" ] = (target ["family" ] == "f7" ) or \
86
97
((target ["family" ] == "f4" ) and target ["name" ] in ["27" , "29" , "37" , "39" , "46" , "69" , "79" ])
@@ -127,7 +138,6 @@ def build(env):
127
138
if target .family == "h7" else ""
128
139
properties ["cfgr3" ] = ("SRDCFGR" if target .name in ["a0" , "a3" , "b0" , "b3" ] else "D3CFGR" )
129
140
properties ["d3" ] = ("SRD" if target .name in ["a0" , "a3" , "b0" , "b3" ] else "D3" )
130
- properties ["bdcr" ] = "CSR1" if target .family in ["c0" ] else "CSR" if target .family in ["l0" , "l1" ] else "BDCR"
131
141
properties ["pll_ids" ] = ["1" , "2" , "3" ] if target .family in ["h7" , "u5" ] else [] if target .family in ["c0" ] else ["" ]
132
142
properties ["has_smps" ] = target ["family" ] == "h7" and (target ["name" ] in ["25" , "35" , "45" , "47" , "55" , "57" ] or \
133
143
(target ["name" ] in ["30" , "a3" , "b0" , "b3" ] and target ["variant" ] == "q" ))
@@ -145,7 +155,7 @@ def build(env):
145
155
146
156
all_peripherals = env .query (":cmsis:device:peripherals" )
147
157
rcc_map = defaultdict (dict )
148
- for (reg , per , typ ) in regs .findall (r"RCC_([A-Z0-9]*?)_([A-Z0-9]+ ?)(EN|RST)" ):
158
+ for (reg , per , typ ) in regs .findall (r"RCC_(A[HP]B\d?(?:ENR|RSTR)\d?)_(.* ?)(EN|RST)" ):
149
159
rcc_map [per ][typ ] = reg
150
160
rcc_enable = {}
151
161
rcc_reset = {}
0 commit comments