Windows script to make an exact copy of AVR (Arduino) firmware including the bootloader, user program, fuses and EEPROM.
Things used in this project
Hardware components: Atmel ATmega328P-PU |
Story
Overview
This project addresses a simple need: duplicate a working AVR (Arduino) microcontroller firmware: including bootloader, user programming, eeprom, and fuses. You can create one copy or as many as you want. If you have an AVR-ISP device, you essentially have a chip copy machine. While we think about using the ISP for downloading (burning/flashing) the uC, the hardware interface is also capable of reading the information.
Caveat:You must have access to an AVR-ISP programmer.
I personally use an old UNO running ArduinoISP and a ZIF shield from Adafruit: http://www.adafruit.com/products/462 but one could also use something like:
http://www.adafruit.com/products/46http://store.atmel.com/PartDetail.aspx?q=p:10500054#tc:descriptionhttps://www.sparkfun.com/products/9825
DUPE.CMD — Windows Read & Copy (XP, Vista tested)
DUPE.CMD — Windows Read & Copy (XP, Vista tested)
REM
prompt $G
ECHO OFF
CLS
ECHO.
ECHO BATCH COPY ATMEGA328P-PU VIA ARDUINO-ISP ON com4
CD C:\Program Files\Arduino_105\hardware\tools\avr\bin
ECHO ENSURE MASTER CHIP IS IN THE READER
ECHO CTRL+C to abort OR PRESS Any key to begin copy...
ECHO.
pause >nul
ECHO Creating hexadecimal binary files of ATmel328P contents...
>stdout.log 2>&1 (
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U flash:r:%temp%\backup_flash.hex:i
ECHO flash has been sAVED to backup_flash.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U eeprom:r:%temp%\backup_eeprom.hex:i
ECHO eeprom has been SAVED to backup_eerpom.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U hfuse:r:%temp%\backup_hfuse.hex:i
ECHO hfuse has been SAVED to backup_hfuse.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U lfuse:r:%temp%\backup_lfuse.hex:i
ECHO lfuse has been SAVED to backup_lfuse.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U efuse:r:%temp%\backup_efuse.hex:i
ECHO efuse has been SAVED to backup_efuse.hex
)
ECHO Hexadecimal files created.
ECHO.
CD C:\Program Files\Arduino_105\hardware\tools\avr\bin
ECHO INSERT THE NEW CHIP now!
ECHO PRESS Any key to write new chip...
pause >nul
REM Note that the path cannot contain the drive letter "C:" so you cannot use %temp% as previously
REM Reference:http://savannah.nongnu.org/bugs/index.php Bug report #39230
REM.
>>stdout.log 2>&1 (
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U flash:w:\Users\owner\AppData\Local\Temp\backup_flash.hex
ECHO backup_flash.hex WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U eeprom:w:\Users\owner\AppData\Local\Temp\backup_eeprom.hex
ECHO backup_eeprom.hex WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U hfuse:w:\Users\owner\AppData\Local\Temp\backup_hfuse.hex
ECHO hfuse WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U lfuse:w:\Users\owner\AppData\Local\Temp\backup_lfuse.hex
ECHO lfuse WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U efuse:w:\Users\owner\AppData\Local\Temp\backup_efuse.hex
ECHO efuse WRITTEN ... this may change from 05 to 07 with BOD being disabled by AVRDUDE
)
ECHO.
ECHO Chip duplication and verification is complete.
ECHO Starting Notepad editor to display log file.
start notepad C:\Program Files\Arduino_105\hardware\tools\avr\bin\stdout.log
ECHO.
ECHO Press Any key to close this window...
pause >nul
ANOTHER.CMD — Multiple copies (Run ONLY after DUPE.CMD)
ANOTHER.CMD — Multiple copies (Run ONLY after DUPE.CMD)
REM Execute this for 2nd throgh n copies IMMEDIATELY after 1st copy
PROMPT $G
ECHO OFF
CLS
CD C:\Program Files\Arduino_105\hardware\tools\avr\bin
ECHO INSERT THE NEW CHIP INTO ARDUINO ISP PROGRAMMER
ECHO PRESS Any key to write new chip (CTRL+C to abort)
ECHO ...
PAUSE >nul
REM Paste 328: Note that the path cannot contain the drive letter "C:" so you cannot use %temp% as previously
REM Reference:http://savannah.nongnu.org/bugs/index.php Bug report #39230
REM.
>stdout.log 2>&1 (
DIR %temp%\*.hex
ECHO ATmel328P-PU duplication is beginning now...
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U flash:w:\Users\owner\AppData\Local\Temp\backup_flash.hex
ECHO flash WRITTEN
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U eeprom:w:\Users\owner\AppData\Local\Temp\backup_eeprom.hex
ECHO eeprom WRITTEN
REM high_fuses=0xDA
REM REM avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U hfuse:w:0xDA:m
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U hfuse:w:\Users\owner\AppData\Local\Temp\backup_hfuse.hex
ECHO hfuse WRITTEN
REM low_fuses=0xE2
REM avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U lfuse:w:0xE2:m
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U lfuse:w:\Users\owner\AppData\Local\Temp\backup_lfuse.hex
ECHO lfuse WRITTEN
REM extended_fuses=0x05
REM avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U efuse:w:0x05:m
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U efuse:w:\Users\owner\AppData\Local\Temp\backup_efuse.hex
ECHO efuse WRITTEN
)
REM.
REM Chip duplication is complete... starting display of log file.
start notepad C:\Program Files\Arduino_105\hardware\tools\avr\bin\stdout.log
ECHO.
ECHO Press Any key to close this window...
PAUSE >nul
Example of batch commands for AVRDUDE running under Windows
Examples are all relative to the contents of my %temp% variable — remember to change for your specific environment!
To Read and create a disk file image:
- flash
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U flash:r:%temp%\backup_flash.bin:r
- eeprom
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U eeprom:r:%temp%\backup_eeprom.bin:r
- hfuse
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U hfuse:r:%temp%\backup_hfuse.bin:r
- lfuse
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U lfuse:r:%temp%\backup_lfuse.bin:r
- efuse
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U efuse:r:%temp%\backup_efuse.bin:r
To Write a disk file image into the ATmega328 microcontroller (no line breaks):
- flash
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U flash:w:\Users\owner\AppData\Local\Temp\backup_flash.bin
- eeprom
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U eeprom:w:\Users\owner\AppData\Local\Temp\backup_eeprom.bin
- hfuse
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U hfuse:w:\Users\owner\AppData\Local\Temp\backup_hfuse.bin
- lfuse
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U lfuse:w:\Users\owner\AppData\Local\Temp\backup_lfuse.bin
- efuse
avrdude -c arduino -P com9 -p ATMEGA328P -b 19200 -U efuse:w:\Users\owner\AppData\Local\Temp\backup_efuse.bin
There are no line-breaks in the commands above, the Hackster editor does the line wrapping automatically!>
Issues & Notes
I am only describing how to clone the ATmega328P-PU which is used in the Arduino UNO. The process lends itself to any Arduino microcontroller but the exact parameters for the commands will vary. You will need to do research for other processors and other ISP programmers other than the ArduinoISP running on UNO with the Adafruit shield.
Other things you MUST know prior to being successful:
- The USB/Serial communications port for your AVR-ISP burner, generally denoted as comX
- The AVR device name for the Atmel microcontroller, the UNO uses ATMEGA328P
- The exact location where you intend on writing the temporary image files, I used %temp%
- The exact location where you intend on reading the temporary image files… without drive letter
So, let’s get started with the explanation of how this all works!
Software:Software? If you have the Arduino environment on your PC, the software AVRDUDE is already loaded! If you need software, then download and install from this link: http://arduino.cc/en/Main/SoftwareExamples of how the AVRDUDE software can be used from a command line is located here:
http://www.nongnu.org/avrdude/user-manual/avrdude_6.html
Batch file (script):You will need to either type the commands below in a command window under your OS to read a working Arduino microcontroller flash, eeprom, and fuses. The commands create Intel HEX files which represent the exact information contained in the Arduino 328 microcontroller (UNO example.)
Within Windows, the user’s temporary files location is denoted by an environmental variable automatically set and named %temp% and this resolves to a long path (for grins, type this in a command window: echo %temp% and press the ENTER key.) In my case on my particular PC running Vista, the %temp% is equivalent to: C:\Users\owner\AppData\Local\Temp but your path will likely be very different. Now is a good time to open the command prompt (Start / Run… / CMD and press Enter) … on Win8 you can go through the help system to get a run command line, then type CMD to open the environment. Other OS provide the feature, but you will need to research of non-Windows.
There is a BUG (or if not a bug an very annoying feature) of AVRDUDE that allows the reading path to have the «C:» drive in the path variable but the writing path must exclude the «C:». So, while you can use %temp% for creating the binary files, you must type the path without the C: for the write process. OR, if you are a super DOS freak, you know you can create your own parameter to pass… I will not explain all of this here because I wish to keep this write-up simple..
Here is a link and sample batch file that will give you an idea of how to construct a proper path without the drive letter so that you can completely mechanize the record & write processes without having to hard-code the path:
http://stackoverflow.com/questions/636381/what-is-the-best-way-to-do-a-substring-in-a-batch-file
Sample preamble to create a path without the leading drive letter:
echo OFF
echo.
set tempdir=%TMP%
echo Temporary Directory= %tempdir%
REM echo Modified Path= %tempdir:~2%
set newpath=%tempdir:~2%
echo Temporary Directory= %newpath%
You can use this procedure to quickly create chips with a bootloader and the program and the correct fuse settings and use that chip on a breadboard. And while you cannot de-compile to source code from an Arduino, you could certainly copy whatever program and data is contained in a working UNO microcontroller and insert the chip into another UNO (official or clone) board. Otherwise, it is just fun to know that you can duplicate all aspects of the software environment.
Warning: some non-official «Arduino» boards may come with the lock-bit set in the chip in which case you will NOT be able to copy the flash program. See: http://support.atmel.no/bin/customer.exe?action=viewKbEntry&id=394
— Ray
Code
windows_read___copy__xp__vista_tested_.
Plain text
REM
prompt $G
ECHO OFF
CLS
ECHO.
ECHO BATCH COPY ATMEGA328P-PU VIA ARDUINO-ISP ON com4
CD C:\Program Files\Arduino_105\hardware\tools\avr\bin
ECHO ENSURE MASTER CHIP IS IN THE READER
ECHO CTRL+C to abort OR PRESS Any key to begin copy...
ECHO.
pause >nul
ECHO Creating hexadecimal binary files of ATmel328P contents...
>stdout.log 2>&1 (
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U flash:r:%temp%\backup_flash.hex:i
ECHO flash has been sAVED to backup_flash.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U eeprom:r:%temp%\backup_eeprom.hex:i
ECHO eeprom has been SAVED to backup_eerpom.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U hfuse:r:%temp%\backup_hfuse.hex:i
ECHO hfuse has been SAVED to backup_hfuse.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U lfuse:r:%temp%\backup_lfuse.hex:i
ECHO lfuse has been SAVED to backup_lfuse.hex
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U efuse:r:%temp%\backup_efuse.hex:i
ECHO efuse has been SAVED to backup_efuse.hex
)
ECHO Hexadecimal files created.
ECHO.
CD C:\Program Files\Arduino_105\hardware\tools\avr\bin
ECHO INSERT THE NEW CHIP now!
ECHO PRESS Any key to write new chip...
pause >nul
REM Note that the path cannot contain the drive letter "C:" so you cannot use %temp% as previously
REM Reference:http://savannah.nongnu.org/bugs/index.php Bug report #39230
REM.
>>stdout.log 2>&1 (
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U flash:w:\Users\owner\AppData\Local\Temp\backup_flash.hex
ECHO backup_flash.hex WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U eeprom:w:\Users\owner\AppData\Local\Temp\backup_eeprom.hex
ECHO backup_eeprom.hex WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U hfuse:w:\Users\owner\AppData\Local\Temp\backup_hfuse.hex
ECHO hfuse WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U lfuse:w:\Users\owner\AppData\Local\Temp\backup_lfuse.hex
ECHO lfuse WRITTEN
avrdude -c arduino -P com4 -p ATMEGA328P -b 19200 -U efuse:w:\Users\owner\AppData\Local\Temp\backup_efuse.hex
ECHO efuse WRITTEN ... this may change from 05 to 07 with BOD being disabled by AVRDUDE
)
ECHO.
ECHO Chip duplication and verification is complete.
ECHO Starting Notepad editor to display log file.
start notepad C:\Program Files\Arduino_105\hardware\tools\avr\bin\stdout.log
ECHO.
ECHO Press Any key to close this window...
pause >nul