Ich habe hier zwei Fahrzeugmodule (Rückfahrkamera) aus dem Baujahr 2009-2012. Bei einem wird der Lenkwinkel über CAN-Bus, bei dem anderen über ein analoges Signal (vermutlich PWM) eingespeist. Das Modul mit dem analogen Lenkwinkelsignal funktioniert grundsätzlich auch anstelle dem mit CAN-Lenkwinkel, jedoch werden die Linien nicht angezeigt. Von der Platine und den Komponenten her sind beide gleich, also ist es nur eine Frage der Software. In beiden Modulen werkelt ein MC9S12 Mikrocontroller, wie man ihn häufig in KFZ-Modulen verschiedenster Art findet. Dieser gehört zur HCS12-Familie und verfügt über einen BDM-Anschluß zum debuggen und programmieren. Den Debug-Header konnte ich schnell identifizieren. Dann habe ich einen (China) USBDM an diesen Header verbunden versucht und mittels der USBDM-Software von Sourceforge https://sourceforge.net/p/usbdm/wiki/Home/ irgendwas sinnvolles zu tun, jedoch wird jeder Connect-Versuch mit einer Fehlermeldung quittiert. Soweit ich die Signale gemessen habe sind MODA und MODB mit Widerständen auf GND gezogen und damit "0", was einem normalen Betriebsmodus entspricht. Wer kennt sich mit sowas aus und kann mit etwas "Starthilfe" geben wie ich an die Register, den RAM, Flash und EEPROM herankomme?
Gast
#6803710
Der Controller wird garantiert gegen Auslesen geschützt sein, je nach Programmierung kann der Readout auch mit einem Passwort versehen sein.
Gast
#6803774
Ich weiß nicht ob Dir das hilft, ein Xprog M kann das ev. auslesen , zumindest Flash und EEPROM.
René F. schrieb: > Der Controller wird garantiert gegen Auslesen geschützt sein, je nach > Programmierung kann der Readout auch mit einem Passwort versehen sein. Davon ging ich auch aus, aber dem ist wohl nicht so.
Inzwischen habe ich es geschafft. Und zwar verwende ich diesen USBDM-Clone (China-Ware). Das Pinout habe ich mal angefügt, weil man da leicht in die Irre geführt wird. Oft wird nur das Pinout auf dem Board angegeben, das am Stecker ist natürlich spiegelverkehrt ;-) Dann habe ich USBDM installiert und dort gibt es eine ganze Reihe von Tools, u.a. den "USBDM Memory Dump". Dort habe ich zunächst den Prozessortyp eingestellt und die USBDM Geschwindigkeit auf 12MHz. Dann den auszulesenden Speicherbereich (hier war ich großzügig und habe von 0x0000 bis 0xFFFF mal alles genommen, ist ja nur eine 16-Bit CPU drin). Das Tool speichert den readout im Motorola S12-Format, welches man z.B. mit HxD in eine lineare Binärdatei wandeln kann. Habe von beiden Modulen mal den Readout angehangen. Beim 8M5T habe ich zweimal ausgelesen und es gibt erstaunlich viele Unterschiede. Hier hätte ich jetzt nur welche in den RAM-Bereichen erwartet. Für das 9M5T habe ich auch mal die Original-Firmware-Updatedatei angefügt, mit der das Modul aktualisiert wurde. Jetzt versuche ich aus dem ganzen mal schlau zu werden (natürlich sehr gern mit Eurer Hilfe! :-) und letztlich einen Weg zu finden die 9M2J Firmware vom 9M5T-Modul auf das 8M5T-Modul zu kopieren. Die VBF-Datei dient einem CAN-basierenden Updater zum aktualisieren eines Moduls. Das 8M5T ist für ein anderes Fahrzeugmodell gedacht und ich kann ihm die 9M2J-Firmware nicht einfach so unterschieben. Die VBFs enthalten in der Regel einen secondary-bootloader, welcher in den RAM des µC im Modul eingebracht und ausgeführt wird und dieser dann den Rest des Updates (Flash löschen, Daten vom CAN lesen, Flash beschreiben, usw.) durchführt. In dem VBF-Header (im Binären Teil) wird in der Regel auch eine Startadresse angegeben. Ich vermute aber stark das dies der Teil ab 0x4000 ist. Dort ist im Moduldump kein Inhalt zu sehen, was dafür spricht das dieser Bereich speziell für einen Updater (2nd Bootloader) freigehalten wurde. Wenn die Memory-Map die ich aus dem Datenblatt vom MC9S12DG habe stimmt, dann beginnt ab 0x4000 der 16KB große Flash-Speicher (EEPROM) vom Chip. Eine Idee wäre nun den MC9S12 auf dem 8M5T-Board zu löschen (Mass erase) und mit dem Dump vom 9M5T-Board zu beschreiben... danach sollte sich dann das Modul am CAN-Bus wie ein 9M5T "zeigen" und nochmal ein "normales" Update annehmen.
Gast
#6804291
Du hast aber schon verstanden dass der MC9S12 Pages verwendet? Einen Hinweis wie das mit "USBDM Memory Dump" funktionieren könnte gibt es z.B. hier: https://community.nxp.com/t5/OSBDM-and-TBDML/USBDM-and-HCS12-9S12D64-read-write-problems/m-p/501003
Dieter schrieb: > Du hast aber schon verstanden dass der MC9S12 Pages verwendet? Ja, hab ich gelesen, aber ich dachte die werden nur für externe Ressourcen genutzt?
Gast
#6804426
Olli Z. schrieb: > > Ja, hab ich gelesen, aber ich dachte die werden nur für externe > Ressourcen genutzt? Im Datenblatt steht doch alles, außerdem beschreibt der Beitrag in dem Link wie man vorgeht (diesen Betrag zu finden ist nicht schwer). Und wenn man dann noch den EEPROM aktiviert bevor man ihn auslesen möchte werden vermutlich Daten in Bereich des EEPROM auftauchen (auch das wird im Beitrag des Links so gemacht). XPROG wurde hier ja schon erwähnt, das ist für Leute die sich nicht näher mit den Details beschäftigen wollen besser geeignet als USBDM...
Laut VBF wird zunächst der erste Block (0x140) an Adresse 0x4000 geladen und ausgeführt. Was man darin findet scheint aber kein HCS12 opcode zu sein, sieht mir eher aus wie eine Vektortabelle:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
Dieter schrieb: > XPROG wurde hier ja schon erwähnt, das ist für Leute die sich nicht > näher mit den Details beschäftigen wollen besser geeignet als USBDM... Eigentlich will ich mich mit Details beschäftigen, sonst hätte ich hier kaum gefragt. Das aber nur nebenbei. Um eine Verifikation zu haben habe ich mir XPROG mal angesehen. Vor 2-3 Jahren habe ich mir mal so ein China-Teil bestellt aber nie was mit gemacht, also Premiere. Naja und so "straight-forward" war es dann nun auch nicht das Ding ans laufen zu bekommen. Zuerst musste ich meinen USBASP updaten, mit einem UNO als ISP-Programmer. Dann den USB-Chip vom XPROG neu flashen und eine "spezielle" Version von XPROG 5.51 installieren (alles aus dieser Anleitung entnommen: https://www.e90post.com/forums/showthread.php?t=1838104). Am Ende konnte ich damit EEPROM und FLASH auslesen. Jetzt muss ich das erstmal analysieren. Ich habe zunächst mal die "unprotected" Variante vom "MC9S12_FLASH" und "MC9S12_EEPROM" gewählt. Darin beschrieben ist auch meine Variante mit dem MC9S12DG128 in der QFP80. Das ganze lies sich ohne anlegen der Stromversorgung am Modul, rein durch +5V vom XPROG bewerkstelligen. Die Dumps beider Module habe ich mal beigefügt. Eine erste Stichprobe mit dem 9M5T ergab, das ich nur einen Teil der im VBF steckenden Software im MC9S12 Flash finde:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Das was XPROG da ausgelesen hat finde ich auch 1:1 in meinem USBDM-Dump wieder. Einzig das XPROG die unprogrammierten Bereiche im Flash als 0xFF und USBDM diese als 0x00 ausgibt. Den Inhalt des EEPROMs finde ich z.B. garnicht im Update-File, was aber auch so gewollt sein kann. Das Flash-Protection-Byte 0x7BF0F steht auf 0xFE und zeigt somit einen ungeschützten Flash an (wenn ich es richtig interpretiert hab):
1 | |
2 | |
Block 0 und Block 1 Protection-Bytes 0x7BF0C und 0x7BF0D sind jedoch 0xFF. Könnte das der Grund sein warum die Blöcke im Dump leer sind? Ich versuche es dann doch mal mit einem Secured-Readout. Der ist etwas komplexer weil auch CLK verbunden werden muss. Ich nehme an der XPROG macht hier ein paar "Glitches".
Gast
#6805831
Der XPROG Dump passt doch recht gut zu der VBF Datei: Im XPROG Dump sind die 16 KByte Pages 0x38 bis 0x3F. Und in der VBF Datei die Pages 0x38, 0x39, 0x3C und 0x3D (die Page steht ja deutlich sichtbar als MSB der Adresse) sowie die Page 0x3E (Adresse 0x4000 bis 0x7FFF, siehe Datenblatt) sowie Page 0x3F (Adresse 0xC000 bis 0xFFFF, siehe Datenblatt). Nur der Inhalt des Dumps passt nicht überall exakt zur VBF Datei weil die Firmware Version der VBF Datei vermutlich nicht die selbe wie im Steuergerät ist.
Ich versuche mich mal mit nem Faktencheck: Der MC9S12DG128 ist eine 16-Bit HCS12 CPU mit M68HC11 Instruction-Set, 128K Flash (131.072, 0x20000), 2K EEPROM (2048, 0x800) und 8K RAM (8192, 0x2000) Die Memory-Map nach dem Reset ist so wie der Datenblatt-Auszug zeigt, also aufgrund des begrenzten Adressraumes der CPU (16-Bit = 0x0000 - 0xFFFF) wird zunächst "von allem etwas" durch den MMC in den direkt adressierbaren Bereich der CPU gemapped. --------------------------------- Im Bereich 0x0000-0x03FF liegt der 1K (1024, 0x400) große "Register-Space" der verschiedenste Einstellparameter und Zugang zu den I/O-Bausteinen des Chips enthält. Dieser überlagert zum Teil das 2K (0x800, 2048) große Adressbereich des EEPROMs (0x0000-0x07FF). D.H. nach dem Reset ist direkt nur ein ca. 1,5K (0x600, 1536) großer EEPROM-Bereich von 0x0200-0x07FF ansprechbar. Das gleiche gilt für das 2K große RAM, welches auch ab Adresse 0x0000 bis 0x1FFF liegt. Dieses wird vom EEPROM und vom Register-Space überlagert, sodass direkt nur ein ca. 6KB (0x1800, 6144) großer Bereich 0x0800-0x1FFF direkt verfügbar ist. Vom 128K Flash wird ab 0x4000 (bis maximal 0x7FFF) zunächst der "protected low sector" eingeblendet. Dann folgt ein 16K großes "Fenster" des Flash im Adressbereich von 0x8000-0xBFFF. Und diesem folgt ab 0xC000 der "flash protected high sector" vom Flash. Ganz am Ende des Adressbereiches liegt die 256 Byte große Vectortabelle (0xFF00-0xFFFF). --------------------------------- Der Flash selbst ist intern in zwei 64K Blöcke unterteilt und jeder Block in 1024 Zeilen zu je 64 Bytes. Die Löschgröße beträgt 8 Zeilen (512 Byte). Will man also auch nur ein einziges Byte im Flash ändern, muss man wenigstens 512 Byte löschen und neu schreiben. Die 128K des Flash sind nie als ganzes im Adressbereich der CPU eingeblendet, sondern immer nur max. 16KB davon im mittleren Page-Window 0x8000-0xBFFF. Über das PPAGE-Register im Register-Space wird bestimmt welcher der acht möglichen 16K Pages aktuell im Adressbereich verfügbar ist. Nach dem Reset ist das immer die erste Page welche die Flash-Speicheradresse 0x000000 referenziert. Das PPAGE-Register hält hierbei den Wert 0x38 Die für die "protected sectors" des Flash in der CPU festgelegten Speicherbereiche sind fix und zeigen im Flash immer auf dieselbe Stelle, sind also nicht veränderlich. --------------------------------- Wenn man also mit USBDM einen Dump von 0x0000 bis 0xFFFF durchführt erhält man zunächst nur einen der acht 16K Blöcke des Flash. Um mit USBDM den ganzen Flash zu dumpen muss man also 8 mal den Bereich 0x8000-0xBFFF auslesen und dabei vorher jedesmal das PPAGE auf einen Wert von 0x38 bis auf 0x3F erhöhen. Im Adressbereich 0xFF00-0xFF0F der CPU werden die "Flash Protection und Security Field" Bits gespiegelt. Die 16 Statusregister des Flash werden in dem CPU-Adressbereich 0x0100-0x010F dargestellt. Interessant ist hier wohl das FSEC (Flash Security) Register in 0x101. Dieses wird nach dem Reset aus dem im Flash gespeicherten und in 0xFF0F gespiegelten Register geladen. Die Bits 7+6 zeigen mit 0b10xxxxxx an wenn ein Backdoor-Key hinterlegt ist um die Sicherheit aufzubrechen. Die Bits 1+0 zeigen mit 0bxxxxxx10 an wenn der Flash "entsichert" ist. Mit "Protected" ist dabei gemeint ob bestimmte Flash-Sektoren beschreibbar oder löschbar sind. Hier ist wohl für das spätere programmieren wichtig das alle Sektoren beschreibbar sind. Mit dem VBF wird also zunächst etwas in den ersten protected low sector 0x3E geschrieben (ab 0x4000, 0x4A00, 0x7200) und anschließend in den protected high sector 0x3F (ab 0xC000, 0xC080) und dann in die unprotected Pages 0x38, 0x39, 0x3C und 0x3D. Was wir nicht sehen ist eine Schreiboperation ins EEPROM. Auch wissen wir nicht was dem Chip (Flash/EEPROM) als "Grundprogrammierung" bereits zuteil wurde, da es sich hier ja nur um ein Softwareupdate handelt und keine initiale Programmierung. Ggf. sind also im EEPROM und Flash noch Dinge die durch das Update zunächst nicht geändert, zur Gesamtfunktion aber benötigt werden.
Dieter schrieb: > Der XPROG Dump passt doch recht gut zu der VBF Datei: Im XPROG Dump sind > die 16 KByte Pages 0x38 bis 0x3F. Und in der VBF Datei die Pages 0x38, > 0x39, 0x3C und 0x3D (die Page steht ja deutlich sichtbar als MSB der Adresse) sowie die Page 0x3E (Adresse 0x4000 bis 0x7FFF, siehe Datenblatt) sowie Page 0x3F (Adresse 0xC000 bis 0xFFFF, siehe Datenblatt). Die Software muss das Bank-Paging ja mitmachen bei ihren Sprung und Adressbefehlen, es ist also vermutlich egal ob die Software "linear" über die Flash-Blöcke und Pages verteilt ist oder nicht. Die Pages 0x3E und 0x3F (beides aus Block 0) liegen immer im Adressbereich der CPU. Diese Pages würden sich dann vermutlich besonders für Library-Funktion oder (statische)Variablen eignen die jederzeit im Zugriff sein müssen. Die anderen Pages (0x38, 0x39, 0x3C, 0x3D) dann eher für Programmcode. Wie könnte man da jetzt zum Disassemblieren ansetzen? Ich würde mit dem RESET starten. Hier müsste doch wie bei jeder CPU mit Adresse 0x0000 begonnen werden auszuführen? Für gewöhnlich findet man hier die Interrupt-Vectoren die zum Einsprung führen. Den würde ich jetzt bei 0x8000 erwarten, könnte damit aber auch falsch liegen...
Gast
#6806143
Olli Z. schrieb: > > Wenn man also mit USBDM einen Dump von 0x0000 bis 0xFFFF durchführt > erhält man zunächst nur einen der acht 16K Blöcke des Flash. Um mit > USBDM den ganzen Flash zu dumpen muss man also 8 mal den Bereich > 0x8000-0xBFFF auslesen und dabei vorher jedesmal das PPAGE auf einen > Wert von 0x38 bis auf 0x3F erhöhen. Warum liesst Du nicht einfach denn Beitrag für den ich den Link gepostet habe? Da steht die Lösung, die ist zwar für einen etwas anderen Chip aber es ist doch wirklich nicht schwer die dort beschriebene Lösung um die paar mehr Pages zu erweitern, die der Chip in Deiner ECU hat.
Gast
#6806177
Olli Z. schrieb: > > Wie könnte man da jetzt zum Disassemblieren ansetzen? Ich würde mit dem > RESET starten. Hier müsste doch wie bei jeder CPU mit Adresse 0x0000 > begonnen werden auszuführen? Wie kommst Du darauf dass jede CPU bei 0x0000 den Reset hat? Ich sag es nochmal, liess das Datenblatt, da stehen solche Dinge drinnen. Und dann wunderst Du Dich dass ich davon ausgehe dass Dich die Details nicht interessieren. Oder erwartest Du dass jemand anderst für Dich das Datenblatt liesst und Dir die Antworten raussucht?
Dieter schrieb: > Warum liesst Du nicht einfach denn Beitrag für den ich den Link gepostet > habe? Da steht die Lösung, die ist zwar für einen etwas anderen Chip Das habe ich getan, aber ich lerne noch und muss da erstmal draus schlau werden. Da mag mir der ein oder andere Denkfehler unterlaufen... > aber es ist doch wirklich nicht schwer die dort beschriebene Lösung um > die paar mehr Pages zu erweitern, die der Chip in Deiner ECU hat. Ich habe mir jetzt mal die Firmware VBF besorgt die auch auf dem Modul geflashed ist und als ZIP angehangen und weil nicht jeder VBF konvertieren kann auch gleich ein S19 und BIN File davon ins Archiv gepackt. Den USBDM Memory Dump habe ich dann so eingestellt wie im VBF die Blöcke angegeben sind. Einzig mit der WIDTH im USBDM kann ich nichts anfangen, die habe ich mal auf 1 und 2 probiert, kommt aber dasselbe raus. Hat hier vielleicht keinen Einfluß? Nun hätte ich erwartet das mein Dump nahezu gleich mit dem VBF ist, aber weit gefehlt. Der Dump ist ab 0x388000 sehr unterscheidlich. Komisch nicht? Man findet in beiden die gleichen Nummern für Hardware (19H405) und Software (14F631):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Dieter schrieb: > Wie kommst Du darauf dass jede CPU bei 0x0000 den Reset hat? Ja, das war dumm von mir. Habe es im Datenblatt gefunden (siehe Bild), die Vector-Tabelle beginnt ab 0xFF80 und an 0xFFFE sollte der 16 Bit Vector für POR (Power-On-Reset) liegen, also eine Sprungadresse:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Dort lese ich 0xE0FF (Big-Endian CPU). Das kann aber doch unmöglich eine valide Sprungadresse sein, da sie ungerade ist und somit ausserhalb vom SP. Im VBF File ist als Startadresse 0x4000 hinterlegt, das mag aber evtl. nur für den Update gelten (SBL). "Lies das Datenblatt" ist aber auch nicht so einfach wie es klingt. Das sind schließlich mehrere PDFs mit hunderten von Seiten, das muss man erstmal alles kapieren und im Kopf behalten... aber ich habe wirklich Stunden darin rumgelesen. Und nein, ich erwarte nicht das man mir die Stellen im Datenblatt raussucht, man kann auch einfach so antworten geben ;-)
Gast
#6806733
Olli Z. schrieb: > > Dort lese ich 0xE0FF (Big-Endian CPU). Das kann aber doch unmöglich eine > valide Sprungadresse sein, da sie ungerade ist und somit ausserhalb vom > SP. Warum kann die Adresse bei dieser CPU nicht ungerade sein? Bei 0xE0FF liegt der Reset-Code und mit einem Disassembler sieht man schnell dass es sich um gültigen Code handelt der zu einem Reset-Handler passt. Auch das findet sich im Datenblatt (es gibt z.B. 1 Byte lange Befehle, damit ist schnell klar dass es keinen Grund für eine Beschränkung auf gerade Adressen gibt). Und nochmal zum Datenblatt: Um die Reset-Adresse zu finden oder die Pages zu verstehen genügt es ein paar Seiten zu lesen, danach kann man auch einfach suchen (z.B. nach "reset vector").
Gast
#6806762
Olli Z. schrieb: > > Nun hätte ich erwartet das mein Dump nahezu gleich mit dem VBF ist, aber > weit gefehlt. Der Dump ist ab 0x388000 sehr unterscheidlich. Komisch > nicht? Ich würde jeweils die komplette 16 kByte Page lesen (also 0x..BFFF als Ende, ebenso die komplette Page bei 0x4000 und 0xC000) und schauen was dann herauskommt. Und als Vergleich den XPROG Dump nehmen weil der vermutlich passt. Und man könnte auch noch den EEPROM lesen, mit der Initialisierung und dem Bereich ab 0x1000.
Dieter schrieb: > Warum kann die Adresse bei dieser CPU nicht ungerade sein? Bei 0xE0FF Stimmt, wieder eine Falschannahme und Verwechslung mit ARM-Prozessoren von mir. > liegt der Reset-Code und mit einem Disassembler sieht man schnell dass > es sich um gültigen Code handelt der zu einem Reset-Handler passt. Ghidra erkennt diesen Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
und gibt auch eine Pseudo C-Code alternative dafür:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Vermutlich habe ich bei Ghidra was falsch gemacht, denn der Aufruf der Subroutine mit JSR ab Adresse 0xE113 nennt Ghidra "SUB_7fe26a" und normalerweise wird hier die Zieladresse als 16 Bit Wert übergeben (Mnemonic 16 = JSR, gefolgt von HH und LL als Zielmarke des Calls). An 0xE26A geht es also wirklich weiter. Aber gut, das sieht soweit alles stimmig aus, unabhängig davon was der Code so alles macht :-)
Dieter schrieb: > Ich würde jeweils die komplette 16 kByte Page lesen (also 0x..BFFF als > Ende, ebenso die komplette Page bei 0x4000 und 0xC000) Das habe ich ja oben bereits getan. 0x4000 ist ja im Full-Dump drin und wird vom VBF beschrieben, ebenso 0xC000. Interessant sind ja die gepageten 16K Bereiche des Flash. Und hier werden vom VBF vier Pages beschrieben, 0x38, 0x39, 0x3C und 0x3D. Meine Erwartung war das diese 1:1 zur Firmware im VBF passen, was aber interessanterweise nicht der Fall ist. Was ich nochmal ausprobieren sollte, ist das 9M2J Modul mit dem VBF "frisch" zu programmieren und dann nochmal zu schauen. > Und als Vergleich den XPROG Dump nehmen weil der vermutlich > passt. In meinem ersten Vergleich konnte ich ja doch keinen Unterschied zwischen dem XPROG Readout und dem vom USBDM feststellen. XPROG wäre dann vermutlich sinnvoller wenn es um das entschlüsseln eines Backdoor-Keys ginge, aber ich habe hier bislang keine Anzeichen gesehen das irgendwas speziell gesichert wäre, Du? > Und man könnte auch noch den EEPROM lesen, mit der Initialisierung und Den EEPROM habe ich oben ebenfalls schon angefügt. Dieser ist nicht Bestandteil des VBF, also wird entweder voll dynamisch zur Laufzeit genutzt, oder ist Teil der Grundbetankung des Moduls. Das könnte ich mal verifizieren indem ich das EEPROM des 9M2J Moduls lösche und schaue ob es dann noch funktioniert, bzw. den Inhalt restauriert. Ich weiss das wenn man das Modul als erstes mal im Fahrzeug aktiviert, es sich auf dieses "einstellt" und vermutlich u.a. die VIN dort ablegt. Man erhält dazu sogar einen Hinweis im Display des Radios das man nun die Zündung ausschalten, 10 Sekunden warten und diese wieder einschalten soll. Was ich etwas komisch finde ist, das dieser Meldetext nirgendwo im Flash/VBF zu finden ist. Er kommt definitiv vom Modul und nicht vom Radio, da ich das auf dem "Labortisch" mit einem einfachen Monitor bereits mal nachgestellt hatte. > dem Bereich ab 0x1000. Was würde man hier erhalten? 0x1000-0x1FFF ist doch RAM und da kann ja erstmal nichts sinnvolles drinstehen? Die RESET-Routine intialisiert den SP auf 0x1FFF.
Gast
#6807005
Olli Z. schrieb: > > Was würde man hier erhalten? 0x1000-0x1FFF ist doch RAM und da kann ja > erstmal nichts sinnvolles drinstehen? Die RESET-Routine intialisiert den > SP auf 0x1FFF. Und wieder hilft das Datenblatt. Die unter dem Link beschriebene Lösung mit USBDM initialisiert INITEE (0x12) so dass der EEPROM ab 0x1000 eingeblendet wird. Den Werte muss man gegebenenfalls anpassen, je nach Chip. Mein Hinweis mit dem Auslesen von kompletten 16 KByte Pages mit USBDM versucht auszuschliessen dass USBM eventuell Fehler macht wenn man so krumme Werte vewendet wie bei Deinem Versuch (das macht in der Praxis auch wenig Sinn weil man üblicherweise den kompletten Flash lesen will).
Gast
#6807108
Olli Z. schrieb: > Die Software muss das Bank-Paging ja mitmachen bei ihren Sprung und > Adressbefehlen, es ist also vermutlich egal ob die Software "linear" > über die Flash-Blöcke und Pages verteilt ist oder nicht. Die Pages 0x3E > und 0x3F (beides aus Block 0) liegen immer im Adressbereich der CPU. > Diese Pages würden sich dann vermutlich besonders für Library-Funktion > oder (statische)Variablen eignen die jederzeit im Zugriff sein müssen. > Die anderen Pages (0x38, 0x39, 0x3C, 0x3D) dann eher für Programmcode. Wenn du mehr Programmcode (incl. konstante Daten) hast, als du in den linear sichtbaren 3 (je 16kB großen) Flash-Segmenten unterbringen kannst, kommt Paging ins Spiel. Wenn du nur Code in die Pages platzierst, gehts relativ transparent (soll heissen: ohne dass du manuell am PPAGE Register rumspielen musst): Die Funktionen, die in den Page-Bereich sollen, werden für den Compiler entsprechend deklariert ("far" oder was immer auch der verwendete Compiler als Schüsselwort verlangt). Dann werden die betreffenden Funktionen+Aufrufe nicht mehr mit den Maschinenbefehlen JSR(16BitAdr)/RTS, sondern mit Call(PPage,16BitAdr)/RTC erzeugt. Call sichert (zusätzlich zu JSR) den alten PPAGE Registerinhalt auf dem Stack und setzt das PPAGE Register entsprechend der Ziel-Funktionsadresse, RTC restauriert das PPAGE Register wieder. Das ist auf C-Quellcodeebene voll transparent, du musst dich nicht um das PPAGE Register kümmern. Im Linkerskript musst du dann noch dafür sorgen dass die Paged-Funktionen im entsprechenden Speicherbereich platziert werden.
Dieter schrieb: >> Was würde man hier erhalten? 0x1000-0x1FFF ist doch RAM und da kann ja > Und wieder hilft das Datenblatt. Die unter dem Link beschriebene Lösung > mit USBDM initialisiert INITEE (0x12) so dass der EEPROM ab 0x1000 > eingeblendet wird. Den Werte muss man gegebenenfalls anpassen, je nach > Chip. Ok, verstanden. Aber laut Datenblatt dürfte das nicht funktionieren:"device memory map of the MC9S12DT128 after reset. Note that after reset the EEPROM ($0000 – $07FF) is hidden by the register space ($0000 - $03FF) and the RAM ($0000 - $1FFF). The bottom 1K Bytes of RAM ($0000 - $03FF) are hidden by the register space." Ich lese da raus: Das EEPROM wird vom Register-Space und vom RAM überlagert und zwar vollständig und immer. Selbst wenn ich die Base-Address vom MMC für das EEPROM auf 0x1000 stelle, liegt das RAM dennoch da drüber. Und genau das Ergebnis erhalte ich wenn ich einen Readout mache wie eingestellt. Damit das funktioniert müsste ich doch eigentlich das RAM-Mapping disablen, oder des Flash-Mapping und die EEPROM-Adresse (INITEE) auf 0x41 stellen damit es ab 0x4000 dargestellt wird?
Gast
#6807305
Olli Z. schrieb: > > Damit das funktioniert > müsste ich doch eigentlich das RAM-Mapping disablen, oder des > Flash-Mapping und die EEPROM-Adresse (INITEE) auf 0x41 stellen damit es > ab 0x4000 dargestellt wird? Ich habe ja geschrieben dass Du das Beispiel aus dem Link gegebenenfalls an Deinen Chip anpassen musst. Du könntest es z.B. mit dem Wert aus dem Reset-Code versuchen (0x39, also dann EEPROM ab 0x3800). Eventuell ist noch mehr Initialisierung nötig, das sollte USBDM können.
Nein, klappt auch nicht. Ich erhalte wieder nur RAM. Habe schon versucht den unteren Flash-Map zu entfernen mit 0x0F auf das MISC-Register (0x13), ebenfalls erfolglos. Das RAM kann man nicht disablen, theoretisch nur kleiner machen, das lese ich mir gerade durch. Auch versuche ich weiter aus dem RESET (INIT)-Code schlau zu werden das dort so getrieben wird...
1 | |
2 | |
3 | |
Das setzt den Start vom 2k RAM-Array auf die Basisadresse 0x0000 (was ja eh schon der Fall ist nach dem Reset). Dann das EEPROM auf Start 0x3800 und den Register-Space auf 0x3000. Auch wenn ich das in die INIT-Sequenz vom USBDM gebe bekomme ich nach wie vor dasselbe Ergebnis als wenn ich FLAT 0x0000 bis 0xFFFF auslese.
Wenn ich bei USBDM mit "Initialize" Speicherbereiche beschreibe/ändere, dann finde ich das reflektiert im readout. Soweit scheint die Funktion zu tun was sie soll. Was mich bei der ganzen Geschichte noch irritiert ist das der Register-Space nur zum Teil mit den nach einem RESET erwarteten Daten übereinstimmt. Die spannenden Daten befinden sich im Bereich 0x0000-0x003F und der sieht nach einem "Flat" readout so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
Laut Datenblatt sollten hier nach dem RESET auch einige Read-Only Werte vom Mikrocontroller stehen, z.B. in 0x1A, 0x1B die Device ID oder in 0x1C, 0x1D die Memory size. Dort ist aber immer nur 0x00 zu lesen. Das kann doch eigentlich nicht sein?!
Gast
#6808355
Olli Z. schrieb: > > Laut Datenblatt sollten hier nach dem RESET auch einige Read-Only Werte > vom Mikrocontroller stehen, z.B. in 0x1A, 0x1B die Device ID oder in > 0x1C, 0x1D die Memory size. Dort ist aber immer nur 0x00 zu lesen. Das > kann doch eigentlich nicht sein?! Du wirst vermutlich ein wenig mit den Werten fuer die Initialisierung von INITRM, INITEE und INITRG experimentieren müssen. Ich würde es selber ausprobieren, aber ich habe kein Gerät mit dem Chip aus Deiner ECU hier.
Gast
#6808397
Sicher, dass das ab 0x0000 noch der Registerblock ist und dieser nicht schon woanders hin geschoben wurde?
Dieter schrieb: > Du wirst vermutlich ein wenig mit den Werten fuer die Initialisierung > von INITRM, INITEE und INITRG experimentieren müssen. Ich würde es > selber ausprobieren, aber ich habe kein Gerät mit dem Chip aus Deiner > ECU hier. Danke für die Hilfsbereitschaft Dieter, ich weiss das wirklich sehr zu schätzen!! Ich habe bereits Stunden mit rumexperimentieren verbracht. Ich wollte z.B. wissen ob ich es im unteren Bereich wirklich nur mit RAM zu tun habe und habe daher die Speicherstellen 0x0400, 0x1FFF, 0x2000 mittels der Intialize-Funktion von USBDM mit Daten befüllt: (400,44),(1FFF,AA),(2000,55) Der Readout hat gezeigt das bis auf die Speicherstelle 0x2000 alle anderen mit meinen Daten gefüllt waren. Also liegt das 8KB RAM wirklich im Adressbereich 0x0000-0x1FFF ("sichtbar" davon sind 0x0400-0x1FFF). Somit wäre der Adressbereich 0x2000-0x3FFF frei verfügbar. Ich habe also mittel Initialize das EEPROM auf 0x2000 (INITEE = 0x21) gelegt: (12,21) Das EEPROM ist ja nur 2KB groß, müsste sich also von 0x2000-0x27FF erstrecken. Aber der ausgelesene Bereich ist komplett 0x00 (also eigentlich auch nicht leer, denn das wäre ja 0xFF). Ab 0x3800 jedoch kommt immer dieser Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
Und für mich sieht das irgendwie so aus als wären das EEPROM Daten. Auch weil doch im Programmcode der EEPROM-Bereich mit 0x39 initilaisiert wurde, also auf Adresse 0x3800 gelegt. Das würde alles passen. Demnach wären dann auf 0x2000 doch noch RAM und das ist initial halt 0x00 und nicht wie bei Flash/EEPROM 0xFF. Ich glaube irgendwie das die Software schon startet bevor BDM zuschlägt und dann sind die Verhältnisse so wie sie sind. Zudem wäre auch die Frage ob es wirklich ausreicht einfach nur die Register zu setzen, oder ob es nicht noch wenigstens einen CPU-Cycle braucht damit das wirkt. Oder die Änderung wird aus einem anderen Grund nicht angewendet. Ich hätte erwartet das nach dem setzen des Registers der Code per Map dort zu sehen ist wo ich ihn haben wollte. Nun, man könnte nun ein paar Bytes Maschinencode irgendwo ins RAM planzen und den ausführen lassen, welcher dann die gewünschten Einstellungen vornimmt. Dazu müsste man aber einen echten Debugger verbinden (GDB). Das einzige was USBDM hier in seiner Suite mitbringt ist eine TCL-Shell, keinen GDB-Server für HCS12. Die sieht so aus wie man das von JTAG beim Segger kennt (J-Commander). Man kann dort auch Speicherbereiche lesen/schreiben, aber leider keine programmausführung (step) durchführen, dabei erhält man ein "Expected BDM command ACK missing", also irgendwas stimmt nicht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
APW schrieb: > Sicher, dass das ab 0x0000 noch der Registerblock ist und dieser nicht > schon woanders hin geschoben wurde? Tja, die Init-Routine im Flash macht da ja so einiges und es scheint wirklich als wäre die schon gelaufen wenn der BDM zuschlägt. Von daher glaube ich das der BDM den Chip irgendwo "mittendrin" erwischt und so sieht es auch aus. Dennoch müssten meine Initialisierungen ja eine Wirkung haben und das haben sie nicht.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
Demnach wird das RAM ab 0x0000-0x1FFF gelegt (das habe ich ja mit meinen Random-Writes bewiesen), das Register-Space auf 0x0000-0x03FF und das EEPROM auf 0x3800-3FFF. Die Flash-Pages sind nicht veränderbar. Es kann natürlich sein das es hier ein Softwarebug ist, denn USBDM ist ja kein Original NXP Produkt und auch mein Tester ist ein China-Clone.
Gast
#6808548
Olli Z. schrieb: > > Es kann natürlich sein das es hier ein Softwarebug ist, denn USBDM ist > ja kein Original NXP Produkt und auch mein Tester ist ein China-Clone. Das würde ich ausschliessen (zumindest dass die Clone Hardware das Problem ist). BDM selbst ist relativ einfach aufgebaut (die Details stehen in der Doku), da kann man nicht viel falsch machen um die paar Kommandos zum Chip zu schicken. Hardware mit dem Chip aus Deiner ECU gibt es leider eher selten, und der HCS12 ist auch schon älter daher ist es nicht so einfach ein System zum Testen zu finden. Ich kenne XPROG und den USBDM (auch als Clone) von diversen anderen HCS12 Varianten, da gab es bisher keine Probleme.
Gast
#6808611
Die Register, mit denen man die Address-Positionen für die EE/Ram/Register-Blöcke einstellt sind Write-Once (Also nach dem Reset nur einmal beschreibbar und danach schreibgeschützt), es sei denn, man startet in einem "Special Mode" (üblicherweise Special Single Chip). Dann hält der BDM (-Debugger) die CPU nach einem Reset am ersten Befehl an.
APW schrieb: > Die Register, mit denen man die Address-Positionen für die > EE/Ram/Register-Blöcke einstellt sind Write-Once (Also nach dem Reset > nur einmal beschreibbar und danach schreibgeschützt), es sei denn, man > startet in einem "Special Mode" (üblicherweise Special Single Chip). Ich glaube da kommen wir der Sache schon näher... hatte das auch gelesen bei der Lektüre des BDM-Kapitels. Aber auch das mit dem Special Mode könnte eine gute Erklärung für die Beobachtungen sein. Das Datenblatt schreib hierzu: "Bits EE11-EE15 are Write once in Normal and Emulation modes and write anytime in Special modes" Dort steht auch das je nach Modus nicht alle BDM-Kommandos aktiv sind. BDM unterscheidet ja zwischen Hardware- und Firmware-Kommandos. Bei ersteren kann man zwar ohne CPU Zugriff nehmen, aber nur auf Speicherbereiche und z.B. nicht auf das Register-Space. Erst wenn man BDM Firmware aktiviert (da ist wohl noch etwas in einem kleinen ROM im Chip fest verankert) dann kann man auch Debugging-Kommandos nutzen. Hier muss ich nochmal ansetzen. Das Datenblatt schreibt: "The operating mode out of reset is determined by the states of the MODC, MODB, and MODA pins during reset. The MODC, MODB, and MODA bits in the MODE register show the current operating mode and provide limited mode switching during operation. The states of the MODC, MODB, and MODA pins are latched into these bits on the rising edge of the reset signal. The ROMCTL signal allows the setting of the ROMON bit in the MISC register thus controlling whether the internal Flash is visible in the memory map. ROMON = 1 mean the Flash is visible in the memory map. The state of the ROMCTL pin is latched into the ROMON bit in the MISC register on the rising edge of the reset signal." Damit ich in den Special Mode komme brauche ich an MODA und MODB nichts zu ändern, die bleiben LOW. Lediglich der BKGD-Pin, welcher auch MODC ist, müsste zum Zeitpunkt des RESETs LOW sein. Diesen Pin steuert jedoch USBDM und das müsste es dann aktiv so tun, sonst komme ich in diesen Modus nicht rein. Zumindest im Memory-Dump-Tool gibt es keine Option dafür, vielleicht in der TCL-Shell... > Dann hält der BDM (-Debugger) die CPU nach einem Reset am ersten Befehl > an. Genau so würde ich es mir wünschen :-)
Dieter schrieb: > Das würde ich ausschliessen (zumindest dass die Clone Hardware das > Problem ist). BDM selbst ist relativ einfach aufgebaut (die Details > stehen in der Doku), da kann man nicht viel falsch machen um die paar > Kommandos zum Chip zu schicken. > > Hardware mit dem Chip aus Deiner ECU gibt es leider eher selten, und der Zumindest bei Ford findet man den massenhaft in den Baujahren 2007-2014. Dort in PAM (Einparkwarner), BCM (Komfortsteuereinheit), CMR (Rückfahrkamerasystem), PCM (Motorsteuerung), AHCU (Standheizung), usw. usw. > HCS12 ist auch schon älter daher ist es nicht so einfach ein System zum > Testen zu finden. Ich kenne XPROG und den USBDM (auch als Clone) von Ja, stimmt sicher, dazu müsste man ein paar alte Teile haben. > diversen anderen HCS12 Varianten, da gab es bisher keine Probleme. Ich weiss ja auch garnicht ob ich ein Problem habe oder nur auf der falschen Fährte bin. Bislang habe ich ja nur ausgelesen und versucht zu verstehen wie das Zeug tickt um beim Programmieren nicht was irreversibel zu zerstören. Beim PAM z.B. gibt es zwei sonst baugleiche Platinen, nur der Chip ist anders, einmal ist ein MC9S12DG128 drauf und einmal ein MC9S12XD128. Das heißt einmal HCS12 und einmal HCS12X, zwei völlig verschiedene Chips. Ich könnte mir aber vorstellen das der Hersteller einfach das nimmt was grad verfügbar und günstig zu haben ist und die Chipspezifischen Unterschiede hier gar keine so große Rolle spielen, sprich sich der µC nach außen hin immer gleich verhält. Möglicherweise ist durch meine Art des Auslesens schon alles soweit richtig eingestellt, RAM ist ab 0x1FFF abwärts, EEPROM ab 0x3800 aufwärts und somit im Dump vorhanden. Auch das Pagen scheint ja zu klappen. Gut möglich das ich hier wirklich schon alles habe um mal einen Programmierversuch zu wagen. Trotzdem ist es sehr interessant und spannend sich mit all diesen Details zu beschäftigen. Und ich hoffe das Du mir inzwischen glaubst das ich das auch gewillt bin zu tun :-)
Es sieht ja so aus als könnte man mit dem TCL-Tool einen entsprechenden RESET erzeugen:
1 | |
Ich habe nun mal ein paar Varianten durchgespielt und danach immer den
Bereich ab 0x3800 ausgelesen ("wb 0x3800 0x100") um zu sehen ob dort
wieder EEPROM Daten zu lesen sind. Leider ist das so, was bedeutet das
der RESET nicht so gegriffen hat. Ich muss das mal mit dem Oszi
untersuchen.
Gast
#6808957
S12 und S12X sind nicht so ohne weiteres austauschbar. Wenn ich mich richtig erinnere, ist der S12X CPU-Core an mehreren Stellen weiterentwickelt (Befehlssatz, Ausführungszeiten etc.), teilweise haben die Chips einen XGATE Coprozessor drauf und das Interruptsystem wurde umgekrempelt. Irgendwann wurden die Fuzzy-Support-Befehle rausgenommen. Da gibt es innerhalb der S12X auch mehrere Unterversionen. Man muss immer vom konkreten Chip ausgehen, und in dessen Datenblatt nachschauen, u.a. welche CPU-Version da implementiert ist. Bez. Peripheriemodule, BDM Schnittstelle, XGATE Copro etc. gibt es auch immer mal unterschiedliche Versionen. Das ist alles im konkreten Datenblatt aufgelistet. Bei Freescale (jetzt NXP) gibt (oder gab? war schon lange nicht mehr dort) alte kostenlose codesizebegrenzte CodeWarrior Entwicklungsumgebungen für HCS08/HC12/S12/S12X. Da war eine brauchbare Debuggingumgebung mit dabei. Was man da heute bekommt, musst du selber nachsehen. Mit S12 habe ich mich vor >10 Jahren zum letzten Mal beschäftigt.
Ja, danke. Ich wollte jetzt auch nicht das Problem unnötig vergrößern mit dem HCS12X, nur drauf hinweisen das ich auch solch ein Modul habe. Ist aber egal, mein Problem ist mit dem HCS12. Und ja, der ist alt. Aber ich stehe nunmal auf so Retro-Zeugs, egal ob VHS-Technik, alte Computer oder alte Mikrocontroller :-)
Gast
#6808993
Olli Z. schrieb: > > Zumindest bei Ford findet man den massenhaft in den Baujahren 2007-2014. > Dort in PAM (Einparkwarner), BCM (Komfortsteuereinheit), CMR > (Rückfahrkamerasystem), PCM (Motorsteuerung), AHCU (Standheizung), usw. > usw. Hast Du Teilenummern dazu, idealerweise von ECUs die man gebraucht günstig bekommt? Und es sollte der HCS12 sein, nicht der HCS12X, davon habe ich diverse ECUs von anderen Herstellern hier.
Gast
#6809002
Olli Z. schrieb: > > Ich weiss ja auch garnicht ob ich ein Problem habe oder nur auf der > falschen Fährte bin. Bislang habe ich ja nur ausgelesen und versucht zu > verstehen wie das Zeug tickt um beim Programmieren nicht was > irreversibel zu zerstören. Wenn Du sowieso den XPROG hast und es Dir darum geht die Firmware der beiden ECU Varianten auszutauschen sollte es damit kein Problem sein. So wie ich es verstanden habe sind es ja die selben Chips auf den beiden ECUs. Ob die restliche Hardware der ECUs dann auch zur anderen Firmware passt ist etwas anderes.
Gast
#6809041
Olli Z. schrieb: > Ja, danke. Ich wollte jetzt auch nicht das Problem unnötig vergrößern > mit dem HCS12X, nur drauf hinweisen das ich auch solch ein Modul habe. > Ist aber egal, mein Problem ist mit dem HCS12. Und ja, der ist alt. Aber > ich stehe nunmal auf so Retro-Zeugs, egal ob VHS-Technik, alte Computer > oder alte Mikrocontroller :-) HCS12 war einer meiner Lieblingscontroller. Wenn die modernere, flexiblere Peripherie drin gehabt hätten, würde ich die heute noch verwenden wollen. Boards zum Rumspielen und Entwicklertools habe ich übrigens gerne von hier bezogen: https://elmicro.com/catalog/mcu/hc12/
Dieter schrieb: > Hast Du Teilenummern dazu, idealerweise von ECUs die man gebraucht > günstig bekommt? Und es sollte der HCS12 sein, nicht der HCS12X, davon > habe ich diverse ECUs von anderen Herstellern hier. Das PAM dürfte das günstigste und häufigste sein (gibt es ab so 30€) mit dem HCS12 ist das BS7T-15K866-AE, das 7G92-15K866-AF ist baugleich (und billiger und häufiger zu finden).
Gast
#6809149
Olli Z. schrieb: > > Das PAM dürfte das günstigste und häufigste sein (gibt es ab so 30€) mit > dem HCS12 ist das BS7T-15K866-AE, das 7G92-15K866-AF ist baugleich (und > billiger und häufiger zu finden). Danke. Auf der bekannten Verkaufsplatform findet man einige BS7T-15K866-AE, die andere eher selten. Eventuell hole ich mir dort eine von den BS7T-15K866-AE, mal schauen.
Gast
#6809150
APW schrieb: > > Boards zum Rumspielen und Entwicklertools habe ich übrigens gerne von > hier bezogen: > https://elmicro.com/catalog/mcu/hc12/ Interessant, einige der Boards scheinen immer noch lieferbar zu sein (wenn auch nicht gerade günstig).
So, habe dem RESET-Vorgang mal mit einem DSO auf die Pins geschaut. Mittels dem TCL-Interpreter kann man verschiedenste Reset-Methoden aufrufen, witzigerweise erzeugen alle dasselbe RESET-Bild. Ansich wäre das ja nicht verkehrt, denn somit kommt der Chip immer in den Special Single Chip Mode, wenn da nur nicht der parasitäre nachfolgende Reset-Impuls wäre. Der sorg meines Erachtens dafür das dann doch im Normal Single Chip Mode gestartet wird. Wo könnte der her stammen? Komisch auch die Amplitude, hat fast was Tri-State-Artiges. Natürlich habe ich auch versucht die Pins manuell zu beeinflussen. In der Tat sorgt ein "pinSet RST=L" dafür das die RESET-Leitung auf LOW gezogen wird, ebenso wie ein "pinSet BKGD=L". Dummerweise verweigert USBDM jedoch die RESET-Leitung mit "pinSet RST=H" wieder hochzuziehen, dann kommt nur die oben schon genannte dusselige Fehlermeldung. Interessant ist, das wenn ich RESET und BKGD einfach manuell auf GND ziehe und dann RESET wieder freigebe (BKGD noch auf GND) dann habe ich bei RESET den im Bild "rst_bkgd_pulse.png" sichtbaren "Selbstreset". Könnte es sein das der RESET-Pin auch dann kurz Richtung LOW geht, wenn es intern einen durch Software ausgelösten RESET gibt? Watchdog, oder sowas? So lange ich die BKGD-Leitung auf GND lasse, kommt dieser Puls. Es könnte ja durchaus sein das die Software intern immer dann einen RESET ausführt wenn das MODE-Register (in dem sollte ja der beim reset gewählte Chip-Mode enthalten sein) nicht den gewünschten Wert (Normal Single Chip) aufweist? Das würde in gewisser Weise Sinn ergeben. Aber wie schafft es die Software dann zu starten wenn ich zunächst in den Special Single Chip Mode resette? Danach müsste die CPU doch eigentlich gestoppt bleiben? Hier liegen wohl die Sourcen von den ganzen Tools: https://github.com/podonoghue/usbdm-eclipse-makefiles-build-4.10.6.250 und hier die vom TCL Interpreter: https://github.com/podonoghue/usbdm-eclipse-makefiles-build/tree/master/UsbdmTcl_DLL Ich durchwühle jetzt mal den Code, vielleicht fällt mir was auf...
Ja, wie vermutet finde ich das im Datenblatt: 2.3.2 RESET — External Reset Pin An active low bidirectional control signal, it acts as an input to initialize the MCU to a known start-up state, and an output when an internal MCU function causes a reset. Also ist der zweite Reset-Puls aufgrund eines intern ausgelösten Reset. Jetzt ist nur die Frage wie und warum?
Habe nochmal das BDM-Manual durchgelesen und etwas rumprobiert. BDM hat eigene Statusregister welche nur für die BDM-Schnittstelle sichtbar sind. BDM bietet zwei Kommandos um auf diese Register zuzugreifen READ_BD und WRITE_BD. Angesprochen werden die Register über Pseudo-Speicheradressen im Bereich von 0xFF00-0XFF0B (diese liegen nicht in der Memory-Map der CPU, sondern nur des BDM!). Der TCL-Interpreter realisiert diese Kommandos mit "rdreg" und "wrreg", jeweils gefolgt von der Speicheradresse. Im Datenblatt sind für uns interessant, 0xFF01 (BDMSTST) und 0xFF07 (BDMINR) (siehe Grafik). Das erste gibt das BDM-Status-Register an. Dieses lässt sich dann so ermitteln:
1 | |
2 | |
3 | |
Entspricht 0b1000 0000. Das spricht erstmal dafür das BDM enabled ist (ENBDM=1) aber NICHT aktiv (BDMACT=0). Wäre das der Fall, so wären wir im "Special Single Chip Mode". Da BDM nicht aktiv ist, erklärt das auch warum die ganzen Debugging-Funktionen nicht klappen und nur die Speicherzugriffe. Das UNSEC=0 zeigt eigentlich an das sich der Chip im Secured Mode befindet. Hmm... Als nächstes habe ich mir das BDMINR vorgenommen, welches im TCL-Interpreter warum auch immer als "BDMCCRH" angezeigt wird:
1 | |
2 | |
3 | |
Diese Register ist im Grunde ein Spiegel des INITRG-Registers im Register-Space, jedoch ohne das dort befindliche ROMON-Bit. Somit wird aktuell der Register-Space nach 0x3000 gemapped! Das wollte ich dann mal genauer wissen und habe mir den Speicherbereich mit "rb" ausgelesen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
Von besonderem Interesse war für mich dabei zunächst das Byte 0x1A und 0x1B vom Registerspace, also 0x301A und 0x301B, weil dort nämlich die Device-ID stehen muss, welche ich auf 0x001A und 0x001B nie gefunden hab, als ich noch davon ausging das der Register-Space ab 0x0000 steht. Und hier haben wir jetzt endlich 0x0115, eine gültige Device-ID ! Die MEMSIZE-Bytes habe hier auch die richtigen Werte: MEMSIZ0=0x13 MEMSIZ1=0x80 Das MODE-Byte, welches den Chip-Modus anzeigt ist dann auf 0x300B und hat hier den Wert 0x80 (0b1000 0000) und demnach ist MODC=1, MODB=0 und MODA=0, was dem "Normal Single Chip Mode" entspricht. Damit ist wohl bestätigt das es mir bislang nicht gelungen ist den Chip in den Special Mode zu resetten und somit auch immer der interne Programmcode aufgerufen wurde, welche für das vorliegende Memory-Layout verantwortlich ist. Vermutlich ist er auch verantwortlich für die RESETs. Wenn man sich den Codeverlauf mit IDA oder Ghidra mal anschaut wird man das vermutlich herausfinden. Klar ist somit dann auch das in den bisherigen Dumps der Register-Space in 0x3000-0x33FF, das EEPROM in 0x3800-0x3FFF und das RAM in 0x0000-0x1FFF lag, weil dies auch der INIT-Prozedur der Software entspricht:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Es bleibt also unterm Strich noch die Frage warum mir der Special Mode nicht gelingen mag. Alles andere funktioniert offensichtlich wie erwartet.
Gast
#6809545
Olli Z. schrieb: > > Es bleibt also unterm Strich noch die Frage warum mir der Special Mode > nicht gelingen mag. Alles andere funktioniert offensichtlich wie > erwartet. Du könntest Dir ansehen was XPROG beim Reset macht. Und gegebenenfalls auch noch mit einen Logicanalyzer schauen was bei BDM passiert, das ist dann aber etwas nehr Zeitaufwand. Ansonsten solltest Du ja auch so mit USBDM an den kompletten Flash kommen, man kann ja alle Pages über das Page Window auslesen.
Alles richtig Dieter. Mein Ansinnen ist es das wirklich zu verstehen bevor ich mich an die erste Programmierung wage, denn dann kommen sicher wieder andere Probleme zum Vorschein :-) XPROG brauche ich wohl dann wenn es darum geht die Sicherung des Chips zu knacken. Aktuell sieht es ja so aus als würde eine Sperre verhindern das man dem Chip auf die Finger, äh Register schauen kann ;-)
Gast
#6809759
Olli Z. schrieb:
> ... warum auch immer als "BDMCCRH" angezeigt wird: ...
Dein Tool scheint von neueren Versionen der HCS12/S12X Reihe auszugehen.
Im 9S12XDP512 zum Beispiel gibt es statt "BDMCCR" ein Registerpaar
"BDMCCRL/BDMCCRH".
Im HCS12CoreUG.pdf (Document "S12CPU15UG/D", "STAR12 V1.5 Core User
Guide Version1.2", Revision vom 17.7.2000) habe ich im Kapitel "Section
15 Secured Mode of Operation","15.4.3 Unsecuring The System" folgenden
Satz gefunden:
Please note that if the system goes through a reset condition prior to
successful configuration of unsecured mode the system will reset back
into secured mode operation.
Wobei mir nicht klar ist, 1. ob damit ein HW-Reset gemeint ist oder
einfach das Umschalten vom "Special Single Chip Mode" in den "Normal
Single Chip Mode". Und 2. falls HW-Reset, wie genau dieser Reset
ausgelöst wird. In dem Dokument ist ja auch der Firmware-Quellcode für
Secured und Unsecured BDM gelistet. Dass irgendwo ein Reset ausgelöst
werden würde, ist für mich da nicht rauszulesen.
"Secured" heisst, dass Flash und EEPROM gegen Auslesen geschützt ist und
lediglich der Zugriff auf den Register-Speicherbereich möglich ist
(zwecks Flash/EE löschen oder über Backdoor-Key zu unsecuren). Aber du
hast die Bereiche auslesen können!?
Quellcode gegen Auslesen zu schützten war für mich nie ein Thema,
deshalb kenne ich mich da schlecht aus.
XPROG erzeugt einen sauberen RESET und es folgt dann auch nichts mehr nach. So hätte ich es auch bei USBDM erwartet. Nach dem Reset in den Special Mode kommt kein Reset mehr danach. Diesen schiebe ich immer noch darauf das der Chip, warum auch immer mit USBDM nicht sauber in den Special Mode kommt und nach der steigenden Flanke von /RESET das Programm anfängt zu laufen und dann aufgrund von Abfragen in einen Selbstreset geht. XPROG liest auch sauber das EEPROM (es entspricht dem was im USBDM Dump ab 0x3800-0x3FFF steht) und Flash. Beim Flash-Dump von XPROG ist der Bereich von 0x0000-0x7FFF mit 0xFF gefüllt, wobei ich mir nicht ganz sicher bin ob XPROG das nur für das Dump so abspeichert, weil es in der Infobox ganz klar angibt nur die Flash-Pages zu lesen. Ich gehe daher davon aus das dies nur Füllbytes sind. In XPROG habe ich die "unsecured" Auslesemethode gewählt. XPROG liest mit 8MHz, was aber wohl keinen Unterschied macht zu den 4MHz von USBDM?
Gast
#6810147
Olli Z. schrieb: > > Nach dem Reset in den Special Mode kommt kein Reset mehr danach. Diesen > schiebe ich immer noch darauf das der Chip, warum auch immer mit USBDM > nicht sauber in den Special Mode kommt und nach der steigenden Flanke von > /RESET das Programm anfängt zu laufen und dann aufgrund von Abfragen in > einen Selbstreset geht. Eine mögliche Erklärung ist dass USBDM das Progamm nicht anhält nach dem Reset sondern laufen läßt, XPROG dagegen hält es an. Dadurch hat man dann die Konfiguration, die das Programm einstellt, BDM funktioniert ja auch bei laufendem Programm. Ich werde das morgen mal prüfen, ich habe hier inzwischen ein Board mit einem sehr ähnlichen Chip. Du könntest natürlich auch bei Deiner ECU schauen, ich weiss nicht ob die z.B. im Betrieb CAN Messages verschickt. Wenn die auch verschickt werden wenn USBDM den Speicher dumpt dann läuft die Software, bei XPROG sollte dagegen nichts zu sehen sein. Wie schon geschrieben, momentan ist das noch eine reine Spekulation.
Ein Unterschied ist das XPROG zuerst RESET auf low legt und erst dann die Betriebsspannung (Vdd) anlegt. Bei USBDM ist die Betriebsspannung permanent angelegt. Und wenn ich mir den Schaltplan vom USBDM so ansehe sieht das auch sehr danach aus als wäre das bei USBDM garnicht vorgesehen da der Pin auf permanent 5V liegt. https://github.com/DeuceEFI/USBDM/blob/master/USBDM-Schematic.pdf Habe das mit meiner USBDM-Hardware mal verglichen. Da ist nur noch zusätzlich ein 3,3V Spannungsregler und ein Jumper auf dem Board um auch diese Spannung liefern zu können, aber prinzipiell wird das an USB ankommende +5V direkt zum BDM-Pfostenstecker weitergereicht, so wie im obigen Schaltplan. Damit ist klar, das der USBDM nicht in der Lage ist die Betriebsspannung ein/aus zu schalten und der TCL-Befehl "settargetvdd" mit den Optionen 0, 3, 5, on, off hier keine Wirkung hat.
Das CMR-Modul sendet von sich aus keine CAN-Botschaften, aber es antwortet natürlich auf entsprechende Nachrichten. Für Low-Level-Tests nehme ich da gern Basis-Dienste wie OBD-II Modulinfos oder DTCs. Diese CAN-Botschaft zum Beispiel initialisiert eine DTC-Abfrage zum Modul:
1 | |
2 | |
Das Modul antwortet darauf mit:
1 | |
2 | |
Die Antwort kann natürlich variieren bei einer DTC-Abfrage, aber hier geht es ja nur grundsätzlich darum DAS das Modul antwortet, denn dann läuft die Firmware. Setze ich mit "pinSet RST=L" die Reset-Leitung auf low, kommt, erwartungsgemäß, keine Antwort. Wenn ich jetzt über die TCL-Shell einen "reset s h" (oder irgendeinen anderen Reset durchführe der das Modul eigentlich in den Special Mode bringen soll) erhalte ich weiterhin abfragen vom Modul. D.H. das es wieder in den Normal Mode resettet ist. Während dem auslesen des Flash mittels USBDM kommen ebenfalls die CAN-Antworten. D.H. ich lese während die Software läuft. Ich habe das Gefühl das sich der Chip, nachdem er einmal mit Power-On in den Normal Mode gebootet wurde, nicht mehr in einen anderen Mode "warm"resetten lässt.
Gast
#6810729
Olli Z. schrieb: > > Während dem auslesen des Flash mittels USBDM kommen ebenfalls die > CAN-Antworten. D.H. ich lese während die Software läuft. Wenn ich Dich richtig verstanden habe versorgst Du bei USBDM den Chip über das USBDM Interface mit Spannung. Falls ja, könnte es damit zusammenenhängen? Bei meinem USBDM kann ich per Jumper einstellen ob +5 Volt, +3.3 Volt oder keine Spannung an den Vcc Pin geht, die Default Einstellung ist "keine Spannung". Falls es daran nicht liegt: Auf den Bildern der ECU kann man ja noch einen anderen Mikrocontroller erkennen (BlackFin DSP). Könnte der eventuell einen Reset erzeugen wenn er mitbekommt dass der HCS12 nicht reagiert?
Ein Problem mit USBDM könnte auch sein das der davon ausgeht das der Register-Space ab 0x0000 liegt, weil er seiner Ansicht nach den Chip zurückgesetzt hat und das der Default ist. In meinem Fall aber wird durch den zweiten Reset in den Normal Mode die Firmware aktiviert welche den Register-Space auf 0x3000 legt. Es bleibt dabei, das USBDM so nicht in der Lage ist den Chip in den Special Mode zu bekommen. Es müsste aktiv die Stromversorgung steuern (so wie XPROG das auch macht). Denn nur wenn man einen Kaltstart durchführt und dabei die RST und BKGD auf LOW legt bevor man 5V anlegt, kann das mit dem Special Mode funktionieren. Andernfalls verbleiben womöglich vorher durch die Firmware gesetzte Watchdogs im Chip aktiv und führen zum Reset.
Dieter schrieb: > Wenn ich Dich richtig verstanden habe versorgst Du bei USBDM den Chip > über das USBDM Interface mit Spannung. Falls ja, könnte es damit > zusammenenhängen? Ganz genau. > Bei meinem USBDM kann ich per Jumper einstellen ob +5 Volt, +3.3 Volt > oder keine Spannung an den Vcc Pin geht, die Default Einstellung ist > "keine Spannung". Das kann ich auch. Dieser Jumper ist auch bei mir vorhanden. > Falls es daran nicht liegt: Auf den Bildern der ECU kann man ja noch > einen anderen Mikrocontroller erkennen (BlackFin DSP). Könnte der > eventuell einen Reset erzeugen wenn er mitbekommt dass der HCS12 nicht > reagiert? Daran habe ich auch schon gedacht, auch an externe Watchdogs/Spannungsprüfer. Das Problem ist nur, dann hätte XPROG ja das gleiche Verhalten zeigen müssen. Was ja auch komisch ist, das wenn BKGD auf LOW bleibt und RESET wieder HIGH wird, das alles 250ms intern ein Reset ausgelöst wird. Das sehe ich ganz deutlich auf dem Oszi.
Gast
#6810765
Olli Z. schrieb: > > Das kann ich auch. Dieser Jumper ist auch bei mir vorhanden. > Ich habe hier vermutlich eine ältere Version des USBDM, der kann z.B. auch kein ARM SWD, siehe das Bild. Ich habe das Verhalten inzwischen mit meinem HCS12 Board ausprobiert, dort ist die CPU angehalten wenn USBDM den Speicher dumpt, man muss explizit nach dem Lesen einen Reset ausführen um die Software im HCS12 nach dem Lesen mit USBDM wieder zu starten. Die Software ist USBDM_4_12_1_262_Win. Nochmal zu XPROG: dort läuft die ECU Software nicht, also ist keine CAN Kommunikation möglich?
Gast
#6811338
Ich nehme inzwischen an dass ein externer Reset dazwischen funkt. Was hat denn der 6-Pin SOT-23 an der linken unteren Ecke des HCS12 für eine Bezeichnung? Die Frage ist warum XPROG keine Probleme mit dem externen Reset hat, da wäre interessant zu wissen ob beim Auslesen mit XPROG die Firmware in der ECU ebenfalls läuft.
Dieter schrieb: > Ich nehme inzwischen an dass ein externer Reset dazwischen funkt. Was Diese Vermutung hattest Du ja schon früher und lagst damit auch goldrichtig, wie ich nun weiss :-) > hat denn der 6-Pin SOT-23 an der linken unteren Ecke des HCS12 für eine > Bezeichnung? Der ist es nicht, aber auf der gegenüberliegenden Seite ist ein Voltage-Monitor/Watchdog Baustein (5) vom Typ (SMD-Marking "PKG4", SOT-23-5) TPS3820-50DBVRQ1G4. Dessen /RESET-Ausgang ist über einen 4,7k Widerstand auf den /RESET der MCU (und des Debug-Headers) verbunden. Der Voltage-Monitor wird ebenfalls mit Vdd (+5V) gespeist und läuft somit auch an wenn man die Vdd extern über den USBDM anlegt. Durch den Vorwiderstand und eine Leistungsaufnahme kann er den RESET nicht ganz bis auf GND-Level ziehen, das ist der "schwache" Reset-Impuls den wir ganz am Anfang sehen (Einschalt-Reset) und der der 25ms später kommt (Watchdog-Reset). Damit kein Reset ausgelöst wird müsste der Chip regelmäßig über den WDI-Eingang mit einer geänderten Flanke versorgt werden. Der WDI ist direkt mit dem Pin 23 (PB7) der MCU verbunden. Wie Du schon richtig vermutet hast sorgt die MCU mit einem regelmäßigen Flankenwechsel auf PB7 dafür das der Watchdog-Timer zurückgesetzt wird und somit nicht zuschlägt. Bleiben die Impulse 25 ms aus, wird ein RESET ausgelöst. Nun habe ich so auf die Schnelle keine Möglichkeit gesehen den Watchdog zu "entschärfen" und einfach den 4,7k Widerstand ("472") zum BDM-Header hin ausgelötet und siehe da - alles funktioniert wie es soll! Ich kann mit einem normalen "reset" im TCL-Interpreter den Chip in den Special Mode bringen, die Register auslesen und habe auch das erwartete Memory-Layout:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
In einem Full-Readout mit allen Pages finde ich nun auch die komplette aus dem VBF stammende Firmware 1:1 wieder :-) So, nun kann ich mich endlich dran machen den Chip so einzustellen das man auch das EEPROM vollständig auslesen kann. Auch glaube ich jetzt genug zu wissen um mal einen Programmierversuch zu starten. Die Sache mit dem Reset hat jetzt schon echt genervt. Laut Datenblatt vom Watchdog-Chip ist es wohl so, das der Watchdog disabled wird, wenn der WDI-Eingang Hochohmig (unbeschaltet) ist. Sobald dieser einen LOW (GND) oder HIGH (5V) Pegel hat, wird er gestartet: "If WDI remains high or low longer than the time-out period, then reset is triggered. The timer clears when reset is asserted or when WDI sees a rising edge or a falling edge. If unused, the WDI connection must be high impedance to prevent it from causing a reset event." Dazu müsste man den PB7 hochohmig als Tri-State programmieren, oder als Eingang ohne Push/Pull-Widerstand. Das würde ggf. durch Beschaltung der Register funktionieren. Laut Datenblatt vom MC9S12 sollten aber eigentlich sämtliche Ausgänge hochohmig (3state) sein nach dem Reset.
Gast
#6812116
Damit ist dieses Problem ja nun gelöst. Wobei ich denke dass man den externen Reset auch über die Debug Testpads unschädlich machen kann ohne auf der Platine löten zu müssen. Eventuell reicht ja schon ein zusätzlicher Pullup Widerstand an Reset um den externen Reset nicht durchkommen zu lassen. Und XPROG wird vermutlich den Reset Pegel so stark auf "High" halten dass der externe Reset nicht durchkommt.
Dieter schrieb: > Damit ist dieses Problem ja nun gelöst. Ja, war ne harte Nuss und ich Danke Dir für deine unermüdliche Unterstützung!! Jetzt so im Nachhinein erinnere ich mich an einen alten Trick, wenn man sehen wollte ob ein Impuls von einem bestimmten Baustein kam, (z.B. bei W-Bus, K-Line, CAN) dann hat man da einfach einen Widerstand in die Leitung geklemmt und konnte dann an den unterschiedlichen Pegeln erkennen was von wem gesteuert wurde. Im Prinzip ist das hier beim RESET auf der Fall gewesen :-) > Wobei ich denke dass man den > externen Reset auch über die Debug Testpads unschädlich machen kann ohne > auf der Platine löten zu müssen. Eventuell reicht ja schon ein > zusätzlicher Pullup Widerstand an Reset um den externen Reset nicht > durchkommen zu lassen. Einen solchen Gedanken hatte ich auch schon. Direkt oben links neben dem Widerstand sieht man ja einen TP (im Prinzip der TP vom /RESET Ausgang). Evtl. könnte man hier eine Brücke nach +5V machen sodass der Watchdog den Ausgang nicht auf LOW bekommt. Oder wie Du sagst am RESET-Pin des BDM-Headers mit einem niederohmigen Widerstand (z.B. 1k) auf +5V dafür zu sorgen das der Watchdog das über den 4,7k nicht schafft einen Pegel der tief genug für den Reset der MCU ist herzustellen. Ich hatte ein wenig gehofft das es ähnlich wie bei anderen Modulen mit Watchdog hier einen Disable-Pin am Header gibt der das auslösen des Reset direkt oder über einen Transistor verhindert. Aber da finde ich nix. Einzig das vom RESET-Pin der MPU neben dem direkten Pin am Header noch der gegenüberliegende mit Reset versorgt wird, welches aber über einen Widerstand in Reihe und einen Kondensator gegen Masse läuft. Den Sinn dafür habe ich noch nicht verstanden. > Und XPROG wird vermutlich den Reset Pegel so stark auf "High" halten > dass der externe Reset nicht durchkommt. Das wäre eine Erklärung warum es da nicht auftritt. Der Watchdog selbst läuft ja in jedem Fall. In der Firmware müsste man wohl auch einen Timer-Interrupt finden welcher den PB7 immer wieder toggelt um den Watchdog am leben zu halten.
Wenn ich den "regs" Befehl eingebe sieht man ja den Zustand der internen Register (zum Glück hat die HCS12 CPU nicht so viele davon ;-) aber auch den Program-Counter:
1 | |
2 | |
3 | |
Warum der wohl auf 0x4A4D steht? Laut Datenblatt wird im Special Mode die CPU direkt nach dem Reset angehalten, noch vor Ausführung des ersten Befehls. Ich hätte also erwartet das sich die CPU den Reset-Vektor auf 0xFFFE liest (welcher auch 0xE0FF weist) und diesen Wert in den PC lädt. Auch sagen mir die Werte dahinter noch nix, könnte das Stack sein?
Gast
#6812442
Olli Z. schrieb: > > Auch sagen mir die Werte dahinter noch nix, könnte das Stack sein? Schau halt mal in Deinem Dump an diese Adresse: USBDM zeigt die Werte am PC an, einen Disassembler gibt es vermutlich in USBDM nicht. Der "seltsame" Wert des PC ist vermutlich eine Konstante "JM" könnte ein Heiweis auf den Entwickler sein. Den Wert verwenden andere HCS12 Varianten ebenfalls.
Also es reicht wenn ich den /RESET-Pin vom BDM-Header des Boards über einen 1k Widerstand auf Vdd (+5V) ziehe. Dann hat der Watchdog über seinen 4,7k Widerstand keine Chance mehr den Pegel weiter als 0,5V unter Vdd zu ziehen. Damit wird dann kein Reset mehr ausgelöst und man kann die MCU ganz ohne auslöten eines Bauteils in den Special Mode bringen.
Dieter, evtl. hast Du hierzu auch ein paar wertvolle Hinweise und Tipps? Beitrag "HCS12 (MC9S12DG) dump mit IDA Pro disassemblieren" Wollte das Thema nicht hier in dem Thread behandeln, weil ich glaube das es den Rahmen sprengen könnte. Ich habe gestern einige Teile der Firmware dekodiert und bin überrascht wie unterschiedlich die Dinge in der 8M2J und 9M2J Firmware behandelt werden. Da liegt aber auch bei der Entwicklung mind. 1 Jahr dazwischen, möglicherweise wurde die Toolchain aktualisiert/getauscht. Der INIT nach dem Reset sieht bei der 8M2J Firmware nämlich so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
Anschließend wartet der Code bis der PLL eingerastet ist, führt dann einige Memory-Tests durch und geht dann in eine Endlosschleife, vermutlich die Serverloop (main()) in der immer wieder der externe und interne Watchdog zurückgesetzt wird. Weitere direkte Aussprünge kann ich so noch nicht erkennen, jedoch wird immer etwas überprüft und konditionell verzweigt. Ggf. wird da anstelle mit direkten Calls/Jumps mit dem Stack gespielt, oder es ist alles in Timern/Interrupts vergraben und diese Loop überwacht nur den Betriebszustand. Hier und da gibt es Absprünge in Endlosschleifen (bra auf sich selbst) was dann nach kurzer Zeit wohl unweigerlich zum Reset durch den Watchdog führt.
Gast
#6813524
Olli Z. schrieb: > Dieter, evtl. hast Du hierzu auch ein paar wertvolle Hinweise und Tipps? > Beitrag "HCS12 (MC9S12DG) dump mit IDA Pro disassemblieren" IDA Pro kann mit den Pages ganz gut umgehen, man muss dazu passende Segment in IDA Pro konfigurieren. Wie das genau geht wird z.B. im Support Forum für IDA Pro Kunden erklärt. Ich habe jetzt aber nicht vor hier den Support für IDA Pro zu machen und die Freeware Version von IDA Pro kann den HCS12 meines Wissens sowieso nicht. Ansonsten halt bei Ghidra schauen, da müsste es auch gehen, dazu kenne ich allerdings nicht die Details.
Dieter schrieb: > IDA Pro kann mit den Pages ganz gut umgehen, man muss dazu > passende Segment in IDA Pro konfigurieren. Wie das genau Alles gut, habs schon :-) Ghidra kann es z.B. nicht, bzw. nur halb.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.




























