LPC2148 IAP USB Bootloader

OP (Firma: andreas-weschenfelder.de.vu) Persönliche Seite #776149
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
Angehängte Dateien:
OP (Firma: andreas-weschenfelder.de.vu) Persönliche Seite #794994
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
Gast #873131
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
Gast #1024733
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?
Gast #1239928
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 ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren