Skip to content

Commit 10dfac8

Browse files
committed
feat: more robust TPI config during BMP startup
- halt after reset - configure Manchester when using SWO from probe - includes slight refactoring of the GDB SWO support helpers
1 parent 9ff7e3a commit 10dfac8

File tree

3 files changed

+88
-59
lines changed

3 files changed

+88
-59
lines changed

src/bmp.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class BMPServerController extends EventEmitter implements GDBServerContro
6161
public launchCommands(): string[] {
6262
const commands = [
6363
...genDownloadCommands(this.args, []),
64-
'interpreter-exec console "SoftwareReset"'
64+
'interpreter-exec console "SoftwareReset 1"'
6565
];
6666
return commands;
6767
}
@@ -93,12 +93,13 @@ export class BMPServerController extends EventEmitter implements GDBServerContro
9393
const cpuFrequency = this.args.swoConfig.cpuFrequency;
9494

9595
const ratio = Math.floor(cpuFrequency / swoFrequency) - 1;
96+
const encoding = this.args.swoConfig.source === 'probe' ? 1 : 2;
9697

9798
const commands: string[] = [];
9899

99100
commands.push(
100101
'EnableITMAccess',
101-
`BaseSWOSetup ${ratio}`,
102+
`BaseSWOSetup ${ratio} ${encoding}`,
102103
'SetITMId 1',
103104
'ITMDWTTransferEnable',
104105
'DisableITMPorts 0xFFFFFFFF',

support/gdb-swo.init

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,6 @@
2727
# $swoPortMask -- The ITM ports to enable, calculated based on ports used in swoConfig (launch.json)
2828
#
2929

30-
# The following are ARM CoreSight blocks but the Silicon Vendors are free to chose
31-
# alternate base addresses. Check with your vendor documentation
32-
set language c
33-
set $ITM_BASE = 0xE0000000
34-
set $DWT_BASE = 0xE0001000
35-
set $DCB_BASE = 0xE000EDF0
36-
set $TPI_BASE = 0xE0040000
37-
set language auto
38-
3930
# We wish we could do this whole thing in python some sane language but python is not enabled
4031
# in many distributions of gdb
4132

support/gdbsupport.init

Lines changed: 85 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,229 +1,266 @@
1+
# The following are ARM CoreSight blocks but the Silicon Vendors are free to chose
2+
# alternate base addresses. Check with your vendor documentation
3+
set language c
4+
set $ITM_BASE = 0xE0000000
5+
set $DWT_BASE = 0xE0001000
6+
set $SCS_BASE = 0xE000E000
7+
set $SCB_BASE = $SCS_BASE + 0xD00
8+
set $DCB_BASE = $SCB_BASE + 0xF0
9+
set $TPI_BASE = 0xE0040000
10+
set language auto
11+
112
#
213
# Help needed: There are many useful functions here but most of them use hardcoded addresses
314
# that may not be the same for all devices. Wish we can port all these functions to something
415
# more usable (modifiable). In the meantime we are going to use the function defined in gdb-swo.Initializes
516
#
617
define EnableITMAccess
718
set language c
8-
set *0xE000EDFC |= 0x1000000
9-
set *0xE0000FB0 = 0xC5ACCE55
19+
set *($DCB_BASE + 0xC) |= 0x1000000
20+
set *($ITM_BASE + 0xFB0) = 0xC5ACCE55
1021
set language auto
1122
end
1223

1324
define BaseSWOSetup
1425
set language c
15-
set *0xE0040304 = 0x100
16-
set *0xE00400F0 = 2
17-
set *0xE0040010 = $arg0
18-
set *0xE0001000 &= ~(0x8000)
19-
set *0xE0001000 |= 0xBFF
26+
27+
# NRZ is the default format
28+
set $format = 2
29+
if $argc > 1
30+
# format specified explicitly
31+
set $format = $arg1
32+
end
33+
34+
set *($TPI_BASE + 0x304) = 0x100
35+
set *($TPI_BASE + 0x0F0) = $format
36+
set *($TPI_BASE + 0x010) = $arg0
37+
set *($DWT_BASE) &= ~(0x8000)
38+
set *($DWT_BASE) |= 0xBFF
2039
set language auto
2140
end
2241

2342
define SetITMTimestampFrequency
2443
set language c
25-
set *0xE0000E80 &= ~(0x3 << 10)
26-
set *0xE0000E80 |= ($arg0 << 10)
44+
set *($ITM_BASE + 0xE80) &= ~(0x3 << 10)
45+
set *($ITM_BASE + 0xE80) |= ($arg0 << 10)
2746
set language auto
2847
end
2948

3049
define SetITMTimestampPrescale
3150
set language c
32-
set *0xE0000E80 &= ~(0x3 << 8)
33-
set *0xE0000E80 |= ($arg0 << 8)
51+
set *($ITM_BASE + 0xE80) &= ~(0x3 << 8)
52+
set *($ITM_BASE + 0xE80) |= ($arg0 << 8)
3453
set language auto
3554
end
3655

3756
define EnableITMPorts
3857
set language c
39-
set *0xE0000E00 |= $arg0
58+
set *($ITM_BASE + 0xE00) |= $arg0
4059
set language auto
4160
end
4261

4362
define DisableITMPorts
4463
set language c
45-
set *0xE0000E00 &= ~($arg0)
64+
set *($ITM_BASE + 0xE00) &= ~($arg0)
4665
set language auto
4766
end
4867

4968
define SetITMId
5069
set language c
51-
set *0xE0000E80 &= ~(0x7F << 16)
52-
set *0xE0000E80 |= ($arg0 << 16)
70+
set *($ITM_BASE + 0xE80) &= ~(0x7F << 16)
71+
set *($ITM_BASE + 0xE80) |= ($arg0 << 16)
5372
set language auto
5473
end
5574

5675
define ITMGlobalEnable
5776
set language c
58-
set $busy = ((*0xE0000E80 & 0x800000))
77+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
5978
while ($busy)
60-
set $busy = ((*0xE0000E80 & 0x800000))
79+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
6180
end
6281

63-
set *0xE0000E80 |= 0x1
82+
set *($ITM_BASE + 0xE80) |= 0x1
6483

65-
set $busy = ((*0xE0000E80 & 0x800000))
84+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
6685
while ($busy)
67-
set $busy = ((*0xE0000E80 & 0x800000))
86+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
6887
end
6988
set language auto
7089
end
7190

7291
define ITMGlobalDisable
7392
set language c
74-
set $busy = ((*0xE0000E80 & 0x800000))
93+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
7594
while ($busy)
76-
set $busy = ((*0xE0000E80 & 0x800000))
95+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
7796
end
7897

79-
set *0xE0000E80 &= ~(0x1)
98+
set *($ITM_BASE + 0xE80) &= ~(0x1)
8099

81-
set $busy = ((*0xE0000E80 & 0x800000))
100+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
82101
while ($busy)
83-
set $busy = ((*0xE0000E80 & 0x800000))
102+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
84103
end
85104
set language auto
86105
end
87106

88107
define ITMTimestampEnable
89108
set language c
90-
set *0xE0000E80 |= 0x302
109+
set *($ITM_BASE + 0xE80) |= 0x302
91110
set language auto
92111
end
93112

94113
define ITMTimestampDisable
95114
set language c
96-
set *0xE0000E80 &= ~(0x2)
115+
set *($ITM_BASE + 0xE80) &= ~(0x2)
97116
set language auto
98117
end
99118

100119
define ITMSyncEnable
101120
set language c
102-
set *0xE0000E80 |= 0x4
121+
set *($ITM_BASE + 0xE80) |= 0x4
103122
set language auto
104123
end
105124

106125
define ITMSyncDisable
107126
set language c
108-
set *0xE0000E80 &= ~(0x4)
127+
set *($ITM_BASE + 0xE80) &= ~(0x4)
109128
set language auto
110129
end
111130

112131
define ITMDWTTransferEnable
113132
set language c
114-
set *0xE0000E80 |= 0x8
133+
set *($ITM_BASE + 0xE80) |= 0x8
115134
set language auto
116135
end
117136

118137
define ITMDWTTransferDisable
119138
set language c
120-
set *0xE0000E80 &= (~0x8)
139+
set *($ITM_BASE + 0xE80) &= (~0x8)
121140
set language auto
122141
end
123142

124143
define EnableDWTSync
125144
set language c
126-
set *0xE0001000 |= 0x800
145+
set *($DWT_BASE) |= 0x800
127146
set language auto
128147
end
129148

130149
define DisableDWTSync
131150
set language c
132-
set *0xE0001000 &= ~(0x800)
151+
set *($DWT_BASE) &= ~(0x800)
133152
set language auto
134153
end
135154

136155
define EnablePCSample
137156
set language c
138-
set *0xE0001004 = 0x0
139-
set *0xE0001000 |= 0x1201
157+
set *($DWT_BASE + 0x004) = 0x0
158+
set *($DWT_BASE) |= 0x1201
140159
set language auto
141160
end
142161

143162
define DisablePCSample
144163
set language c
145-
set *0xE0001000 &= ~(0x1000)
164+
set *($DWT_BASE) &= ~(0x1000)
146165
set language auto
147166
end
148167

149168
define EnableCycleCountEvent
150169
set language c
151-
set *0xE0001000 |= 0x400000
170+
set *($DWT_BASE) |= 0x400000
152171
set language auto
153172
end
154173

155174
define DisableCycleCountEvent
156175
set language c
157-
set *0xE0001000 &= ~(0x400000)
176+
set *($DWT_BASE) &= ~(0x400000)
158177
set language auto
159178
end
160179

161180
define EnableFoldedEvent
162181
set language c
163-
set *0xE0001000 |= 0x200000
182+
set *($DWT_BASE) |= 0x200000
164183
set language auto
165184
end
166185

167186
define DisableFoldedEvent
168187
set language c
169-
set *0xE0001000 &= ~(0x200000)
188+
set *($DWT_BASE) &= ~(0x200000)
170189
set language auto
171190
end
172191

173192
define EnableLSUCountEvent
174193
set language c
175-
set *0xE0001000 |= 0x100000
194+
set *($DWT_BASE) |= 0x100000
176195
set language auto
177196
end
178197

179198
define DisableLSUCountEvent
180199
set language c
181-
set *0xE0001000 &= ~(0x100000)
200+
set *($DWT_BASE) &= ~(0x100000)
182201
set language auto
183202
end
184203

185204
define EnableSleepCountEvent
186205
set language c
187-
set *0xE0001000 |= 0x80000
206+
set *($DWT_BASE) |= 0x80000
188207
set language auto
189208
end
190209

191210
define DisableSleepCountEvent
192211
set language c
193-
set *0xE0001000 &= ~(0x80000)
212+
set *($DWT_BASE) &= ~(0x80000)
194213
set language auto
195214
end
196215

197216
define EnableInterruptOverheadEvent
198217
set language c
199-
set *0xE0001000 |= 0x40000
218+
set *($DWT_BASE) |= 0x40000
200219
set language auto
201220
end
202221

203222
define DisableInterruptOverheadEvent
204223
set language c
205-
set *0xE0001000 &= ~(0x40000)
224+
set *($DWT_BASE) &= ~(0x40000)
206225
set language auto
207226
end
208227

209228
define EnableCPICountEvent
210229
set language c
211-
set *0xE0001000 |= 0x20000
230+
set *($DWT_BASE) |= 0x20000
212231
set language auto
213232
end
214233

215234
define DisableCPICountEvent
216235
set language c
217-
set *0xE0001000 &= ~(0x20000)
236+
set *($DWT_BASE) &= ~(0x20000)
218237
set language auto
219238
end
220239

221240
define SoftwareReset
222241
set language c
242+
243+
set $halt = 0
244+
245+
if $argc
246+
set $halt = $arg0
247+
end
248+
249+
if $halt
250+
set $demcr = *($DCB_BASE + 0xC)
251+
set *($DCB_BASE + 0xC) |= 1
252+
end
253+
223254
set *0xE000ED0C = 0x05FA0004
224255
set $busy = (*0xE000ED0C & 0x4)
225256
while ($busy)
226257
set $busy = (*0xE000ED0C & 0x4)
227258
end
259+
260+
if $halt
261+
# restore DEMCR value
262+
set *($DCB_BASE + 0xC) = $demcr
263+
end
264+
228265
set language auto
229266
end

0 commit comments

Comments
 (0)