Dumper une EEprom d’Arduino, the hardest way.

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
This entry was posted in Electro and tagged , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

AlphaOmega Captcha Classica  –  Enter Security Code