@@ -22,131 +22,152 @@ def prepare(module, options):
22
22
if not options [":target" ].has_driver ("rcc:stm32*" ):
23
23
return False
24
24
25
- module .depends (":cmsis:device" , ":utils" , ":platform:clock" , ":architecture:delay" )
26
- # FIXME: Move Peripherals enum somewhere better
27
- module .depends (":platform:gpio" )
25
+ module .depends (":cmsis:device" , ":utils" , ":platform:clock" ,
26
+ ":architecture:delay" , ":platform:gpio" , ":cmsis:ll:rcc" )
28
27
return True
29
28
30
29
def build (env ):
31
30
device = env [":target" ]
32
31
driver = device .get_driver ("rcc" )
33
32
regs = env .query (":cmsis:device:registers" )
34
33
35
- properties = {}
36
- properties ["target" ] = target = device .identifier
37
- properties ["partname" ] = device .partname
38
- properties ["core" ] = core = device .get_driver ("core" )["type" ]
39
-
40
- if target ["family" ] in ["c0" ]:
41
- properties ["hsi_frequency" ] = 48_000_000
42
- properties ["lsi_frequency" ] = 32_000
43
- properties ["boot_frequency" ] = 12_000_000
44
- elif target ["family" ] in ["f0" , "f1" , "f3" ]:
45
- properties ["hsi_frequency" ] = 8_000_000
46
- properties ["lsi_frequency" ] = 40_000
47
- properties ["boot_frequency" ] = properties ["hsi_frequency" ]
48
- elif target ["family" ] in ["h7" ]:
49
- properties ["hsi_frequency" ] = 64_000_000
50
- properties ["lsi_frequency" ] = 32_000
51
- properties ["boot_frequency" ] = properties ["hsi_frequency" ]
52
- elif target ["family" ] in ["l0" , "l1" ]:
53
- properties ["hsi_frequency" ] = 16_000_000
54
- properties ["lsi_frequency" ] = 37_000
55
- properties ["msi_frequency" ] = 2_097_000
56
- properties ["boot_frequency" ] = properties ["msi_frequency" ]
57
- elif target ["family" ] in ["l5" ]:
58
- properties ["hsi_frequency" ] = 16_000_000
59
- properties ["lsi_frequency" ] = 32_000
60
- properties ["msi_frequency" ] = 4_000_000
61
- properties ["boot_frequency" ] = properties ["msi_frequency" ]
62
- else :
63
- properties ["hsi_frequency" ] = 16_000_000
64
- properties ["lsi_frequency" ] = 32_000
65
- properties ["boot_frequency" ] = properties ["hsi_frequency" ]
34
+ p = {"regs" : regs }
35
+ p ["target" ] = target = device .identifier
36
+ p ["partname" ] = device .partname
37
+ p ["core" ] = core = device .get_driver ("core" )["type" ]
38
+
39
+ # These definitions must exist on all devices
40
+ p ["boot_frequency" ] = "HSI_VALUE"
41
+ if target .family in ["c0" ]:
42
+ p ["boot_frequency" ] = "12'000'000"
43
+ elif target .family in ["l0" , "l1" ]:
44
+ p ["boot_frequency" ] = "2'097'000"
45
+ elif target .family in ["l5" ]:
46
+ p ["boot_frequency" ] = "4'000'000"
47
+
48
+ # We're using two regex here, since some headers have both PLLSOURCE *and* PLL1SOURCE
49
+ p ["pll_source" ] = regs .findall (r"(LL_RCC_PLLSOURCE_(.+?))" ) or regs .findall (r"(LL_RCC_PLL1SOURCE_(.+?))" )
50
+ assert p ["pll_source" ], "Cannot find PllSource enums"
51
+
52
+ p ["sys_source" ] = regs .findall (r"(LL_RCC_SYS_CLKSOURCE_(.{1,9}))" )
53
+ assert p ["sys_source" ], "Cannot find SystemClockSource enums"
54
+ p ["cfgr_sws_pos" ] = regs .search ("RCC_.*?_SWS_Pos" )
55
+
56
+ p ["rtc_source" ] = regs .findall (r"(LL_RCC_RTC_CLKSOURCE_(.+?))" )
57
+ assert p ["rtc_source" ], "Cannot find RealTimeClockSource enums"
58
+
59
+ p ["ahb_prescaler" ] = regs .findall (r"(LL_RCC_SYSCLK_DIV_(\d+?))" )
60
+ assert p ["ahb_prescaler" ], "Cannot find AhbPrescaler enums"
61
+
62
+ apb_prescaler = defaultdict (list )
63
+ for reg , bus , div in regs .findall (r"(LL_RCC_APB(\d)?_DIV_(\d+?))" ):
64
+ apb_prescaler [bus ].append ((reg , div ))
65
+ assert apb_prescaler , "Cannot find any ApbPrescaler enums"
66
+ p ["apb_prescaler" ] = apb_prescaler
67
+
68
+ mco_source = defaultdict (lambda : ([], []))
69
+ for reg , mco , name in regs .findall (r"(LL_RCC_MCO(\d?)SOURCE_(.+?))" ):
70
+ mco_source [mco ][0 ].append ((reg , name ))
71
+ for reg , mco , div in regs .findall (r"(LL_RCC_MCO(\d?)_DIV_(\d+?))" ):
72
+ mco_source [mco ][1 ].append ((reg , div ))
73
+ assert mco_source , "Cannot find any ClockOutputSource enums"
74
+ p ["mco_source" ] = mco_source
75
+
76
+ # These may not exist on all devices
77
+ p ["can_source" ] = regs .findall (r"(LL_RCC_FDCAN_CLKSOURCE_(.+?))" )
78
+ p ["hsi_div" ] = regs .findall (r"(LL_RCC_HSI_DIV_?(\d+))" )
79
+ p ["pll_mul" ] = regs .findall (r"(LL_RCC_PLL_MUL_(\d+_?\d?))" )
80
+ p ["pll_input_range" ] = regs .findall (r"(LL_RCC_PLLINPUTRANGE_(\d+_\d+))" )
81
+ p ["usbprescaler" ] = regs .search (r"RCC_CFGR_USBPRE" )
82
+
83
+ # There is sadly no easy way to find the MSI range values, so we have to hardcode them
84
+ msi_range = regs .findall (r"(LL_RCC_MSIK?RANGE_)\d+" )
85
+ p ["msi_clocks" ] = ["K" , "S" ] if "K" in msi_range [0 ] else (["" ] if msi_range else [])
86
+ if len (msi_range ) == 7 :
87
+ msi_range = (msi_range [0 ], ("kHz65_536" , "kHz131_072" , "kHz262_144" , "kHz524_288" , "MHz1_048" , "MHz2_097" , "MHz4_194" ))
88
+ elif len (msi_range ) == 12 :
89
+ msi_range = (msi_range [0 ], ("kHz100" , "kHz200" , "kHz400" , "kHz800" , "MHz1" , "MHz2" ,
90
+ "MHz4" , "MHz8" , "MHz16" , "MHz24" , "MHz32" , "MHz48" ))
91
+ elif len (msi_range ) == 16 :
92
+ msi_range = (msi_range [0 ], ("MHz48" , "MHz24" , "MHz16" , "MHz12" , "MHz4" , "MHz2" , "MHz1_5" , "MHz1" , "MHz3_072" ,
93
+ "MHz1_536" , "MHz1_024" , "kHz768" , "kHz400" , "kHz200" , "kHz133" , "kHz100" ))
94
+ p ["msi_range" ] = msi_range
95
+
96
+
97
+ p ["hsi48" ] = regs .search (r"RCC_.*?_HSI48ON" )
98
+ p ["hsi14" ] = regs .search (r"RCC_.*?_HSI14ON" )
99
+ p ["bdcr" ] = regs .search (r"RCC_(.*?)_RTCSEL_\d" )
100
+
66
101
67
102
# TODO: Move this data into the device files
68
- properties ["usbprescaler" ] = device .has_driver ("usb" ) and target .family in ["f0" , "f1" , "f3" ]
69
- properties ["pllprediv" ] = \
70
- (target ["family" ] in ["f0" , "f3" ] or (target ["family" ] == "f1" and target ["name" ] in ["00" , "05" , "07" ]))
71
- properties ["pllprediv2" ] = False # FIXME: not sure what value this should have
72
- properties ["pll_hse_prediv2" ] = target ["family" ] == "f1" and target ["name" ] in ["01" , "02" , "03" ]
73
- properties ["hsi48" ] = \
74
- (target ["family" ] in ["g4" , "h5" , "h7" , "l5" , "u0" , "u5" ]) or \
75
- (target ["family" ] == "f0" and target ["name" ] in ["42" , "48" , "71" , "72" , "78" , "91" , "98" ]) or \
76
- (target ["family" ] == "g0" and target ["name" ] in ["b1" , "c1" ]) or \
77
- (target ["family" ] == "l0" and target ["name" ][1 ] == "2" ) or \
78
- (target ["family" ] == "l4" and target ["name" ][0 ] not in ["7" , "8" ])
79
- if target ["family" ] in ["g4" , "l0" , "l4" , "l5" , "u0" ]:
80
- properties ["hsi48_cr" ] = "CRRCR"
81
- elif target ["family" ] in ["g0" , "h5" , "h7" , "u5" ]:
82
- properties ["hsi48_cr" ] = "CR"
83
- elif target ["family" ] in ["f0" ]:
84
- properties ["hsi48_cr" ] = "CR2"
85
- properties ["pll_p" ] = ((target ["family" ] == "l4" and target ["name" ] not in ["12" , "22" ]) or target ["family" ] == "g4" )
86
- properties ["overdrive" ] = (target ["family" ] == "f7" ) or \
87
- ((target ["family" ] == "f4" ) and target ["name" ] in ["27" , "29" , "37" , "39" , "46" , "69" , "79" ])
88
- properties ["vos0_overdrive" ] = (target ["family" ] == "h7" ) and \
89
- target ["name" ] in ["42" , "43" , "45" , "47" , "50" , "53" , "55" , "57" ]
90
- properties ["has_r1mode" ] = (target ["family" ] == "g4" ) or \
91
- (target ["family" ] == "l4" and target ["name" ][0 ] in ["p" , "q" , "r" , "s" ])
92
- properties ["pllsai_p_usb" ] = (target ["family" ] == "f7" ) or \
93
- ((target ["family" ] == "f4" ) and target ["name" ] in ["46" , "69" , "79" ])
103
+ p ["pllprediv" ] = \
104
+ (target .family in ["f0" , "f3" ] or (target .family == "f1" and target .name in ["00" , "05" , "07" ]))
105
+ p ["pllprediv2" ] = False # FIXME: not sure what value this should have
106
+ p ["pll_hse_prediv2" ] = target .family == "f1" and target .name in ["01" , "02" , "03" ]
107
+ p ["pll_p" ] = ((target .family == "l4" and target .name not in ["12" , "22" ]) or target .family == "g4" )
108
+ p ["overdrive" ] = (target .family == "f7" ) or \
109
+ ((target .family == "f4" ) and target .name in ["27" , "29" , "37" , "39" , "46" , "69" , "79" ])
110
+ p ["vos0_overdrive" ] = (target .family == "h7" ) and \
111
+ target .name in ["42" , "43" , "45" , "47" , "50" , "53" , "55" , "57" ]
112
+ p ["has_r1mode" ] = (target .family == "g4" ) or \
113
+ (target .family == "l4" and target .name [0 ] in ["p" , "q" , "r" , "s" ])
114
+ p ["pllsai_p_usb" ] = (target .family == "f7" ) or \
115
+ ((target .family == "f4" ) and target .name in ["46" , "69" , "79" ])
94
116
95
117
if target .family in ["h7" ]:
96
118
if target .name in ["a3" , "b0" , "b3" ]:
97
- properties ["cfgr_prescaler" ] = "CDCFGR1"
119
+ p ["cfgr_prescaler" ] = "CDCFGR1"
98
120
else :
99
- properties ["cfgr_prescaler" ] = "D1CFGR"
121
+ p ["cfgr_prescaler" ] = "D1CFGR"
100
122
elif target .family in ["u5" ]:
101
- properties ["cfgr_prescaler" ] = "CFGR2"
123
+ p ["cfgr_prescaler" ] = "CFGR2"
102
124
else :
103
- properties ["cfgr_prescaler" ] = "CFGR"
125
+ p ["cfgr_prescaler" ] = "CFGR"
104
126
105
127
if target .family in ["h7" ]:
106
128
if target .name in ["a3" , "b0" , "b3" ]:
107
- properties ["cfgr2" ] = "CDCFGR2"
129
+ p ["cfgr2" ] = "CDCFGR2"
108
130
else :
109
- properties ["cfgr2" ] = "D2CFGR"
131
+ p ["cfgr2" ] = "D2CFGR"
110
132
elif target .family in ["u5" ]:
111
- properties ["cfgr2" ] = "CFGR2"
133
+ p ["cfgr2" ] = "CFGR2"
112
134
else :
113
- properties ["cfgr2" ] = "CFGR"
135
+ p ["cfgr2" ] = "CFGR"
114
136
115
137
if target .family in ["h7" ]:
116
138
if target .name in ["a3" , "b0" , "b3" ]:
117
- properties ["ccipr1" ] = "CDCCIP1R"
139
+ p ["ccipr1" ] = "CDCCIP1R"
118
140
else :
119
- properties ["ccipr1" ] = "D2CCIP1R"
141
+ p ["ccipr1" ] = "D2CCIP1R"
120
142
elif target .family in ["l5" , "u5" ]:
121
- properties ["ccipr1" ] = "CCIPR1"
143
+ p ["ccipr1" ] = "CCIPR1"
122
144
else :
123
- properties ["ccipr1" ] = "CCIPR"
145
+ p ["ccipr1" ] = "CCIPR"
124
146
125
- properties ["d1" ] = ("CD" if target .name in ["a3" , "b0" , "b3" ] else "D1" ) \
147
+ p ["d1" ] = ("CD" if target .name in ["a3" , "b0" , "b3" ] else "D1" ) \
126
148
if target .family == "h7" else ""
127
- properties ["d2" ] = ("CD" if target .name in ["a3" , "b0" , "b3" ] else "D2" ) \
149
+ p ["d2" ] = ("CD" if target .name in ["a3" , "b0" , "b3" ] else "D2" ) \
128
150
if target .family == "h7" else ""
129
- properties ["cfgr3" ] = ("SRDCFGR" if target .name in ["a0" , "a3" , "b0" , "b3" ] else "D3CFGR" )
130
- properties ["d3" ] = ("SRD" if target .name in ["a0" , "a3" , "b0" , "b3" ] else "D3" )
131
- properties ["bdcr" ] = "CSR1" if target .family in ["c0" ] else "CSR" if target .family in ["l0" , "l1" ] else "BDCR"
132
- properties ["pll_ids" ] = ["1" , "2" , "3" ] if target .family in ["h7" , "u5" ] else [] if target .family in ["c0" ] else ["" ]
133
- properties ["has_smps" ] = target ["family" ] == "h7" and (target ["name" ] in ["25" , "35" , "45" , "47" , "55" , "57" ] or \
134
- (target ["name" ] in ["30" , "a3" , "b0" , "b3" ] and target ["variant" ] == "q" ))
151
+ p ["cfgr3" ] = ("SRDCFGR" if target .name in ["a0" , "a3" , "b0" , "b3" ] else "D3CFGR" )
152
+ p ["d3" ] = ("SRD" if target .name in ["a0" , "a3" , "b0" , "b3" ] else "D3" )
153
+ p ["pll_ids" ] = ["1" , "2" , "3" ] if target .family in ["h7" , "u5" ] else [] if target .family in ["c0" ] else ["" ]
154
+ p ["has_smps" ] = target .family == "h7" and (target .name in ["25" , "35" , "45" , "47" , "55" , "57" ] or \
155
+ (target .name in ["30" , "a3" , "b0" , "b3" ] and target ["variant" ] == "q" ))
135
156
136
157
flash_latencies = {}
137
158
for vcore in device .get_driver ("flash" )["latency" ]:
138
159
flash_latencies [int (vcore ["vcore-min" ])] = sorted ([int (f ["hclk-max" ]) for f in vcore ["wait-state" ]])
139
160
140
- properties ["table" ] = flash_latencies
141
- env .substitutions = properties
161
+ p ["table" ] = flash_latencies
162
+ env .substitutions = p
142
163
env .outbasepath = "modm/src/modm/platform/clock"
143
164
144
165
env .template ("rcc.cpp.in" )
145
166
env .template ("rcc.hpp.in" )
146
167
147
168
all_peripherals = env .query (":cmsis:device:peripherals" )
148
169
rcc_map = defaultdict (dict )
149
- for (reg , per , typ ) in regs .findall (r"RCC_([A-Z0-9]*?)_([A-Z0-9]+ ?)(EN|RST)" ):
170
+ for (reg , per , typ ) in regs .findall (r"RCC_(A[HP]B\d?(?:ENR|RSTR)\d?)_(.* ?)(EN|RST)" ):
150
171
rcc_map [per ][typ ] = reg
151
172
rcc_enable = {}
152
173
rcc_reset = {}
0 commit comments