Firmware update on Arduino UNO

So the story is that I had this Arduino UNO with me which I was unable to use.

I think that it’s owner did not really use it for anything serious or used it with Windows. After a bit of googling around I found out that rev1 Uno’s are shipped with a firmware that’s not working with Linux (and requires special drivers on Windows).

The problem is with the guy marked red on the image, namely the Atmega 8u2 which is the replacement for the FTDI chip that can be found on other boards. The trick with this chip is that one can define the most important parts of USB communication: the USB id fields. Other boards using the FTDI chip carry the vendor and product id of FTDI for USB communication therefore the drivers associated to it will be the standard USB-RS232 converter driver. With the use of the Atmega 8u2 we have the freedom to tell the system which driver to attach to the device. So still the problem is that these USB communication id fields are not fit to be used with Linux so a firmware update was released.

There are several tutorials out there addressing this problem and I’m going to introduce the one found on the Arduino website (references below).

It starts by soldering a 10kOhm resistor between two pins on the back of the board. It was easier with the right one but for the left one I had to apply some extra solder because it did not melt.

I don’t know how you feel about things like this but I felt more secure after I removed the Atmega328p chip from the board.

Just to be on the safe side…

And now the easy part:

sudo apt-get install dfu-programmer

You might want to take a look around the git repository on the link below but it’s not necessary to download the firmware from there.

https://github.com/arduino/Arduino/tree/master/hardware/arduino/firmwares/atmegaxxu2

Assuming you already have an Arduino IDE installed you can locate the corresponding firmware files with the following command: (I hope you only have 1 such directory :))

cd ~/arduino-*/hardware/arduino/firmwares/

Now let’s reset the Atmega 8u2 to enter programming mode. Pull the 2 marked pins together for a little while. A touch with my tweezer solved it.

And the rest is:

sudo dfu-programmer at90usb82 erase
sudo dfu-programmer at90usb82 flash UNO-dfu_and_usbserial_combined.hex --suppress-bootloader-mem
sudo dfu-programmer at90usb82 reset

After this it’s up and running nicely 🙂

You can remove the 10k resistor from the board but it’s not compulsory.

Troubleshooting:

  • “Bootloader and code overlap.” — add “–suppress-bootloader-mem” to the arguments of dfu-programmer
  • “Error parsing the line. Something went wrong with creating the memory image.” — the .hex file is damaged, re-download it
  • “dfu-programmer: no device present.” – either you forgot to connect the arduino or you forgot to reset the atmega 8u2

References:

http://arduino.cc/en/Hacking/DFUProgramming8U2

https://github.com/arduino/Arduino/tree/master/hardware/arduino/firmwares/atmegaxxu2

http://arduino.cc/blog/2011/02/15/fix-to-uno-and-mega-2560-linux-serial-problems/

http://spacetinkerer.blogspot.hu/2011/03/solving-8u2-firmware-bug-on-arduino.html

3 thoughts on “Firmware update on Arduino UNO

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.