Bootloader mit Programmer laden...

  • 1
  • 2
  • Page 2 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Bootloader mit Programmer laden...

 · 
Posted: 06.08.2014 - 13:06  ·  #9
Quote by pvs-deck

Quote by rh

Hallo Thorsten,

die BootApp sollte (wenns geht) allein programmiert werden.
Beim ersten Start fordert die BootApp dann eine Applikation zum downloaden an.
Fuses werden und sollten nur in der BootApp programmiert werden.
Die meisten Fuses können nur auf 0 programmiert werden und nicht auf 1.
Das geht nur wenn ein komplettes Chip Erase durchgeführt wird.

rolf


Hallo Rolf,

ich habe jetzt mal etwas mit dem XMEGA_BootAppU rumgespielt und bekomme es nicht richtig zum laufen.

Sobald ich in die BootApp gehe, kommt nur noch die Info, dass das USB-Gerät nicht erkannt wird?
Pid 0 und Vid 0

Der USBSmart aus der MainApp läuft und wird erkannt, also ist die Hardware OK.

Gibt es mit der Demo noch Probleme unter dem XMEGA?
Und eigentlich müsste doch der "AvrCo Flash Downloader" nach dem einstellen der USB Schnittstelle laufen oder? Hier kommt immer Target not found, könnte aber mit dem Fehlverhalten des USBboot Flashloaders zu tun haben. Wenn Windows das Gerät nicht erkennt, kann wahrscheinlich auch der FlashLoader nicht funktionieren oder?

Hier mal der Code der BootApp:
Code
program PVS2014_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];
//  AutoRelease    = true; // or false – Release Target    // Wichtig für Programmierung über UPP !!
  AddApp     = 'D:\Data\PVS_AVR_CPU\PVS_AVRco\pvs2014';
               // 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            = 'PVS Thorsten Deck';       // max 31 bytes
//  USBprodName            = 'PVS2014-CPU';           // In der BootApp gibt es das nicht ??? Warum?
  USBpid                 = $1234;
  USBvid                 = $1234;
  USBprodRel             = 201;
  USBcurrent             = 200;
  USBvBUS                = PortA.7;                 // port and pin

  SysLEDblink = mSec500; {10..1000 msec}
  SysLedPort = @LEDram, $00; // byte-var, polarity

Implementation

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

{--------------------------------------------------------------}
{ Const Declarations }
const
// Bootapp und Mainapp muss das gleiche nutzen
  DownLoaderID : word   = $1234;           // important 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;
   
{--------------------------------------------------------------}
  // 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



  // optional a port pin can be checked for a forced download
  // if Pin.x = false then ...
  //  ...
  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;

  EnableInts($87);
  SysLEDflashOn( 0 ); // OKLED; // Zyklus LED starten
  
  loop
   HxOK:= NOT (LEDram.0); // Setzte OK LED zum flashen ...TEST
    FlashDownLoader;
    // Downloader does an exit to the main app if
    // a valid main has been downloaded
  endloop;
end PVS2014_BOOT.

Bis auf leichte Anpassung ist es fast der Original Code.

Gruß
pvs-deck


Hallo Rolf,
Hallo miparo,

leider funktioniert der USB-Bootloader trotz update immer noch nicht, gleiches Fehlerbild.
Wie ist hier der Stand?

Gruß
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Bootloader mit Programmer laden...

 · 
Posted: 07.08.2014 - 19:28  ·  #10
Hallo Thorsten,

was bedeutet "in die BootApp gehen"??

Bei den XMega USBs muss unbedingt ein Hardware RESET durchgeführt werden,
bevor man im Boot oder in der App fortfahren kann. Das geschieht hier immer
mit einem Hardware_Reset !!

Was nach einem solchen Reset passiert bestimmt dann das Flag in der letzten
EEprom Stelle. Voraussetzung dafür ist aber dass der RESET !immer! in das Boot
geht und dann dort entschieden wird ob ein Download erfolgen muss oder mit
der App weitergemacht werden kann.

Ich denke mal dass unser XMega sample hier alles aussagt.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Bootloader mit Programmer laden...

 · 
Posted: 08.08.2014 - 08:29  ·  #11
Quote by rh

Hallo Thorsten,

was bedeutet "in die BootApp gehen"??

Bei den XMega USBs muss unbedingt ein Hardware RESET durchgeführt werden,
bevor man im Boot oder in der App fortfahren kann. Das geschieht hier immer
mit einem Hardware_Reset !!

Was nach einem solchen Reset passiert bestimmt dann das Flag in der letzten
EEprom Stelle. Voraussetzung dafür ist aber dass der RESET !immer! in das Boot
geht und dann dort entschieden wird ob ein Download erfolgen muss oder mit
der App weitergemacht werden kann.

Ich denke mal dass unser XMega sample hier alles aussagt.

rolf

Hallo rolf,

das ist mir schon klar mit der EEPROM Speicherstelle, das ist ja auch ORIGINAL euer Code mit dem ich teste, ich habe lediglich ein paar Eingänge dazu gemacht um später über das betätigen eines Tasters (bei einem Hardware-Reset !!!) den Flash Vorgang zu starten.

Es macht aber KEINEN unterschied, ob ich das ORIGINAL-DEMO Programm von euch nutze oder dieses, der USB-Treiber läuft nicht! Die Hardware kann ausgeschlossen werden, da der USB-Smart im Hauptprogramm läuft und Windows das Gerät auch erkennt.

Ich habe mehrmals beide Teile von euch getestet am XMEGA256A3U, es kommt im BOOT-Mode immer unknown-Device PID 0x000 und VID 0x000.

Ich komme da nicht weiter, wenn ich mich nach dem DEMO-Programm von euch richte, geht es einfach nicht!
Und nun?

Aber wenn die Demo ja bei Dir läuft, dann mache mir doch einfach mal zum testen ein HEX-File für den Programmer fertig. Das kann ich ja dann mal testen, evtl. liegt es ja an meinen Compiler/PC.

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Bootloader mit Programmer laden...

 · 
Posted: 10.08.2014 - 20:32  ·  #12
Bug im XMega USB Boot mit TRAPs beseitigt.

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Bootloader mit Programmer laden...

 · 
Posted: 16.08.2014 - 12:00  ·  #13
Quote by rh

Bug im XMega USB Boot mit TRAPs beseitigt.

rolf


Hallo Rolf,

es geht zwar besser..aber nicht zuverlässig und immer :(

Es hat 2x funktioniert und 20x nicht (aktuell läuft es gar nicht mehr, original euer Code zum testen XMEGA_BootAppU), beim flashen mit den E-LAB Flash Downlaoder hängt es immer an der selben Stelle. Da das blinken der LED nicht mehr läuft (bleibt stehen) sieht es so aus, als ob sich da was aufgehängt hat!

Meldung siehe Bild.

Gruß
Thorsten
Attachments
BootProb
Filename: BootUSBProb.jpg
Filesize: 87.79 KB
Title: BootProb
Information: Flashen
Download counter: 128
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Bootloader mit Programmer laden...

 · 
Posted: 16.08.2014 - 16:11  ·  #14
Hallo Rolf,

ich verstehe das nicht. Nichts aber absolut nichts am BOOT-Code geändert, jetzt läuft es wieder den letzten 20 Versuchen!!!

Einziger Unterschied, ich habe vor Ratlosigkeit, vor dem FlashDownload ein Make+Optimize gemacht :(

Wenn dieser Absturz bei meinem Kunden passiert, bekommen diese die Steuerung ohne Programmer nicht mehr zum laufen. Irgend eine IDEE wie ich so ein Fehlverhalten ausschließen kann?

Gruß
Thorsten
  • 1
  • 2
  • Page 2 of 2
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: 16 · Cache Hits: 15   112   127 · Page-Gen-Time: 0.031607s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI