Topic permanente di programmazione newbie

[quote author=Michele Menniti link=topic=95050.msg765334#msg765334 date=1334821244] Grazie a tutti e a fra poco. [/quote]

Tieni presente che con un micro protetto in lettura dovresti ottenere un file contenente tutti 0xff, a meno che AvrDude non preveda un errore specifico se il micro è protetto in lettura.

micro protetto con FC: lettura :00000001FF micro protetto con FE o non protetto (FF): lettura

:200000000C9461000C9473000C9473000C9473000C9473000C9473000C9473000C9473005A
:200020000C9473000C9473000C9473000C9473000C9473000C9473000C9473000C94730028
:200040000C948F000C9473000C9473000C9473000C9473000C9473000C9473000C947300EC
:200060000C9473000C94730000000000240027002A0000000000250028002B00000000006D
:20008000230026002900040404040404040402020202020203030303030301020408102071
:2000A0004080010204081020010204081020000000070002010000030406000000000000EB
:2000C000000011241FBECFEFD8E0DEBFCDBF11E0A0E0B1E001C01D92A930B107E1F70E94F2
:2000E000EA010C94F1010C9400008DE061E00E948C0108958DE061E00E94B00164E670E0CE
:2001000080E090E00E94FD008DE060E00E94B00164E670E080E090E00E94FD0008951F9219
:200120000F920FB60F9211242F933F938F939F93AF93BF938091040190910501A091060192
:20014000B0910701309108010196A11DB11D232F2D5F2D3720F02D570196A11DB11D2093BD
:2001600008018093040190930501A0930601B09307018091000190910101A0910201B09106
:2001800003010196A11DB11D8093000190930101A0930201B0930301BF91AF919F918F91A2
:2001A0003F912F910F900FBE0F901F9018959FB7F89420910001309101014091020150913C
:2001C000030186B5A89B06C08F3F21F02F5F3F4F4F4F5F4F9FBF542F432F322F2227280F5C
:2001E000311D411D511D82E0220F331F441F551F8A95D1F7B901CA010895EF92FF920F936C
:200200001F93CF93DF937B018C010E94D700EB010FC00E94D7006C1B7D0B83E0683E78070B
:2002200038F00894E108F10801091109C851DC4FE114F1040105110561F7DF91CF911F91D2
:200240000F91FF90EF900895789484B5826084BD84B5816084BD85B5826085BD85B5816017
:2002600085BDEEE6F0E0808181608083E1E8F0E01082808182608083808181608083E0E8F5
:20028000F0E0808181608083E1EBF0E0808184608083E0EBF0E0808181608083EAE7F0E004
:2002A0008081846080838081826080838081816080838081806880831092C10008958330EC
:2002C00071F0843028F48130A1F0823021F514C08630B1F08730D1F08430E9F404C08091DA
:2002E00080008F7703C0809180008F7D80938000089584B58F7702C084B58F7D84BD0895C4
:200300008091B0008F778093B00008958091B0008F7D8093B000089590E0FC01E656FF4F92
:200320002491FC01EA57FF4FE491EE23C1F0F0E0EE0FFF1FE859FF4F85919491DC0166232A
:2003400041F49FB7F8948C91209582238C939FBF08959FB7F8948C91822B8C939FBF08952F
:200360000F931F93DF93CF930F92CDB7DEB7282F30E0F901E255FF4F8491F901E656FF4F1C
:2003800014912A573F4FF90104910023E9F0882321F069830E945F016981E02FF0E0EE0FAE
:2003A000FF1FEE58FF4F85919491DC01662331F49FB7F8948C911095812304C09FB7F894D7
:2003C0008C91812B8C939FBF0F90CF91DF911F910F9108950E9424010E9475000E947A0081
:0603E000FDCFF894FFCFF1
:00000001FF

quindi la protezione in lettura FUNZIONA!!!. Resta il mistero della protezione in scrittura. Vorrei provare da AVRDUDE, se cambio "r" in "W" dovrebbe funzionare in scrittura, no? EDIT: sì, funziona, purtroppo, cioè quando devo scrivere scrivo e non gliene frega niente dei LB; se non avete idee o notizie da darmi non posso che fermarmi; a questo punto posso anche ritenermi soddisfatto, anche se non al 100%; almeno la protezione da lettura e quella dei fuse funziona bene.

[quote author=Michele Menniti link=topic=95050.msg765349#msg765349 date=1334822165] quindi la protezione in lettura FUNZIONA!!!. Resta il mistero della protezione in scrittura. Vorrei provare da AVRDUDE, se cambio "r" in "W" dovrebbe funzionare in scrittura, no? [/quote]

Si. Sostituendo :r con :w scrivi sulla flash. Esiste poi il parametro :v che permette di fare la verifica tra file.hex e flash.

Ciao QP

AriEdit: scrittura con :w e verifica con :v

C:\Documents and Settings\tgiovanni>C:\arduino-0023\hardware\tools\avr\bin\avrdu de.exe -C "C:\arduino-0023\hardware\tools\avr\etc\avrdude.conf" -p atmega328p - cstk500v1 -b 115200 -P com4 -Uflash:w:"C:\Lavoro-temp\flash.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude.exe: Device signature = 0x1e950f avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be perfo rmed To disable this feature, specify the -D option. avrdude.exe: erasing chip avrdude.exe: reading input file "C:\Lavoro-temp\flash.hex" avrdude.exe: writing flash (32748 bytes):

Writing | ################################################## | 100% 3.36s

avrdude.exe: 32748 bytes of flash written avrdude.exe: verifying flash memory against C:\Lavoro-temp\flash.hex: avrdude.exe: load data flash data from input file C:\Lavoro-temp\flash.hex: avrdude.exe: input file C:\Lavoro-temp\flash.hex contains 32748 bytes avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 4.64s

avrdude.exe: verifying ... avrdude.exe: 32748 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done. Thank you.


C:\Documents and Settings\tgiovanni>C:\arduino-0023\hardware\tools\avr\bin\avrdu de.exe -C "C:\arduino-0023\hardware\tools\avr\etc\avrdude.conf" -p atmega328p - cstk500v1 -b 115200 -P com4 -Uflash:v:"C:\Lavoro-temp\flash.hex":i

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude.exe: Device signature = 0x1e950f avrdude.exe: verifying flash memory against C:\Lavoro-temp\flash.hex: avrdude.exe: load data flash data from input file C:\Lavoro-temp\flash.hex: avrdude.exe: input file C:\Lavoro-temp\flash.hex contains 32748 bytes avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 4.64s

avrdude.exe: verifying ... avrdude.exe: 32748 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done. Thank you.

Grazie, nel frattempo avevo provato e aggiunto un EDIT.... :)

Occhio che avrdude prima cancella la flash (e forse i fuse)

avrdude.exe: Device signature = 0x1e950f
avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be perfo
rmed
To disable this feature, specify the -D option.
avrdude.exe: erasing chip

Prova ad inserire il parametro -D

Ciao
QP

[quote author=Michele Menniti link=topic=95050.msg765355#msg765355 date=1334822560] Grazie, nel frattempo avevo provato e aggiunto un EDIT.... :) [/quote]

La protezione in scrittura è intesa interna al micro, ovvero da software non puoi scrivere sulla flash, cosa normalmente possibile se non attivi il relativo l.b., stessa cosa da programmatore se prima non esegui un erase, che cancella anche i fuse,l.b. inclusi, quindi è normale che se non disabiliti l'erase da riga di comando di AvrDude il micro viene riprogrammato.

Scusate, ma non vi sto capendo, quindi ricomincio dalla mia necessità. Io voglio proteggere il micro dalla scrittura, un esempio, fornisco una scheda a tizio e voglio evitare che accidentalmente tizio la sovrascriva con un banale uploading; nello stesso tempo voglio proteggerne il contenuto (si fa per dire, in realtà è ciò che dovrò spiegare presentando lo strumento HV); quindi in HV imposto i LB su "FC" che significa protezione in scrittura e lettura. Fatto, ora cosa mi succede: NON riesco a leggere con AVRDUDE (bene!) RIESCO a scrivere con AVRDUDE (male!). Quindi a me NON interessa che mettendo il parametro -D non scriva, perché significa che volontariamente NON voglio scrivere, a me serve proteggere dall'incidente o dalla cattiva idea. Avevo capito che l'unico modo per "sproteggere" era il Chip_ERASE (che effettivamente riporta i LB a FF, libero), purtroppo lo stesso effetto me lo fa una banale operazione ISP o l'AVRDUDE da riga di comando. A questo punto posso solo fare un'ultima prova: mettere il micro con Bootloader su Arduino, protetto con FE o FC e vedere se almeno via seriale mi impedisce di scrivere :grin:

Il blink passa che è una bellezza, posso UFFICIALMENTE dire che la protezione da scrittura via LB è una emerita cag :grin:

Il punto è che avrdude, se non diversamente specificato con -D (Disable auto erase), esegue un chip-erase ed a quel punto hai un chip vergine sul quale puoi fare tutte le scritture che vuoi.

Ciao QP

QuercusPetraea: Il punto è che avrdude, se non diversamente specificato con -D (Disable auto erase), esegue un chip-erase ed a quel punto hai un chip vergine sul quale puoi fare tutte le scritture che vuoi.

Ciao QP

Questo è chiarissimo, la cag consiste nel fatto che ti indicano una via per proteggere un micro e poi l'unico strumento che ti mettono a disposizione per lavorarci lo sprotegge d'ufficio; cioè avrei capito se di default il -D fosse attivo, ma qui entra in ballo tutto un discorso che non vale la pena nemmeno di affrontare, tanto questa è :disappointed_relieved: Comunque almeno ora ho la certezza di non aver sbagliato nulla nella programmazione dei Lock Bits. Grazie per l'eccellente supporto, come sempre! XD

[quote author=Michele Menniti link=topic=95050.msg765378#msg765378 date=1334824242] Scusate, ma non vi sto capendo, quindi ricomincio dalla mia necessità. Io voglio proteggere il micro dalla scrittura, un esempio, fornisco una scheda a tizio e voglio evitare che accidentalmente tizio la sovrascriva con un banale uploading; [/quote]

La protezione per la scrittura è intesa solamente ed esclusivamente contro la scrittura della stessa da parte del firmware, non esiste nessun modo per impedire la scrittura da programmatore, ed è ovvio che sia così. Però Avrdude usato da Arduino non esegue un erase, la flash viene semplicemente riscritta dal bootloader senza nessuna cancellazione preventiva. La stringa di comando inviata dall'IDE è la seguente:

"..\arduino-1.0.1-rc2\hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\.\COM4 -b115200 -D -Uflash:w:C:\DOCUME~1\user\IMPOST~1\Temp\build5651456138611584630.tmp\BlinkWithoutDelay.cpp.hex:i"

Con tanto di parametro -D che inibisce l'uso dell'Erase.

Sicuro di aver fatto i test nel corretto modo ? Adesso non posso mettermi a fare prove, a pranzo ci provo io a caricare uno sketch tramite programmatore, avrisp MKII, settando la massima protezione della flash e vediamo cosa succede.

edit: dimenticavo, è possibile proteggere gli AVR contro la riprogrammazione hardware, basta bloccarla da fuse disabilitando la modalità ISP e Jtag, se presente, in questo modo è possibile riprogrammali solo passando per la modalità HV per poter resettare i fuse.

[quote author=Michele Menniti link=topic=95050.msg765391#msg765391 date=1334825060] Questo è chiarissimo, la cag consiste nel fatto che ti indicano una via per proteggere un micro e poi l'unico strumento che ti mettono a disposizione per lavorarci lo sprotegge d'ufficio; cioè avrei capito se di default il -D fosse attivo, ma qui entra in ballo tutto un discorso che non vale la pena nemmeno di affrontare, tanto questa è :disappointed_relieved: Comunque almeno ora ho la certezza di non aver sbagliato nulla nella programmazione dei Lock Bits. Grazie per l'eccellente supporto, come sempre! XD [/quote]

Il chip non viene sprotetto, nel senso che puoi accedere al codice, ma riportato ad una condizione di utilizzo senza sapere cosa c'era prima e nessuno ti può impedire di scriverci su ulteriormente. Diversamente (chip super protetto) se fosse impedito il chip-erase il micro lo dovresti buttare via e buona notte. Non credo che la protezione in scrittura sia intesa in questo modo.

Ciao QP

Una prima risposta alla questione l.b. si trova sul data sheet:

The user can select:
• To protect the entire Flash from a software update by the MCU.
• To protect only the Boot Loader Flash section from a software update by the MCU.
• To protect only the Application Flash section from a software update by the MCU.
• Allow software update in the entire Flash.

Si parla esclusivamente di protezione da riscrittura effettuata via software dalla MCU stessa, ovvero è esclusa la riscrittura da programmatore hardware che lavora tramite ISP, Jtag e HV. C'è da fare un paio di prove per la conferma però in linea di massima direi che se programmi tramite ISP puoi sempre riscrivere il micro indipendente dai l.b., e questo include pure lo spazio dove è allocato il boot loader, al contrario se cerchi di caricare un programma tramite bootloader con la protezione in scrittura attiva, p.e. dall'IDE di Arduino, questo non è possibile. Per proteggere contro la riprogrammazione tramite programmatore devi disabilitare i relativi fuse, però se fai questa operazione poi sei obbligato a ricorrere alla HV per ripristinare il micro.

@Mike: vuoi un sistema sicuro per poter non riscrivere su un chip? Te lo do io! Togli il bootloader e disattiva il pin di reset! In questo modo usando un normale ArduinoISP oppure un programmatorino ino ino come l'USBtinyISP l'utente non può più inviare nessuno sketch.

Se manca il bootloader, la programmazione seriale tramite bootloader non funziona perché il bootloader non c'è. Se hai disattivato il pin di reset, non puoi programmare il micro con la tecnica ISP perché la programmazione SPI sfrutta il pin di reset per dare l'avvio alla programmazione.

Hai solo la possibilità di un erase ad alta tensione (ecco che torna fuori il tuo programmatore HV) altrimenti non leggi (lock bit) e non scrivi (pin di reset).

Saluti e bacia, la fattura te la mando a fine mese XD

Nella descrizione della funzionalità dei LBx indica le tre possibili impostazioni:

1) No memory lock features enabled.

2) Further programming of the Flash and EEPROM is disabled in
Parallel and Serial Programming mode. The Fuse bits are
locked in both Serial and Parallel Programming mode.

3) Further programming and verification of the Flash and EEPROM
is disabled in Parallel and Serial Programming mode. The Boot
Lock bits and Fuse bits are locked in both Serial and Parallel
Programming mode.

Da questa descrizione io capisco che si riferisce alla programmazione parallela e seriale (intesa come ISP/SPI), ma (suppongo) possa ancora funzionare tramite bootloader che utilizza l'istruzione SPM (Store Program Memory) per caricare i programmi sulla Application Section della flash. Se così fosse, bisogna agire sui fuse BLBxx per inibire, secondo le modalità indicate sul datasheet, la scrittura sulla flash memory.

Ciao QP

ma disabilitare SPIEN no?

BrainBooster: ma disabilitare SPIEN no?

SPIEN disattiva la programmazione SPI ma non la programmazione interna, quindi se c'è un bootloader in ascolto sulla seriale puoi riflashare il micro, giusto? Fare come ho detto io un paio di post più sopra (disattivare reset e togliere il bootloader) ti mette al riparo da qualsiasi tentativo.

leo72: [SPIEN disattiva la programmazione SPI ma non la programmazione interna, quindi se c'è un bootloader in ascolto sulla seriale puoi riflashare il micro, giusto?

Se è attiva la protezione in scrittura della flash tramite l.b. il bootloader non può riprogrammare il micro, avevo già fatto presente che per bloccare la riprogrammazione SPI o Jtag è necessario disabilitare i relativi fuse, dopo di che solo tramite HV è possibile riprogrammare il micro.

astrobeed:

leo72: [SPIEN disattiva la programmazione SPI ma non la programmazione interna, quindi se c'è un bootloader in ascolto sulla seriale puoi riflashare il micro, giusto?

Se è attiva la protezione in scrittura della flash tramite l.b. il bootloader non può riprogrammare il micro, avevo già fatto presente che per bloccare la riprogrammazione SPI o Jtag è necessario disabilitare i relativi fuse, dopo di che solo tramite HV è possibile riprogrammare il micro.

Bene, quindi di protezioni a questo punto Mike ne ha un bel po' a sua disposizione: - fuse SPIEN anti programmazione SPI - fuse RSTDISBL anti pin reset - lock bit anti scrittura bootloader (BLB0 e BLB1)

@ QP: io non voglio disabilitare il chip_erase, solo che non sia attivo in condizioni normali; cioè l’utente non dovrebbe poter fare una normale operazione di scrittura con successo, se ho attivato la protezione. Prendo atto che non è possibile.

@ Astro: ma un firmware all’interno di un micro è capace di gestire una autoscrittura nella flash? mi torna utile questa info per l’articolo, se me la confermi :slight_smile:

@ Leo e BB: considerando che parlerò di stand-alone il problema bootloader non me lo pongo proprio, quindi la disabilitazione reset non mi serve; invece ok per la disabilitazione SPI, provata, l’effetto è che il micro non è sovrascrivibile via ISP(bene!) ma non è più neanche leggibile (male!) nemmeno se lascio i lock bits a FF; infatti mi dà errore di signature. Con la scusa ho capito cosa è successo a quei 2-3 chip che ho immolato per la progettazione dell’HV, a forza di sparargli botte da 12V (parlo di centinaia di volte…) devo aver danneggiato il circuito del pin reset di questi micro, e quindi è come se fosse disabilitato, perché ho provato la disabilitazione del reset e l’effetto è lo stesso: invalid device signature (quindi sia se disabilito il reset che se disabilito lo SPI).
Conclusioni, la procedura:
impostazione fuse per no SPI
lockbits su FE o FC
protegge il micro da lettura e scrittura

la procedura:
lockbits su FC protegge il micro dalla sola lettura
non c’è modo di proteggere il micro da scrittura e lasciarlo libero in lettura (condizione FE), ma comunque direi di avere una soluzione per tutto, questa particolare opzione non ha significato per me.
Naturalmente ho provato sia da IDE che da riga di comando, identici comportamenti.Grazie!