/*
LUFA Library
- Copyright (C) Dean Camera, 2011.
+ Copyright (C) Dean Camera, 2012.
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
/* 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();
}
/** Configures all hardware required for the bootloader. */
-void SetupHardware(void)
+static void SetupHardware(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF);
MCUCR = (1 << IVCE);
MCUCR = (1 << IVSEL);
- /* Initialize USB Subsystem */
+ /* Initialize the USB and other board hardware drivers */
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
return;
}
+ /* Activity - toggle indicator LEDs */
+ LEDs_ToggleLEDs(LEDS_LED1 | LEDS_LED2);
+
/* Process CDC specific control requests */
switch (USB_ControlRequest.bRequest)
{
{
LowByte = FetchNextCommandByte();
}
-
+
HighByte = !HighByte;
}
else
}
/* 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
}
/* 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.
*/
-void CDC_Task(void)
+static void CDC_Task(void)
{
/* Select the OUT endpoint */
Endpoint_SelectEndpoint(CDC_RX_EPNUM);
if (Command == 'E')
{
RunBootloader = false;
-
+
/* Send confirmation byte back to the host */
WriteNextResponseByte('\r');
}