Added extra commands for moving back and forth between the bootloader and the actual program.

Disabled the flash erase capability on the main program while I'm working on the bootloader...
This commit is contained in:
Doug Brown 2011-12-24 20:09:39 -08:00
parent 035e7cce28
commit 258fb187ad
2 changed files with 40 additions and 10 deletions

View File

@ -1,4 +1,4 @@
#Tue Dec 20 21:48:25 PST 2011 #Sat Dec 24 19:28:57 PST 2011
avrtarget/ClockFrequency=16000000 avrtarget/ClockFrequency=16000000
avrtarget/ExtRAMSize=0 avrtarget/ExtRAMSize=0
avrtarget/ExtendedRAM=false avrtarget/ExtendedRAM=false
@ -21,7 +21,7 @@ avrtarget/avrdude/Locks/FileName=
avrtarget/avrdude/Locks/MCUid=at90usb646 avrtarget/avrdude/Locks/MCUid=at90usb646
avrtarget/avrdude/Locks/UseFile=false avrtarget/avrdude/Locks/UseFile=false
avrtarget/avrdude/Locks/Write=false avrtarget/avrdude/Locks/Write=false
avrtarget/avrdude/NoChipErase=false avrtarget/avrdude/NoChipErase=true
avrtarget/avrdude/NoSigCheck=false avrtarget/avrdude/NoSigCheck=false
avrtarget/avrdude/NoVerify=false avrtarget/avrdude/NoVerify=false
avrtarget/avrdude/NoWrite=false avrtarget/avrdude/NoWrite=false

View File

@ -63,25 +63,34 @@ typedef enum ProgrammerCommand
ReadByte, ReadByte,
ReadChips, ReadChips,
EraseChips, EraseChips,
WriteChips WriteChips,
GetBootloaderState,
EnterBootloader,
EnterProgrammer
} ProgrammerCommand; } ProgrammerCommand;
typedef enum ProgrammerReply typedef enum ProgrammerReply
{ {
CommandReplyOK, CommandReplyOK = 0,
CommandReplyError, CommandReplyError,
CommandReplyInvalid CommandReplyInvalid
} ProgrammerReply; } ProgrammerReply;
typedef enum BootloaderStateReply
{
BootloaderStateInBootloader = 0,
BootloaderStateInProgrammer
} BootloaderStateReply;
typedef enum ComputerReadReply typedef enum ComputerReadReply
{ {
ComputerReadOK, ComputerReadOK = 0,
ComputerReadCancel ComputerReadCancel
} ComputerReadReply; } ComputerReadReply;
typedef enum ProgrammerReadReply typedef enum ProgrammerReadReply
{ {
ProgrammerReadOK, ProgrammerReadOK = 0,
ProgrammerReadError, ProgrammerReadError,
ProgrammerReadMoreData, ProgrammerReadMoreData,
ProgrammerReadFinished, ProgrammerReadFinished,
@ -90,26 +99,26 @@ typedef enum ProgrammerReadReply
typedef enum ComputerWriteReply typedef enum ComputerWriteReply
{ {
ComputerWriteMore, ComputerWriteMore = 0,
ComputerWriteFinish, ComputerWriteFinish,
ComputerWriteCancel ComputerWriteCancel
} ComputerWriteReply; } ComputerWriteReply;
typedef enum ProgrammerWriteReply typedef enum ProgrammerWriteReply
{ {
ProgrammerWriteOK, ProgrammerWriteOK = 0,
ProgrammerWriteError, ProgrammerWriteError,
ProgrammerWriteConfirmCancel ProgrammerWriteConfirmCancel
} ProgrammerWriteReply; } ProgrammerWriteReply;
typedef enum ProgrammerIdentifyReply typedef enum ProgrammerIdentifyReply
{ {
ProgrammerIdentifyDone ProgrammerIdentifyDone = 0
} ProgrammerIdentifyReply; } ProgrammerIdentifyReply;
typedef enum ProgrammerElectricalTestReply typedef enum ProgrammerElectricalTestReply
{ {
ProgrammerElectricalTestFail, ProgrammerElectricalTestFail = 0,
ProgrammerElectricalTestDone ProgrammerElectricalTestDone
} ProgrammerElectricalTestReply; } ProgrammerElectricalTestReply;
@ -282,6 +291,27 @@ void USBSerial_HandleWaitingForCommandByte(uint8_t byte)
writePosInChunk = -1; writePosInChunk = -1;
SendByte(CommandReplyOK); SendByte(CommandReplyOK);
break; break;
case GetBootloaderState:
SendByte(CommandReplyOK);
SendByte(BootloaderStateInProgrammer);
break;
case EnterBootloader:
SendByte(CommandReplyOK);
USB_Disable();
// Disable interrupts...
cli();
// Wait a little bit to let everything settle and let the program close the port after the USB disconnect
_delay_ms(2000);
// Now run the bootloader
__asm__ __volatile__ ( "jmp 0xE000" );
break;
case EnterProgrammer:
// Already in the programmer
SendByte(CommandReplyOK);
break;
default: default:
SendByte(CommandReplyInvalid); SendByte(CommandReplyInvalid);
break; break;