Petit retour sur le dump d’EEprom sur Arduino Uno car vider l’eeprom de son Atmel ATmega328p n’est pas si simple.
L’Eeprom est une mémoire non volatile qui peut être lue et écrit depuis son petit programme Arduino. un genre de disque dur.
Prenons le programme suivant qui écrit HELLO au début de l’eeprom.
#include <EEPROM.h>
void setup()
{
EEPROM.write(0,'H');
EEPROM.write(1,'E');
EEPROM.write(2,'L');
EEPROM.write(3,'L');
EEPROM.write(4,'O');
}
void loop() {
}
Si on se rappelle de https://thanat0s.trollprod.org/2014/01/dumper-un-arduino ils semble que l’on puisse utiliser ce vieux tutorial pour dumper l’eeprom au lieu de la flash.
Avec Avrdude, J’utilise la command -D -Ueeprom:r:/tmp/eeprom.hex:r
D pour dump, U pour la dire quoi.. ici l’Eeprom directement au format binaire ( :r pour raw) .
$ ./avrdude -carduino -P/dev/cu.usbmodem14101 -b115200 -p atmega328p -v -C /Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -D -Ueeprom:r:/tmp/eeprom.hex:r
avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
User configuration file is "/Users/thanat0s/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/cu.usbmodem14101
Using Programmer : arduino
Overriding Baud Rate : 115200
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : Arduino
Description : Arduino
Hardware Version: 3
Firmware Version: 4.4
Vtarget : 0.3 V
Varef : 0.3 V
Oscillator : 28.800 kHz
SCK period : 3.3 us
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: reading eeprom memory:
Reading | ################################################## | 100% 2.10s
avrdude: writing output file "/tmp/eeprom.hex"
avrdude: safemode: lfuse reads as 0
avrdude: safemode: hfuse reads as 0
avrdude: safemode: efuse reads as 0
avrdude: safemode: Fuses OK (E:00, H:00, L:00)
avrdude done. Thank you.
En plus tout se passe bien, la taille est bonne, MAIS le problème c’est que le dump au final est fort étrange… Il est ou le HELLO ?? c’est quoi ce fatra ??
$ hexdump -C /tmp/eeprom.hex | head 00000000 0c 94 34 00 0c 94 46 00 0c 94 46 00 0c 94 46 00 |..4...F...F...F.| 00000010 0c 94 46 00 0c 94 46 00 0c 94 46 00 0c 94 46 00 |..F...F...F...F.| * 00000040 0c 94 4a 00 0c 94 46 00 0c 94 46 00 0c 94 46 00 |..J...F...F...F.| 00000050 0c 94 46 00 0c 94 46 00 0c 94 46 00 0c 94 46 00 |..F...F...F...F.| 00000060 0c 94 46 00 0c 94 46 00 11 24 1f be cf ef d8 e0 |..F...F..$......| 00000070 de bf cd bf 21 e0 a0 e0 b1 e0 01 c0 1d 92 a9 30 |....!..........0| 00000080 b2 07 e1 f7 0e 94 94 00 0c 94 05 01 0c 94 00 00 |................| 00000090 0c 94 f7 00 1f 92 0f 92 0f b6 0f 92 11 24 2f 93 |.............$/.| 000000a0 3f 93 8f 93 9f 93 af 93 bf 93 80 91 05 01 90 91 |?...............|
On se rend vite compte que le Bitonio nous prends pour un lapin. En fait, si on utilise son Arduino Uno directement via USB pour dumper l’Eeprom du microcontrolleur Atmel, on se rend vite compte que l’eeprom n’est pas accessible et que on n’as pas vraiment accès a tout ce que l’on croit. En place de l’eeprom avec la bonne commande pour eeprom sous avrdude, il dump toujours la flash !
Impossible de lui dumper l’eeprom. Ce qu’il faut comprendre c’est que la partie “flashing” du Arduino quand on passe par la carte Arduino Uno est controlée par un genre de bios. le BootLoader. Ce bootloader ( voir ici : https://github.com/Optiboot/optiboot ) nommé optiboot, s’occupe de la gestion du flash et est posé a la fin de l’espace mémoire de la flash du microcontrolleur.
C’est lui qui entre autre au reboot regarde si il voit arriver des commandes série pour flasher. Pour le détail de sa vie et son oeuvre c’est ici : ( https://github.com/Optiboot/optiboot/wiki/HowOptibootWorks ) Pour des raisons variée dont une est l’espace utilisé, tout n’est pas implémenté, il est impossible de dumper ou flasher l’eeprom via un Arduino Uno.
C’est documenté dans le code :)
/* Write memory, length is big endian and is in bytes */
else if(ch == STK_PROG_PAGE) {
7ec4: 80 e0 ldi r24, 0x00 ; 0
7ec6: e6 cf rjmp .-52 ; 0x7e94 <main+0x90>
// PROGRAM PAGE - we support flash programming only, not EEPROM
uint8_t desttype;
uint8_t *bufPtr;
pagelen_t savelength;
Il faut donc pour dumper sereinement l’Eeprom du atmel avoir un vrai programmeur qui va parler au Atmel directement via le protocol SPI ( Serial Peripheral Interface ), un protocole de communication qui nécessite 4 fils ( MISO, MOSI, CLOCK et CS ) . Si vous voulez sombrer dans le détail c’est ici (https://fr.wikipedia.org/wiki/Serial_Peripheral_Interface).
Plusieurs options s’offrent alors a vous pour voir l’Eeprom, utiliser un montage de deux arduino pour avoir un programmeur SPI, ce montage s’appelle ArduinoISP voir ici voir https://www.arduino.cc/en/Tutorial/ArduinoISP. Acheter un vrai programmeur, ou utiliser un Buspirate qui fera aussi l’affaire.
Dump…
$ ./avrdude -c buspirate -P /dev/cu.usbserial-AK05UZS1 -p atmega328p -v -C /Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -D -Ueeprom:r:/tmp/eeprom.hex:r
avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch
System wide configuration file is "/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf"
User configuration file is "/Users/thanat0s/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : /dev/cu.usbserial-AK05UZS1
Using Programmer : buspirate
AVR Part : ATmega328P
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PC2
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 65 20 4 0 no 1024 4 0 3600 3600 0xff 0xff
flash 65 6 128 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
efuse 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
lock 0 0 0 0 no 1 0 0 4500 4500 0x00 0x00
calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Programmer Type : BusPirate
Description : The Bus Pirate
Attempting to initiate BusPirate binary mode...
BusPirate binmode version: 1
BusPirate SPI version: 1
avrdude: Paged flash write enabled.
AVR Extended Commands not found.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.08s
avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as FD
avrdude: reading eeprom memory:
Reading | ################################################## | 100% 32.76s
avrdude: writing output file "/tmp/eeprom.hex"
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as DA
avrdude: safemode: efuse reads as FD
avrdude: safemode: Fuses OK (E:FD, H:DA, L:FF)
BusPirate is back in the text mode
avrdude done. Thank you.
Et au final, victoire.
$ hexdump -C /tmp/eeprom.hex 00000000 48 45 4c 4c 4f ff ff ff ff ff ff ff ff ff ff ff |HELLO...........| 00000010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00000400