mikrocontroller.net

Forum: Projekte & Code LPC2148 IAP USB Bootloader


Autor: Andreas Weschenfelder (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Hans Huber (hexxter)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Weschenfelder (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hans Huber (hexxter)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Weschenfelder (Firma: andreas-weschenfelder.de.vu) (rupplyn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich bin aktuell noch mal in den Quellen zugange und da ist mir noch was 
aufgefallen:
static int lpc_write(unsigned long addr)
{
char err;
//static char data[512] = {'T','E','S','T'};      // data buffer
long buffer_vic;
//Interrupt Enable Speichern
buffer_vic = VICIntEnable;
//clear vic
VICIntEnClr = 0xffffffff;


// If not blank, dump sector data.
if (blank_check_sector( get_sec_num(addr), get_sec_num(addr) ) == SECTOR_NOT_BLANK) 
  {
  putstring_serial0("\nWarning: Sector not blank!\n");
  //VICIntEnable = buffer_vic;    //interrupts zurueckschreiben
  //return 1;
  }


if (prepare_sector( get_sec_num(addr), get_sec_num(addr)))
  {
  putstring_serial0("\n\r-- Error: PREPARE_SECTOR_FOR_WRITE_OPERATION: ");
  return 2;
  }
  else
  {
  err = copy_ram_to_flash( addr, (unsigned int)my_bl_data, sizeof(my_bl_data));
  if (err)
    {
    putstring_serial0("\n\r-- Error: COPY_RAM_TO_FLASH: ");
    put_int2str(err);
    putstring_serial0(" --\n\r");
    return 3;
    }
    else
    {
    if (compare(addr,(long)my_bl_data, sizeof(my_bl_data)))  
      {
      putstring_serial0("\n\r-- Error: COMPARE --\n\r");
      return 4;
      }
      else
      {
      putstring_serial0("\n\rData successfully written.\n\r");
      return 0;
      }
    }
  }

VICIntEnable = buffer_vic;    //interrupts zurueckschreiben
}

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

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

wird nie erreicht!


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.