Forum: Mikrocontroller und Digitale Elektronik Arduino Due: Programmierung ohne 16U2


von Geri (Gast)


Lesenswert?

Hallo,

kann mir jemand bitte beim Verständnis der beiden USB-Ports des Arduino 
Due helfen? V.a geht es mir um die unterschiedlichen Methoden, wie der 
SAM-Chip in den Programmierbaren modus versetzt wird. Er muss ja 
gelöscht werden, bevor er programmiert werden kann. Dies geht entweder 
über die Pushbuttons, oder der 16U2 übernimmt das, oder, wenn der Native 
USB - Port verwendet wird - irgendwie softwareseitig - und genau da 
stehe ich an: Wie funktioniert das genau? Der Trick ist ja, dass der 
Programming port des SAM mit Baudrate 1200 geöffnet wird, um in den 
Programmiermodus zu gelangen. Aber wie funktioniert das genau? Wo finden 
diese Software-Tricks statt? Am Sam-Chip oder in der Arduino-IDE? Und 
weshalb ist diese Methode unsicherer als über die Serielle 16U2 - 
Methode? Kann der SAMBA-Bootloader im Flash des Sam-Chips dabei 
beschädigt werden? Ich glaube, ich hab da irgendetwas grundsätzliches 
nicht verstanden...

Danke für die Aufklärung!

von Silvio L. (otti20vt)


Lesenswert?

Alles micht so schlim wie du meinst :)

Kabel an den Programming Port und gut ist :)

Hast du das Due in der IDE Installiert?

von EGS (Gast)


Lesenswert?

Moinsen,

Also unter folgendem Link, bis zum Punkt "Communication runterscrollen 
und dort lesen was dort mit dem 16u gemacht wird (Seriell zu UART) und 
dass der andere Port für Funktionen wie z.B. HID Gerät genutzt werden 
kann und direkt auf den SAM32 geht.

https://www.arduino.cc/en/Main/ArduinoBoardDue

Seitdem die Seite von den Machern des Arduino zwischen USA und Rest der 
Welt unterscheidet gibt es anscheinend Probleme für manche die 
Informationen zu beschaffen...

Achso ist natürlich wie die meisten Elektronik-Seiten oder HAndbücher 
auf Englisch ;)

Gruß EGS

von STK500/Besityer (Gast)


Lesenswert?

Geri schrieb:
> Der Trick ist ja, dass der
> Programming port des SAM mit Baudrate 1200 geöffnet wird, um in den
> Programmiermodus zu gelangen. Aber wie funktioniert das genau? Wo finden
> diese Software-Tricks statt?
PC-seitig.
Wobei der 16U2 sich beim Programmingport darum kümmert.

> Am Sam-Chip oder in der Arduino-IDE? Und
> weshalb ist diese Methode unsicherer als über die Serielle 16U2 -
> Methode?
Ist sie nicht, nur etwas komplizierter.

> Kann der SAMBA-Bootloader im Flash des Sam-Chips dabei
> beschädigt werden? Ich glaube, ich hab da irgendetwas grundsätzliches
> nicht verstanden...
eigentlich nicht. Die User-Firmware kann vielleicht schaden nehmen, aber 
der Bootloader ist eh fest eingebrannt.

von Heinrich (Gast)


Lesenswert?

Hallo,

ich habe mich damit auch mal befasst wie das funktioniert. Das was ich 
da bisher rausgefunden habe ist folgendes:
Vorweg, ich benutz Mac OS. Wo die Pfade bei Windows oder Linux liegen, 
weiß ich leider nicht. Daher gebe ich hier nur die Pfade von der Mac IDE 
an.
Es gibt den Ordner 
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/system/CMSIS/De 
vice/ATMEL/sam3xa/source/gcc
Dort findest du die Datei startup_sam3xa.c und folgenden Codeausschnitt:
1
void Reset_Handler(void)
2
{
3
  uint32_t *pSrc, *pDest;
4
5
  /* Initialize the relocate segment */
6
  pSrc = &_etext;
7
  pDest = &_srelocate;
8
9
  if (pSrc != pDest) {
10
    for (; pDest < &_erelocate;) {
11
      *pDest++ = *pSrc++;
12
    }
13
  }
14
15
...
16
}
Dieser wird aufgerufen, wenn du den Controller startest. Dieser 
Codeausschnitt macht nichts anderes als Code von dem Flash in den RAM zu 
kopieren. Die Definitionen von _etext, _srelocate befinden sich im 
Linkerscript in sam3x_sram.ld und sam3x_flash.ld, welche sich ebenfalls 
in dem oben genannten Ordner befinden.

Nun ist er Arduino gestartet. Jetzt kann man sich mal das USB Subsystem 
anschauen. Dort gibt es folgendes. In der Datei
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/cores/arduino/U 
SB/CDC.cpp
Befindet sich die Funktion
1
bool WEAK CDC_Setup(Setup& setup)
2
{
3
  uint8_t r = setup.bRequest;
4
  uint8_t requestType = setup.bmRequestType;
5
...
6
7
  if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType)
8
  {
9
...
10
    if (CDC_SET_CONTROL_LINE_STATE == r)
11
    {
12
      _usbLineInfo.lineState = setup.wValueL;
13
      // auto-reset into the bootloader is triggered when the port, already
14
      // open at 1200 bps, is closed.
15
      if (1200 == _usbLineInfo.dwDTERate)
16
      {
17
        // We check DTR state to determine if host port is open (bit 0 of lineState).
18
        if ((_usbLineInfo.lineState & 0x01) == 0)
19
          initiateReset(250);
20
        else
21
          cancelReset();
22
      }
23
      return true;
24
    }
25
  }
26
  return false;
27
}
Wenn diese aufgerufen wird, kann ein Reset getriggert werden. Schau dir 
den Code einfach mal an. Der Reset wird nach 250 Ticks ausgeführt wobei 
1 Tick = 1ms sind. Folgende Datei führt den Reset aus:
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/cores/arduino/R 
eset.cpp
Dort findest du auch die erste Funktion die Mittels eines Pargmas in den 
RAM während des Startups geschoben wurde.
Die Funktion tickReset() in der Datei
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/cores/arduino/c 
ortex_handlers.c
zyklisch aufgerufen.

Ich hoffe, ich konnte damit ein wenig helfen.

MfG
Heinrich

von Geri (Gast)


Lesenswert?

Hallo Heinrich,

Vielen Dank, das klingt genau nach dem, was ich gesucht habe. Jetzt muss 
ich mich nur mal durch den Code arbeiten und melde mich dann wieder mit 
Fragen, die sicherlich auftauchen werden;-)


Heinrich schrieb:
> Ich hoffe, ich konnte damit ein wenig helfen.
>
> MfG
> Heinrich

von Kaj (Gast)


Angehängte Dateien:

Lesenswert?

STK500/Besityer schrieb:
> Wobei der 16U2 sich beim Programmingport darum kümmert.
Nein, tut er nicht. Wenn man den Due manuel (also ohne die Arduino IDE) 
mit hilfe von Bossac flashen will, muss man vorher händisch den port 
einmal mit 1200 baud öffnen. Mag sein, dass man den 16u2 mit einem 
Befehl dazu bringen kann, aber von alleine macht der da erstmal gar 
nichts.

Geri schrieb:
> Kann der SAMBA-Bootloader im Flash des Sam-Chips dabei
> beschädigt werden?
Nein. Der Bootloader ist in einem ROM-Bereich eingebrannt.

Weiteres findest du im Datenblatt, Seite 327, Kapitel 22:
SAM3X/A Boot Program

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