Show Posts
This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.
Messages - Jabberwock
1
Ok, da ist kein Quarz drin sonder ein Oszillator. Ein Bauteil das die Funktion eines Quarzes nachahmt, also Takte erzeugt. Dieser ist aber sehr ungenau in seiner Frequenz. Deshalb kommt es zu Problemen mit der seriellen Übertragung von Daten. Das kann man am einfachsten umgehen in dem man einen "echten" Quarz nimmt, oder den internen kalibriert.
Die Fusebits kann ich dir auch nicht aus dem Kopf sagen. Einfach erstmal so lassen. Wenn du da nichts verstellt hast sollte das schon passen.
JTAG und UART können parallel laufen.
Aber am Rechner kannst du nur per UART etwas empfangen
Für JTAG kannst du PORT A nehmen. Wenn alles so geht wie ich mir das denke dann müsste das mit der Belegung passen.
Portpin | Pin am JTAGkabel/ParallelPort
PA0 = frei
PA1 = Pin 4
PA2 = Pin 3
PA3 = Pin 2
PA7 = Pin 13
GND = GND
Aber wie schon gesagt, das geht noch nicht...
Hast du denn die UART Schnittstelle schon am laufen? Bekommst du eine Antwort im Terminal?
Bevor das nicht geht brauchen wir nicht weiter machen weil wir nicht sehen können was passiert.
2
Also das wird so nicht funktionieren... da muss noch einiges an Debugarbeit getan werden und sei mir nicht böse aber wenn du schon scheiterst beim aufspielen der .hex dann wird das wohl eher schwierig werden.
Es kann damit noch nichts gepatcht werden!!! Es müsste jetzt erstmal geschaut werden ob die serielle Schnittstelle funktioniert, ich denke nicht dass es geht weil der interne Oszillator zu ungenau ist. Aber das kann man hinbekommen. Bei mir geht sie aber ich habe einen anderen uC, ohne die wird das weitere Debuggen sehr schwierig.
Wenn das geht dann kann man anfangen Bits an das JTAG zu senden und zu schauen was die Box davon hält. Dazu ist es aber nötig weiter zu programmieren. Eigentlich kann jetzt jeder daran weiter basteln.
Ich würde den AVR erstmal mit einer externen Spannung versorgen und dann per ISP
http://s-huehn.de/elektronik/avr-prog/avr-prog.htm und PonnyProg die .hex drauf schieben. Im Datenbaltt die Pins (RX, TX, GND) des UART (serielle Schnittstelle) suchen und mit einem Stecker für den Rechner versehen. Dann im Terminal schauen ob bei Eingabe von "1" die Antwort "Verbindung OK" kommt. Wenn nicht, am einfachsten einen Quarz nutzen. Welche Frequenz ist eigentlich egal, muss dann halt im Programm angepasst werden.
Wenn das geht suchen wir uns ein paar Pins aus an die das JTAG kabel kommt. Aber erstmal Grundlagen schaffen...
mfg
Jabberwock
3
Hi, ich habe dir das jetzt mal passend für den Mega32 gemacht.
Ich nutze AVRStudio mit GCC. In dem .Zip ist das komplette Projekt mit fertigem .hex drin.
Wenn du den hexfile auf dem Chip hast kannst du ihn per rs232 an den Rechner hängst und solltest dann im Terminal. (9600 8N1 Fluss= keine) bei Eingabe einer "1" den String "Verbindung OK" bekommen. Wenn das nicht geht. Haut die serielle Verbindung nicht hin. Dann würde ich einen externen Quarz empfehlen. Weil ohne hast du keine debugmöglichkeit. Später kann man das ja dann weg lassen. Wenn es geht kannst du mit "2" den Patchvorgang starten.
Es sind noch keine Pins für das Wigglerkabel festgelegt. Am besten erstmal testen ob es überhaupt läuft. Dann können wir weiter sehen.
In dem Code kannst du per "uart_puts("debug")" ausgaben erzeugen.
Es ist noch nicht fertig!!!! Aber ohne Box kann ich erstmal nicht mehr viel machen.
Wenn Fragen sind, Mail oder (icq: 269780240)
EDIT: Müsste auch auf ATMega16 laufen
mfg
Jabberwock
4
Es ist jetzt für den Butterfly angepasst weil ich keinen anderen hier habe. Da benutze ich den externen Uhrenquarz um den internen Oszillator zu kalibrieren. Das wird natürlich auf dem Mega32 dann nicht gehen, kann sein das dann die rs232 nicht richtig geht. Außerdem werden einige Register nicht passen. Aber ich kann es dir schicken und du kannst es versuchen.
Das gilt auch für alle anderen die sich dran versuchen möchten.
Aber die Verbindung zur Box noch nicht wirklich da, deshalb laufen alle lese- und scheibversuche ins Leere.
Da ist noch ein bisschen was zu tun.
Aber ich bin schon mal froh dass ich es jetzt endlich mal Kompiliert bekommen habe.
Wie ist das eigentlich mit dem Patch, muss der an einer bestimmten Stelle ausgeführt werden? Oder ist das egal wann man den startet?
5
So... ich habe jetzt alle Fehler soweit raus und kann es Kompillieren
Es sind allerdings noch ein paar Warnungen da und beim Simulieren kommen Stack Overflows. Aber ich habe es einfach mal auf den AVRButterfly geschoben und es läuft! Zumindes soweit wie ich es ohne Box testen kann.
Es kommen schön die Fehlermeldungen auf dem Terminal an.
Das ist die Ausgbe die ich bekommen:
Probing bus ... Done
CPU Chip ID: *** Unknown or NO CPU Chip ID Detected ***
Issuing Processor / Peripheral Reset ... Done
Halting Processor ... <Processor did NOT enter Debug Mode!> ... Done
Clearing Watchdog ...
Bei Clearing Watchdog ... bleibt er hängen da kein Watchdog da ist ...
6
Hi,
ich habe mir das grade noch mal angeschaut, kann mir jemand den folgenden Code erläutern, beziehungsweise meine Überlegung dazu mal prüfen?
Die Funktion clockin wird von den einigen andern Funktionen aufgerufen unter andrem ReadWriteData, ReadData und WriteData was ja grade die interessanten Funktionen sind.
if(wiggler) data = (1 << WTDO) | (0 << WTCK) | (tms << WTMS) | (tdi << WTDI) | (1 << WTRST_N);
Das sind genau die Pins die im Wiki für das Wiggler Interface beschrieben sind.
Wenn ich jetzt einfach 5 Pins am AVR wie oben definiere dann wäre das doch der gleiche output wie am Parallelport, oder nicht?
Ist die clockin die Outputfuktion? Könnte da so funktionieren?
static unsigned char clockin(int tms, int tdi)
{
unsigned char data;
tms = tms ? 1 : 0;
tdi = tdi ? 1 : 0;
if(wiggler) data = (1 << WTDO) | (0 << WTCK) | (tms << WTMS) | (tdi << WTDI) | (1 << WTRST_N);
else data = (1 << TDO) | (0 << TCK) | (tms << TMS) | (tdi << TDI);
#ifdef WINDOWS_VERSION // ---- Compiler Specific Code ----
_outp(0x378, data);
#else
//ioctl(pfd, PPWDATA, &data); Was ist das???
#endif
if(wiggler) data = (1 << WTDO) | (1 << WTCK) | (tms << WTMS) | (tdi << WTDI) | (1 << WTRST_N);
else data = (1 << TDO) | (1 << TCK) | (tms << TMS) | (tdi << TDI);
#ifdef WINDOWS_VERSION // ---- Compiler Specific Code ----
_outp(0x378, data);
#else
//ioctl(pfd, PPWDATA, &data); Was ist das???
#endif
#ifdef WINDOWS_VERSION // ---- Compiler Specific Code ----
data = (unsigned char)_inp(0x379);
#else
// ioctl(pfd, PPRSTATUS, &data);
#endif
data ^= 0x80;
data >>= (wiggler ? WTDO : TDO);
data &= 1;
return data;
}
patch() ruft ejtag_read(addr1) auf
ejtag_read(addr1) ruft ejtag_pracc_read(addr) auf
ejtag_pracc_read(addr) ruft ExecuteDebugModule(pracc_readword_code_module) auf (pracc_readword_code_module) ist die Assembler Funktion um den Speicher zu lesen denke ich
ExecuteDebugModule(pracc_readword_code_module) ruft ReadWriteData(PRACC | PROBEN | SETDEV) und ReadData() mehrfach auf
ReadData() WriteData() ReadWriteData() rufen die oben beschreibende clockin() auf.
Also landet alles irgendwann da und wird über die Pins rausgeschickt.
Ich weiß nicht ob ich das alles richtig verstanden habe aber es scheint mir schon so zu sein.
Kann das jemand so bestätigen?
7
ja das ist mir schon klar, ist auch soweit schon fertig.
Ich habe alle "printf" Ausgaben auf die serielle Schnittstelle gelegt um am Terminal zu sehen wie weit er kommt. Zurzeit würde der Patchvorgang durch eine Tastatureingabe gestartet werden. Da ich noch keine Box habe konnte ich den original patch noch nicht durchführen und weiß nicht genau wann der gestartet werden soll/muss und woran man erkennt das der richtige Zeitpunkt da ist.
Mein Problem ist das ich nicht weiß wie die Verbindung zum Prozessor funktioniert und irgendwie finde ich dazu auch nicht soviel im Netz.
Wenn jemand Interesse an dem Code hat einfach melden. Ich mache das ja auch nur nebenbei. Vielleicht bekommt ja jemand die letzen Fehler raus.
mfg
Jabberwock
8
Hi,
ich habe den Code mal im AVRStudio eingefügt und ein bisschen angepasst aber ganz lässt es sich nicht kompelliert
Ich habe immer noch 3 Fehler die ich nicht wegbekomme. Ganz zu schweigen von den vielen Warnungen. Da sind auch ein Haufen Variablen die gar nicht genutzt werden. Ich glaube den Code so direkt aus dem Windows Programm zu übernehmen wird nicht so einfach. Zwar sind die Funktionen zum lesen und scheiben schon ok so nur wird die Verbindung ja über den Parallelport hergestellt und den gibt es ja hier nicht. Ich habe leider keine Ahnung wie ich so eine Verbindung zu dem Prozessor herstellen könnte.
Ich habe aber eine Idee, es gibt diesen nachbau JTAGICE
http://www.uc-projects.com/JTAG_Software.htm und es gibt ein Kommunikationsprotokoll
http://www.atmel.com/dyn/resources/prod_documents/doc2524.pdf. Der Programmer wird seriell angesprochen. Wenn man jetzt an den Code des Programmes kommt könnte man ihn dazu bringen die entsprechenden Aktionen durchzuführen in dem er die Befehle per URAT an sich selber sendet. Also einfach den RX Pin mit dem TX Pin verbinden. Das müsste eigentlich gehen. Nur weiß ich nicht ob man an den Code des Programmers kommt. Oder man nimmt einen zweiten Chip der die Befehle dann an den Programmer sendet. Dann müsste der Code nicht geändert werden.
Ich glaube ich werde mir erstmal eine Box besorgen müssen bevor es weiter gehen kann…
9
Hallo, ich bin ganz neu hier und über den Umbau meiner S100 auf das Forum hier gestoßen. Ich mich den Vormittag mal eingelesen. Ist ja alles sehr interessant was ihr schon geschafft habe. Vor allem in der recht kurzen Zeit.
Ich könnte vielleicht behilflich sein bei der Programmierung des Modechip. Ich habe schon ein paar Sachen mit AVRs gemacht und hätte auch Lust meinen Beitrag zu leisten. Ich habe zwar noch keine Box aber macht ja nix.
@plenkk: Ich würde mich freuen wenn ich dir behilflich sein darf.
Wie weit bist du denn schon? Vielleicht können wir uns ein bisschen austauschen.
Arbeitet sonst noch wer daran?
Ich habe mir mal den Code angeschaut, weiß aber nicht ob ich das richtig verstanden habe.
Eigentlich muss doch nur die bootloderversion ermittelt werden und dann die Endsprechenden Daten an die richtige Adressen geschrieben werden, oder?
Also vereinfacht dargestellt müsste es diese Funktion sein um die Version zu bekommen
void apply_patch(char *filename, unsigned int start, unsigned int length)
{
if (!patchOk)
{
patchOk = patch1053();
}
if (!patchOk)
{
patchOk = patch1051();
}
if (!patchOk)
{
patchOk = patch1039();
}
if (patchOk)
{
printf("Patch applied !\n");
printf("... now press OK Button on the X300T.\n");
}
else
{
printf("unknown Bootloader version. please dump it !\n");
}
}
und diese um die Daten zu lesen und zu schreiben. Dazu muss natürlich eine JTAG Kommunikation mit dem Prozessor aufgebaut werden und vielleicht noch einen seriellen Output um zu sehen was passier.
boolean patch1053()
{
unsigned int addr1, addr2, data1, data2, data3, data4;
addr1 = 0x93640150;
data1 = ejtag_read(addr1);
data2 = ejtag_read(addr1+4);
// printf("0x93640150: %x%x\n", data1, data2);
if (data1 != 0x0cd8dce4 || data2 != 0x24040001) // Auswerten der Daten
{
return false;
}
addr2 = 0x93640250;
data3 = ejtag_read(addr2);
data4 = ejtag_read(addr2+4);
// printf("0x93640250: %x%x\n", data3, data4);
if (data3 != 0x0cd8dce4 || data4 != 0x24040001)
{
return false;
}
printf("Bootloader Version 1053 found\n");
ejtag_write(addr1, 0x10000019); // jal 0x93637390 --> b 0x936401B8
ejtag_write(addr1+4, 0x00);
ejtag_write(addr2, 0x1000ffd9); // jal 0x93637390 --> b 0x936401B8
ejtag_write(addr2+4, 0x00);
// hash always correct
ejtag_write(0x93641E90, 0x00000000); // b loc_93641EA8 --> NOP //Wenn alle daten zu der Version passen schreibe an die Adresse
// signature skip flag
addr1 = 0x937E1728;
ejtag_write(addr1, 0x01000000); //Signatur skip flag immer gleich!!!!
return true;
}
boolean patch1051()
{usw.
Habe ich in dem Code was übersehen? Sind noch mehr Sachen nötig um den bootloader zu patchen, oder sind das nur die zwei Adressen die da geändert werden?
1. Also JTAG Verbindung zu dem Prozessor aufbauen
2. Adressen 1, 2, 3, 4, lesen und vergleichen zu welcher Version das passt
3. Passende Daten schreiben
Fertig!
Würde mich freuen wenn das was werden würde.
Die Box scheint ja wirklich ein sehr interessantes Gerät zu sein.
Mfg
Jabberwock