Revert changed version files in /trunk/ now that the LUFA-120219-BETA version has...
[pub/USBasp.git] / Bootloaders / CDC / BootloaderCDC.c
index 0f7b266..e9ea8ae 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  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
 /** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some
  *  operating systems will not open the port unless the settings can be set successfully.
  */
 /** Contains the current baud rate and other settings of the first virtual serial port. This must be retained as some
  *  operating systems will not open the port unless the settings can be set successfully.
  */
-CDC_Line_Coding_t LineEncoding = { .BaudRateBPS = 0,
-                                   .CharFormat  = OneStopBit,
-                                   .ParityType  = Parity_None,
-                                   .DataBits    = 8            };
+static CDC_LineEncoding_t LineEncoding = { .BaudRateBPS = 0,
+                                           .CharFormat  = CDC_LINEENCODING_OneStopBit,
+                                           .ParityType  = CDC_PARITY_None,
+                                           .DataBits    = 8                            };
 
 /** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host,
  *  and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued
  *  command.)
  */
 
 /** Current address counter. This stores the current address of the FLASH or EEPROM as set by the host,
  *  and is used when reading or writing to the AVRs memory (either FLASH or EEPROM depending on the issued
  *  command.)
  */
-uint32_t CurrAddress;
+static uint32_t CurrAddress;
 
 /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run
  *  via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite
  *  loop until the AVR restarts and the application runs.
  */
 
 /** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run
  *  via a watchdog reset. When cleared the bootloader will exit, starting the watchdog and entering an infinite
  *  loop until the AVR restarts and the application runs.
  */
-bool RunBootloader = true;
+static bool RunBootloader = true;
 
 
 /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
 
 
 /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously
@@ -66,6 +66,9 @@ int main(void)
        /* Setup hardware required for the bootloader */
        SetupHardware();
 
        /* Setup hardware required for the bootloader */
        SetupHardware();
 
+       /* Turn on first LED on the board to indicate that the bootloader has started */
+       LEDs_SetAllLEDs(LEDS_LED1);
+
        /* Enable global interrupts so that the USB stack can function */
        sei();
 
        /* Enable global interrupts so that the USB stack can function */
        sei();
 
@@ -85,7 +88,7 @@ int main(void)
 }
 
 /** Configures all hardware required for the bootloader. */
 }
 
 /** Configures all hardware required for the bootloader. */
-void SetupHardware(void)
+static void SetupHardware(void)
 {
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
 {
        /* Disable watchdog if enabled by bootloader/fuses */
        MCUSR &= ~(1 << WDRF);
@@ -98,8 +101,19 @@ void SetupHardware(void)
        MCUCR = (1 << IVCE);
        MCUCR = (1 << IVSEL);
 
        MCUCR = (1 << IVCE);
        MCUCR = (1 << IVSEL);
 
-       /* Initialize USB Subsystem */
+       /* Initialize the USB and other board hardware drivers */
        USB_Init();
        USB_Init();
+       LEDs_Init();
+
+       /* Bootloader active LED toggle timer initialization */
+       TIMSK1 = (1 << TOIE1);
+       TCCR1B = ((1 << CS11) | (1 << CS10));
+}
+
+/** ISR to periodically toggle the LEDs on the board to indicate that the bootloader is active. */
+ISR(TIMER1_OVF_vect, ISR_BLOCK)
+{
+       LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
 }
 
 /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready
 }
 
 /** Event handler for the USB_ConfigurationChanged event. This configures the device's endpoints ready
@@ -127,27 +141,37 @@ void EVENT_USB_Device_ConfigurationChanged(void)
  */
 void EVENT_USB_Device_ControlRequest(void)
 {
  */
 void EVENT_USB_Device_ControlRequest(void)
 {
+       /* Ignore any requests that aren't directed to the CDC interface */
+       if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) !=
+           (REQTYPE_CLASS | REQREC_INTERFACE))
+       {
+               return;
+       }
+
+       /* Activity - toggle indicator LEDs */
+       LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
+
        /* Process CDC specific control requests */
        switch (USB_ControlRequest.bRequest)
        {
        /* Process CDC specific control requests */
        switch (USB_ControlRequest.bRequest)
        {
-               case REQ_GetLineEncoding:
+               case CDC_REQ_GetLineEncoding:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
 
                                /* Write the line coding data to the control endpoint */
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
 
                                /* Write the line coding data to the control endpoint */
-                               Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_Line_Coding_t));
+                               Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t));
                                Endpoint_ClearOUT();
                        }
 
                        break;
                                Endpoint_ClearOUT();
                        }
 
                        break;
-               case REQ_SetLineEncoding:
+               case CDC_REQ_SetLineEncoding:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
 
                                /* Read the line coding data in from the host into the global struct */
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
 
                                /* Read the line coding data in from the host into the global struct */
-                               Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_Line_Coding_t));
+                               Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t));
                                Endpoint_ClearIN();
                        }
 
                                Endpoint_ClearIN();
                        }
 
@@ -242,7 +266,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
                                {
                                        LowByte = FetchNextCommandByte();
                                }
                                {
                                        LowByte = FetchNextCommandByte();
                                }
-                               
+
                                HighByte = !HighByte;
                        }
                        else
                                HighByte = !HighByte;
                        }
                        else
@@ -294,7 +318,7 @@ static uint8_t FetchNextCommandByte(void)
        }
 
        /* Fetch the next byte from the OUT endpoint */
        }
 
        /* Fetch the next byte from the OUT endpoint */
-       return Endpoint_Read_Byte();
+       return Endpoint_Read_8();
 }
 
 /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the
 }
 
 /** Writes the next response byte to the CDC data IN endpoint, and sends the endpoint back if needed to free up the
@@ -320,13 +344,13 @@ static void WriteNextResponseByte(const uint8_t Response)
        }
 
        /* Write the next byte to the IN endpoint */
        }
 
        /* Write the next byte to the IN endpoint */
-       Endpoint_Write_Byte(Response);
+       Endpoint_Write_8(Response);
 }
 
 /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions
  *  and send the appropriate response back to the host.
  */
 }
 
 /** Task to read in AVR910 commands from the CDC data OUT endpoint, process them, perform the required actions
  *  and send the appropriate response back to the host.
  */
-void CDC_Task(void)
+static void CDC_Task(void)
 {
        /* Select the OUT endpoint */
        Endpoint_SelectEndpoint(CDC_RX_EPNUM);
 {
        /* Select the OUT endpoint */
        Endpoint_SelectEndpoint(CDC_RX_EPNUM);
@@ -341,7 +365,7 @@ void CDC_Task(void)
        if (Command == 'E')
        {
                RunBootloader = false;
        if (Command == 'E')
        {
                RunBootloader = false;
-       
+
                /* Send confirmation byte back to the host */
                WriteNextResponseByte('\r');
        }
                /* Send confirmation byte back to the host */
                WriteNextResponseByte('\r');
        }