The ATPROGRAM LUFA build system module now defaults to the Atmel ICE debuger tool...
[pub/USBasp.git] / Bootloaders / CDC / BootloaderCDC.c
index 9830ba7..c7eeb92 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2012.
+     Copyright (C) Dean Camera, 2014.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -91,12 +91,16 @@ void Application_Jump_Check(void)
        if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
          JumpToApplication |= true;
 
        if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
          JumpToApplication |= true;
 
+       /* Don't run the user application if the reset vector is blank (no app loaded) */
+       if (pgm_read_word_near(0) == 0xFFFF)
+         JumpToApplication = false;
+
        /* If a request has been made to jump to the user application, honor it */
        if (JumpToApplication)
        {
                /* Turn off the watchdog */
                MCUSR &= ~(1<<WDRF);
        /* If a request has been made to jump to the user application, honor it */
        if (JumpToApplication)
        {
                /* Turn off the watchdog */
                MCUSR &= ~(1<<WDRF);
-               wdt_disable(); 
+               wdt_disable();
 
                /* Clear the boot key and jump to the user application */
                MagicBootKey = 0;
 
                /* Clear the boot key and jump to the user application */
                MagicBootKey = 0;
@@ -129,7 +133,7 @@ int main(void)
 
        /* Disconnect from the host - USB interface will be reset later along with the AVR */
        USB_Detach();
 
        /* Disconnect from the host - USB interface will be reset later along with the AVR */
        USB_Detach();
-       
+
        /* Unlock the forced application start mode of the bootloader if it is restarted */
        MagicBootKey = MAGIC_BOOT_KEY;
 
        /* Unlock the forced application start mode of the bootloader if it is restarted */
        MagicBootKey = MAGIC_BOOT_KEY;
 
@@ -223,21 +227,29 @@ void EVENT_USB_Device_ControlRequest(void)
                        }
 
                        break;
                        }
 
                        break;
+        case CDC_REQ_SetControlLineState:
+               if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+               {
+                   Endpoint_ClearSETUP();
+                   Endpoint_ClearStatusStage();
+               }
+
+               break;
        }
 }
 
 #if !defined(NO_BLOCK_SUPPORT)
 /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending
        }
 }
 
 #if !defined(NO_BLOCK_SUPPORT)
 /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending
- *  on the AVR910 protocol command issued.
+ *  on the AVR109 protocol command issued.
  *
  *
- *  \param[in] Command  Single character AVR910 protocol command indicating what memory operation to perform
+ *  \param[in] Command  Single character AVR109 protocol command indicating what memory operation to perform
  */
 static void ReadWriteMemoryBlock(const uint8_t Command)
 {
        uint16_t BlockSize;
        char     MemoryType;
 
  */
 static void ReadWriteMemoryBlock(const uint8_t Command)
 {
        uint16_t BlockSize;
        char     MemoryType;
 
-       bool     HighByte = false;
+       uint8_t  HighByte = 0;
        uint8_t  LowByte  = 0;
 
        BlockSize  = (FetchNextCommandByte() << 8);
        uint8_t  LowByte  = 0;
 
        BlockSize  = (FetchNextCommandByte() << 8);
@@ -394,7 +406,7 @@ static void WriteNextResponseByte(const uint8_t Response)
        Endpoint_Write_8(Response);
 }
 
        Endpoint_Write_8(Response);
 }
 
-/** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions
+/** Task to read in AVR109 commands from the CDC data OUT endpoint, process them, perform the required actions
  *  and send the appropriate response back to the host.
  */
 static void CDC_Task(void)
  *  and send the appropriate response back to the host.
  */
 static void CDC_Task(void)
@@ -442,7 +454,7 @@ static void CDC_Task(void)
        }
        else if (Command == AVR109_COMMAND_SetCurrentAddress)
        {
        }
        else if (Command == AVR109_COMMAND_SetCurrentAddress)
        {
-               /* Set the current address to that given by the host */
+               /* Set the current address to that given by the host (translate 16-bit word address to byte address) */
                CurrAddress   = (FetchNextCommandByte() << 9);
                CurrAddress  |= (FetchNextCommandByte() << 1);
 
                CurrAddress   = (FetchNextCommandByte() << 9);
                CurrAddress  |= (FetchNextCommandByte() << 1);
 
@@ -460,7 +472,7 @@ static void CDC_Task(void)
                for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++)
                  WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]);
        }
                for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++)
                  WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]);
        }
-       else if (Command == AVR109_COMMAND_ReadBootloaderVersion)
+       else if (Command == AVR109_COMMAND_ReadBootloaderSWVersion)
        {
                WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR);
                WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR);
        {
                WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR);
                WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR);