pyGdbToolkit 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyGdbToolkit/__init__.py +55 -0
- pyGdbToolkit/arch/__init__.py +79 -0
- pyGdbToolkit/arch/arm/__init__.py +17 -0
- pyGdbToolkit/arch/arm/coresight.py +427 -0
- pyGdbToolkit/arch/arm/cortex_m.py +504 -0
- pyGdbToolkit/arch/arm/fault.py +629 -0
- pyGdbToolkit/arch/arm/models.py +60 -0
- pyGdbToolkit/arch/arm/mpu.py +556 -0
- pyGdbToolkit/arch/arm/probe.py +10 -0
- pyGdbToolkit/arch/arm/providers/__init__.py +16 -0
- pyGdbToolkit/arch/arm/providers/base.py +77 -0
- pyGdbToolkit/arch/arm/providers/manufacturers/__init__.py +4 -0
- pyGdbToolkit/arch/arm/providers/manufacturers/stm32.py +680 -0
- pyGdbToolkit/arch/arm/sau.py +253 -0
- pyGdbToolkit/arch/arm/security.py +816 -0
- pyGdbToolkit/arch/arm/session_state.py +96 -0
- pyGdbToolkit/arch/arm/target.py +32 -0
- pyGdbToolkit/arch/base.py +143 -0
- pyGdbToolkit/arch/diagnostics.py +300 -0
- pyGdbToolkit/arch/registry.py +43 -0
- pyGdbToolkit/cmd_faultinfo.py +99 -0
- pyGdbToolkit/cmd_lscpu.py +116 -0
- pyGdbToolkit/cmd_profile.py +1402 -0
- pyGdbToolkit/cmd_rtos.py +298 -0
- pyGdbToolkit/cmd_secscan.py +466 -0
- pyGdbToolkit/cmd_svd.py +1208 -0
- pyGdbToolkit/diagnostic_runtime.py +52 -0
- pyGdbToolkit/rtos/__init__.py +8 -0
- pyGdbToolkit/rtos/camelot.py +513 -0
- pyGdbToolkit/session.py +233 -0
- pyGdbToolkit/svd.py +1194 -0
- pyGdbToolkit/target_memory.py +190 -0
- pygdbtoolkit-0.1.0.dist-info/METADATA +586 -0
- pygdbtoolkit-0.1.0.dist-info/RECORD +36 -0
- pygdbtoolkit-0.1.0.dist-info/WHEEL +5 -0
- pygdbtoolkit-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,680 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2026 H2Lab Development Team
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
"""STM32 device provider and electronic-signature catalog.
|
|
5
|
+
|
|
6
|
+
The STM32 catalog is deliberately local and declarative. Its addresses,
|
|
7
|
+
fixed SRAM totals, and factory flash fallbacks are derived from the official
|
|
8
|
+
ST CMSIS device headers listed in ``README.md``; the headers themselves are
|
|
9
|
+
not vendored here.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
from dataclasses import dataclass
|
|
15
|
+
|
|
16
|
+
from ...coresight import CoreSightDiscovery, Jep106Identity
|
|
17
|
+
from ...cortex_m import CortexMTargetDescription
|
|
18
|
+
from ...models import DeviceReport, FieldValue
|
|
19
|
+
from .....target_memory import TargetMemory, TargetReadError
|
|
20
|
+
|
|
21
|
+
_FLASH_DEFAULT_16 = (0x0000, 0xFFFF)
|
|
22
|
+
_FLASH_DEFAULT_L4 = (0xFFFF,)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@dataclass(frozen=True)
|
|
26
|
+
class SignatureLayout:
|
|
27
|
+
"""Documented electronic-signature addresses for one STM32 product line."""
|
|
28
|
+
|
|
29
|
+
flash_size_address: int | None = None
|
|
30
|
+
uid_address: int | None = None
|
|
31
|
+
package_address: int | None = None
|
|
32
|
+
flash_size_mask: int = 0xFFFF
|
|
33
|
+
flash_size_default_kib: int | None = None
|
|
34
|
+
flash_size_default_values: tuple[int, ...] = ()
|
|
35
|
+
flash_size_fixed_kib: int | None = None
|
|
36
|
+
package_codes: tuple[tuple[int, str], ...] = ()
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True)
|
|
40
|
+
class Stm32Profile:
|
|
41
|
+
"""A documented STM32 product line keyed by validated MCU-ROM identity."""
|
|
42
|
+
|
|
43
|
+
product_line: str
|
|
44
|
+
jep106: Jep106Identity
|
|
45
|
+
mcu_rom_part_numbers: tuple[int, ...]
|
|
46
|
+
signature: SignatureLayout
|
|
47
|
+
ram_kib: int | None = None
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass(frozen=True)
|
|
51
|
+
class UnmappedStm32Signature:
|
|
52
|
+
"""CMSIS-derived STM32 signature layout and fixed RAM metadata."""
|
|
53
|
+
|
|
54
|
+
product_line: str
|
|
55
|
+
signature: SignatureLayout
|
|
56
|
+
ram_kib: int | None = None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
_F0_SIGNATURE = SignatureLayout(flash_size_address=0x1FFFF7CC, uid_address=0x1FFFF7AC)
|
|
60
|
+
_F1_SIGNATURE = SignatureLayout(flash_size_address=0x1FFFF7E0, uid_address=0x1FFFF7E8)
|
|
61
|
+
_F2_SIGNATURE = SignatureLayout(flash_size_address=0x1FFF7A22, uid_address=0x1FFF7A10)
|
|
62
|
+
_F3_SIGNATURE = SignatureLayout(flash_size_address=0x1FFFF7CC, uid_address=0x1FFFF7AC)
|
|
63
|
+
_F4_SIGNATURE = SignatureLayout(
|
|
64
|
+
flash_size_address=0x1FFF7A22,
|
|
65
|
+
uid_address=0x1FFF7A10,
|
|
66
|
+
package_address=0x1FFF7BF0,
|
|
67
|
+
)
|
|
68
|
+
_F7_72_73_SIGNATURE = SignatureLayout(
|
|
69
|
+
flash_size_address=0x1FF07A22,
|
|
70
|
+
uid_address=0x1FF07A10,
|
|
71
|
+
package_address=0x1FF07BF0,
|
|
72
|
+
)
|
|
73
|
+
_F7_74_77_SIGNATURE = SignatureLayout(
|
|
74
|
+
flash_size_address=0x1FF0F442,
|
|
75
|
+
uid_address=0x1FF0F420,
|
|
76
|
+
package_address=0x1FF0F7E0,
|
|
77
|
+
)
|
|
78
|
+
_C5_55_56_SIGNATURE = SignatureLayout(
|
|
79
|
+
flash_size_address=0x08FFF80C,
|
|
80
|
+
uid_address=0x08FFF800,
|
|
81
|
+
package_address=0x08FFF80E,
|
|
82
|
+
flash_size_default_kib=512,
|
|
83
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
84
|
+
)
|
|
85
|
+
_C5_53_54_SIGNATURE = SignatureLayout(
|
|
86
|
+
flash_size_address=0x08FFF80C,
|
|
87
|
+
uid_address=0x08FFF800,
|
|
88
|
+
package_address=0x08FFF80E,
|
|
89
|
+
flash_size_default_kib=256,
|
|
90
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
91
|
+
)
|
|
92
|
+
_C5_59_5A_SIGNATURE = SignatureLayout(
|
|
93
|
+
flash_size_address=0x08FFF80C,
|
|
94
|
+
uid_address=0x08FFF800,
|
|
95
|
+
package_address=0x08FFF80E,
|
|
96
|
+
flash_size_default_kib=1024,
|
|
97
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
98
|
+
)
|
|
99
|
+
_C01_SIGNATURE = SignatureLayout(
|
|
100
|
+
flash_size_address=0x1FFF75A0,
|
|
101
|
+
uid_address=0x1FFF7550,
|
|
102
|
+
package_address=0x1FFF7500,
|
|
103
|
+
flash_size_default_kib=32,
|
|
104
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
105
|
+
)
|
|
106
|
+
_C03_SIGNATURE = SignatureLayout(
|
|
107
|
+
flash_size_address=0x1FFF75A0,
|
|
108
|
+
uid_address=0x1FFF7550,
|
|
109
|
+
package_address=0x1FFF7500,
|
|
110
|
+
flash_size_default_kib=32,
|
|
111
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
112
|
+
)
|
|
113
|
+
_C05_SIGNATURE = SignatureLayout(
|
|
114
|
+
flash_size_address=0x1FFF75A0,
|
|
115
|
+
uid_address=0x1FFF7550,
|
|
116
|
+
package_address=0x1FFF7500,
|
|
117
|
+
flash_size_default_kib=64,
|
|
118
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
119
|
+
)
|
|
120
|
+
_C071_SIGNATURE = SignatureLayout(
|
|
121
|
+
flash_size_address=0x1FFF75A0,
|
|
122
|
+
uid_address=0x1FFF7550,
|
|
123
|
+
package_address=0x1FFF7500,
|
|
124
|
+
flash_size_default_kib=128,
|
|
125
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
126
|
+
)
|
|
127
|
+
_C09_SIGNATURE = SignatureLayout(
|
|
128
|
+
flash_size_address=0x1FFF75A0,
|
|
129
|
+
uid_address=0x1FFF7550,
|
|
130
|
+
package_address=0x1FFF7500,
|
|
131
|
+
flash_size_default_kib=256,
|
|
132
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
133
|
+
)
|
|
134
|
+
_G0_SIGNATURE = SignatureLayout(
|
|
135
|
+
flash_size_address=0x1FFF75E0,
|
|
136
|
+
uid_address=0x1FFF7590,
|
|
137
|
+
package_address=0x1FFF7500,
|
|
138
|
+
flash_size_mask=0x007F,
|
|
139
|
+
)
|
|
140
|
+
_COMMON_SIGNATURE = SignatureLayout(
|
|
141
|
+
flash_size_address=0x1FFF75E0,
|
|
142
|
+
uid_address=0x1FFF7590,
|
|
143
|
+
package_address=0x1FFF7500,
|
|
144
|
+
)
|
|
145
|
+
_H5_SIGNATURE = SignatureLayout(
|
|
146
|
+
flash_size_address=0x08FFF80C,
|
|
147
|
+
uid_address=0x08FFF800,
|
|
148
|
+
package_address=0x08FFF80E,
|
|
149
|
+
)
|
|
150
|
+
_H5_503_SIGNATURE = SignatureLayout(
|
|
151
|
+
flash_size_address=0x08FFF80C,
|
|
152
|
+
uid_address=0x08FFF800,
|
|
153
|
+
package_address=0x08FFF80E,
|
|
154
|
+
flash_size_default_kib=128,
|
|
155
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
156
|
+
)
|
|
157
|
+
_H5_52_53_SIGNATURE = SignatureLayout(
|
|
158
|
+
flash_size_address=0x08FFF80C,
|
|
159
|
+
uid_address=0x08FFF800,
|
|
160
|
+
package_address=0x08FFF80E,
|
|
161
|
+
flash_size_default_kib=512,
|
|
162
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
163
|
+
)
|
|
164
|
+
_H5_56_57_SIGNATURE = SignatureLayout(
|
|
165
|
+
flash_size_address=0x08FFF80C,
|
|
166
|
+
uid_address=0x08FFF800,
|
|
167
|
+
package_address=0x08FFF80E,
|
|
168
|
+
flash_size_default_kib=2048,
|
|
169
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
170
|
+
)
|
|
171
|
+
_H5_E_F_SIGNATURE = SignatureLayout(
|
|
172
|
+
flash_size_address=0x08FFF80C,
|
|
173
|
+
uid_address=0x08FFF800,
|
|
174
|
+
package_address=0x08FFF80E,
|
|
175
|
+
flash_size_default_kib=4096,
|
|
176
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
177
|
+
)
|
|
178
|
+
_H7_74_75_SIGNATURE = SignatureLayout(
|
|
179
|
+
flash_size_address=0x1FF1E880,
|
|
180
|
+
uid_address=0x1FF1E800,
|
|
181
|
+
flash_size_mask=0x0FFF,
|
|
182
|
+
flash_size_default_kib=2048,
|
|
183
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
184
|
+
)
|
|
185
|
+
_H7_72_73_SIGNATURE = SignatureLayout(
|
|
186
|
+
flash_size_address=0x1FF1E880,
|
|
187
|
+
uid_address=0x1FF1E800,
|
|
188
|
+
flash_size_mask=0x0FFF,
|
|
189
|
+
flash_size_default_kib=1024,
|
|
190
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
191
|
+
)
|
|
192
|
+
_H7A_H7B_SIGNATURE = SignatureLayout(
|
|
193
|
+
flash_size_address=0x08FFF80C,
|
|
194
|
+
uid_address=0x08FFF800,
|
|
195
|
+
package_address=0x08FFF80E,
|
|
196
|
+
flash_size_mask=0x0FFF,
|
|
197
|
+
flash_size_default_kib=2048,
|
|
198
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
199
|
+
)
|
|
200
|
+
_H7RS_SIGNATURE = SignatureLayout(
|
|
201
|
+
uid_address=0x08FFF800,
|
|
202
|
+
package_address=0x08FFF80C,
|
|
203
|
+
flash_size_fixed_kib=64,
|
|
204
|
+
)
|
|
205
|
+
_L0_SIGNATURE = SignatureLayout(flash_size_address=0x1FF8007C, uid_address=0x1FF80050)
|
|
206
|
+
_L1_SIGNATURE = SignatureLayout(flash_size_address=0x1FF8004C, uid_address=0x1FF80050)
|
|
207
|
+
_L4_41_42_SIGNATURE = SignatureLayout(
|
|
208
|
+
flash_size_address=0x1FFF75E0,
|
|
209
|
+
uid_address=0x1FFF7590,
|
|
210
|
+
package_address=0x1FFF7500,
|
|
211
|
+
flash_size_default_kib=128,
|
|
212
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
213
|
+
)
|
|
214
|
+
_L4_43_44_SIGNATURE = SignatureLayout(
|
|
215
|
+
flash_size_address=0x1FFF75E0,
|
|
216
|
+
uid_address=0x1FFF7590,
|
|
217
|
+
package_address=0x1FFF7500,
|
|
218
|
+
flash_size_default_kib=256,
|
|
219
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
220
|
+
)
|
|
221
|
+
_L4_45_46_SIGNATURE = SignatureLayout(
|
|
222
|
+
flash_size_address=0x1FFF75E0,
|
|
223
|
+
uid_address=0x1FFF7590,
|
|
224
|
+
package_address=0x1FFF7500,
|
|
225
|
+
flash_size_default_kib=512,
|
|
226
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
227
|
+
)
|
|
228
|
+
_L4_47_48_SIGNATURE = SignatureLayout(
|
|
229
|
+
flash_size_address=0x1FFF75E0,
|
|
230
|
+
uid_address=0x1FFF7590,
|
|
231
|
+
package_address=0x1FFF7500,
|
|
232
|
+
flash_size_default_kib=1024,
|
|
233
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
234
|
+
)
|
|
235
|
+
_L4_49_4A_SIGNATURE = SignatureLayout(
|
|
236
|
+
flash_size_address=0x1FFF75E0,
|
|
237
|
+
uid_address=0x1FFF7590,
|
|
238
|
+
package_address=0x1FFF7500,
|
|
239
|
+
flash_size_default_kib=1024,
|
|
240
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
241
|
+
)
|
|
242
|
+
_L4R_4S_SIGNATURE = SignatureLayout(
|
|
243
|
+
flash_size_address=0x1FFF75E0,
|
|
244
|
+
uid_address=0x1FFF7590,
|
|
245
|
+
package_address=0x1FFF7500,
|
|
246
|
+
flash_size_default_kib=2048,
|
|
247
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
248
|
+
)
|
|
249
|
+
_L4P_4Q_SIGNATURE = SignatureLayout(
|
|
250
|
+
flash_size_address=0x1FFF75E0,
|
|
251
|
+
uid_address=0x1FFF7590,
|
|
252
|
+
package_address=0x1FFF7500,
|
|
253
|
+
flash_size_default_kib=1024,
|
|
254
|
+
flash_size_default_values=_FLASH_DEFAULT_L4,
|
|
255
|
+
)
|
|
256
|
+
_L5_SIGNATURE = SignatureLayout(
|
|
257
|
+
flash_size_address=0x0BFA05E0,
|
|
258
|
+
uid_address=0x0BFA0590,
|
|
259
|
+
package_address=0x0BFA0500,
|
|
260
|
+
flash_size_mask=0x0FFF,
|
|
261
|
+
flash_size_default_kib=512,
|
|
262
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
263
|
+
)
|
|
264
|
+
_U0_31_SIGNATURE = SignatureLayout(
|
|
265
|
+
flash_size_address=0x1FFF3EA0,
|
|
266
|
+
uid_address=0x1FFF3E50,
|
|
267
|
+
package_address=0x1FFF3D00,
|
|
268
|
+
flash_size_default_kib=64,
|
|
269
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
270
|
+
)
|
|
271
|
+
_U0_73_83_SIGNATURE = SignatureLayout(
|
|
272
|
+
flash_size_address=0x1FFF6EA0,
|
|
273
|
+
uid_address=0x1FFF6E50,
|
|
274
|
+
package_address=0x1FFF6D00,
|
|
275
|
+
flash_size_default_kib=256,
|
|
276
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
277
|
+
)
|
|
278
|
+
_U3_37_38_SIGNATURE = SignatureLayout(
|
|
279
|
+
flash_size_address=0x0BFA07A0,
|
|
280
|
+
uid_address=0x0BFA0700,
|
|
281
|
+
package_address=0x0BFA0500,
|
|
282
|
+
flash_size_default_kib=1024,
|
|
283
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
284
|
+
)
|
|
285
|
+
_U3_B_C_SIGNATURE = SignatureLayout(
|
|
286
|
+
flash_size_address=0x0BFA07A0,
|
|
287
|
+
uid_address=0x0BFA0700,
|
|
288
|
+
package_address=0x0BFA0500,
|
|
289
|
+
flash_size_default_kib=2048,
|
|
290
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
291
|
+
)
|
|
292
|
+
_U5_53_54_SIGNATURE = SignatureLayout(
|
|
293
|
+
flash_size_address=0x0BFA07A0,
|
|
294
|
+
uid_address=0x0BFA0700,
|
|
295
|
+
package_address=0x0BFA0500,
|
|
296
|
+
flash_size_default_kib=512,
|
|
297
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
298
|
+
)
|
|
299
|
+
_U5_57_58_SIGNATURE = SignatureLayout(
|
|
300
|
+
flash_size_address=0x0BFA07A0,
|
|
301
|
+
uid_address=0x0BFA0700,
|
|
302
|
+
package_address=0x0BFA0500,
|
|
303
|
+
flash_size_default_kib=2048,
|
|
304
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
305
|
+
)
|
|
306
|
+
_U5_59_5A_5F_5G_SIGNATURE = SignatureLayout(
|
|
307
|
+
flash_size_address=0x0BFA07A0,
|
|
308
|
+
uid_address=0x0BFA0700,
|
|
309
|
+
package_address=0x0BFA0500,
|
|
310
|
+
flash_size_default_kib=4096,
|
|
311
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
312
|
+
)
|
|
313
|
+
_WB_SIGNATURE = SignatureLayout(
|
|
314
|
+
flash_size_address=0x1FFF75E0,
|
|
315
|
+
uid_address=0x1FFF7590,
|
|
316
|
+
package_address=0x1FFF7500,
|
|
317
|
+
flash_size_mask=0x07FF,
|
|
318
|
+
)
|
|
319
|
+
_WBA_2_5_SIGNATURE = SignatureLayout(
|
|
320
|
+
flash_size_address=0x0BF907A0,
|
|
321
|
+
uid_address=0x0BF90700,
|
|
322
|
+
package_address=0x0BF90500,
|
|
323
|
+
flash_size_default_kib=1024,
|
|
324
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
325
|
+
)
|
|
326
|
+
_WBA_6_SIGNATURE = SignatureLayout(
|
|
327
|
+
flash_size_address=0x0BFA07A0,
|
|
328
|
+
uid_address=0x0BFA0700,
|
|
329
|
+
package_address=0x0BFA0500,
|
|
330
|
+
flash_size_default_kib=2048,
|
|
331
|
+
flash_size_default_values=_FLASH_DEFAULT_16,
|
|
332
|
+
)
|
|
333
|
+
_N6_SIGNATURE = SignatureLayout(uid_address=0x46009014)
|
|
334
|
+
_WL_SIGNATURE = SignatureLayout(
|
|
335
|
+
flash_size_address=0x1FFF75E0,
|
|
336
|
+
uid_address=0x1FFF7590,
|
|
337
|
+
package_address=0x1FFF7500,
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
ST_JEP106_IDENTITY = Jep106Identity(bank=0, code=0x20)
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
_STM32_ROM_PART_NUMBERS = {
|
|
345
|
+
"STM32C01xx": (0x443,),
|
|
346
|
+
"STM32C03xx": (0x453,),
|
|
347
|
+
"STM32C05xx": (0x44C,),
|
|
348
|
+
"STM32C071xx": (0x493,),
|
|
349
|
+
"STM32C09xx": (0x44D,),
|
|
350
|
+
"STM32C55xx/C56xx": (0x44E,),
|
|
351
|
+
"STM32C53xx/C54xx": (0x44F,),
|
|
352
|
+
"STM32C59xx/C5Axx": (0x45A,),
|
|
353
|
+
"STM32F03x": (0x444,),
|
|
354
|
+
"STM32F04x": (0x445,),
|
|
355
|
+
"STM32F05x": (0x440,),
|
|
356
|
+
"STM32F07x": (0x448,),
|
|
357
|
+
"STM32F09x": (0x442,),
|
|
358
|
+
"STM32F10x medium-density": (0x410,),
|
|
359
|
+
"STM32F10x low-density": (0x412,),
|
|
360
|
+
"STM32F10x high-density": (0x414,),
|
|
361
|
+
"STM32F10x connectivity line": (0x418,),
|
|
362
|
+
"STM32F100 low/medium-density value line": (0x420,),
|
|
363
|
+
"STM32F100 high-density value line": (0x428,),
|
|
364
|
+
"STM32F10x XL-density": (0x430,),
|
|
365
|
+
"STM32F2xx": (0x411,),
|
|
366
|
+
"STM32F3 product lines": (0x422, 0x432, 0x438, 0x439, 0x446),
|
|
367
|
+
"STM32F405/F407/F415/F417": (0x413,),
|
|
368
|
+
"STM32F42x/F43x": (0x419,),
|
|
369
|
+
"STM32F446": (0x421,),
|
|
370
|
+
"STM32F401xB/xC": (0x423,),
|
|
371
|
+
"STM32F411": (0x431,),
|
|
372
|
+
"STM32F401xD/xE": (0x433,),
|
|
373
|
+
"STM32F469/F479": (0x434,),
|
|
374
|
+
"STM32F412": (0x441,),
|
|
375
|
+
"STM32F410": (0x458,),
|
|
376
|
+
"STM32F413/F423": (0x463,),
|
|
377
|
+
"STM32F72x/F73x": (0x452,),
|
|
378
|
+
"STM32F74x/F75x": (0x449,),
|
|
379
|
+
"STM32F76x/F77x": (0x451,),
|
|
380
|
+
"STM32G05x/G06x": (0x456,),
|
|
381
|
+
"STM32G07x/G08x": (0x460,),
|
|
382
|
+
"STM32G03x/G04x": (0x466,),
|
|
383
|
+
"STM32G0Bx/G0Cx": (0x467,),
|
|
384
|
+
"STM32G43x/G44x": (0x468,),
|
|
385
|
+
"STM32G47x/G48x": (0x469,),
|
|
386
|
+
"STM32G49x/G4Ax": (0x479,),
|
|
387
|
+
"STM32H503": (0x474,),
|
|
388
|
+
"STM32H52x/H53x": (0x478,),
|
|
389
|
+
"STM32H5Ex/H5Fx": (0x47A,),
|
|
390
|
+
"STM32H54x/H55x": (0x47C,),
|
|
391
|
+
"STM32H56x/H57x": (0x484,),
|
|
392
|
+
"STM32H74x/H75x": (0x450,),
|
|
393
|
+
"STM32H7Ax/H7Bx": (0x480,),
|
|
394
|
+
"STM32H72x/H73x": (0x483,),
|
|
395
|
+
"STM32H7Rx/H7Sx": (0x485,),
|
|
396
|
+
"STM32H7Pxx": (0x47B,),
|
|
397
|
+
"STM32L0 category 1/2/3/5": (0x417, 0x425, 0x447, 0x457),
|
|
398
|
+
"STM32L1 product lines": (0x416, 0x427, 0x429, 0x436, 0x437),
|
|
399
|
+
"STM32L47x/L48x": (0x415,),
|
|
400
|
+
"STM32L43x/L44x": (0x435,),
|
|
401
|
+
"STM32L49x/L4Ax": (0x461,),
|
|
402
|
+
"STM32L45x/L46x": (0x462,),
|
|
403
|
+
"STM32L41x/L42x": (0x464,),
|
|
404
|
+
"STM32L4Rx/L4Sx": (0x470,),
|
|
405
|
+
"STM32L4Px/L4Qx": (0x471,),
|
|
406
|
+
"STM32L55x/L56x": (0x472,),
|
|
407
|
+
"STM32N6 product line": (0x486,),
|
|
408
|
+
"STM32U031xx": (0x459,),
|
|
409
|
+
"STM32U073x/U083x": (0x489,),
|
|
410
|
+
"STM32U3B/U3Cxx": (0x42A,),
|
|
411
|
+
"STM32U37x/U38x": (0x454,),
|
|
412
|
+
"STM32U535x/U545x": (0x455,),
|
|
413
|
+
"STM32U57x/U58x": (0x482,),
|
|
414
|
+
"STM32U595/U599/U5A5/U5A9": (0x481,),
|
|
415
|
+
"STM32U5Fx/U5Gx": (0x476,),
|
|
416
|
+
"STM32WB1x": (0x494,),
|
|
417
|
+
"STM32WB3x": (0x496,),
|
|
418
|
+
"STM32WB5x": (0x495,),
|
|
419
|
+
"STM32WBA2x": (0x4B2,),
|
|
420
|
+
"STM32WBA5x": (0x492,),
|
|
421
|
+
"STM32WBA6x": (0x4B0,),
|
|
422
|
+
"STM32WLE/WL5x": (0x497,),
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
STM32_SIGNATURE_CATALOG = (
|
|
426
|
+
UnmappedStm32Signature("STM32C01xx", _C01_SIGNATURE, 6),
|
|
427
|
+
UnmappedStm32Signature("STM32C03xx", _C03_SIGNATURE, 12),
|
|
428
|
+
UnmappedStm32Signature("STM32C05xx", _C05_SIGNATURE, 12),
|
|
429
|
+
UnmappedStm32Signature("STM32C071xx", _C071_SIGNATURE, 24),
|
|
430
|
+
UnmappedStm32Signature("STM32C09xx", _C09_SIGNATURE, 36),
|
|
431
|
+
UnmappedStm32Signature("STM32C55xx/C56xx", _C5_55_56_SIGNATURE, 128),
|
|
432
|
+
UnmappedStm32Signature("STM32C53xx/C54xx", _C5_53_54_SIGNATURE, 64),
|
|
433
|
+
UnmappedStm32Signature("STM32C59xx/C5Axx", _C5_59_5A_SIGNATURE, 256),
|
|
434
|
+
UnmappedStm32Signature("STM32F03x", _F0_SIGNATURE),
|
|
435
|
+
UnmappedStm32Signature("STM32F04x", _F0_SIGNATURE),
|
|
436
|
+
UnmappedStm32Signature("STM32F05x", _F0_SIGNATURE),
|
|
437
|
+
UnmappedStm32Signature("STM32F07x", _F0_SIGNATURE),
|
|
438
|
+
UnmappedStm32Signature("STM32F09x", _F0_SIGNATURE),
|
|
439
|
+
UnmappedStm32Signature("STM32F10x medium-density", _F1_SIGNATURE),
|
|
440
|
+
UnmappedStm32Signature("STM32F10x low-density", _F1_SIGNATURE),
|
|
441
|
+
UnmappedStm32Signature("STM32F10x high-density", _F1_SIGNATURE),
|
|
442
|
+
UnmappedStm32Signature("STM32F10x connectivity line", _F1_SIGNATURE),
|
|
443
|
+
UnmappedStm32Signature("STM32F100 low/medium-density value line", _F1_SIGNATURE),
|
|
444
|
+
UnmappedStm32Signature("STM32F100 high-density value line", _F1_SIGNATURE),
|
|
445
|
+
UnmappedStm32Signature("STM32F10x XL-density", _F1_SIGNATURE),
|
|
446
|
+
UnmappedStm32Signature("STM32F2xx", _F2_SIGNATURE),
|
|
447
|
+
UnmappedStm32Signature("STM32F3 product lines", _F3_SIGNATURE),
|
|
448
|
+
UnmappedStm32Signature("STM32F405/F407/F415/F417", _F4_SIGNATURE),
|
|
449
|
+
UnmappedStm32Signature("STM32F42x/F43x", _F4_SIGNATURE),
|
|
450
|
+
UnmappedStm32Signature("STM32F446", _F4_SIGNATURE),
|
|
451
|
+
UnmappedStm32Signature("STM32F401xB/xC", _F4_SIGNATURE),
|
|
452
|
+
UnmappedStm32Signature("STM32F411", _F4_SIGNATURE),
|
|
453
|
+
UnmappedStm32Signature("STM32F401xD/xE", _F4_SIGNATURE),
|
|
454
|
+
UnmappedStm32Signature("STM32F469/F479", _F4_SIGNATURE),
|
|
455
|
+
UnmappedStm32Signature("STM32F412", _F4_SIGNATURE),
|
|
456
|
+
UnmappedStm32Signature("STM32F410", _F4_SIGNATURE),
|
|
457
|
+
UnmappedStm32Signature("STM32F413/F423", _F4_SIGNATURE),
|
|
458
|
+
UnmappedStm32Signature("STM32F72x/F73x", _F7_72_73_SIGNATURE),
|
|
459
|
+
UnmappedStm32Signature("STM32F74x/F75x", _F7_74_77_SIGNATURE),
|
|
460
|
+
UnmappedStm32Signature("STM32F76x/F77x", _F7_74_77_SIGNATURE),
|
|
461
|
+
UnmappedStm32Signature("STM32G05x/G06x", _G0_SIGNATURE, 16),
|
|
462
|
+
UnmappedStm32Signature("STM32G07x/G08x", _G0_SIGNATURE, 32),
|
|
463
|
+
UnmappedStm32Signature("STM32G03x/G04x", _G0_SIGNATURE, 8),
|
|
464
|
+
UnmappedStm32Signature("STM32G0Bx/G0Cx", _G0_SIGNATURE, 128),
|
|
465
|
+
UnmappedStm32Signature("STM32G43x/G44x", _COMMON_SIGNATURE, 32),
|
|
466
|
+
UnmappedStm32Signature("STM32G47x/G48x", _COMMON_SIGNATURE, 128),
|
|
467
|
+
UnmappedStm32Signature("STM32G49x/G4Ax", _COMMON_SIGNATURE, 112),
|
|
468
|
+
UnmappedStm32Signature("STM32H503", _H5_503_SIGNATURE, 32),
|
|
469
|
+
UnmappedStm32Signature("STM32H52x/H53x", _H5_52_53_SIGNATURE, 272),
|
|
470
|
+
UnmappedStm32Signature("STM32H5Ex/H5Fx", _H5_E_F_SIGNATURE, 1536),
|
|
471
|
+
UnmappedStm32Signature("STM32H54x/H55x", _H5_SIGNATURE),
|
|
472
|
+
UnmappedStm32Signature("STM32H56x/H57x", _H5_56_57_SIGNATURE, 640),
|
|
473
|
+
UnmappedStm32Signature("STM32H74x/H75x", _H7_74_75_SIGNATURE),
|
|
474
|
+
UnmappedStm32Signature("STM32H7Ax/H7Bx", _H7A_H7B_SIGNATURE),
|
|
475
|
+
UnmappedStm32Signature("STM32H72x/H73x", _H7_72_73_SIGNATURE),
|
|
476
|
+
UnmappedStm32Signature("STM32H7Rx/H7Sx", _H7RS_SIGNATURE),
|
|
477
|
+
UnmappedStm32Signature("STM32H7Pxx", SignatureLayout()),
|
|
478
|
+
UnmappedStm32Signature("STM32L0 category 1/2/3/5", _L0_SIGNATURE),
|
|
479
|
+
UnmappedStm32Signature("STM32L1 product lines", _L1_SIGNATURE),
|
|
480
|
+
UnmappedStm32Signature("STM32L47x/L48x", _L4_47_48_SIGNATURE, 128),
|
|
481
|
+
UnmappedStm32Signature("STM32L43x/L44x", _L4_43_44_SIGNATURE, 64),
|
|
482
|
+
UnmappedStm32Signature("STM32L49x/L4Ax", _L4_49_4A_SIGNATURE, 320),
|
|
483
|
+
UnmappedStm32Signature("STM32L45x/L46x", _L4_45_46_SIGNATURE, 160),
|
|
484
|
+
UnmappedStm32Signature("STM32L41x/L42x", _L4_41_42_SIGNATURE, 40),
|
|
485
|
+
UnmappedStm32Signature("STM32L4Rx/L4Sx", _L4R_4S_SIGNATURE, 640),
|
|
486
|
+
UnmappedStm32Signature("STM32L4Px/L4Qx", _L4P_4Q_SIGNATURE, 320),
|
|
487
|
+
UnmappedStm32Signature("STM32L55x/L56x", _L5_SIGNATURE, 256),
|
|
488
|
+
UnmappedStm32Signature("STM32N6 product line", _N6_SIGNATURE, 4240),
|
|
489
|
+
UnmappedStm32Signature("STM32U031xx", _U0_31_SIGNATURE, 8),
|
|
490
|
+
UnmappedStm32Signature("STM32U073x/U083x", _U0_73_83_SIGNATURE, 32),
|
|
491
|
+
UnmappedStm32Signature("STM32U3B/U3Cxx", _U3_B_C_SIGNATURE, 640),
|
|
492
|
+
UnmappedStm32Signature("STM32U37x/U38x", _U3_37_38_SIGNATURE, 256),
|
|
493
|
+
UnmappedStm32Signature("STM32U535x/U545x", _U5_53_54_SIGNATURE, 272),
|
|
494
|
+
UnmappedStm32Signature("STM32U57x/U58x", _U5_57_58_SIGNATURE, 784),
|
|
495
|
+
UnmappedStm32Signature("STM32U595/U599/U5A5/U5A9", _U5_59_5A_5F_5G_SIGNATURE, 2512),
|
|
496
|
+
UnmappedStm32Signature("STM32U5Fx/U5Gx", _U5_59_5A_5F_5G_SIGNATURE, 3024),
|
|
497
|
+
UnmappedStm32Signature("STM32WB1x", _WB_SIGNATURE, 48),
|
|
498
|
+
UnmappedStm32Signature("STM32WB3x", _WB_SIGNATURE, 96),
|
|
499
|
+
UnmappedStm32Signature("STM32WB5x", _WB_SIGNATURE, 256),
|
|
500
|
+
UnmappedStm32Signature("STM32WBA2x", _WBA_2_5_SIGNATURE, 128),
|
|
501
|
+
UnmappedStm32Signature("STM32WBA5x", _WBA_2_5_SIGNATURE, 128),
|
|
502
|
+
UnmappedStm32Signature("STM32WBA6x", _WBA_6_SIGNATURE, 512),
|
|
503
|
+
UnmappedStm32Signature("STM32WLE/WL5x", _WL_SIGNATURE, 64),
|
|
504
|
+
)
|
|
505
|
+
|
|
506
|
+
STM32_PROFILES = tuple(
|
|
507
|
+
Stm32Profile(
|
|
508
|
+
product_line=signature.product_line,
|
|
509
|
+
jep106=ST_JEP106_IDENTITY,
|
|
510
|
+
mcu_rom_part_numbers=_STM32_ROM_PART_NUMBERS[signature.product_line],
|
|
511
|
+
signature=signature.signature,
|
|
512
|
+
ram_kib=signature.ram_kib,
|
|
513
|
+
)
|
|
514
|
+
for signature in STM32_SIGNATURE_CATALOG
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
class Stm32Provider:
|
|
519
|
+
"""Recognize documented STM32 product lines and read their signatures."""
|
|
520
|
+
|
|
521
|
+
def __init__(self, profiles: tuple[Stm32Profile, ...] = STM32_PROFILES) -> None:
|
|
522
|
+
"""Create a provider using an ordered immutable profile catalog.
|
|
523
|
+
|
|
524
|
+
Parameters
|
|
525
|
+
----------
|
|
526
|
+
profiles
|
|
527
|
+
Product-line profiles to probe. This supports extensions and tests
|
|
528
|
+
without changing global state.
|
|
529
|
+
"""
|
|
530
|
+
self._profiles = profiles
|
|
531
|
+
|
|
532
|
+
def inspect(
|
|
533
|
+
self,
|
|
534
|
+
reader: TargetMemory,
|
|
535
|
+
target: CortexMTargetDescription,
|
|
536
|
+
discovery: CoreSightDiscovery,
|
|
537
|
+
) -> DeviceReport | None:
|
|
538
|
+
"""Recognize an STM32 target from its validated MCU-ROM identity.
|
|
539
|
+
|
|
540
|
+
Parameters
|
|
541
|
+
----------
|
|
542
|
+
reader
|
|
543
|
+
Typed reader for target memory.
|
|
544
|
+
target
|
|
545
|
+
The previously decoded Cortex-M target description.
|
|
546
|
+
discovery
|
|
547
|
+
Best-effort discovery results containing the MCU-ROM root identity.
|
|
548
|
+
|
|
549
|
+
Returns
|
|
550
|
+
-------
|
|
551
|
+
DeviceReport | None
|
|
552
|
+
A report for a documented STM32 profile or ``None`` when no
|
|
553
|
+
registered MCU-ROM identity matches.
|
|
554
|
+
"""
|
|
555
|
+
table = discovery.mcu_rom.table
|
|
556
|
+
if table is None:
|
|
557
|
+
return None
|
|
558
|
+
peripheral_id = table.identity.peripheral_id
|
|
559
|
+
if peripheral_id.jep106 is None:
|
|
560
|
+
return None
|
|
561
|
+
matches = tuple(
|
|
562
|
+
profile
|
|
563
|
+
for profile in self._profiles
|
|
564
|
+
if profile.jep106 == peripheral_id.jep106
|
|
565
|
+
and peripheral_id.part_number in profile.mcu_rom_part_numbers
|
|
566
|
+
)
|
|
567
|
+
if len(matches) == 1:
|
|
568
|
+
return self._profile_report(reader, target, discovery, matches[0])
|
|
569
|
+
if len(matches) > 1:
|
|
570
|
+
return self._ambiguous_report(target, discovery, matches)
|
|
571
|
+
return None
|
|
572
|
+
|
|
573
|
+
def _profile_report(
|
|
574
|
+
self,
|
|
575
|
+
reader: TargetMemory,
|
|
576
|
+
target: CortexMTargetDescription,
|
|
577
|
+
discovery: CoreSightDiscovery,
|
|
578
|
+
profile: Stm32Profile,
|
|
579
|
+
) -> DeviceReport:
|
|
580
|
+
"""Build a report after exactly one documented STM32 profile matched."""
|
|
581
|
+
return DeviceReport(
|
|
582
|
+
target=target,
|
|
583
|
+
discovery=discovery,
|
|
584
|
+
vendor="STMicroelectronics",
|
|
585
|
+
product_line=FieldValue.known(profile.product_line),
|
|
586
|
+
part_number=FieldValue.known(
|
|
587
|
+
f"{profile.product_line} (exact ordering code unavailable from MCU-ROM part)"
|
|
588
|
+
),
|
|
589
|
+
ram=_ram_size(profile),
|
|
590
|
+
flash=_read_flash_size(reader, profile.signature),
|
|
591
|
+
package=_read_package(reader, profile.signature),
|
|
592
|
+
serial_number=_read_serial_number(reader, profile.signature),
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
def _ambiguous_report(
|
|
596
|
+
self,
|
|
597
|
+
target: CortexMTargetDescription,
|
|
598
|
+
discovery: CoreSightDiscovery,
|
|
599
|
+
matches: tuple[Stm32Profile, ...],
|
|
600
|
+
) -> DeviceReport:
|
|
601
|
+
"""Build a safe report when one MCU-ROM identity matches multiple profiles."""
|
|
602
|
+
candidates = ", ".join(profile.product_line for profile in matches)
|
|
603
|
+
reason = "MCU-ROM identity is shared by multiple documented STM32 product lines"
|
|
604
|
+
return DeviceReport(
|
|
605
|
+
target=target,
|
|
606
|
+
discovery=discovery,
|
|
607
|
+
vendor="STMicroelectronics",
|
|
608
|
+
product_line=FieldValue.known(f"Ambiguous: {candidates}"),
|
|
609
|
+
part_number=FieldValue.unavailable(reason),
|
|
610
|
+
ram=FieldValue.unavailable(reason),
|
|
611
|
+
flash=FieldValue.unavailable(reason),
|
|
612
|
+
package=FieldValue.unavailable(reason),
|
|
613
|
+
serial_number=FieldValue.unavailable(reason),
|
|
614
|
+
)
|
|
615
|
+
|
|
616
|
+
|
|
617
|
+
def _read_flash_size(reader: TargetMemory, layout: SignatureLayout) -> FieldValue:
|
|
618
|
+
"""Read a CMSIS-documented STM32 flash capacity or fixed flash allocation."""
|
|
619
|
+
if layout.flash_size_fixed_kib is not None:
|
|
620
|
+
return FieldValue.known(f"{layout.flash_size_fixed_kib} KiB")
|
|
621
|
+
if layout.flash_size_address is None:
|
|
622
|
+
return FieldValue.unavailable(
|
|
623
|
+
"no trusted flash-size signature is catalogued for this product line"
|
|
624
|
+
)
|
|
625
|
+
try:
|
|
626
|
+
register_value = reader.read_uint16(layout.flash_size_address)
|
|
627
|
+
except TargetReadError as error:
|
|
628
|
+
return FieldValue.unavailable(f"could not read documented flash-size register ({error})")
|
|
629
|
+
if register_value in layout.flash_size_default_values:
|
|
630
|
+
if layout.flash_size_default_kib is not None:
|
|
631
|
+
return FieldValue.known(f"{layout.flash_size_default_kib} KiB")
|
|
632
|
+
return FieldValue.unavailable(
|
|
633
|
+
f"flash-size register reports 0x{register_value:X}; no product-line default is known"
|
|
634
|
+
)
|
|
635
|
+
raw_size = register_value & layout.flash_size_mask
|
|
636
|
+
if raw_size in (0, layout.flash_size_mask):
|
|
637
|
+
return FieldValue.unavailable(
|
|
638
|
+
f"flash-size register reports 0x{raw_size:X}; an exact SKU would be required"
|
|
639
|
+
)
|
|
640
|
+
return FieldValue.known(f"{raw_size} KiB")
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
def _ram_size(profile: Stm32Profile) -> FieldValue:
|
|
644
|
+
"""Return a profile's fixed CMSIS SRAM capacity when it is unambiguous."""
|
|
645
|
+
if profile.ram_kib is not None:
|
|
646
|
+
return FieldValue.known(f"{profile.ram_kib} KiB")
|
|
647
|
+
return FieldValue.unavailable(
|
|
648
|
+
"RAM size is SKU-dependent; MCU-ROM part does not select one fixed CMSIS SRAM map"
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
def _read_package(reader: TargetMemory, layout: SignatureLayout) -> FieldValue:
|
|
653
|
+
"""Read a documented package code without inventing a package-name mapping."""
|
|
654
|
+
if layout.package_address is None:
|
|
655
|
+
return FieldValue.unavailable(
|
|
656
|
+
"no documented package register is catalogued for this product line"
|
|
657
|
+
)
|
|
658
|
+
try:
|
|
659
|
+
package_code = reader.read_uint16(layout.package_address)
|
|
660
|
+
except TargetReadError as error:
|
|
661
|
+
return FieldValue.unavailable(f"could not read documented package register ({error})")
|
|
662
|
+
for code, name in layout.package_codes:
|
|
663
|
+
if package_code == code:
|
|
664
|
+
return FieldValue.known(name)
|
|
665
|
+
return FieldValue.known(
|
|
666
|
+
f"0x{package_code:04X} (raw package code; package type mapping unavailable)"
|
|
667
|
+
)
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
def _read_serial_number(reader: TargetMemory, layout: SignatureLayout) -> FieldValue:
|
|
671
|
+
"""Read a documented 96-bit STM32 unique-device identifier."""
|
|
672
|
+
if layout.uid_address is None:
|
|
673
|
+
return FieldValue.unavailable(
|
|
674
|
+
"no trusted 96-bit UID signature is catalogued for this product line"
|
|
675
|
+
)
|
|
676
|
+
try:
|
|
677
|
+
words = tuple(reader.read_uint32(layout.uid_address + offset) for offset in range(0, 12, 4))
|
|
678
|
+
except TargetReadError as error:
|
|
679
|
+
return FieldValue.unavailable(f"could not read documented 96-bit UID ({error})")
|
|
680
|
+
return FieldValue.known(f"0x{words[0]:08X}{words[1]:08X}{words[2]:08X} (96-bit UID)")
|