Modificare firmware 16U2 dell'Arduino Uno per eliminare l'autoreset

Stavo ca@@eggiando sulle pagine della DUE e ad un certo punto leggo questo:

The Programming port is connected to an ATmega16U2, which provides a virtual COM port to software on a connected computer (To recognize the device, Windows machines will need a .inf file, but OSX and Linux machines will recognize the board as a COM port automatically.). The 16U2 is also connected to the SAM3X hardware UART. Serial on pins RX0 and TX0 provides Serial-to-USB communication for programming the board through the ATmega16U2 microcontroller. The Arduino software includes a serial monitor which allows simple textual data to be sent to and from the board. The RX and TX LEDs on the board will flash when data is being transmitted via the ATmega16U2 chip and USB connection to the computer (but not for serial communication on pins 0 and 1).

e poi questo:

Programming port: To use this port, select "Arduino Due (Programming Port)" as your board in the Arduino IDE. Connect the Due's programming port (the one closest to the DC power jack) to your computer. The programming port uses the 16U2 as a USB-to-serial chip connected to the first UART of the SAM3X (RX0 and TX0). The 16U2 has two pins connected to the Reset and Erase pins of the SAM3X. Opening and closing the Programming port connected at 1200bps triggers a “hard erase” procedure of the SAM3X chip, activating the Erase and Reset pins on the SAM3X before communicating with the UART. This is the recommended port for programming the Due. It is more reliable than the "soft erase" that occurs on the Native port, and it should work even if the main MCU has crashed.

quindi la domanda mi sorge spontanea. Posso mettere il firmware che si usa sulla DUE nel 16U2 dell'Arduino UNO R3 e ottenere lo stesso comportamento per la programmazione della Leonardo. Ovvero senza il reset del micro ogni volta che apro la seriale?

Non ho ancora controllato se i collegamenti tra il 16U2 delle DUE e quello della UNO R3 sia identici (Seriale e Reset), ma nel caso, ci sarebbero delle modifiche da fare al firmware prima di sostituirlo?

Poi bisognerà istruire anche l'IDE per trattare la programmazione della UNO come una Leonardo? Giusto?

@ArduinoTeam E' una modifica che farete sulla UNO R4?

UPDATE: E' stato creato da Astro un apposito bootloader --> http://arduino.cc/forum/index.php/topic,130621.msg982176.html#msg982176

Non mi sono messo a tradurre i tuoi quote :sweat_smile: ti dico quello che so: l'impulso di RESET all'apertura del serial monitor lo manda l'IDE tramite un segnale al convertitore USB-Seriale che gli fa semplicemente generare un DTR; la cosa l'ho scoperta quando ho fatto sperimentazione con l'MCP2200 che NON ha il DTR bensì l'RTS; in questo caso continuo ad avere le normali funzionalità di RESET ma quando apro il SM Arduino NON si resetta. L'IDE manda entrambi i DTR e RTS (ovviamente le istruzioni per farli eseguire al convertitore) quando deve resettare la scheda solo nel caso del SM invece manda DTR ma non RTS. In conclusione penso che agendo sul convertitore si possa disabilitare completamente il RESET, cosa peraltro facilmente fattibile interrompendo il jumper a saldare previsto o mettendo un C da 10µF tra 3,3V e RESET, ma non bloccare il comando proveniente dall'IDE SOLO nel caso del SM. Sono interessato alla discussione :)

Il firmware che gira sul 16U2 della Due non è per nulla compatibile con la Uno.. Quel processore fa una sequenza di Erase/Reset per riprogrammare la scheda che non sono quelli necessari alla Uno.

Per eliminare il reset basta tagliare la pista in mezzo ai due pad vicino a RESET_EN

Non è in programma una Uno R4 a questo punto.

m

[quote author=Massimo Banzi link=topic=129176.msg972379#msg972379 date=1351280393] Il firmware che gira sul 16U2 della Due non è per nulla compatibile con la Uno.. Quel processore fa una sequenza di Erase/Reset per riprogrammare la scheda che non sono quelli necessari alla Uno.

Per eliminare il reset basta tagliare la pista in mezzo ai due pad vicino a RESET_EN

Non è in programma una Uno R4 a questo punto.

m [/quote] La DUE non è di certo adatta ai principianti, volete dismettere la UNO che è il punto di partenza? =(

cece99: La DUE non è di certo adatta ai principianti, volete dismettere la UNO che è il punto di partenza? =(

Semplicemente la UNO verrà lasciata com'è, immagino senza più evoluzione.

[quote author=Massimo Banzi link=topic=129176.msg972379#msg972379 date=1351280393]
Il firmware che gira sul 16U2 della Due non è per nulla compatibile con la Uno… Quel processore fa una sequenza di Erase/Reset per riprogrammare la scheda che non sono quelli necessari alla Uno.[/quote]
Peccato.
Un sistema come quello della Leonardo, importato sulla UNO lo troverei più comodo che non tagliare la pista.

PaoloP: Un sistema come quello della Leonardo, importato sulla UNO lo troverei più comodo che non tagliare la pista.

Il sistema della Leonardo si basa sull'uso di una circuiteria interna al micro stesso. Attivando uno specifico fuse, si può fare in modo che all'apertura e chiusura della seriale il micro si autoresetti. In questo modo può partire il bootloader e scrivere l'eventuale nuovo firmware in arrivo. Sui 328 non c'è nulla di simile all'interno del microcontrollore.

Ok per la Leonardo. Ma lo stesso sistema è usato sulla DUE che usa il 16U2. Ecco perché pensavo che si potesse modificare il firmware per adattarlo alla UNO in modo che si potesse programmare come la Leonardo.

Vediamo se ho capito. Tu vorresti riscrivere il firmware del 16U2 della UNO per far sì che esso invii il segnale di reset all'Atmega328 solo in determinate condizioni, modificando opportunamente l'IDE.

leo72: Attivando uno specifico fuse, si può fare in modo che all'apertura e chiusura della seriale il micro si autoresetti. In questo modo può partire il bootloader e scrivere l'eventuale nuovo firmware in arrivo.

Non esiste nessun fuse del genere nei 8/16u2, esistono due fuse dedicati al reset, il primo è BOOTRST che consente di specificare se dopo un reset, hardware, il program counter parte dall'indirizzo 0 oppure dall'indirizzo in cui è posto il bootloader, dipende dalle dimensioni dell'area riservata (vedere relativa tabella sul datasheet). Il secondo fuse è HWBE e consente di utilizzare il pin PD7 del micro per scegliere se dopo un reset il program counter parte dall'indirizzo 0 oppure da quello in cui si trova il bootloader.

leo72: Vediamo se ho capito. Tu vorresti riscrivere il firmware del 16U2 della UNO per far sì che esso invii il segnale di reset all'Atmega328 solo in determinate condizioni, modificando opportunamente l'IDE.

Esatto. Anche se al momento non sono in grado di fare queste modifiche. Almeno credo. :roll_eyes:

astrobeed:

leo72: Attivando uno specifico fuse, si può fare in modo che all'apertura e chiusura della seriale il micro si autoresetti. In questo modo può partire il bootloader e scrivere l'eventuale nuovo firmware in arrivo.

Non esiste nessun fuse del genere nei 8/16u2, esistono due fuse dedicati al reset, il primo è BOOTRST che consente di specificare se dopo un reset, hardware, il program counter parte dall'indirizzo 0 oppure dall'indirizzo in cui è posto il bootloader, dipende dalle dimensioni dell'area riservata (vedere relativa tabella sul datasheet). Il secondo fuse è HWBE e consente di utilizzare il pin PD7 del micro per scegliere se dopo un reset il program counter parte dall'indirizzo 0 oppure da quello in cui si trova il bootloader.

Mi riferivo alla Leonardo, che ha il 32U4. Tempo fa ho indagato come funziona il reset ed è come ho descritto io.

la soluzione e' molto piu' semplice, e non capisco perche' l'ArduinoTeam non se ne faccia carico. Bisogna sistemare la RXTXSerial che e' vecchissima. Con la versione modificata che ho postato tempo fa non c'e' questo problema

Visto che questa .dll e' alla base delle comuniczioni arduiniche sarebbe buona cosa iniziare ad inserire quella modificata nell'IDE prossimo, e poi magari contribuire al suo sviluppo, ad esempio servirebbe un porting 64bit

Testato: la soluzione e' molto piu' semplice, e non capisco perche' l'ArduinoTeam non se ne faccia carico. Bisogna sistemare la RXTXSerial che e' vecchissima. Con la versione modificata che ho postato tempo fa non c'e' questo problema

Visto che questa .dll e' alla base delle comuniczioni arduiniche sarebbe buona cosa iniziare ad inserire quella modificata nell'IDE prossimo, e poi magari contribuire al suo sviluppo, ad esempio servirebbe un porting 64bit

Hai le modifiche che hai apportato? Non voglio l'eseguibile perché tu hai Windows ed io Linux.

leo72: Mi riferivo alla Leonardo, che ha il 32U4. Tempo fa ho indagato come funziona il reset ed è come ho descritto io.

Sto guardando adesso il datasheet e non vedo nessun fuse che fa quello che dici tu, per il reset ci sono solo i due BOOTRST e HWBE presenti nel 8/16u2.

27.5 Entering the Boot Loader Program
The bootloader can be executed with three different conditions:

27.5.1 Regular application conditions.
A jump or call from the application program. This may be initiated by a trigger such as a com-mand received via USART, SPI or USB. 

27.5.2 Boot Reset Fuse
The Boot Reset Fuse (BOOTRST) can be programmed so that the Reset Vector is pointing to
the Boot Flash start address after a reset. In this case, the Boot Loader is started after a reset.
After the application code is loaded, the program can start executing the application code. Note
that the fuses cannot be changed by the MCU itself. This means that once the Boot Reset Fuse

27.5.3 External Hardware conditions
The Hardware Boot Enable Fuse (HWBE) can be programmed (See Table 27-5) so that upon
special hardware conditions under reset, the bootloader execution is forced after reset.

Non parla di fuse speciali, parla di una ben precisa azione comandata da software in risposta ad un comando ricevuto da una periferica, oppure l'uso del pin reset eventualmente abbinato a PE2 per scegliere da dove far partire il program counter.

non le ho apportate io :) cerca ERIED, e' un utente cileno, ha fatto un capolavoro, non solo si risolve l'autoreset, ma anche i problemi con bluetooth. il tutto compatibile anche con processing.

Ho postato tutti i miei test nel topic bluetooth

@astrobeed: adesso non ricordo ma tempo fa ho studiato la cosa perché volevo replicare anch'io lo stesso modo di reset della Leonardo e pensavo che ci fosse qualcosa nel bootloader ma poi, guardandolo, non trovai nulla. Studiando il datasheet ho trovato invece che era una cosa a livello di microcontrollore.

@astro: ecco, qui ho spiegato come avviene la cosa: http://arduino.cc/forum/index.php/topic,121632.msg916326.html#msg916326 Non è un fuse, mi ero confuso, ma una R su un determinato pin.

leo72:
Non è un fuse, mi ero confuso, ma una R su un determinato pin.

Viene settato HWBE che consente di scegliere tramite lo stato logico presente su PE2, durante il reset è un input, se parte il programma utente oppure il bootloader, in pratica consente di avviare Leonardo senza passare per il bootloader se non è necessario.

Ho visto su Git che c'è il codice del 16U2 per la UNO (https://github.com/arduino/Arduino/tree/master/hardware/arduino/firmwares/atmegaxxu2), però non trovo quello della DUE (https://github.com/arduino/Arduino/tree/ide-1.5.x/hardware/arduino/sam) Manca la cartellina Firmware. Probabilmente la metteranno in seguito. =( Volevo verificare le differenze a livello di codice. :~