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