User Tools

Site Tools


Connecting a programmer

The Raven boards contain two microcontroller: A ATMega1284p and an ATMega3290p. Both are accessible using JTAG and ISP ports (the latter ones need to be soldered to the board). While the ATMega1284p can be programmed using the JTAG port, the JTAG functionality on the ATMega3290p is disabled via a fuse setting. I hacked one of the 50mil/100mil-adapters of the Raven Kit to accept a 6-pin ISP connector. This way, I can connect to the ISP port and flash the device using avrdude, here with a bus pirate in ISP mode:

avrdude  -c buspirate -P /dev/cu.usbserial-A700eEaD -p m3290p -U flash:w:$NAME.hex

The cable between the bus pirate and the ISP port is described here:

I use an external power supply:

Issuing MAC addresses

These MAC addresses have been assigned to the devices:

Range: CC-B5-5A-0B-01-00 bis CC-B5-5A-0B-01-FF

Device MAC Address IPv6-Address (aaaa:: subnet)
USB-Stick 1 CC-B5-5A-0B-01-00
USB-Stick 1 CC-B5-5A-0B-01-01
Raven1 CC-B5-5A-0B-01-10 aaaa::b5:5aff:fe0b:110
Raven2 CC-B5-5A-0B-01-11 aaaa::b5:5aff:fe0b:111
Raven3 CC-B5-5A-0B-01-12 aaaa::b5:5aff:fe0b:112
Raven4 CC-B5-5A-0B-01-13 aaaa::b5:5aff:fe0b:113
Raven5 CC-B5-5A-0B-01-14 aaaa::b5:5aff:fe0b:114

The MAC addresses are stored in the EEPROM storage, see also . They can be modified by re-writing the EEPROM. First, extract the EEP file from the ELF:

avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
  --change-section-lma .eeprom=0 -O ihex $NAME.elf $NAME.eep

The file looks like this:

$ cat ravenusbstick.eep 

On a Linux box, the stick reports as:

# ifconfig usb0
usb0      Link encap:Ethernet  HWaddr 02:12:13:14:15:16

As you can see, the MAC address is encapsulated as “021213FFFE141516”, with a checksum following it.

NOTE: My initial plan of just modifying the EEPROM file failed. I was not able to change the adress, even using the methods described here: Strange things are going on here.

For the Raven boards, the MAC address can be changed in the apps folder: In


the variables can be adjusted. These values end up in the EEPROM section. Currently, the file looks like this:

#include <avr/eeprom.h>

/* Link layer ipv6 address will become fe80::11:22ff:fe33:4455 */
//uint8_t mac_address[8]  EEMEM = {0x02, 0x11, 0x22, 0xff, 0xfe, 0x33, 0x44, 0x55};
// Raven1
uint8_t mac_address[8] EEMEM = {0x02, 0xb5, 0x5a, 0xff, 0xfe, 0x0b, 0x01, 0x10};
uint8_t server_name[16] EEMEM = "Raven1";
uint8_t domain_name[30] EEMEM = "localhost";
/*// Raven2
uint8_t mac_address[8] EEMEM = {0x02, 0xb5, 0x5a, 0xff, 0xfe, 0x0b, 0x01, 0x11};
uint8_t server_name[16] EEMEM = "Raven2;
uint8_t domain_name[30] EEMEM = "localhost";
// Raven3
uint8_t mac_address[8] EEMEM = {0x02, 0xb5, 0x5a, 0xff, 0xfe, 0x0b, 0x01, 0x12};
uint8_t server_name[16] EEMEM = "Raven3;
uint8_t domain_name[30] EEMEM = "localhost";
// Raven4
uint8_t mac_address[8] EEMEM = {0x02, 0xb5, 0x5a, 0xff, 0xfe, 0x0b, 0x01, 0x13};
uint8_t server_name[16] EEMEM = "Raven4;
uint8_t domain_name[30] EEMEM = "localhost";

Flashing the devices

I use the AVR JTAG2 adapter with avrdude. The build system generates ELF files, so it is necessary to extract fuses, EEP and flash images. The “contiki-tools” folder contains scripts for this. The general idea for this is:

echo "Extracting memory sections from ELF"
avr-objcopy -R .eeprom -R .fuse -R .signature -O ihex $NAME.elf $NAME.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
  --change-section-lma .eeprom=0 -O ihex $NAME.elf $NAME.eep
echo "Make sure the fuses are set to:"
avr-objdump -d -S -j .fuse $NAME.elf

The USB Dongle

WARNING: I never managed to program the USB dongle using Mac OS. I used a WinXP machine and AVR Studio to upload the ELF file.

Fuses must be set to: Extended 0xFB, High 0x99, Low 0xDE.

In theory (see the caveat above):
cd oktobus/contiki-2.4/examples/ravenusbstick
make all
avrdude -c jtag2 -P usb -p at90usb1287 -U lfuse:w:0xDE:m -U hfuse:w:0x99:m -U efuse:w:0xFB:m

The AVR Raven

Flashing the raven board consists of two steps: Flashing the webserver and flashing the display/relay driver.

Connect to the 1284 JTAG connector, then:

cd oktobus/contiki-2.4/examples/webserver-ipv6-raven
avrdude -c jtag2 -P usb -p m1284p -U lfuse:w:0xE2:m -U hfuse:w:0x99:m -U efuse:w:0xFF:m
sh ../../../contiki-tools/

The fuse settings of the 3290 prevent the chip to be programmed over JTAG. I use an usbasp connected to the ISP header to change the fuse settings:

avrdude -c usbasp -p m3290 -U lfuse:w:0xE2:m -U hfuse:w:0x99:m -U efuse:w:0xFF:m

Now, connect to the 3290 ISP connector.

cd oktobus/contiki-2.4/platform/avr-ravenlcd
avrdude -c buspirate -P /dev/usbserial-XYZ -p m3290p -U lfuse:w:0xE2:m -U hfuse:w:0x99:m -U efuse:w:0xFF:m

Battery-operated mobile box

The mobile button runs on 9V, delivered by 2 9V block batteries. They are connected in parallel. The capacity of a 9V alkaline cell is approx. 500 mAh. The circuit draws 33mA. Therefore, the setup will run for (2*500mAh)/(33mA) = 30h.

OpenWRT Router

The DNSmasq daemon needs to be convinced to use another gateway. This can be done by adding

config dhcp lan
 option dhcp_option "6," #dns server
 option dhcp_option "3," #default route

or similar to /etc/config/dhcp.

Add to /etc/sysctl.conf


The /etc directory of demo router 2 is here: etc-router-demo2.tar.gz

hexabusdemosetup.txt · Last modified: 2012/10/30 10:27 (external edit)