Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.Sign up
Changing the device MAC address
Clone this wiki locally
If you have a device without an "official" MAC address, you might want to change the preprogrammed MAC address. A MAC address is a 48bit identifier and unique to the device. For example, CC:B5:5A:0B:03:01 is an official MAC address of the Fraunhofer ITWM. (Note: If you're with ITWM, you can get a development address from Mathias. All other people: DON'T USE THIS ONE!)
For 6LoWPAN, the MAC address needs to be entered in 64bit-format. Therefore, the MAC address needs to be adjusted as follows:
- Put the padding bytes 0xFF:0xFE in the middle of the MAC address, i.e.
- Change the first two bytes to 0x02 (this is defined to be a 6LoWPAN MAC):
The MAC address is stored in the EEPROM and can be changed like this:
The single-byte write eeprom solution (recommended)
If you see the message
warning: OCDEN fuse not programmed, single-byte EEPROM updates not possible
you have to set the OCDEN fuse in order to enable the EEPROM single-byte updates:
avrdude -c jtag2 -P usb -p atmega1284p -U hfuse:w:0x10:m -F
Then, you can use the terminal mode of avrdude to update the values:
avrdude -p atmega1284p -P usb -c jtagmkII -t -F to enter terminal mode
dump eeprom 1 8 to view the current MAC address
write eeprom 1 <Byte1> ... <Byte8> to set a new MAC address
write eeprom 7 <Byte7> <Byte8> if you only want to change the last two bytes
Note: The byte values have to be in decimal format! If you want to write the address using hexadecimal values, you need to prepend
write eeprom 1 0x02 0xb5 0x5a 0xff 0xfe 0x0b 0x03 0x01
for writing the MAC address
The EEP image write way
Writing the eeprom using
avrdude -p atmega1284p -P usb -c jtagmkII -U eeprom:w:Bootloader.eep doesn't seem to work anymore. TODO: Needs moar evaluation.
Recovering a board
Sometimes, it happens that the EEPROM of a board cannot be written. Avrdude reports write errors in specific EEPROM cells. To change the EEPROM content on such a board, you have to erase the EEPROM completely and upload a (patched) backup of the previous content. Here's how:
First, you have to make a raw copy of the EEPROM in a local file:
$ avrdude -p atmega1284p -P usb -c dragon_jtag -F -U eeprom:r:eeprom.raw:r
You can edit this file using a hex editor, i.e.
$ ghex2 eeprom.raw
Then, unset the EESAVE fuse. This fuse protects the EEPROM from being deleted when the chip is erased. By unsetting it, you allow EEPROM deletion.
$ avrdude -c dragon_jtag -P usb -F -p atmega1284p -U hfuse:w:0x98:m
Now delete the chip:
$ avrdude -c dragon_jtag -P usb -F -p atmega1284p -e
Write the (edited) EEPROM image back into the chip:
$ avrdude -p atmega1284p -P usb -F -c dragon_jtag -U eeprom:w:eeprom.raw:r
Last step: Protect the EEPROM from being deleted again.
$ avrdude -c dragon_jtag -P usb -F -p atmega1284p -U hfuse:w:0x90:m