OpenOCD zum Debuggen
OpenOCD ist ein Werkzeug, um über JTAG-Adapter mit der Debug-Schnittstelle auf einem Chip zu kommunizieren. Es unterstützt neben anderen auch meinen Bus Blaster als JTAG-Debug-Adapter. Das Programm bietet zwar keine direkte Unterstützung für den verbauten Samsung-SoC, allerdings tun das einige andere Modelle aus Samsungs S3C-Familie - und sie scheinen sich stark zu ähneln.
Die Dokumentation von OpenOCD ist nicht sonderlich gut. Aber nach einigem Trial and Error habe ich eine funktionierende openocd.cfg:
source [find interface/ftdi/dp_busblaster.cfg] adapter_khz 1000 reset_config srst_only srst_open_drain reset_config trst_and_srst jtag newtap s3c2416 cpu -irlen 4 -ircapture 0x1 -irmask 0xf \ -expected-id 0x07926f0f target create s3c2416.cpu arm920t -endian little -chain-position \ s3c2416.cpu
OpenOCD zeigt nach dem Start an, dass es etwas gefunden hat:
$ openocd -f openocd.cfg ... Info : clock speed 1000 kHz Info : JTAG tap: s3c2416.cpu tap/device found: 0x07926f0f \ (mfg: 0x787 (), part: 0x7926, ver: 0x0) Info : Embedded ICE version 6 Info : s3c2416.cpu: hardware has 2 breakpoint/watchpoint units Info : accepting 'telnet' connection on tcp/4444
Jetzt kann ich mich mit OpenOCD verbinden und Dinge ausprobieren.
$ telnet localhost 4444 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger > halt s3c2416.cpu: target state: halted target halted in ARM state due to debug-request, current mode: Supervisor cpsr: 0x40000013 pc: 0x33c04664 MMU: disabled, D-Cache: disabled, I-Cache: disabled > step s3c2416.cpu: target state: halted target halted in ARM state due to single-step, current mode: Supervisor cpsr: 0x40000013 pc: 0x33c03990 MMU: disabled, D-Cache: enabled, I-Cache: disabled
Damit wird die CPU angehalten und führt CPU-Anweisungen im Einzelschrittmodus aus. Entsprechend des Speicher-Mappings laut dem Datenblatt des S3C2416 wird der DDR-RAM ab der Adresse 0x30000000 eingeblendet, die angezeigte Adresse 0x33c04664 liegt also in diesem RAM.
Jetzt kann ich herumspielen und Daten aus den Registern des SoC lesen und auch beschreiben. Für einen schnellen Test suche ich das Transmit-Register der seriellen Schnittstelle im Datenblatt. Es heißt UTXH0 und befindet sich an Adresse 0x50000020. Ich versuche, den Wert 0x55 (ASCII-Code für "U") in das Register zu schreiben: mww 0x50000020 0x55
Und tatsächlich: "U" wird über die serielle Schnittstelle ausgegeben. Jetzt weiß ich, wie ich Text ausgeben kann.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
- ohne Werbung
- mit ausgeschaltetem Javascript
- mit RSS-Volltext-Feed
Auf der Suche nach neuen Kontakten | Flash-Speicher auslesen |
+1 Mehr davon und ich abonniere auch. Und wie laoladabamba sagt, die Weltraumartikel...
Aber ehrlich. Wenn's nur News über neue Grafikkarten gibt heulen die selben Leute über...
ich seh das ja auch immer mit einem zwinkernden Auge. Entwickler sollen entwickeln und...
Die Chancen dass es ein Linux ist sind relativ gross. Würde es mich interessieren hätte...
Hier kann man mal sehen, was Fachkraft wirklich bedeutet. *Davon* haben wir zu wenige.