Forum: Projekte & Code Python Script: LPC810 flashen


von Axel H. (axelh)


Angehängte Dateien:

Lesenswert?

Hi,

Anbei ein Python Script um den LPC810 über die serielle Schnittstelle 
bzw einen USB Adapter zu flashen. Die ursprüngliche Version habe ich bei 
http://midibel.com gefunden und noch ein wenig erweitert.

Vielleicht kann es ja der ein oder andere brauchen.....

Axel

von Axel H. (axelh)


Angehängte Dateien:

Lesenswert?

Hallo,

es gibt eine neue Version, mit dem Parameter "-r" wird jetzt am Ende ein 
Reset ausgeführt. Damit wird dann nach dem Flashen gleich das neue 
Programmm gestartet und das lästiger drücken des Reset Tasters entfällt.
1
$ make && flushmagic.py -p /dev/ttyUSB1 -r blink.bin && picocom -b 115200 /dev/ttyUSB1

Zusammen mit einem UART Interrupt handler, der ein "r" für Reset und ein 
"i" für ISP-Reset versteht , lässt sich dann jegliche Interaktion mit 
der Platine vermeiden (zumindest solange das Programm läuft):
1
typedef void (*IAP)(uint32_t*, uint32_t*);
2
#define IAP_ENTRY ((IAP)0x1fff1ff1)
3
4
void intHdl_UART0(void) 
5
{
6
  if (0 != (LPC8xx_UART->stat & UART_STAT_RXRDY))
7
  {
8
    char c = (char)(LPC8xx_UART->rxDat)
9
    switch (c)
10
    {
11
      case 'r': // reset
12
        LPC8xx_SCS->AIRCR = 0x05fa0004;
13
        for(;;) { } // Loop forever as fail safe option
14
        break;
15
16
      case 'i': // reset into ISP
17
        { uint32_t cmd = 57;
18
          IAP_ENTRY( &cmd, NULL); }
19
       break;
20
    }
21
  }
22
}

: Bearbeitet durch User
von Marc P. (marcvonwindscooting)


Lesenswert?

Irgendwoher kenn ich das... ;-)
Tja, deine Frage mit dem halb-schrottigen 'G' Kommando werde ich mir 
demn"achst auch noch mal ansehen.

Warum verwendest Du nicht die RTS und DTR signale, die auf vielen Boards 
zu finden sind?

von Peter Z. (Gast)


Lesenswert?

Hi,

RTS und DTR? Kann der LPC810 das überhaupt <g>? Seit dem FTDI/USB ist 
doch nur noch RX und TX interessant. Und DTR uns RTS kosten 2 PINs mehr 
von den 8. Das ist echt teuer dann. So kann man wenigstens den Reset Pin 
auch nutzen...

Peter

von Marc P. (marcvonwindscooting)


Lesenswert?

Sorry, ich war schlampig. Ich dachte das ist f"ur LPC800 (im Sinne von 
LPC810/811/812). Bei 8 Pins wird's echt eng. Da muss man RESET ja schon 
fast "uber power-cycling machen ;-)

von Axel H. (axelh)


Lesenswert?

Hallo,

also lt. LPC81x User Manual Kapitel:

* Der LPC81x kennt kein explizites DTR, die Switch Matrix hat neben 
U0_TXD_O, U0_RXD_I nur noch U0_RTS_O und U0_CTS_I
* Im Kapitel "22.3 Pin description" steht nur, dass PIO0_0/U0_RXD und 
PIO0_4/U0_TXD benutzt wird vom Bootloader.

Marc, hast du da noch mehr Doku oder gar den Bootloader mal 
disassembliert?
Unter http://midibel.com/bootrom-4.13.S ist ein dump zu finden, aber so 
ganz ohne Symbole ist das schon hart und ich hab irgendwann die Lust 
verloren...

Axel

von Marc P. (marcvonwindscooting)


Lesenswert?

@Axel: nee, vergiss es. Ich meinte ueber Hardware DTR -> /RESET, RTS -> 
/BOOT. Ich denke zu sehr an die Familie LPC800 als an den expliziten 
LPC810 (DIP8). Kontextfehler. Bei 16 oder 20 Pins kann man schon mal 2 
opfern, bei 8 wohl eher nicht.

Geht dein Script auch bei den anderen LPC81X ?

von Axel H. (axelh)


Lesenswert?

Ahh...klick...das mit dem DTR -> /RESET, RTS -> /BOOT ist eine gute 
Idee. Werde des das mal notieren und ggf als weitere Option in das 
Script einbauen. Mir sind nur leider die PIN ausgegangen, so dass ich 
den Reset als GPIO brauche. Muss mir jetzt doch mal ein paar LPC812 
besorgen.

Ich hab bisher nur die LPC10 DIP8 da zum testen, es sollte aber mit den 
anderen auch gehen, da das Protokoll gleich ist. Das Script hat auch 
keinen Test auf die Flash-Grösse drinnen, sollte also alles nehmen. In 
getPartName() habe ich nur die ID from LPC810 drinnen, die anderen sind 
auskommentiert bis die jemand verifiziert hat.

Axel

von Der Unlaut(ere) mit den Ga"nsef"usschen (Gast)


Lesenswert?

Hi Axel,

bei mir gibts Probleme in Zeile 108. Ich hab da mal aus dem Bauch heraus 
Klammern rum gemacht, scheint dann OK zu sein.

Aber wo bekomm ich das Modul 'serial' her? Ich hab wohl eine 
spartanische Installation...

von Axel H. (axelh)


Lesenswert?

Siehe http://pyserial.sourceforge.net/pyserial.html#installation oder 
bei Ubuntu das Packet "python-serial" installieren.

Wegen Zeile 108: ggf. ist Pyhton bei dir neuer und mag print() nur noch 
als funktion? Ist aber eh sauberer mit den Klammern.

von Axel H. (axelh)


Angehängte Dateien:

Lesenswert?

Es gab mit Python 3.3 einige Probleme. Anbei eine Version, die damit 
auch laufen sollte. Leider kann ich das momentan bei mir nicht testen, 
aber vielleicht könnte mir jemand eine Rückmeldung gehen.

Axel

von Marc P. (marcvonwindscooting)


Lesenswert?

Hi Axel,

ich habe mit einem LPC812 getestet (Tim's (cpldcpu) breakout-board).

Dabei ist mir eingefallen, dass mit mxli 115200 baud zu schnell sind, 
sofern echo on (CMD 'A') ist. Ohne echo packt's der LPC. Ich denke das 
ist diesselbe Sache, die von 'capiman' als Verdacht f"ur zu langsame 
Antwort des LPC mal in den Raum gestellt wurde.

von Axel H. (axelh)


Lesenswert?

Nächste Version bekommt dann noch einen "-b BAUDRATE" Parameter, mit dem 
sich das anpassen lässt.

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