// Detect which type of boot loader is present, using a fixed built-in table | |
// 2012-03-06 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php | |
#include <avr/pgmspace.h> | |
#include <util/crc16.h> | |
#define VERSION "2" | |
// list of all known boot loaders with their unique signatures | |
struct { word crc; const char* desc; } signatures[] = { | |
0x489C, "Duemilanove", | |
0xF1A0, "Nanode (Duemilanove mod)", | |
0xFD70, "OptiBoot 4.4", | |
0, 0 | |
}; | |
static word CalculateChecksum (word addr, word size) { | |
word crc = ~0; | |
prog_uint8_t* p = (prog_uint8_t*) addr; | |
for (word i = 0; i < size; ++i) | |
crc = _crc16_update(crc, pgm_read_byte(p++)); | |
Serial.print(" CRC "); | |
Serial.print(size); | |
Serial.print("b @ 0x"); | |
Serial.print(addr, HEX); | |
Serial.print(" = "); | |
Serial.println(crc, HEX); | |
return crc; | |
} | |
static const char* IdentifyBootLoader (word addr, word size) { | |
word crc = CalculateChecksum(addr, size); | |
for (byte i = 0; signatures[i].desc != 0; ++i) | |
if (signatures[i].crc == crc) | |
return signatures[i].desc; | |
return 0; | |
} | |
void setup () { | |
Serial.begin(57600); | |
Serial.println("\n[bootCheck." VERSION "]"); | |
const char* message = IdentifyBootLoader(0x7800, 2048); | |
if (message == 0) | |
message = IdentifyBootLoader(0x7E00, 512); | |
if (message == 0) | |
message = "(UNKNOWN)"; | |
Serial.print("Boot loader: "); | |
Serial.println(message); | |
} | |
void loop () {} |
This comment has been minimized.
This comment has been minimized.
Thank you for this. I had to change line 19 because prog_uint8_t is deprecated (it is May 2015, and I'm using Arduino 1.6.1). So this is what I have now: |
This comment has been minimized.
This comment has been minimized.
BootCheck.ino: In function 'word CalculateChecksum(word, word)': This is when I want to upload it to my arduino uno. |
This comment has been minimized.
This comment has been minimized.
JCW, This no longer compiles in arduino environments (tested on Arduino 1.6.8), as the prog_uint8_t type is deprecated. The compiler gives the following error: Based on this discussion, I suggest adding |
This comment has been minimized.
This comment has been minimized.
Another Interesting tidbit: One Arduino Leonardo (from adafruit) says: while another (source unknown) says:
|
This comment has been minimized.
This comment has been minimized.
I'm pretty sure I uploaded OptiBoot 6.2 on one of my ATMega328P chips and got this: |
This comment has been minimized.
This comment has been minimized.
Ignore my previous comment (leaving it there for search purposes). I used the optiLoader program to burn the bootloader in my previous comment. I don't know what version of the OptiBoot bootloader it loaded. I just used an Uno R3 with ArduinoISP sketch to burn a bootloader on a new 328 and got the following (using the latest 6.2 OptiBoot) |
This comment has been minimized.
This comment has been minimized.
add |
This comment has been minimized.
Like Denisj on your blog, I needed to change the serial speed to 9600 to get this to work.