Skip to content

Commit 29a004a

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 29a004a

File tree

3 files changed

+80
-59
lines changed

3 files changed

+80
-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: 77 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,229 +1,258 @@
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+
set *($TPI_BASE + 0x304) = 0x100
27+
set *($TPI_BASE + 0x0F0) = $argc > 1 ? $arg1 : 2
28+
set *($TPI_BASE + 0x010) = $arg0
29+
set *($DWT_BASE) &= ~(0x8000)
30+
set *($DWT_BASE) |= 0xBFF
2031
set language auto
2132
end
2233

2334
define SetITMTimestampFrequency
2435
set language c
25-
set *0xE0000E80 &= ~(0x3 << 10)
26-
set *0xE0000E80 |= ($arg0 << 10)
36+
set *($ITM_BASE + 0xE80) &= ~(0x3 << 10)
37+
set *($ITM_BASE + 0xE80) |= ($arg0 << 10)
2738
set language auto
2839
end
2940

3041
define SetITMTimestampPrescale
3142
set language c
32-
set *0xE0000E80 &= ~(0x3 << 8)
33-
set *0xE0000E80 |= ($arg0 << 8)
43+
set *($ITM_BASE + 0xE80) &= ~(0x3 << 8)
44+
set *($ITM_BASE + 0xE80) |= ($arg0 << 8)
3445
set language auto
3546
end
3647

3748
define EnableITMPorts
3849
set language c
39-
set *0xE0000E00 |= $arg0
50+
set *($ITM_BASE + 0xE00) |= $arg0
4051
set language auto
4152
end
4253

4354
define DisableITMPorts
4455
set language c
45-
set *0xE0000E00 &= ~($arg0)
56+
set *($ITM_BASE + 0xE00) &= ~($arg0)
4657
set language auto
4758
end
4859

4960
define SetITMId
5061
set language c
51-
set *0xE0000E80 &= ~(0x7F << 16)
52-
set *0xE0000E80 |= ($arg0 << 16)
62+
set *($ITM_BASE + 0xE80) &= ~(0x7F << 16)
63+
set *($ITM_BASE + 0xE80) |= ($arg0 << 16)
5364
set language auto
5465
end
5566

5667
define ITMGlobalEnable
5768
set language c
58-
set $busy = ((*0xE0000E80 & 0x800000))
69+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
5970
while ($busy)
60-
set $busy = ((*0xE0000E80 & 0x800000))
71+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
6172
end
6273

63-
set *0xE0000E80 |= 0x1
74+
set *($ITM_BASE + 0xE80) |= 0x1
6475

65-
set $busy = ((*0xE0000E80 & 0x800000))
76+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
6677
while ($busy)
67-
set $busy = ((*0xE0000E80 & 0x800000))
78+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
6879
end
6980
set language auto
7081
end
7182

7283
define ITMGlobalDisable
7384
set language c
74-
set $busy = ((*0xE0000E80 & 0x800000))
85+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
7586
while ($busy)
76-
set $busy = ((*0xE0000E80 & 0x800000))
87+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
7788
end
7889

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

81-
set $busy = ((*0xE0000E80 & 0x800000))
92+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
8293
while ($busy)
83-
set $busy = ((*0xE0000E80 & 0x800000))
94+
set $busy = ((*($ITM_BASE + 0xE80) & 0x800000))
8495
end
8596
set language auto
8697
end
8798

8899
define ITMTimestampEnable
89100
set language c
90-
set *0xE0000E80 |= 0x302
101+
set *($ITM_BASE + 0xE80) |= 0x302
91102
set language auto
92103
end
93104

94105
define ITMTimestampDisable
95106
set language c
96-
set *0xE0000E80 &= ~(0x2)
107+
set *($ITM_BASE + 0xE80) &= ~(0x2)
97108
set language auto
98109
end
99110

100111
define ITMSyncEnable
101112
set language c
102-
set *0xE0000E80 |= 0x4
113+
set *($ITM_BASE + 0xE80) |= 0x4
103114
set language auto
104115
end
105116

106117
define ITMSyncDisable
107118
set language c
108-
set *0xE0000E80 &= ~(0x4)
119+
set *($ITM_BASE + 0xE80) &= ~(0x4)
109120
set language auto
110121
end
111122

112123
define ITMDWTTransferEnable
113124
set language c
114-
set *0xE0000E80 |= 0x8
125+
set *($ITM_BASE + 0xE80) |= 0x8
115126
set language auto
116127
end
117128

118129
define ITMDWTTransferDisable
119130
set language c
120-
set *0xE0000E80 &= (~0x8)
131+
set *($ITM_BASE + 0xE80) &= (~0x8)
121132
set language auto
122133
end
123134

124135
define EnableDWTSync
125136
set language c
126-
set *0xE0001000 |= 0x800
137+
set *($DWT_BASE) |= 0x800
127138
set language auto
128139
end
129140

130141
define DisableDWTSync
131142
set language c
132-
set *0xE0001000 &= ~(0x800)
143+
set *($DWT_BASE) &= ~(0x800)
133144
set language auto
134145
end
135146

136147
define EnablePCSample
137148
set language c
138-
set *0xE0001004 = 0x0
139-
set *0xE0001000 |= 0x1201
149+
set *($DWT_BASE + 0x004) = 0x0
150+
set *($DWT_BASE) |= 0x1201
140151
set language auto
141152
end
142153

143154
define DisablePCSample
144155
set language c
145-
set *0xE0001000 &= ~(0x1000)
156+
set *($DWT_BASE) &= ~(0x1000)
146157
set language auto
147158
end
148159

149160
define EnableCycleCountEvent
150161
set language c
151-
set *0xE0001000 |= 0x400000
162+
set *($DWT_BASE) |= 0x400000
152163
set language auto
153164
end
154165

155166
define DisableCycleCountEvent
156167
set language c
157-
set *0xE0001000 &= ~(0x400000)
168+
set *($DWT_BASE) &= ~(0x400000)
158169
set language auto
159170
end
160171

161172
define EnableFoldedEvent
162173
set language c
163-
set *0xE0001000 |= 0x200000
174+
set *($DWT_BASE) |= 0x200000
164175
set language auto
165176
end
166177

167178
define DisableFoldedEvent
168179
set language c
169-
set *0xE0001000 &= ~(0x200000)
180+
set *($DWT_BASE) &= ~(0x200000)
170181
set language auto
171182
end
172183

173184
define EnableLSUCountEvent
174185
set language c
175-
set *0xE0001000 |= 0x100000
186+
set *($DWT_BASE) |= 0x100000
176187
set language auto
177188
end
178189

179190
define DisableLSUCountEvent
180191
set language c
181-
set *0xE0001000 &= ~(0x100000)
192+
set *($DWT_BASE) &= ~(0x100000)
182193
set language auto
183194
end
184195

185196
define EnableSleepCountEvent
186197
set language c
187-
set *0xE0001000 |= 0x80000
198+
set *($DWT_BASE) |= 0x80000
188199
set language auto
189200
end
190201

191202
define DisableSleepCountEvent
192203
set language c
193-
set *0xE0001000 &= ~(0x80000)
204+
set *($DWT_BASE) &= ~(0x80000)
194205
set language auto
195206
end
196207

197208
define EnableInterruptOverheadEvent
198209
set language c
199-
set *0xE0001000 |= 0x40000
210+
set *($DWT_BASE) |= 0x40000
200211
set language auto
201212
end
202213

203214
define DisableInterruptOverheadEvent
204215
set language c
205-
set *0xE0001000 &= ~(0x40000)
216+
set *($DWT_BASE) &= ~(0x40000)
206217
set language auto
207218
end
208219

209220
define EnableCPICountEvent
210221
set language c
211-
set *0xE0001000 |= 0x20000
222+
set *($DWT_BASE) |= 0x20000
212223
set language auto
213224
end
214225

215226
define DisableCPICountEvent
216227
set language c
217-
set *0xE0001000 &= ~(0x20000)
228+
set *($DWT_BASE) &= ~(0x20000)
218229
set language auto
219230
end
220231

221232
define SoftwareReset
222233
set language c
234+
235+
set $halt = 0
236+
237+
if $argc
238+
set $halt = $arg0
239+
end
240+
241+
if $halt
242+
set $demcr = *($DCB_BASE + 0xC)
243+
set *($DCB_BASE + 0xC) |= 1
244+
end
245+
223246
set *0xE000ED0C = 0x05FA0004
224247
set $busy = (*0xE000ED0C & 0x4)
225248
while ($busy)
226249
set $busy = (*0xE000ED0C & 0x4)
227250
end
251+
252+
if $halt
253+
# restore DEMCR value
254+
set *($DCB_BASE + 0xC) = $demcr
255+
end
256+
228257
set language auto
229258
end

0 commit comments

Comments
 (0)