Page 1 of 1

bootloadHID atmega128

Posted: Wed Mar 25, 2009 11:42 pm
by guest
I have having a world of trouble trying to implement bootloadHID on the atmeaga128. For the life of me I just cant get it to work. The setup I am using has two 3.6v zeners, D- = D4 , D+ = D0, and a 16mhz crystal. I know my hardware works because the example data-hid firmware (when configured) runs like a dream. For the bootloadHID config I have

DEVICE = atmega128
F_CPU = 16000000



Low: 0xAF High: 0x91
BODEN Programed
SUT00 Programed
JTAGEN Programed
SPIEN Programed
EESAVE Programed
BOOTSZ1 Programed
BOOTSZ0 Programed

I also added
#define F_CPU = 16000000
to the top of main.c just to be safe.

With this setup when I short out the jumper it runs the boot loader firmware. But windows can't detect it. I thought it could have been a timing issue so I replaced the 16mhz crystal with a 12mhz resonator (it's all I had) and changed the fcp_u to 12000000 and still nothing. But again when I configure it for the hid-data example it works like a dream. If anyone has a suggestion I would love to hear it as I have been trying to do this for about a week and just can't get it to work. I am starting to think that bootloadHID isn't compatible with the atmega128. But I'm sure it's something small and stupid I'm missing.

Re: bootloadHID atmega128

Posted: Fri Mar 27, 2009 8:37 pm
by rodmolina
sorry if im very very wrong.. but F_CPU isnt defined at khz? you got it at hz

YUP, i was wrong.. F_CPU is at Hz :oops:

Re: bootloadHID atmega128

Posted: Sat Mar 28, 2009 5:45 am
by guest
Thanks for your response! Anything helps! I also have an update. I hooked up the mcu to my computer and enabled debugging level 2.
The output looks like this


Now here's the thing I know I got the address and clock settings because I'm getting valid debugging information. The strange thing is it keeps resetting. It seems to run through the main loop like 5 times then restart the firmware (or so it looks). I'm going to have to keep working on it. I just kills me that the hid-data example works and not bootloadHID. It's got to be something in the config......

P.S. has anyone got bootloadHID to work on an atmega128 yet?

Re: bootloadHID atmega128

Posted: Mon Mar 30, 2009 1:19 pm
by guest
Man that took way to long!!!!!!!!!!!!! The problem I posted about last was the result of my fuse bits being set wrong(I find it odd that the firmware was still running.... but what the hell.). But the problem with windows not detecting the device was still their. So I started debugging the code ....... and after like.. two days I found it. The problem is with the memory address's being out of range of PROGMEM. It turns out that it wasn't a simple configuration issue (unless theirs something I'm missing) but a compatibility issue with avr-usb. The problem lies in the usbDeviceRead() function. Their is no issue as long as PROGMEM stays below the 64k mark, however with bootloadHID and the atmega128 the firmware is flashed beyond that point. I had to change
uchar c = USB_READ_FLASH(r);
uchar c = pgm_read_byte_far(r);
it gives an warning..... but I don't care because it works ;)
So to anyone who is trying to get bootloadHID to work on an atmega128 try this

//around line: 504
//function usbdeviceread()

uchar c = USB_READ_FLASH(r);
uchar c = pgm_read_byte_far(r);

if anyone has a better work around suggestion I would like to hear it because mine is vary crude and to the point. I'm just a hacker and a sloppy one at that ;)

Re: bootloadHID atmega128

Posted: Tue Apr 07, 2009 5:33 pm
by rodmolina
mmm i cant get it recognized by windows.. i ve got an atmega328p so i tried what you posted by the winavr says warning and then error:

Code: Select all

[b]usbdrv/usbdrv.c: In function 'usbDeviceRead':
usbdrv/usbdrv.c:504: warning: implicit declaration of function 'pgm_read_byte_far'[/b]
main.c: In function 'main':
main.c:226: warning: unused variable 'j'
main.c:226: warning: unused variable 'i'
main.c: At top level:
usbdrv/usbdrv.h:211: warning: 'usbFunctionDescriptor' used but never defined
usbdrv/usbdrv.h:218: warning: 'usbSetInterrupt' declared 'static' but never defined
avr-gcc -Wall -Os -Iusbdrv -I. -mmcu=atmega328p -DF_CPU=12800000 -DDEBUG_LEVEL=0  -o main.bin usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o -Wl,--section-start=.text=7000
[b]main.o: In function `main':
main.c:(.text+0x30c): undefined reference to `pgm_read_byte_far'
make.exe: *** [main.bin] Error 1[/b]

i think maybe i dont need a far pointer address :P

Re: bootloadHID atmega128

Posted: Tue Apr 07, 2009 7:32 pm
by Grendel
rodmolina wrote:i think maybe i dont need a far pointer address :P

Correct. You only need the far access w/ devices that have more than 64k of FLASH memory. In other words: If a device doesn't have the RAMPZ (extended Z-pointer) register you don't need far access.

#if defined(RAMPZ)
[use far routines]
[use normal routines]

Re: bootloadHID atmega128

Posted: Sat Apr 11, 2009 3:40 pm
by christian
I'm surprised to hear that pgm_read_byte_far() works in this case because the address is only 16 bit. If anybody has a good point WHY this works, we can add an #ifdef to usbportability.h (but on what condition?) or add a usbconfig.h option.

Re: bootloadHID atmega128

Posted: Thu Apr 26, 2012 7:23 pm
by adamh
guest wrote:I had to change uchar c = USB_READ_FLASH(r); to uchar c = pgm_read_byte_far(r);

Thank you very much! You saved my project. I've been trying to make it work @ ATmega128A for couple hours.