XMega BootApp

Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

XMega BootApp

 · 
Posted: 19.02.2015 - 16:51  ·  #1
Hallo,

ich versuche mich gerade an einer BootApp für den ATXMega. Für den ersten Versuch wollte ich
mir mal das Demo Beispiel angucken. [XMega_BootApp]
Bei folgender Zeile bekomme ich aber schon eine Fehlermeldung.
Die Adresse liegt nicht im Bootbereich. Wenn ich es recht verstehe soll der Compilerschalter
eigentlich die Meldung unterdrücken.
Die Kennung $AA55 soll doch bestimmt am Ende des Application Sec. liegen.

{$NOADDRCHECK}
BootCheckF[BootEntry -2] : word = $AA55; // in the standard app area

Mache ich hier einen Denkfehler?
Ich würde mich über einen Hinweis freuen, danke.

Viele Grüße ans Forum
Torsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega BootApp

 · 
Posted: 19.02.2015 - 20:06  ·  #2
Quote by Torsten

Hallo,

ich versuche mich gerade an einer BootApp für den ATXMega. Für den ersten Versuch wollte ich
mir mal das Demo Beispiel angucken. [XMega_BootApp]
Bei folgender Zeile bekomme ich aber schon eine Fehlermeldung.
Die Adresse liegt nicht im Bootbereich. Wenn ich es recht verstehe soll der Compilerschalter
eigentlich die Meldung unterdrücken.
Die Kennung $AA55 soll doch bestimmt am Ende des Application Sec. liegen.

{$NOADDRCHECK}
BootCheckF[BootEntry -2] : word = $AA55; // in the standard app area

Mache ich hier einen Denkfehler?
Ich würde mich über einen Hinweis freuen, danke.

Viele Grüße ans Forum
Torsten


Hallo Torsten,

hmm das nutze ich so gar nicht, ist das in der BootApp oder im Main-Programm?

Ich nutze als Grundlage den USB-Bootloader von rolf und miparo und habe mir 1-2 Punkte für mich angepasst. Wie willst Du denn laden USB, RS232/485 oder SDCARD?

Hier mal mein angepasstes Beispiel:
Code
program XMEGAUSB_BOOT;
{$NOSHADOW}
{ $WG}                     {global Warnings off}

Device = xmega256A3U, VCC = 3.3;
{$BootApplication}

Define_Fuses
  Override_Fuses;
  //  NoteBook  = A;
  ProgMode  = PDI;
  COMport   = USB;
  // LockBits0 = [BLBB0, BLBB1, LB0, LB1];   // protect boot and app against read back
  FuseBits0 = [];
  FuseBits1 = [];
  FuseBits2 = [BootRst];                         // mandatory !!
  // Brown-out is obligatory with USB !!!
  FuseBits5 = [BODACT0, BodLevel0, BodLevel1, BodLevel2];
//  AddApp     = 'D:\Data\AVR_CPU\CPUTestMain';    // Info for programmer, joining hexfiles, using this project name


Import SysTick,
       USBboot,
       FlashLoader,
       SysLEDblink;


From System Import Tasks,
                   Traps;

Define
  // XMega USB must use the internal 32MHz OSC. So the system must use the 2MHz OSC
  OSCtype        = int2MHz,
      PLLmul     = 16,
      prescB     = 1,
      prescC     = 1;
  StackSize      = $0100, iData;
  FrameSize      = $0100, iData;
  IDATA1         = $1ff0;

  SysTick        = 10;
  Scheduler      = iData;
  TaskStack      = $80, iData;
  TaskFrame      = $100;

  maxTraps       = 2;                       // optional, 2..16

  USBmanufact            = 'Herstellername';       // max 31 bytes
//  USBprodName            = 'ProdName';           // "     "
  USBpid                 = $1010;  // Deine PID
  USBvid                 = $0003;  // Deine VID
  USBprodRel             = 201;
  USBcurrent             = 200;
  USBvBUS                = PortA.7;                 // port and pin // Nutze ich nicht..

  SysLEDblink    = mSec600;                 // 10..1000 msec
  SysLEDBlink0   = PortB, 7, high;

Implementation

{$IDATA}
{------------------------------------------------------------------------------}
{ Type Declarations }
Type
  tBuf64                 = Array[0..63] of byte;

{--------------------------------------------------------------}
{ Const Declarations }
const
  // this constant must be the same as in the Main app
  DownLoaderID : word   = $1234;           // mandatory constant

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA1}
var
  bo     :      boolean;
  bb     :      byte;

{$IDATA}
var
  // these two buffers must be aligned to even addresses !!
  RxBuf                 : tBuf64, align2;    // USB incomming Buffer
  TxBuf                 : byte, align2;      // USB outgoing Buffer
  RxCount               : byte;
  RxIndex               : byte;
  RxB                   : byte;
  Header                : tUSB_Request_Header;

// Test LED
   HxOK              [@PORTB, 7 ] : bit;
// Input  Onboard
   HxIN_SOFTRESET    [@PINE, 3 ] : bit;
   HxIN_RUNSTOP      [@PINR, 0 ] : bit;
   HxIN_SERVTAST     [@PINR, 1 ] : bit;
   
{--------------------------------------------------------------}
  // The USB_ControlJob must be repeatedly called to process common PC requests

Task ControlJob(iData, suspended);
begin
  USB_ControlJob;
end;

{--------------------------------------------------------------}
{$Validate $}
Function myUSB_ControlRequest(bRequest : byte; wValue : word) : boolean;
// need always answer from device
// time-critical - fast work off !!!!!!!!!!!!
var
  b                      : byte;
begin
  Header:= USB_ReadHeader;
  case Header.bmRequestType of
    $C0 :
          case bRequest of   // Dev to Host
            0 :
                if Header.wLength > 0 then
                  b:= $FF;
                  USB_ControlSend(@b, 1);
                  return(true);
                endif;
              |
            1 :
                if Header.wLength > 0 then
                  b:= $00;
                  USB_ControlSend(@b, 1);
                  return(true);
                endif;
              |
            else
              USB_ControlSend(nil, 0);  // unknown vendor request, do an ACK
              return(true);
          endcase;
        |
    $40 :
          case bRequest of                // Host to Dev
            0 :
                USB_ControlSend(nil, 0);
                USB_RxSetBuf(@RxBuf);
                return(true);
              |
            1 :
                if Header.wLength > 0 then
                  USB_ControlSend(nil, 0);
                  mDelay(100);
                  HardWareReset;
                endif;
              |
            else
              USB_ControlSend(nil, 0);  // unknown vendor request, do an ACK
              return(true);
          endcase;
        |
    else
      return(true);
  endcase;
end;

{--------------------------------------------------------------}
procedure FlashLoaderInit;                    // mandatory
begin
  USB_SetControlCallback(@myUSB_ControlRequest);
  Resume(ControlJob);
  USB_Init(@RxBuf);        // Attach USB and connect RxBuf for FIRST RX INT
  repeat
  until USBDEV_State = UsbDev_STATE_Configured;
  USB_RxSetBuf(@RxBuf);
end;

{--------------------------------------------------------------}
Function FlashLoaderRecv : byte;              // mandatory
begin
  repeat
  until USB_RxDataAvail;
  loop
    if RxCount > 0 then                       // already bytes in RxBuf ?
      RxB:= RxBuf[RxIndex];
      inc(RxIndex);
      dec(RxCount);
      if RxCount = 0 then
        USB_RxSetBuf(@RxBuf);                 // we need more data ..
      endif;
      return(RxB);
    endif;
    RxCount:= USB_RxCount;
    RxIndex:= 0;
  endloop;
end;

{--------------------------------------------------------------}
procedure FlashLoaderTransm(arg : byte);      // mandatory
var
  bo   :        boolean;
begin
  TxBuf:= arg;
  USB_TXsend(@TxBuf, 1);
  while not USB_TXcomplete do                 // wait TX send complete
    NOP;                                      // user todo -  save this with 2 sec. timeout
  endwhile;
end;

{--------------------------------------------------------------}
procedure FlashLoaderExit;                   // mandatory
begin
  if Application_Valid then                  // Flag in the Flash Loader
    EEprom[EEpromEnd]:= $00;                 // validate application for Boot usage
  endif;
  mDelay(1000);
  HardWareReset;                             // restart with a jump into the Boot
end;

{--------------------------------------------------------------}
// optional Trap which can be called from the main
Function BootFunction : boolean; Trap;
begin
  NOP;    // do anything
  NOP;
  NOP;
  return(bo);
end;

{--------------------------------------------------------------}
// optional Trap which can be called from the main
procedure BootProc(x : byte); Trap;
begin
  bb:= x;
end;

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}
begin
// Inits
//   HxOK              [@PORTB, 7 ] : bit;
  //PIN0CTRLF := %00000000; // pullup und INVERT
  DDRB.7:= 1;  // 0=EINGANG  1=Ausgang
//Reset Input Taste
  PIN3CTRLE := %01011000; // pullup und INVERT
  DDRE.3:= 0;  // 0=EINGANG  1=Ausgang
//Run Stop Schalter
  PIN0CTRLR := %01011000; // pullup und INVERT
  DDRR.0:= 0;  // 0=EINGANG  1=Ausgang
//ServTaste
  PIN1CTRLR := %01011000; // pullup und INVERT
  DDRR.1:= 0;  // 0=EINGANG  1=Ausgang

mDelay(500);

// Starte Applikation wenn keine ServTaste gedrückt oder EEPROM auf 00
  if not(HxIN_SERVTAST) AND (EEprom[EEpromEnd] = $00)  then
    // if a Download failed or the app was never programmed then there is no $00
    // if the main app forces a download then the last byte in the EEprom must be $FF
    //
    Application_Startup;
  endif;

  EnableInts($87);
  SysLEDflashAllOn;
  loop
    FlashDownLoader;
    // Downloader does an exit to the main app if
    // a valid main has been downloaded
  endloop;

end XMEGAUSB_BOOT.


Gruss
Thorsten
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

Re: XMega BootApp

 · 
Posted: 20.02.2015 - 08:39  ·  #3
Hallo Thorsten,

danke für die Antwort, ich habe die Zeile aus der BootApp. Mein Ziel ist es das Programm dann über eine serielle Schnittstelle zu laden/ändern.
Ich werde mir mal dein Beispiel angucken, mal sehen was ich davon lernen kann.
Da ich aber keine USB Schnittstelle habe, werde ich damit bestimmt nicht weit kommen.

Hat jemand Erfahrungen mit der Verfahrensweise wie sie in dem Beispiel im Verzeichnis
[XMega_BootApp] beschrieben ist?

Viele Grüße
Torsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega BootApp

 · 
Posted: 20.02.2015 - 09:28  ·  #4
Quote by Torsten

Hallo Torsten,

danke für die Antwort, ich habe die Zeile aus der BootApp. Mein Ziel ist es das Programm dann über eine serielle Schnittstelle zu laden/ändern.
Ich werde mir mal dein Beispiel angucken, mal sehen was ich davon lernen kann.
Da ich aber keine USB Schnittstelle habe, werde ich damit bestimmt nicht weit kommen.

Hat jemand Erfahrungen mit der Verfahrensweise wie sie in dem Beispiel im Verzeichnis
[XMega_BootApp] beschrieben ist?

Viele Grüße
Torsten


Hallo Thorsten,

hmm... bei mir gibt es diese Zeile nicht, bei dem DEMO-Verzeichnis gibt es 2 Projektfiles
XMEGA_BootAppS und XMEGA_MainAppS.

Das "S" steht für Seriell das gleiche gibt es auch mit "U" für USB.

Im Prinzip laufen beide nach dem selben System, mit der Programmzeile:
EEprom[EEpromEnd]:= $ff;
schreibt die MainApp am Ende des EEProm Bereiches $FF und bootet danach den XMEGA mit HardwareReset.

Dann springt der XMEGA in den Booloader-Bereich und prüft mit:
Code
  if EEprom[EEpromEnd] = $00 then
    // if a Download failed or the app was never programmed then there is no $00
    // if the main app forces a download then the last byte in the EEprom must be $FF
    //
    Application_Startup;
  endif;


Ob da bereits '00', steht (gültige Applikation über Bootloader geladen), dann wird die MainApp gestartet mit "Application_Startup".

Steht dort aber ein $FF von der "MainApp wurde in BootLoader angefordert" oder bei einem neuen XMEGA dann läuft der Bootloader-Modus ab.

Ich kann mir nur vorstellen, das Du eine Alte-Version oder Datei hast, was für eine Compiler-Version nutzt Du?

Ich kenne den kompletten Code nicht, aber für mich sieht das nach dem Vorgänger aus, hier wird auch eine Kennung gesetzt bzw. abgefragt, da BootEntry (Start der Boot-Section) -2 (also Sprich das letzte WORD der Application Table Section)

Ich denke das kann man Bedenkenlos auf die Funktion aus dem neueren Code umändern und die letzte Speicherstelle des EEPROMs nutzen.

Gruß
Thorsten
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

Re: XMega BootApp

 · 
Posted: 20.02.2015 - 16:08  ·  #5
Hallo Thorsten,

vielen Dank, ich probiere es aus.
Ich nehme die aktuelle Version des Compilers, das Beispiel mit dem ich gestartet bin ist aus der Installation, DEMO-Verzeichnis. Na, kein Problem - ich werde es am Wochenende mal probieren.

Viele Grüße
Torsten
Torsten
Benutzer
Avatar
Gender:
Location: Bad Doberan
Age: 59
Posts: 62
Registered: 11 / 2005
Subject:

Re: XMega BootApp

 · 
Posted: 24.02.2015 - 10:55  ·  #6
Hallo Thorsten,

ich habe heute mal den Bootloader in der seriellen Version probiert, alles okay.
Danke für die Hinweise.

Viele Grüße
Torsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega BootApp

 · 
Posted: 24.02.2015 - 11:41  ·  #7
Hallo Torsten,

freut mich, hatte am Anfang mit dem Bootloader auch meine Probleme :)

Gruß
Thorsten
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   126   140 · Page-Gen-Time: 0.027926s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI