Forum: Projekte & Code LPC2148 IAP USB Bootloader


von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

anbei ein Beispiel für nen USB Bootloader für den LPC2148. Die 
USB-Kommunikation ist über die LPCUSB bzw. die Libusb realsisiert.

Die zu ladende Anwendung muss an die Adresse 0x3000 gelinkt werden. Die 
ersten 0x40 Bytes im RAM sind für den Bootloader reserviert. (Ein 
einfaches LED-Beispiel ist dabei)

Das ganze ist momentan für das Olimex-Board: Werden beide Buttons bei 
einem Reset betätigt, wird in den Bootloader gesprungen, andernfalls 
wird die Applikation angesprungen.

Der Schwerpunkt liegt vor allem auf der Anwendung der IAP-Funktionen. 
Sicherungen, wie z.B. Checksummen-Berechnung, sind derzeit nicht 
integriert. Dafür dürfte der Code sehr leicht auf andere Projekte 
(SD-Karte, Ethernet) portierbar sein.

Gruß Andreas

von Hans H. (hexxter)


Lesenswert?

Hallo Herr Weschenfelder,
ich bin auf der Suche nach einem IAP mit AES für den LPC2294. Ich 
benutze es schon beim AVR, dort gibt es einen. Haben Sie evtl eine Idee 
ob es einen für den LPC gibt?

mfg

Hans

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

Hallo Hans,

hab natürlich auch google gefragt, was denn so in der Richtung 
LPC(2148)-Bootloader verfügbar/veröffentlicht ist.
Allgemein war das Ergebnis eher mager: ohne es zu wissen würde ich nein 
sagen.
Vor allem etwas für ein bestimmtes Derivat zu finden... (öffentliche 
IAP-Quellen alleine sind schon nicht so verbreitet)
Hast doch hier ein Beispiel fuer die IAP-Funktionen und von Atmel gibt's 
doch ne Appnote für nen AES-Bootloader; wenn man das nicht kombinieren 
(und hier veröffentlichen ;-) ) kann...

Gruß Andreas

von Hans H. (hexxter)


Angehängte Dateien:

Lesenswert?

Hi,

Hab bisschen was gefunden. Im zip ist eine aes impl. von mir. Diese ist 
zwar für den AVR aber sollte sich problemlos portieren lassen. Und noch 
im Paket sind 2 AN von Philips zum Thema.

Schöne Grüße

hexxter

von gast (Gast)


Lesenswert?

Hallo Andreas

Tolles Projekt. Ich sehe, du hast libusb zur Kommunikation mit dem Board 
verwendet.

Ich möchte gerne mal versuchen Deinen Bootlader mit Delphi anzusprechen.

Würdest du mir bittte mitteilen, welche Version von LibUsb du verwendet 
hast.

Freundliche Grüsse und vielen Dank für Deine Rückmeldung

Geri

von Andreas W. (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite


Lesenswert?

Hi Geri,

hab die 0.1.12.0 verwendet.

Für Delphi gibts ja bereits schon ne Version:
http://www.xs4all.nl/~ynlmns/

Falls du den direkten Weg über die libusb machen willst, kann ich dir 
auch den Code von der awusb.dll schicken.

Gruß Andreas

von Magnus (Gast)


Lesenswert?

Hallo Andreas,

da ich ja grade mit deinen Quellen arbeite, eine kurze Frage:

Beim Beschreiben des Flashes sollten alle Interrupts disabled sein.
Ist die Erase-Funktion nicht ebenso eine Schreibfunktion? Bei dieser 
werden die Interrupt nämlich nicht deaktiviert.
Ist das korrekt so? Oder sollte man auch hier die Interrupts einfrieren?

von Magnus (Gast)


Lesenswert?

Ich bin aktuell noch mal in den Quellen zugange und da ist mir noch was 
aufgefallen:
1
static int lpc_write(unsigned long addr)
2
{
3
char err;
4
//static char data[512] = {'T','E','S','T'};      // data buffer
5
long buffer_vic;
6
//Interrupt Enable Speichern
7
buffer_vic = VICIntEnable;
8
//clear vic
9
VICIntEnClr = 0xffffffff;
10
11
12
// If not blank, dump sector data.
13
if (blank_check_sector( get_sec_num(addr), get_sec_num(addr) ) == SECTOR_NOT_BLANK) 
14
  {
15
  putstring_serial0("\nWarning: Sector not blank!\n");
16
  //VICIntEnable = buffer_vic;    //interrupts zurueckschreiben
17
  //return 1;
18
  }
19
20
21
if (prepare_sector( get_sec_num(addr), get_sec_num(addr)))
22
  {
23
  putstring_serial0("\n\r-- Error: PREPARE_SECTOR_FOR_WRITE_OPERATION: ");
24
  return 2;
25
  }
26
  else
27
  {
28
  err = copy_ram_to_flash( addr, (unsigned int)my_bl_data, sizeof(my_bl_data));
29
  if (err)
30
    {
31
    putstring_serial0("\n\r-- Error: COPY_RAM_TO_FLASH: ");
32
    put_int2str(err);
33
    putstring_serial0(" --\n\r");
34
    return 3;
35
    }
36
    else
37
    {
38
    if (compare(addr,(long)my_bl_data, sizeof(my_bl_data)))  
39
      {
40
      putstring_serial0("\n\r-- Error: COMPARE --\n\r");
41
      return 4;
42
      }
43
      else
44
      {
45
      putstring_serial0("\n\rData successfully written.\n\r");
46
      return 0;
47
      }
48
    }
49
  }
50
51
VICIntEnable = buffer_vic;    //interrupts zurueckschreiben
52
}

Sobald der Schreibvorgang erfolgreich abgeschlossen wurde, wird mit
1
return 0;

zurück in die aufrufende Funktion gesprochen.
Im Vorfeld werden die Interrupteinstellungen gesichert, aber sie werden 
nicht wieder zurück geschrieben, denn
1
VICIntEnable = buffer_vic;    //interrupts zurueckschreiben

wird nie erreicht!


Sollte man bei Applikationen, die mit Interrupts arbeiten vllt beachten, 
wenn man die Quellen verwendet ;)

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.