Forum: Mikrocontroller und Digitale Elektronik gdb problem mit openocd


von openocd (Gast)


Lesenswert?

Hallo,
ich habe Probleme mit meinem SAMD21 Xplainded board. Ich 
programmiere/debugge bereits seit einem tag mit openocd und gdb und nun 
auf einmal erhalte ich die meldung, dass der gdb nicht mehr auf das 
device zugreifen kann:
1
blah@blah:~/Desktop/samd21/blinky-2302$ openocd 
2
Open On-Chip Debugger 0.9.0 (2018-01-24-01:05)
3
Licensed under GNU GPL v2
4
For bug reports, read
5
  http://openocd.org/doc/doxygen/bugs.html
6
Info : only one transport option; autoselect 'swd'
7
adapter speed: 500 kHz
8
adapter_nsrst_delay: 100
9
cortex_m reset_config sysresetreq
10
Info : CMSIS-DAP: SWD  Supported
11
Info : CMSIS-DAP: Interface Initialised (SWD)
12
Info : CMSIS-DAP: FW Version = 03.25.01B6
13
Info : SWCLK/TCK = 1 SWDIO/TMS = 1 TDI = 1 TDO = 1 nTRST = 0 nRESET = 1
14
Info : CMSIS-DAP: Interface ready
15
Info : clock speed 500 kHz
16
Info : SWD IDCODE 0x0bc11477
17
Error: Failed to read memory and, additionally, failed to find out where
18
Polling target at91samd21j18a.cpu failed, trying to reexamine
19
Examination failed, GDB will be halted. Polling again in 100ms
20
Polling target at91samd21j18a.cpu failed, trying to reexamine
21
Examination failed, GDB will be halted. Polling again in 300ms
22
Polling target at91samd21j18a.cpu failed, trying to reexamine
23
Examination failed, GDB will be halted. Polling again in 700ms
24
Polling target at91samd21j18a.cpu failed, trying to reexamine
25
Examination failed, GDB will be halted. Polling again in 1500ms
26
Polling target at91samd21j18a.cpu failed, trying to reexamine
27
Examination failed, GDB will be halted. Polling again in 3100ms
28
Polling target at91samd21j18a.cpu failed, trying to reexamine

die openocd config:
1
# Atmel-ICE JTAG/SWD in-circuit debugger.
2
# get serial: lsusb -vd 03eb:2111 | grep iSerial
3
interface cmsis-dap
4
#cmsis_dap_vid_pid 0x03eb 0x2111
5
#cmsis_dap_serial ATML2130021800030238
6
7
# Chip info 
8
set CHIPNAME at91samd21j18a
9
source [find target/at91samdXX.cfg]

dmeseg sagt:
1
[24771.247890] usb 3-2: new high-speed USB device number 15 using xhci_hcd
2
[24771.565383] usb 3-2: config 1 interface 2 altsetting 0 bulk endpoint 0x84 has invalid maxpacket 64
3
[24771.565408] usb 3-2: config 1 interface 2 altsetting 0 bulk endpoint 0x5 has invalid maxpacket 64
4
[24771.566527] usb 3-2: New USB device found, idVendor=03eb, idProduct=2169
5
[24771.566529] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
6
[24771.566530] usb 3-2: Product: EDBG CMSIS-DAP
7
[24771.566531] usb 3-2: Manufacturer: Atmel Corp.
8
[24771.566532] usb 3-2: SerialNumber: ATML2130031800038334
9
[24771.570909] hid-generic 0003:03EB:2169.000C: hiddev0,hidraw1: USB HID v1.11 Device [Atmel Corp. EDBG CMSIS-DAP] on usb-0000:03:00.0-2/input0
10
[24771.570999] cdc_acm 3-2:1.1: ttyACM0: USB ACM device
11
[24771.571399] usb-storage 3-2:1.3: USB Mass Storage device detected
12
[24771.572173] scsi host42: usb-storage 3-2:1.3
13
[24772.573450] scsi 42:0:0:0: Direct-Access     ATMEL    EDBG             1.00 PQ: 0 ANSI: 3
14
[24772.574133] sd 42:0:0:0: Attached scsi generic sg2 type 0
15
[24772.574899] sd 42:0:0:0: [sdb] 4096 512-byte logical blocks: (2.10 MB/2.00 MiB)
16
[24772.575791] sd 42:0:0:0: [sdb] Write Protect is off
17
[24772.575793] sd 42:0:0:0: [sdb] Mode Sense: 0f 00 00 00
18
[24772.576746] sd 42:0:0:0: [sdb] No Caching mode page found
19
[24772.576748] sd 42:0:0:0: [sdb] Assuming drive cache: write through
20
[24772.580202]  sdb:
21
[24772.586103] sd 42:0:0:0: [sdb] Attached SCSI removable disk

von Christopher J. (christopher_j23)


Lesenswert?

Aus den dmesg-Meldungen werde ich jetzt nicht direkt schlau aber ein 
typischer Fehler, der bei OpenOCD in ein Timeout führt, ist wenn man die 
SWD-Pins fälschlicherweise "umkonfiguriert".
Schau also mal ins Datenblatt deines Controllers, mache aus welche Pins 
das sind und schaue dann mal scharf in deinen Quellcode ob du da nicht 
irgendeinen der beiden Pins für etwas anderes hergenommen hast.

Bei STM32 ist eine sehr einfache Möglichkeit die SWD-Pins wieder in 
einen funktionalen Zustand zu versetzen, den Controller per Boot-Pin in 
irgendeinen ROM-Bootloader zu booten (sei es UART, USB, ganz egal), denn 
innerhalb dieses ROM-Bootloaders sind die SWD-Pins eben für SWD 
konfiguriert. Wie das jetzt im Detail bei Atmel aussieht kann ich nicht 
sagen. ymmv

von openocd (Gast)


Lesenswert?

Hex danke für den Hinweis. Mit dem Microchip Studio habe ich ein 
Beispiel auf den Controller schreiben können. Jetzt kann ich wieder ein 
älteres programm mittel openocd drauf spielen.

PA30 und PA31 wären die PINS für das SWD, aber diese Überschreibe ich 
nicht. Ich probiere mich gerade an dem TC3 (zunächste einfache PWM) aus 
und wollte den TC3 auf PA14 legen. Kann es sein, dass der µC hängt, weil 
ich z.b. den Clock garnicht richtig initialisiert habe?

von openocd (Gast)


Lesenswert?

Es ist tatsächlich so. Wenn man Peripherie wie z.b. den TC3 aktiviert 
aber keinen Clock mux bzw definiert, dann hängt der µC. Ganz einfach :)

von Stefan F. (Gast)


Lesenswert?

openocd schrieb:
> ann es sein, dass der µC hängt, weil
> ich z.b. den Clock garnicht richtig initialisiert habe?

Klar kann das sein. Einige I/O Funktionen lösen einen Hardfault aus, 
wenn man drauf zugreifen will bevor ihr Takt aktiviert ist.

Zumindest ist das bei STM so.

von openocd (Gast)


Lesenswert?

Ok, der OPENOCD kam per SWD nicht mehr auf den µC drauf. Was machen dann 
solche tools wie microchip Studio anders, .. ich meine mit diesem Tool 
habe ich irgendein beispiel drauf geflasht und erst danach konnte ich 
OPENOCD wieder nutzen. Ginge das nicht auch mit OPENOCD?

von Christopher J. (christopher_j23)


Lesenswert?

Ja, das geht auch mit OpenOCD und wird oft als "connect under reset" 
bezeichnet.

Das funktioniert so, dass man das Target resettet. Entweder macht man 
das per OpenOCD mittels Resetleitung des Debug-Adapters oder man macht 
das manuell per Reset-Taster des Targets.

Manuell geht das dann so:
- Resetbutton drücken und gedrückt halten
- OpenOCD Verbindung starten
- Resetbutton loslassen

Das funktioniert, weil die SWD-Pins nach einem Reset (bei mir bekannten 
Controllern) "korrekt konfiguriert" sind und der Debug-Adapter so mit 
dem Target kommunizieren kann, bevor der Code geladen wird, der die 
SWD-Pins umkonfiguriert.

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Christopher J. schrieb:
> Ja, das geht auch mit OpenOCD und wird oft als "connect under reset"
> bezeichnet.

Vorsicht: Funktioniert bei einigen µCs, aber bei vielen anderen wird mit 
der Reset Leitung auch das Debug Interface abgeklemmt.

Ich bin jetzt zu faul nachzuschauen was beim AT91samD21 geht und was 
nicht, eventuell kann der das.

von openocd (Gast)


Lesenswert?

ok vielen Dank für die Infos, ich werde es bei gelegenheit mal 
ausprobieren, sicher werde ich den ein oder anderen Hard-fail sicher 
nochmal produzieren ;D

von Christopher J. (christopher_j23)


Lesenswert?

Jim M. schrieb:
> Christopher J. schrieb:
>
>> Ja, das geht auch mit OpenOCD und wird oft als "connect under reset"
>> bezeichnet.
>
> Vorsicht: Funktioniert bei einigen µCs, aber bei vielen anderen wird mit
> der Reset Leitung auch das Debug Interface abgeklemmt.

Das ist ein guter Punkt aber im Fall des SAMD geben die OpenOCD-Quellen 
direkt die Antwort:
1
# SAMD DSU will hold the CPU in reset if TCK is low when RESET_N
2
# deasserts (see datasheet Atmel-42181E–SAM-D21_Datasheet–02/2015, section 12.6.2)
3
#
4
# dsu_reset_deassert configures whether we want to run or halt out of reset,
5
# then instruct the DSU to let us out of reset.
6
$_TARGETNAME configure -event reset-deassert-post {
7
        at91samd dsu_reset_deassert
8
}
9
10
# SRST (wired to RESET_N) resets debug circuitry
11
# srst_pulls_trst is not configured here to avoid an error raised in reset halt
12
reset_config srst_gates_jtag
13
14
# Do not use a reset button with other SWD adapter than Atmel's EDBG.
15
# DSU usually locks MCU in reset state until you issue a reset command
16
# in OpenOCD.

Interessanterweise liegt da wohl auch was im Argen und wenn man sich die 
älteren OpenOCD-Quellen anschaut, war dort die Resetkonfiguration leicht 
verändert:
1
# SAMD DSU will hold the CPU in reset if TCK is low when RESET_N
2
# deasserts (see datasheet Atmel-42181E–SAM-D21_Datasheet–02/2015, section 12.6.2)
3
#
4
# dsu_reset_deassert configures whether we want to run or halt out of reset,
5
# then instruct the DSU to let us out of reset.
6
$_TARGETNAME configure -event reset-deassert-post {
7
        at91samd dsu_reset_deassert
8
}
9
10
# SRST (wired to RESET_N) resets debug circuitry
11
reset_config srst_gates_jtag srst_pulls_trst

Da ich hier kein Xplained-Board zum testen rumfliegen habe, kann ich das 
auch nicht genau nachvollziehen. Das kann ja bei Gelegenheit der TO mal 
machen und berichten. Der Code stammt direkt aus dem target.tcl aus dem 
OpenOCD-Mirror von hier:
https://github.com/ntfreak/openocd/blob/master/tcl/target/at91samdXX.cfg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.