Added support for the DorkbotPDX Duce board.
[pub/USBasp.git] / Bootloaders / CDC / BootloaderCDC.c
index 8e6a58b..a7fc883 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
@@ -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
@@ -108,17 +122,12 @@ void SetupHardware(void)
 void EVENT_USB_Device_ConfigurationChanged(void)
 {
        /* Setup CDC Notification, Rx and Tx Endpoints */
 void EVENT_USB_Device_ConfigurationChanged(void)
 {
        /* Setup CDC Notification, Rx and Tx Endpoints */
-       Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT,
-                                  ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE,
-                                  ENDPOINT_BANK_SINGLE);
+       Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT,
+                                  CDC_NOTIFICATION_EPSIZE, 1);
 
 
-       Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK,
-                                  ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE,
-                                  ENDPOINT_BANK_SINGLE);
+       Endpoint_ConfigureEndpoint(CDC_TX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
 
 
-       Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK,
-                                  ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE,
-                                  ENDPOINT_BANK_SINGLE);
+       Endpoint_ConfigureEndpoint(CDC_RX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1);
 }
 
 /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
 }
 
 /** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
@@ -134,6 +143,9 @@ void EVENT_USB_Device_ControlRequest(void)
                return;
        }
 
                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)
        {
@@ -249,7 +261,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
                                {
                                        LowByte = FetchNextCommandByte();
                                }
                                {
                                        LowByte = FetchNextCommandByte();
                                }
-                               
+
                                HighByte = !HighByte;
                        }
                        else
                                HighByte = !HighByte;
                        }
                        else
@@ -286,7 +298,7 @@ static void ReadWriteMemoryBlock(const uint8_t Command)
 static uint8_t FetchNextCommandByte(void)
 {
        /* Select the OUT endpoint so that the next data byte can be read */
 static uint8_t FetchNextCommandByte(void)
 {
        /* Select the OUT endpoint so that the next data byte can be read */
-       Endpoint_SelectEndpoint(CDC_RX_EPNUM);
+       Endpoint_SelectEndpoint(CDC_RX_EPADDR);
 
        /* If OUT endpoint empty, clear it and wait for the next packet from the host */
        while (!(Endpoint_IsReadWriteAllowed()))
 
        /* If OUT endpoint empty, clear it and wait for the next packet from the host */
        while (!(Endpoint_IsReadWriteAllowed()))
@@ -312,7 +324,7 @@ static uint8_t FetchNextCommandByte(void)
 static void WriteNextResponseByte(const uint8_t Response)
 {
        /* Select the IN endpoint so that the next data byte can be written */
 static void WriteNextResponseByte(const uint8_t Response)
 {
        /* Select the IN endpoint so that the next data byte can be written */
-       Endpoint_SelectEndpoint(CDC_TX_EPNUM);
+       Endpoint_SelectEndpoint(CDC_TX_EPADDR);
 
        /* If IN endpoint full, clear it and wait until ready for the next packet to the host */
        if (!(Endpoint_IsReadWriteAllowed()))
 
        /* If IN endpoint full, clear it and wait until ready for the next packet to the host */
        if (!(Endpoint_IsReadWriteAllowed()))
@@ -333,10 +345,10 @@ static void WriteNextResponseByte(const uint8_t 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 */
 {
        /* Select the OUT endpoint */
-       Endpoint_SelectEndpoint(CDC_RX_EPNUM);
+       Endpoint_SelectEndpoint(CDC_RX_EPADDR);
 
        /* Check if endpoint has a command in it sent from the host */
        if (!(Endpoint_IsOUTReceived()))
 
        /* Check if endpoint has a command in it sent from the host */
        if (!(Endpoint_IsOUTReceived()))
@@ -348,7 +360,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');
        }
@@ -532,7 +544,7 @@ void CDC_Task(void)
        }
 
        /* Select the IN endpoint */
        }
 
        /* Select the IN endpoint */
-       Endpoint_SelectEndpoint(CDC_TX_EPNUM);
+       Endpoint_SelectEndpoint(CDC_TX_EPADDR);
 
        /* Remember if the endpoint is completely full before clearing it */
        bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed());
 
        /* Remember if the endpoint is completely full before clearing it */
        bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed());
@@ -560,7 +572,7 @@ void CDC_Task(void)
        }
 
        /* Select the OUT endpoint */
        }
 
        /* Select the OUT endpoint */
-       Endpoint_SelectEndpoint(CDC_RX_EPNUM);
+       Endpoint_SelectEndpoint(CDC_RX_EPADDR);
 
        /* Acknowledge the command from the host */
        Endpoint_ClearOUT();
 
        /* Acknowledge the command from the host */
        Endpoint_ClearOUT();