Microkontroller - JTAG

Started by asgard, 09. Jan 2008, 17:15

previous topic - next topic
Go Down

mce2222

ich glaub dein Ansatz ist nicht so optimal.
als erstes solltest Du dich auf den IO Code konzentrieren.... der Rest kann erstens sowieso nicht vom bestehenden Code portiert werden sondern muss speziell für den
Anwendungfall entworfen werden.
Denn der Microcontroller muss alleine wissen wann er die Speicherstellen patchen muss...

also muss da mindestens sowas wie n Timer und im Optimalfall auch noch ein interrupt handler für n Reset trigger implementiert werden.  All das gibt es bei der Windowsversion natürlich nicht.

Abgesehen davon ist in der Windowsversion haufenweise Restmüll von dem original OpenWRT Tool. Also mindestens 50% kann man komplett wegschmeissen.

Jabberwock

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

Jabberwock

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?

Code: [Select]
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?

Jabberwock

So... ich habe jetzt alle Fehler soweit raus und kann es Kompillieren  ;D  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:
Quote
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 ...



asgard

HI,

was brauch ich, um es zu probieren? Kann ich einen ATMega32 verwenden?


Grüße
Asgard

Jabberwock

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?


Jabberwock

#21
03. Mar 2008, 09:28 Last Edit: 03. Mar 2008, 09:34 by Jabberwock
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

asgard

Hi,

super! Ich werde es heute abend gleich mal probieren....jetzt muss ich leider noch ein wenig lernen :(

Grüße
Asgard

Paul

heut hätt ich etwas luft, eine box, die ltag enabelt ist, in meiner krimskramskiste findet sich sicherlich einer der genannten chips, löten kann ich glaub ich auch.  ;D

jetzt noch kurz ne zwischenfrage,
bezieht sich das mega32 bzw 16 auf die kapazität (speichergrösse) des chips?
und könnten ggf auch smartcards wie fun, pic oder atmega gehen?

ich würde dann nämlich nen kartenslot einbaun.

Paul

#24
04. Mar 2008, 07:07 Last Edit: 04. Mar 2008, 09:04 by Paul
also grad mal gegruschtelt

mega32 hab ich auch da  ;D

wie muss nun das file (modchip.hex ?? ) auf den chip? hab hier ein pollin evaluationsboard 2.0 pollin
da, zum programmieren und geh mal davon aus das des per ponyprog geschrieben wird. aber die konfigs dafür bräucht ich.

und welches beinchen muss wo hin am jtag. stimmt das so? atmega32pinout

***edit die 598zigste***
so ich editier mal meine ergebnisse hier rein und führ der doku wegen ne alleinunterhaltung.  ;D
so wie es auschaut hab ich das hex auf dem at mega32. nach eingänigen studien des layouts des evoboard und des pinouts des atmega mein ich kann ich das board direkt an den x300t anschliessen. nun eine frage vorab
müssen die widerstände (100ohm) zum jtag auch rein oder kann man da volldampf drauf?

Jabberwock

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


Paul

sorry aber das verstehe wer will.

ich biete hier meine hilfe an in dem ich recht genau abstecken kann was ich kann und was nicht!
der atmega hat dein hex drauf nur obs so funktioniert lass ich mal dahin gestellt. gibt da abertrillion varioationen an lockbits etc.
aber wie bereits gesagt das hex ist drauf und das ohne murren.

die steckerleisten für jtag ist auf dem x300t board jtag enable ist am sigmar angelötet und funktioniert.
das ich kein guru im bauen von programmen bin geb ich offen und ehrlich zu aber mit etwas zutun bekommst heut und jetzt die info ob das was du da gebastelt hast funktioniert oder nicht. einfach sagen
ja der chip kommt direkt an das jtag oder halt mit vorwiderstand. dann ggf noch kurz info darüber ob die uart schnittstelle parallel zu dem jtag laufen soll oder ob die terminal ausgabe via jtag erfolgt.
ich bau das kurz ein und sag bescheibt obs geht.
bringt ja nix wenn du was machst was du nicht testen kannst.
zu dem "quarz" , das ist soweit mir bekannt in den genannten chipkarten mit drin.

Jabberwock

#27
04. Mar 2008, 12:36 Last Edit: 04. Mar 2008, 12:53 by Jabberwock
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.

Metrex

#28
05. Mar 2008, 13:50 Last Edit: 05. Mar 2008, 13:52 by Metrex
So, tach auch,

also ich hab vor ner Woche auch angefangen nen ModChip zu programmieren. Ich halte von den Atmel-uC nicht so viel, da sie technisch nicht so viel her machen und vor allem nervt, dass die Debug-Geräte so schweinisch teuer sind.

Ich arbeite seit einiger Zeit mit SiLabs (Silicon Laboratories) und bin überaus zufrieden. Die uC sind zwar bis auf einen nur in SMD-Bauform verfügbar, aber das soll ja nicht weiter stören. Naja, lange Rede kurzer sinn:

[font=tahoma]Ein SiLabs-Modchip ist fertig und funktioniert bestens![/font][/color]

Die Frage ist jetzt wie hat die Allgemeinheit am meisten davon? Es bestehen folgende Optionen
- Man erstellt ein PCB, mit Modchip (smd) und Stecker zum JTAG-Port, das müsste dann bestückt, gelötet und programmiert werden (fehlt vermutlich die Nachfrage, dass sich das lohnt)
- Ich stelle den Quellcode hoch (siehe Anhang) und er kann für z.B. Atmel angepasst werden
- Man kauft sich ein SiLabs "Toolstick Starter Kit" (25$) mit dem kann man Programmieren, Debuggen, und aus dem "Daughterboard" einen Modchip machen. Somit sind die Kosten für einen Modchip via "Daughterboard" bei 10$ (Einfachste Lösung) http://www.silabs.com/tgwWebApp/public/web_content/products/Microcontrollers/en/USBToolStick.htm

Nu denn, wünsche euch viel Spaß damit,

Gruß Metrex

asgard

#29
05. Mar 2008, 14:23 Last Edit: 05. Mar 2008, 14:26 by asgard
Hey,

super sache :)

Wie hast du das realisiert, wenn die box einen reboot macht? Woher weiß dein modchip dann, dass ein neustart gemacht wurde...oder schaltest du die box komplett aus und einfach wieder ein...?

Grüße
Asgard

@Metrex: kannst du vielleicht ein Foto von dem eingebauten Modchip machen und hier uppen?

Go Up