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
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
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
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
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.