diff options
Diffstat (limited to 'firmwares/atmegaxxu2/arduino-usbdfu')
| -rwxr-xr-x | firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c | 728 | ||||
| -rwxr-xr-x | firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h | 220 | ||||
| -rwxr-xr-x | firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h | 110 | ||||
| -rwxr-xr-x | firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c | 189 | ||||
| -rwxr-xr-x | firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h | 177 | ||||
| -rwxr-xr-x | firmwares/atmegaxxu2/arduino-usbdfu/makefile | 710 | ||||
| -rw-r--r-- | firmwares/atmegaxxu2/arduino-usbdfu/readme.txt | 7 | 
7 files changed, 2141 insertions, 0 deletions
| diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c b/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c new file mode 100755 index 0000000..7bed831 --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.c @@ -0,0 +1,728 @@ +/*
 +             LUFA Library
 +     Copyright (C) Dean Camera, 2010.
 +              
 +  dean [at] fourwalledcubicle [dot] com
 +      www.fourwalledcubicle.com
 +*/
 +
 +/*
 +  Copyright 2010  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
 +  without fee, provided that the above copyright notice appear in 
 +  all copies and that both that the copyright notice and this
 +  permission notice and warranty disclaimer appear in supporting 
 +  documentation, and that the name of the author not be used in 
 +  advertising or publicity pertaining to distribution of the 
 +  software without specific, written prior permission.
 +
 +  The author disclaim all warranties with regard to this
 +  software, including all implied warranties of merchantability
 +  and fitness.  In no event shall the author be liable for any
 +  special, indirect or consequential damages or any damages
 +  whatsoever resulting from loss of use, data or profits, whether
 +  in an action of contract, negligence or other tortious action,
 +  arising out of or in connection with the use or performance of
 +  this software.
 +*/
 +
 +/** \file
 + *
 + *  Main source file for the DFU class bootloader. This file contains the complete bootloader logic.
 + */
 +
 +#define  INCLUDE_FROM_BOOTLOADER_C
 +#include "Arduino-usbdfu.h"
 +
 +/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run
 + *  via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application
 + *  jumped to via an indirect jump to location 0x0000 (or other location specified by the host).
 + */
 +bool RunBootloader = true;
 +
 +/** Flag to indicate if the bootloader is waiting to exit. When the host requests the bootloader to exit and
 + *  jump to the application address it specifies, it sends two sequential commands which must be properly
 + *  acknowledged. Upon reception of the first the RunBootloader flag is cleared and the WaitForExit flag is set,
 + *  causing the bootloader to wait for the final exit command before shutting down.
 + */
 +bool WaitForExit = false;
 +
 +/** Current DFU state machine state, one of the values in the DFU_State_t enum. */
 +uint8_t DFU_State = dfuIDLE;
 +
 +/** Status code of the last executed DFU command. This is set to one of the values in the DFU_Status_t enum after
 + *  each operation, and returned to the host when a Get Status DFU request is issued.
 + */
 +uint8_t DFU_Status = OK;
 +
 +/** Data containing the DFU command sent from the host. */
 +DFU_Command_t SentCommand;
 +
 +/** Response to the last issued Read Data DFU command. Unlike other DFU commands, the read command
 + *  requires a single byte response from the bootloader containing the read data when the next DFU_UPLOAD command
 + *  is issued by the host.
 + */
 +uint8_t ResponseByte;
 +
 +/** Pointer to the start of the user application. By default this is 0x0000 (the reset vector), however the host
 + *  may specify an alternate address when issuing the application soft-start command.
 + */
 +AppPtr_t AppStartPtr = (AppPtr_t)0x0000;
 +
 +/** 64-bit flash page number. This is concatenated with the current 16-bit address on USB AVRs containing more than
 + *  64KB of flash memory.
 + */
 +uint8_t Flash64KBPage = 0;
 +
 +/** Memory start address, indicating the current address in the memory being addressed (either FLASH or EEPROM
 + *  depending on the issued command from the host).
 + */
 +uint16_t StartAddr = 0x0000;
 +
 +/** Memory end address, indicating the end address to read to/write from in the memory being addressed (either FLASH
 + *  of EEPROM depending on the issued command from the host).
 + */
 +uint16_t EndAddr = 0x0000;
 +
 +
 +/** Pulse generation counters to keep track of the number of milliseconds remaining for each pulse type */
 +volatile struct
 +{
 +	uint8_t TxLEDPulse; /**< Milliseconds remaining for data Tx LED pulse */
 +	uint8_t RxLEDPulse; /**< Milliseconds remaining for data Rx LED pulse */
 +	uint8_t PingPongLEDPulse; /**< Milliseconds remaining for enumeration Tx/Rx ping-pong LED pulse */
 +} PulseMSRemaining;
 +
 +/** Main program entry point. This routine configures the hardware required by the bootloader, then continuously 
 + *  runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
 + *  the loaded application code.
 + */
 +int main(void)
 +{
 +	/* Configure hardware required by the bootloader */
 +	SetupHardware();
 +	
 +	/* Enable global interrupts so that the USB stack can function */
 +	sei();
 +
 +	/* Run the USB management task while the bootloader is supposed to be running */
 +	while (RunBootloader || WaitForExit)
 +	  USB_USBTask();
 +	
 +	/* Reset configured hardware back to their original states for the user application */
 +	ResetHardware();
 +	
 +	/* Start the user application */
 +	AppStartPtr();
 +}
 +
 +/** Configures all hardware required for the bootloader. */
 +void SetupHardware(void)
 +{
 +	/* Disable watchdog if enabled by bootloader/fuses */
 +	MCUSR &= ~(1 << WDRF);
 +	wdt_disable();
 +
 +	/* Disable clock division */
 +//	clock_prescale_set(clock_div_1);
 +	
 +	/* Relocate the interrupt vector table to the bootloader section */
 +	MCUCR = (1 << IVCE);
 +	MCUCR = (1 << IVSEL);
 +
 +	LEDs_Init();
 +
 +	/* Initialize the USB subsystem */
 +	USB_Init();
 +}
 +
 +/** Resets all configured hardware required for the bootloader back to their original states. */
 +void ResetHardware(void)
 +{
 +	/* Shut down the USB subsystem */
 +	USB_ShutDown();
 +	
 +	/* Relocate the interrupt vector table back to the application section */
 +	MCUCR = (1 << IVCE);
 +	MCUCR = 0;
 +}
 +
 +/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific
 + *  control requests that are not handled internally by the USB library (including the DFU commands, which are
 + *  all issued via the control endpoint), so that they can be handled appropriately for the application.
 + */
 +void EVENT_USB_Device_UnhandledControlRequest(void)
 +{
 +	/* Get the size of the command and data from the wLength value */
 +	SentCommand.DataSize = USB_ControlRequest.wLength;
 +
 +	/* Turn off TX LED(s) once the TX pulse period has elapsed */
 +	if (PulseMSRemaining.TxLEDPulse && !(--PulseMSRemaining.TxLEDPulse))
 +		LEDs_TurnOffLEDs(LEDMASK_TX);
 +		
 +	/* Turn off RX LED(s) once the RX pulse period has elapsed */
 +	if (PulseMSRemaining.RxLEDPulse && !(--PulseMSRemaining.RxLEDPulse))
 +		LEDs_TurnOffLEDs(LEDMASK_RX);
 +
 +	switch (USB_ControlRequest.bRequest)
 +	{
 +		case DFU_DNLOAD:
 +			LEDs_TurnOnLEDs(LEDMASK_RX);
 +			PulseMSRemaining.RxLEDPulse = TX_RX_LED_PULSE_MS;		
 +		
 +			Endpoint_ClearSETUP();
 +			
 +			/* Check if bootloader is waiting to terminate */
 +			if (WaitForExit)
 +			{
 +				/* Bootloader is terminating - process last received command */
 +				ProcessBootloaderCommand();
 +				
 +				/* Turn off TX/RX status LEDs so that they're not left on when application starts */
 +				LEDs_TurnOffLEDs(LEDMASK_TX);
 +				LEDs_TurnOffLEDs(LEDMASK_RX);
 +				
 +				/* Indicate that the last command has now been processed - free to exit bootloader */
 +				WaitForExit = false;
 +			}
 +			  
 +			/* If the request has a data stage, load it into the command struct */
 +			if (SentCommand.DataSize)
 +			{
 +				while (!(Endpoint_IsOUTReceived()))
 +				{				
 +					if (USB_DeviceState == DEVICE_STATE_Unattached)
 +					  return;
 +				}
 +
 +				/* First byte of the data stage is the DNLOAD request's command */
 +				SentCommand.Command = Endpoint_Read_Byte();
 +					
 +				/* One byte of the data stage is the command, so subtract it from the total data bytes */
 +				SentCommand.DataSize--;
 +				
 +				/* Load in the rest of the data stage as command parameters */
 +				for (uint8_t DataByte = 0; (DataByte < sizeof(SentCommand.Data)) &&
 +				     Endpoint_BytesInEndpoint(); DataByte++)
 +				{
 +					SentCommand.Data[DataByte] = Endpoint_Read_Byte();
 +					SentCommand.DataSize--;
 +				}
 +				
 +				/* Process the command */
 +				ProcessBootloaderCommand();
 +			}
 +			
 +			/* Check if currently downloading firmware */
 +			if (DFU_State == dfuDNLOAD_IDLE)
 +			{									
 +				if (!(SentCommand.DataSize))
 +				{
 +					DFU_State = dfuIDLE;
 +				}
 +				else
 +				{
 +					/* Throw away the filler bytes before the start of the firmware */
 +					DiscardFillerBytes(DFU_FILLER_BYTES_SIZE);
 +
 +					/* Throw away the packet alignment filler bytes before the start of the firmware */
 +					DiscardFillerBytes(StartAddr % FIXED_CONTROL_ENDPOINT_SIZE);
 +					
 +					/* Calculate the number of bytes remaining to be written */
 +					uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1);
 +					
 +					if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00))        // Write flash
 +					{
 +						/* Calculate the number of words to be written from the number of bytes to be written */
 +						uint16_t WordsRemaining = (BytesRemaining >> 1);
 +					
 +						union
 +						{
 +							uint16_t Words[2];
 +							uint32_t Long;
 +						} CurrFlashAddress                 = {.Words = {StartAddr, Flash64KBPage}};
 +						
 +						uint32_t CurrFlashPageStartAddress = CurrFlashAddress.Long;
 +						uint8_t  WordsInFlashPage          = 0;
 +
 +						while (WordsRemaining--)
 +						{
 +							/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 +							if (!(Endpoint_BytesInEndpoint()))
 +							{
 +								Endpoint_ClearOUT();
 +
 +								while (!(Endpoint_IsOUTReceived()))
 +								{				
 +									if (USB_DeviceState == DEVICE_STATE_Unattached)
 +									  return;
 +								}
 +							}
 +
 +							/* Write the next word into the current flash page */
 +							boot_page_fill(CurrFlashAddress.Long, Endpoint_Read_Word_LE());
 +
 +							/* Adjust counters */
 +							WordsInFlashPage      += 1;
 +							CurrFlashAddress.Long += 2;
 +
 +							/* See if an entire page has been written to the flash page buffer */
 +							if ((WordsInFlashPage == (SPM_PAGESIZE >> 1)) || !(WordsRemaining))
 +							{
 +								/* Commit the flash page to memory */
 +								boot_page_write(CurrFlashPageStartAddress);
 +								boot_spm_busy_wait();
 +								
 +								/* Check if programming incomplete */
 +								if (WordsRemaining)
 +								{
 +									CurrFlashPageStartAddress = CurrFlashAddress.Long;
 +									WordsInFlashPage          = 0;
 +
 +									/* Erase next page's temp buffer */
 +									boot_page_erase(CurrFlashAddress.Long);
 +									boot_spm_busy_wait();
 +								}
 +							}
 +						}
 +					
 +						/* Once programming complete, start address equals the end address */
 +						StartAddr = EndAddr;
 +					
 +						/* Re-enable the RWW section of flash */
 +						boot_rww_enable();
 +					}
 +					else                                                   // Write EEPROM
 +					{
 +						while (BytesRemaining--)
 +						{
 +							/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 +							if (!(Endpoint_BytesInEndpoint()))
 +							{
 +								Endpoint_ClearOUT();
 +
 +								while (!(Endpoint_IsOUTReceived()))
 +								{				
 +									if (USB_DeviceState == DEVICE_STATE_Unattached)
 +									  return;
 +								}
 +							}
 +
 +							/* Read the byte from the USB interface and write to to the EEPROM */
 +							eeprom_write_byte((uint8_t*)StartAddr, Endpoint_Read_Byte());
 +							
 +							/* Adjust counters */
 +							StartAddr++;
 +						}
 +					}
 +					
 +					/* Throw away the currently unused DFU file suffix */
 +					DiscardFillerBytes(DFU_FILE_SUFFIX_SIZE);
 +				}
 +			}
 +
 +			Endpoint_ClearOUT();
 +
 +			Endpoint_ClearStatusStage();
 +
 +			break;
 +		case DFU_UPLOAD:
 +			Endpoint_ClearSETUP();
 +			
 +			LEDs_TurnOnLEDs(LEDMASK_TX);
 +			PulseMSRemaining.TxLEDPulse = TX_RX_LED_PULSE_MS;
 +
 +			while (!(Endpoint_IsINReady()))
 +			{				
 +				if (USB_DeviceState == DEVICE_STATE_Unattached)
 +				  return;
 +			}
 +							
 +			if (DFU_State != dfuUPLOAD_IDLE)
 +			{
 +				if ((DFU_State == dfuERROR) && IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01))       // Blank Check
 +				{
 +					/* Blank checking is performed in the DFU_DNLOAD request - if we get here we've told the host
 +					   that the memory isn't blank, and the host is requesting the first non-blank address */
 +					Endpoint_Write_Word_LE(StartAddr);
 +				}
 +				else
 +				{
 +					/* Idle state upload - send response to last issued command */
 +					Endpoint_Write_Byte(ResponseByte);
 +				}
 +			}
 +			else
 +			{
 +				/* Determine the number of bytes remaining in the current block */
 +				uint16_t BytesRemaining = ((EndAddr - StartAddr) + 1);
 +
 +				if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00))            // Read FLASH
 +				{
 +					/* Calculate the number of words to be written from the number of bytes to be written */
 +					uint16_t WordsRemaining = (BytesRemaining >> 1);
 +
 +					union
 +					{
 +						uint16_t Words[2];
 +						uint32_t Long;
 +					} CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};
 +
 +					while (WordsRemaining--)
 +					{
 +						/* Check if endpoint is full - if so clear it and wait until ready for next packet */
 +						if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE)
 +						{
 +							Endpoint_ClearIN();
 +
 +							while (!(Endpoint_IsINReady()))
 +							{				
 +								if (USB_DeviceState == DEVICE_STATE_Unattached)
 +								  return;
 +							}
 +						}
 +
 +						/* Read the flash word and send it via USB to the host */
 +						#if (FLASHEND > 0xFFFF)
 +							Endpoint_Write_Word_LE(pgm_read_word_far(CurrFlashAddress.Long));
 +						#else
 +							Endpoint_Write_Word_LE(pgm_read_word(CurrFlashAddress.Long));							
 +						#endif
 +
 +						/* Adjust counters */
 +						CurrFlashAddress.Long += 2;
 +					}
 +					
 +					/* Once reading is complete, start address equals the end address */
 +					StartAddr = EndAddr;
 +				}
 +				else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02))       // Read EEPROM
 +				{
 +					while (BytesRemaining--)
 +					{
 +						/* Check if endpoint is full - if so clear it and wait until ready for next packet */
 +						if (Endpoint_BytesInEndpoint() == FIXED_CONTROL_ENDPOINT_SIZE)
 +						{
 +							Endpoint_ClearIN();
 +							
 +							while (!(Endpoint_IsINReady()))
 +							{				
 +								if (USB_DeviceState == DEVICE_STATE_Unattached)
 +								  return;
 +							}
 +						}
 +
 +						/* Read the EEPROM byte and send it via USB to the host */
 +						Endpoint_Write_Byte(eeprom_read_byte((uint8_t*)StartAddr));
 +
 +						/* Adjust counters */
 +						StartAddr++;
 +					}
 +				}
 +
 +				/* Return to idle state */
 +				DFU_State = dfuIDLE;
 +			}
 +
 +			Endpoint_ClearIN();
 +
 +			Endpoint_ClearStatusStage();
 +			break;
 +		case DFU_GETSTATUS:
 +			Endpoint_ClearSETUP();
 +			
 +			/* Write 8-bit status value */
 +			Endpoint_Write_Byte(DFU_Status);
 +			
 +			/* Write 24-bit poll timeout value */
 +			Endpoint_Write_Byte(0);
 +			Endpoint_Write_Word_LE(0);
 +			
 +			/* Write 8-bit state value */
 +			Endpoint_Write_Byte(DFU_State);
 +
 +			/* Write 8-bit state string ID number */
 +			Endpoint_Write_Byte(0);
 +
 +			Endpoint_ClearIN();
 +			
 +			Endpoint_ClearStatusStage();
 +			break;		
 +		case DFU_CLRSTATUS:
 +			Endpoint_ClearSETUP();
 +			
 +			/* Reset the status value variable to the default OK status */
 +			DFU_Status = OK;
 +
 +			Endpoint_ClearStatusStage();
 +			break;
 +		case DFU_GETSTATE:
 +			Endpoint_ClearSETUP();
 +			
 +			/* Write the current device state to the endpoint */
 +			Endpoint_Write_Byte(DFU_State);
 +		
 +			Endpoint_ClearIN();
 +			
 +			Endpoint_ClearStatusStage();
 +			break;
 +		case DFU_ABORT:
 +			Endpoint_ClearSETUP();
 +			
 +			/* Turn off TX/RX status LEDs so that they're not left on when application starts */
 +			LEDs_TurnOffLEDs(LEDMASK_TX);
 +			LEDs_TurnOffLEDs(LEDMASK_RX);
 +			
 +			/* Reset the current state variable to the default idle state */
 +			DFU_State = dfuIDLE;
 +
 +			Endpoint_ClearStatusStage();
 +			break;
 +	}
 +}
 +
 +/** Routine to discard the specified number of bytes from the control endpoint stream. This is used to
 + *  discard unused bytes in the stream from the host, including the memory program block suffix.
 + *
 + *  \param[in] NumberOfBytes  Number of bytes to discard from the host from the control endpoint
 + */
 +static void DiscardFillerBytes(uint8_t NumberOfBytes)
 +{
 +	while (NumberOfBytes--)
 +	{
 +		if (!(Endpoint_BytesInEndpoint()))
 +		{
 +			Endpoint_ClearOUT();
 +
 +			/* Wait until next data packet received */
 +			while (!(Endpoint_IsOUTReceived()))
 +			{				
 +				if (USB_DeviceState == DEVICE_STATE_Unattached)
 +				  return;
 +			}
 +		}
 +		else
 +		{
 +			Endpoint_Discard_Byte();
 +		}
 +	}
 +}
 +
 +/** Routine to process an issued command from the host, via a DFU_DNLOAD request wrapper. This routine ensures
 + *  that the command is allowed based on the current secure mode flag value, and passes the command off to the
 + *  appropriate handler function.
 + */
 +static void ProcessBootloaderCommand(void)
 +{
 +	/* Check if device is in secure mode */
 +// 	if (IsSecure)
 +// 	{
 +// 		/* Don't process command unless it is a READ or chip erase command */
 +// 		if (!(((SentCommand.Command == COMMAND_WRITE)             &&
 +// 		        IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF)) ||
 +// 			   (SentCommand.Command == COMMAND_READ)))
 +// 		{
 +// 			/* Set the state and status variables to indicate the error */
 +// 			DFU_State  = dfuERROR;
 +// 			DFU_Status = errWRITE;
 +// 			
 +// 			/* Stall command */
 +// 			Endpoint_StallTransaction();
 +// 			
 +// 			/* Don't process the command */
 +// 			return;
 +// 		}
 +// 	}
 +
 +	/* Dispatch the required command processing routine based on the command type */
 +	switch (SentCommand.Command)
 +	{
 +		case COMMAND_PROG_START:
 +			ProcessMemProgCommand();
 +			break;
 +		case COMMAND_DISP_DATA:
 +			ProcessMemReadCommand();
 +			break;
 +		case COMMAND_WRITE:
 +			ProcessWriteCommand();
 +			break;
 +		case COMMAND_READ:
 +			ProcessReadCommand();
 +			break;
 +		case COMMAND_CHANGE_BASE_ADDR:
 +			if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x03, 0x00))              // Set 64KB flash page command
 +			  Flash64KBPage = SentCommand.Data[2];
 +			break;
 +	}
 +}
 +
 +/** Routine to concatenate the given pair of 16-bit memory start and end addresses from the host, and store them
 + *  in the StartAddr and EndAddr global variables.
 + */
 +static void LoadStartEndAddresses(void)
 +{
 +	union
 +	{
 +		uint8_t  Bytes[2];
 +		uint16_t Word;
 +	} Address[2] = {{.Bytes = {SentCommand.Data[2], SentCommand.Data[1]}},
 +	                {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}}};
 +		
 +	/* Load in the start and ending read addresses from the sent data packet */
 +	StartAddr = Address[0].Word;
 +	EndAddr   = Address[1].Word;
 +}
 +
 +/** Handler for a Memory Program command issued by the host. This routine handles the preparations needed
 + *  to write subsequent data from the host into the specified memory.
 + */
 +static void ProcessMemProgCommand(void)
 +{
 +	if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) ||                          // Write FLASH command
 +	    IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01))                            // Write EEPROM command
 +	{
 +		/* Load in the start and ending read addresses */
 +		LoadStartEndAddresses();
 +		
 +		/* If FLASH is being written to, we need to pre-erase the first page to write to */
 +		if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00))
 +		{
 +			union
 +			{
 +				uint16_t Words[2];
 +				uint32_t Long;
 +			} CurrFlashAddress = {.Words = {StartAddr, Flash64KBPage}};
 +			
 +			/* Erase the current page's temp buffer */
 +			boot_page_erase(CurrFlashAddress.Long);
 +			boot_spm_busy_wait();
 +		}
 +		
 +		/* Set the state so that the next DNLOAD requests reads in the firmware */
 +		DFU_State = dfuDNLOAD_IDLE;
 +	}
 +}
 +
 +/** Handler for a Memory Read command issued by the host. This routine handles the preparations needed
 + *  to read subsequent data from the specified memory out to the host, as well as implementing the memory
 + *  blank check command.
 + */
 +static void ProcessMemReadCommand(void)
 +{
 +	if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00) ||                          // Read FLASH command
 +        IS_ONEBYTE_COMMAND(SentCommand.Data, 0x02))                            // Read EEPROM command
 +	{
 +		/* Load in the start and ending read addresses */
 +		LoadStartEndAddresses();
 +
 +		/* Set the state so that the next UPLOAD requests read out the firmware */
 +		DFU_State = dfuUPLOAD_IDLE;
 +	}
 +	else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01))                       // Blank check FLASH command
 +	{
 +		uint32_t CurrFlashAddress = 0;
 +
 +		while (CurrFlashAddress < BOOT_START_ADDR)
 +		{
 +			/* Check if the current byte is not blank */
 +			#if (FLASHEND > 0xFFFF)
 +			if (pgm_read_byte_far(CurrFlashAddress) != 0xFF)
 +			#else
 +			if (pgm_read_byte(CurrFlashAddress) != 0xFF)
 +			#endif
 +			{
 +				/* Save the location of the first non-blank byte for response back to the host */
 +				Flash64KBPage = (CurrFlashAddress >> 16);
 +				StartAddr     = CurrFlashAddress;
 +			
 +				/* Set state and status variables to the appropriate error values */
 +				DFU_State  = dfuERROR;
 +				DFU_Status = errCHECK_ERASED;
 +
 +				break;
 +			}
 +
 +			CurrFlashAddress++;
 +		}
 +	}
 +}
 +
 +/** Handler for a Data Write command issued by the host. This routine handles non-programming commands such as
 + *  bootloader exit (both via software jumps and hardware watchdog resets) and flash memory erasure.
 + */
 +static void ProcessWriteCommand(void)
 +{
 +	if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x03))                            // Start application
 +	{
 +		/* Indicate that the bootloader is terminating */
 +		WaitForExit = true;
 +
 +		/* Check if data supplied for the Start Program command - no data executes the program */
 +		if (SentCommand.DataSize)
 +		{
 +			if (SentCommand.Data[1] == 0x01)                                   // Start via jump
 +			{
 +				union
 +				{
 +					uint8_t  Bytes[2];
 +					AppPtr_t FuncPtr;
 +				} Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}};
 +
 +				/* Load in the jump address into the application start address pointer */
 +				AppStartPtr = Address.FuncPtr;
 +			}
 +		}
 +		else
 +		{
 +			if (SentCommand.Data[1] == 0x00)                                   // Start via watchdog
 +			{
 +				/* Start the watchdog to reset the AVR once the communications are finalized */
 +				wdt_enable(WDTO_250MS);
 +			}
 +			else                                                               // Start via jump
 +			{
 +				/* Set the flag to terminate the bootloader at next opportunity */
 +				RunBootloader = false;
 +			}
 +		}
 +	}
 +	else if (IS_TWOBYTE_COMMAND(SentCommand.Data, 0x00, 0xFF))                 // Erase flash
 +	{
 +		uint32_t CurrFlashAddress = 0;
 +
 +		/* Clear the application section of flash */
 +		while (CurrFlashAddress < BOOT_START_ADDR)
 +		{
 +			boot_page_erase(CurrFlashAddress);
 +			boot_spm_busy_wait();
 +			boot_page_write(CurrFlashAddress);
 +			boot_spm_busy_wait();
 +
 +			CurrFlashAddress += SPM_PAGESIZE;
 +		}
 +
 +		/* Re-enable the RWW section of flash as writing to the flash locks it out */
 +		boot_rww_enable();
 +					
 +		/* Memory has been erased, reset the security bit so that programming/reading is allowed */
 +//		IsSecure = false;
 +	}
 +}
 +
 +/** Handler for a Data Read command issued by the host. This routine handles bootloader information retrieval
 + *  commands such as device signature and bootloader version retrieval.
 + */
 +static void ProcessReadCommand(void)
 +{
 +	const uint8_t BootloaderInfo[3] = {BOOTLOADER_VERSION, BOOTLOADER_ID_BYTE1, BOOTLOADER_ID_BYTE2};
 +	const uint8_t SignatureInfo[3]  = {AVR_SIGNATURE_1,    AVR_SIGNATURE_2,     AVR_SIGNATURE_3};
 +
 +	uint8_t DataIndexToRead = SentCommand.Data[1];
 +
 +	if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x00))                         // Read bootloader info
 +	  ResponseByte = BootloaderInfo[DataIndexToRead];
 +	else if (IS_ONEBYTE_COMMAND(SentCommand.Data, 0x01))                    // Read signature byte
 +	  ResponseByte = SignatureInfo[DataIndexToRead - 0x30];
 +}
 diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h b/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h new file mode 100755 index 0000000..4fb236e --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/Arduino-usbdfu.h @@ -0,0 +1,220 @@ +/*
 +             LUFA Library
 +     Copyright (C) Dean Camera, 2010.
 +              
 +  dean [at] fourwalledcubicle [dot] com
 +      www.fourwalledcubicle.com
 +*/
 +
 +/*
 +  Copyright 2010  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
 +  without fee, provided that the above copyright notice appear in 
 +  all copies and that both that the copyright notice and this
 +  permission notice and warranty disclaimer appear in supporting 
 +  documentation, and that the name of the author not be used in 
 +  advertising or publicity pertaining to distribution of the 
 +  software without specific, written prior permission.
 +
 +  The author disclaim all warranties with regard to this
 +  software, including all implied warranties of merchantability
 +  and fitness.  In no event shall the author be liable for any
 +  special, indirect or consequential damages or any damages
 +  whatsoever resulting from loss of use, data or profits, whether
 +  in an action of contract, negligence or other tortious action,
 +  arising out of or in connection with the use or performance of
 +  this software.
 +*/
 +
 +/** \file
 + *
 + *  Header file for Arduino-usbdfu.c.
 + */
 +
 +#ifndef _ARDUINO_USB_DFU_BOOTLOADER_H_
 +#define _ARDUINO_USB_DFU_BOOTLOADER_H_
 +
 +	/* Includes: */
 +		#include <avr/io.h>
 +		#include <avr/wdt.h>
 +		#include <avr/boot.h>
 +		#include <avr/pgmspace.h>
 +		#include <avr/eeprom.h>
 +		#include <avr/power.h>
 +		#include <avr/interrupt.h>
 +		#include <stdbool.h>
 +	
 +		#include "Descriptors.h"
 +		
 +		#include <LUFA/Drivers/Board/LEDs.h>
 +		#include <LUFA/Drivers/USB/USB.h>
 +	
 +	/* Macros: */
 +		/** LED mask for the library LED driver, to indicate TX activity. */
 +		#define LEDMASK_TX               LEDS_LED1
 +
 +		/** LED mask for the library LED driver, to indicate RX activity. */
 +		#define LEDMASK_RX               LEDS_LED2
 +		
 +		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
 +		#define LEDMASK_ERROR            (LEDS_LED1 | LEDS_LED2)
 +		
 +		/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
 +		#define LEDMASK_BUSY             (LEDS_LED1 | LEDS_LED2)		
 +	
 +		/** Configuration define. Define this token to true to case the bootloader to reject all memory commands
 +		 *  until a memory erase has been performed. When used in conjunction with the lockbits of the AVR, this
 +		 *  can protect the AVR's firmware from being dumped from a secured AVR. When false, memory operations are
 +		 *  allowed at any time.
 +		 */
 +//		#define SECURE_MODE              false
 +
 +		/** Major bootloader version number. */
 +		#define BOOTLOADER_VERSION_MINOR 2
 +
 +		/** Minor bootloader version number. */
 +		#define BOOTLOADER_VERSION_REV   0
 +
 +		/** Complete bootloader version number expressed as a packed byte, constructed from the 
 +		 *  two individual bootloader version macros.
 +		 */
 +		#define BOOTLOADER_VERSION       ((BOOTLOADER_VERSION_MINOR << 4) | BOOTLOADER_VERSION_REV)
 +
 +		/** First byte of the bootloader identification bytes, used to identify a device's bootloader. */
 +		#define BOOTLOADER_ID_BYTE1      0xDC
 +
 +		/** Second byte of the bootloader identification bytes, used to identify a device's bootloader. */
 +		#define BOOTLOADER_ID_BYTE2      0xFB
 +		
 +		/** Convenience macro, used to determine if the issued command is the given one-byte long command.
 +		 *
 +		 *  \param[in] dataarr  Command byte array to check against
 +		 *  \param[in] cb1      First command byte to check
 +		 */
 +		#define IS_ONEBYTE_COMMAND(dataarr, cb1)       (dataarr[0] == (cb1))
 +
 +		/** Convenience macro, used to determine if the issued command is the given two-byte long command.
 +		 *
 +		 *  \param[in] dataarr  Command byte array to check against
 +		 *  \param[in] cb1      First command byte to check
 +		 *  \param[in] cb2      Second command byte to check
 +		 */
 +		#define IS_TWOBYTE_COMMAND(dataarr, cb1, cb2) ((dataarr[0] == (cb1)) && (dataarr[1] == (cb2)))
 +	
 +		/** Length of the DFU file suffix block, appended to the end of each complete memory write command.
 +		 *  The DFU file suffix is currently unused (but is designed to give extra file information, such as
 +		 *  a CRC of the complete firmware for error checking) and so is discarded.
 +		 */
 +		#define DFU_FILE_SUFFIX_SIZE     16
 +
 +		/** Length of the DFU file filler block, appended to the start of each complete memory write command.
 +		 *  Filler bytes are added to the start of each complete memory write command, and must be discarded.
 +		 */
 +		#define DFU_FILLER_BYTES_SIZE    26
 +	
 +		/** DFU class command request to detach from the host. */
 +		#define DFU_DETATCH              0x00
 +
 +		/** DFU class command request to send data from the host to the bootloader. */
 +		#define DFU_DNLOAD               0x01
 +
 +		/** DFU class command request to send data from the bootloader to the host. */
 +		#define DFU_UPLOAD               0x02
 +
 +		/** DFU class command request to get the current DFU status and state from the bootloader. */
 +		#define DFU_GETSTATUS            0x03
 +
 +		/** DFU class command request to reset the current DFU status and state variables to their defaults. */
 +		#define DFU_CLRSTATUS            0x04
 +
 +		/** DFU class command request to get the current DFU state of the bootloader. */
 +		#define DFU_GETSTATE             0x05
 +
 +		/** DFU class command request to abort the current multi-request transfer and return to the dfuIDLE state. */
 +		#define DFU_ABORT                0x06
 +
 +		/** DFU command to begin programming the device's memory. */
 +		#define COMMAND_PROG_START       0x01
 +
 +		/** DFU command to begin reading the device's memory. */
 +		#define COMMAND_DISP_DATA        0x03
 +
 +		/** DFU command to issue a write command. */
 +		#define COMMAND_WRITE            0x04
 +
 +		/** DFU command to issue a read command. */
 +		#define COMMAND_READ             0x05
 +
 +		/** DFU command to issue a memory base address change command, to set the current 64KB flash page
 +		 *  that subsequent flash operations should use. */
 +		#define COMMAND_CHANGE_BASE_ADDR 0x06
 +
 +	/* Type Defines: */
 +		/** Type define for a non-returning function pointer to the loaded application. */
 +		typedef void (*AppPtr_t)(void) ATTR_NO_RETURN;
 +		
 +		/** Type define for a structure containing a complete DFU command issued by the host. */
 +		typedef struct
 +		{
 +			uint8_t  Command; /**< Single byte command to perform, one of the COMMAND_* macro values */
 +			uint8_t  Data[5]; /**< Command parameters */
 +			uint16_t DataSize; /**< Size of the command parameters */
 +		} DFU_Command_t;
 +
 +	/* Enums: */
 +		/** DFU bootloader states. Refer to the DFU class specification for information on each state. */
 +		enum DFU_State_t
 +		{
 +			appIDLE                      = 0,
 +			appDETACH                    = 1,
 +			dfuIDLE                      = 2,
 +			dfuDNLOAD_SYNC               = 3,
 +			dfuDNBUSY                    = 4,
 +			dfuDNLOAD_IDLE               = 5,
 +			dfuMANIFEST_SYNC             = 6,
 +			dfuMANIFEST                  = 7,
 +			dfuMANIFEST_WAIT_RESET       = 8,
 +			dfuUPLOAD_IDLE               = 9,
 +			dfuERROR	                 = 10
 +		};
 +
 +		/** DFU command status error codes. Refer to the DFU class specification for information on each error code. */
 +		enum DFU_Status_t
 +		{
 +			OK                           = 0,
 +			errTARGET                    = 1,
 +			errFILE                      = 2,
 +			errWRITE                     = 3,
 +			errERASE                     = 4,
 +			errCHECK_ERASED              = 5,
 +			errPROG                      = 6,
 +			errVERIFY                    = 7,
 +			errADDRESS                   = 8,
 +			errNOTDONE                   = 9,
 +			errFIRMWARE                  = 10,
 +			errVENDOR                    = 11,
 +			errUSBR                      = 12,
 +			errPOR                       = 13,
 +			errUNKNOWN                   = 14,
 +			errSTALLEDPKT	             = 15
 +		};
 +				
 +	/* Function Prototypes: */
 +		void SetupHardware(void);
 +		void ResetHardware(void);
 +
 +		void EVENT_USB_Device_UnhandledControlRequest(void);
 +
 +		#if defined(INCLUDE_FROM_BOOTLOADER_C)
 +			static void DiscardFillerBytes(uint8_t NumberOfBytes);
 +			static void ProcessBootloaderCommand(void);
 +			static void LoadStartEndAddresses(void);
 +			static void ProcessMemProgCommand(void);
 +			static void ProcessMemReadCommand(void);
 +			static void ProcessWriteCommand(void);
 +			static void ProcessReadCommand(void);
 +		#endif
 +		
 +#endif /* _ARDUINO_USB_DFU_BOOTLOADER_H_ */
 diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h b/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h new file mode 100755 index 0000000..152e8f5 --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/Board/LEDs.h @@ -0,0 +1,110 @@ +/*
 +             LUFA Library
 +     Copyright (C) Dean Camera, 2010.
 +              
 +  dean [at] fourwalledcubicle [dot] com
 +      www.fourwalledcubicle.com
 +*/
 +
 +/*
 +  Copyright 2010  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
 +  without fee, provided that the above copyright notice appear in 
 +  all copies and that both that the copyright notice and this
 +  permission notice and warranty disclaimer appear in supporting 
 +  documentation, and that the name of the author not be used in 
 +  advertising or publicity pertaining to distribution of the 
 +  software without specific, written prior permission.
 +
 +  The author disclaim all warranties with regard to this
 +  software, including all implied warranties of merchantability
 +  and fitness.  In no event shall the author be liable for any
 +  special, indirect or consequential damages or any damages
 +  whatsoever resulting from loss of use, data or profits, whether
 +  in an action of contract, negligence or other tortious action,
 +  arising out of or in connection with the use or performance of
 +  this software.
 +*/
 +
 +/*
 +   Board LEDs driver for the Benito board, from www.dorkbotpdx.org.
 +*/
 +
 +#ifndef __LEDS_ARDUINOUNO_H__
 +#define __LEDS_ARDUINOUNO_H__
 +
 +	/* Includes: */
 +		#include <avr/io.h>
 +
 +/* Enable C linkage for C++ Compilers: */
 +		#if defined(__cplusplus)
 +			extern "C" {
 +		#endif
 +
 +	/* Preprocessor Checks: */
 +		#if !defined(INCLUDE_FROM_LEDS_H)
 +			#error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
 +		#endif
 +
 +	/* Public Interface - May be used in end-application: */
 +		/* Macros: */
 +			/** LED mask for the first LED on the board. */
 +			#define LEDS_LED1        (1 << 5)
 +
 +			/** LED mask for the second LED on the board. */
 +			#define LEDS_LED2        (1 << 4)
 +
 +			/** LED mask for all the LEDs on the board. */
 +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2)
 +
 +			/** LED mask for the none of the board LEDs */
 +			#define LEDS_NO_LEDS     0
 +
 +		/* Inline Functions: */
 +		#if !defined(__DOXYGEN__)
 +			static inline void LEDs_Init(void)
 +			{
 +				DDRD  |= LEDS_ALL_LEDS;
 +				PORTD |= LEDS_ALL_LEDS;
 +			}
 +			
 +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
 +			{
 +				PORTD &= ~LEDMask;
 +			}
 +
 +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
 +			{
 +				PORTD |= LEDMask;
 +			}
 +
 +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
 +			{
 +				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
 +			}
 +			
 +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask)
 +			{
 +				PORTD = ((PORTD | ActiveMask) & ~LEDMask);
 +			}
 +
 +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
 +			{
 +				PORTD ^= LEDMask;
 +			}
 +			
 +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
 +			static inline uint8_t LEDs_GetLEDs(void)
 +			{
 +				return (PORTD & LEDS_ALL_LEDS);
 +			}
 +		#endif
 +
 +	/* Disable C linkage for C++ Compilers: */
 +		#if defined(__cplusplus)
 +			}
 +		#endif
 +		
 +#endif
 diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c b/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c new file mode 100755 index 0000000..4deaa06 --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.c @@ -0,0 +1,189 @@ +/*
 +             LUFA Library
 +     Copyright (C) Dean Camera, 2010.
 +              
 +  dean [at] fourwalledcubicle [dot] com
 +      www.fourwalledcubicle.com
 +*/
 +
 +/*
 +  Copyright 2010  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
 +  without fee, provided that the above copyright notice appear in 
 +  all copies and that both that the copyright notice and this
 +  permission notice and warranty disclaimer appear in supporting 
 +  documentation, and that the name of the author not be used in 
 +  advertising or publicity pertaining to distribution of the 
 +  software without specific, written prior permission.
 +
 +  The author disclaim all warranties with regard to this
 +  software, including all implied warranties of merchantability
 +  and fitness.  In no event shall the author be liable for any
 +  special, indirect or consequential damages or any damages
 +  whatsoever resulting from loss of use, data or profits, whether
 +  in an action of contract, negligence or other tortious action,
 +  arising out of or in connection with the use or performance of
 +  this software.
 +*/
 +
 +/** \file
 + *
 + *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special 
 + *  computer-readable structures which the host requests upon device enumeration, to determine
 + *  the device's capabilities and functions.  
 + */
 +
 +#include "Descriptors.h"
 +
 +/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 + *  device characteristics, including the supported USB version, control endpoint size and the
 + *  number of device configurations. The descriptor is read out by the USB host when the enumeration
 + *  process begins.
 + */
 +USB_Descriptor_Device_t DeviceDescriptor =
 +{
 +	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
 +		
 +	.USBSpecification       = VERSION_BCD(01.10),
 +	.Class                  = 0x00,
 +	.SubClass               = 0x00,
 +	.Protocol               = 0x00,
 +				
 +	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
 +		
 +	.VendorID               = 0x03EB, // Atmel
 +	.ProductID              = PRODUCT_ID_CODE, // MCU-dependent
 +	.ReleaseNumber          = 0x0000,
 +		
 +	.ManufacturerStrIndex   = NO_DESCRIPTOR,
 +	.ProductStrIndex        = 0x01,
 +	.SerialNumStrIndex      = NO_DESCRIPTOR,
 +		
 +	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
 +};
 +
 +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 + *  of the device in one of its supported configurations, including information about any device interfaces
 + *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
 + *  a configuration so that the host may correctly communicate with the USB device.
 + */
 +USB_Descriptor_Configuration_t ConfigurationDescriptor =
 +{
 +	.Config = 
 +		{
 +			.Header                   = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
 +
 +			.TotalConfigurationSize   = sizeof(USB_Descriptor_Configuration_t),
 +			.TotalInterfaces          = 1,
 +
 +			.ConfigurationNumber      = 1,
 +			.ConfigurationStrIndex    = NO_DESCRIPTOR,
 +				
 +			.ConfigAttributes         = USB_CONFIG_ATTR_BUSPOWERED,
 +			
 +			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100)
 +		},
 +		
 +	.DFU_Interface = 
 +		{
 +			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 +
 +			.InterfaceNumber        = 0,
 +			.AlternateSetting       = 0,
 +			
 +			.TotalEndpoints         = 0,
 +				
 +			.Class                  = 0xFE,
 +			.SubClass               = 0x01,
 +			.Protocol               = 0x02,
 +
 +			.InterfaceStrIndex      = NO_DESCRIPTOR
 +		},
 +		
 +	.DFU_Functional = 
 +		{
 +			.Header                 = {.Size = sizeof(USB_DFU_Functional_Descriptor_t), .Type = DTYPE_DFUFunctional},
 +			
 +			.Attributes             = (ATTR_CAN_UPLOAD | ATTR_CAN_DOWNLOAD),
 +
 +			.DetachTimeout          = 0x0000,
 +			.TransferSize           = 0x0c00,
 +		
 +			.DFUSpecification       = VERSION_BCD(01.01)
 +		}
 +};
 +
 +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests
 + *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate
 + *  via the language ID table available at USB.org what languages the device supports for its string descriptors.
 + */ 
 +USB_Descriptor_String_t LanguageString =
 +{
 +	.Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
 +		
 +	.UnicodeString          = {LANGUAGE_ID_ENG}
 +};
 +
 +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form,
 + *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device
 + *  Descriptor.
 + */
 +USB_Descriptor_String_t ProductString =
 +{
 +	#if (ARDUINO_MODEL_PID == ARDUINO_UNO_PID)
 +		.Header                 = {.Size = USB_STRING_LEN(15), .Type = DTYPE_String},
 +			
 +		.UnicodeString          = L"Arduino Uno DFU"
 +	#elif (ARDUINO_MODEL_PID == ARDUINO_MEGA2560_PID)
 +		.Header                 = {.Size = USB_STRING_LEN(21), .Type = DTYPE_String},
 +			
 +		.UnicodeString          = L"Arduino Mega 2560 DFU"
 +	#endif
 +};
 +
 +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 + *  documentation) by the application code so that the address and size of a requested descriptor can be given
 + *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
 + *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
 + *  USB host.
 + */
 +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 +                                    const uint8_t wIndex,
 +                                    void** const DescriptorAddress)
 +{
 +	const uint8_t  DescriptorType   = (wValue >> 8);
 +	const uint8_t  DescriptorNumber = (wValue & 0xFF);
 +
 +	void*    Address = NULL;
 +	uint16_t Size    = NO_DESCRIPTOR;
 +
 +	switch (DescriptorType)
 +	{
 +		case DTYPE_Device:
 +			Address = &DeviceDescriptor;
 +			Size    = sizeof(USB_Descriptor_Device_t);
 +			break;
 +		case DTYPE_Configuration: 
 +			Address = &ConfigurationDescriptor;
 +			Size    = sizeof(USB_Descriptor_Configuration_t);
 +			break;
 +		case DTYPE_String: 
 +			if (!(DescriptorNumber))
 +			{
 +				Address = &LanguageString;
 +				Size    = LanguageString.Header.Size;
 +			}
 +			else
 +			{
 +				Address = &ProductString;
 +				Size    = ProductString.Header.Size;
 +			}
 +			
 +			break;
 +	}
 +	
 +	*DescriptorAddress = Address;
 +	return Size;
 +}
 diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h b/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h new file mode 100755 index 0000000..6c93f20 --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/Descriptors.h @@ -0,0 +1,177 @@ +/*
 +             LUFA Library
 +     Copyright (C) Dean Camera, 2010.
 +              
 +  dean [at] fourwalledcubicle [dot] com
 +      www.fourwalledcubicle.com
 +*/
 +
 +/*
 +  Copyright 2010  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
 +  without fee, provided that the above copyright notice appear in 
 +  all copies and that both that the copyright notice and this
 +  permission notice and warranty disclaimer appear in supporting 
 +  documentation, and that the name of the author not be used in 
 +  advertising or publicity pertaining to distribution of the 
 +  software without specific, written prior permission.
 +
 +  The author disclaim all warranties with regard to this
 +  software, including all implied warranties of merchantability
 +  and fitness.  In no event shall the author be liable for any
 +  special, indirect or consequential damages or any damages
 +  whatsoever resulting from loss of use, data or profits, whether
 +  in an action of contract, negligence or other tortious action,
 +  arising out of or in connection with the use or performance of
 +  this software.
 +*/
 +
 +/** \file
 + *
 + *  Header file for Descriptors.c.
 + */
 +
 +#ifndef _DESCRIPTORS_H_
 +#define _DESCRIPTORS_H_
 +
 +	/* Includes: */
 +		#include <LUFA/Drivers/USB/USB.h>
 +		
 +	/* Product-specific definitions: */
 +		#define ARDUINO_UNO_PID				0x0001
 +		#define ARDUINO_MEGA2560_PID		0x0010		
 +
 +	/* Macros: */
 +		/** Descriptor type value for a DFU class functional descriptor. */
 +		#define DTYPE_DFUFunctional               0x21
 +		
 +		/** DFU attribute mask, indicating that the DFU device will detach and re-attach when a DFU_DETACH
 +		 *  command is issued, rather than the host issuing a USB Reset.
 +		 */
 +		#define ATTR_WILL_DETATCH                 (1 << 3)
 +
 +		/** DFU attribute mask, indicating that the DFU device can communicate during the manifestation phase
 +		 *  (memory programming phase).
 +		 */
 +		#define ATTR_MANEFESTATION_TOLLERANT      (1 << 2)
 +		
 +		/** DFU attribute mask, indicating that the DFU device can accept DFU_UPLOAD requests to send data from
 +		 *  the device to the host.
 +		 */		
 +		#define ATTR_CAN_UPLOAD                   (1 << 1)
 +
 +		/** DFU attribute mask, indicating that the DFU device can accept DFU_DNLOAD requests to send data from
 +		 *  the host to the device.
 +		 */		
 +		#define ATTR_CAN_DOWNLOAD                 (1 << 0)
 +
 +		#if defined(__AVR_AT90USB1287__)
 +			#define PRODUCT_ID_CODE               0x2FFB
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x97
 +			#define AVR_SIGNATURE_3               0x82
 +		#elif defined(__AVR_AT90USB1286__)
 +			#define PRODUCT_ID_CODE               0x2FFB
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x97
 +			#define AVR_SIGNATURE_3               0x82
 +		#elif defined(__AVR_AT90USB647__)
 +			#define PRODUCT_ID_CODE               0x2FF9
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x96
 +			#define AVR_SIGNATURE_3               0x82
 +		#elif defined(__AVR_AT90USB646__)
 +			#define PRODUCT_ID_CODE               0x2FF9
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x96
 +			#define AVR_SIGNATURE_3               0x82
 +		#elif defined(__AVR_ATmega32U6__)
 +			#define PRODUCT_ID_CODE               0x2FFB
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x95
 +			#define AVR_SIGNATURE_3               0x88
 +		#elif defined(__AVR_ATmega32U4__)
 +			#define PRODUCT_ID_CODE               0x2FF4
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x95
 +			#define AVR_SIGNATURE_3               0x87
 +		#elif defined(__AVR_ATmega32U2__)
 +			#define PRODUCT_ID_CODE               0x2FF0
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x95
 +			#define AVR_SIGNATURE_3               0x8A
 +		#elif defined(__AVR_ATmega16U4__)
 +			#define PRODUCT_ID_CODE               0x2FF3
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x94
 +			#define AVR_SIGNATURE_3               0x88
 +		#elif defined(__AVR_ATmega16U2__)
 +			#define PRODUCT_ID_CODE               0x2FEF
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x94
 +			#define AVR_SIGNATURE_3               0x89
 +		#elif defined(__AVR_AT90USB162__)
 +			#define PRODUCT_ID_CODE               0x2FFA
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x94
 +			#define AVR_SIGNATURE_3               0x82
 +		#elif defined(__AVR_AT90USB82__)
 +			#define PRODUCT_ID_CODE               0x2FEE
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x93
 +			#define AVR_SIGNATURE_3               0x89
 +		#elif defined(__AVR_ATmega8U2__)
 +			#define PRODUCT_ID_CODE               0x2FF7
 +			#define AVR_SIGNATURE_1               0x1E
 +			#define AVR_SIGNATURE_2               0x93
 +			#define AVR_SIGNATURE_3               0x82
 +		#else
 +			#error The selected AVR part is not currently supported by this bootloader.
 +		#endif
 +		
 +		#if !defined(PRODUCT_ID_CODE)
 +			#error Current AVR model is not supported by this bootloader.
 +		#endif
 +	
 +	/* Type Defines: */
 +		/** Type define for a DFU class function descriptor. This descriptor gives DFU class information
 +		 *  to the host when read, indicating the DFU device's capabilities.
 +		 */
 +		typedef struct
 +		{
 +			USB_Descriptor_Header_t               Header; /**< Standard descriptor header structure */
 +			
 +			uint8_t                               Attributes; /**< DFU device attributes, a mask comprising of the
 +			                                                    *  ATTR_* macros listed in this source file
 +			                                                    */
 +			uint16_t                              DetachTimeout; /**< Timeout in milliseconds between a USB_DETACH
 +			                                                        *  command being issued and the device detaching
 +			                                                        *  from the USB bus
 +			                                                        */																	
 +			uint16_t                              TransferSize; /**< Maximum number of bytes the DFU device can accept
 +			                                                      *  from the host in a transaction
 +			                                                      */			
 +			uint16_t                              DFUSpecification;	/**< BCD packed DFU specification number this DFU
 +			                                                          *  device complies with
 +			                                                          */
 +		} USB_DFU_Functional_Descriptor_t;
 +	
 +		/** Type define for the device configuration descriptor structure. This must be defined in the
 +		 *  application code, as the configuration descriptor contains several sub-descriptors which
 +		 *  vary between devices, and which describe the device's usage to the host.
 +		 */
 +		typedef struct
 +		{
 +			USB_Descriptor_Configuration_Header_t Config;
 +			USB_Descriptor_Interface_t            DFU_Interface;
 +			USB_DFU_Functional_Descriptor_t       DFU_Functional;
 +		} USB_Descriptor_Configuration_t;
 +		
 +	/* Function Prototypes: */
 +		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 +		                                    const uint8_t wIndex,
 +		                                    void** const DescriptorAddress) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
 +
 +#endif
 diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/makefile b/firmwares/atmegaxxu2/arduino-usbdfu/makefile new file mode 100755 index 0000000..1fb4ed3 --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/makefile @@ -0,0 +1,710 @@ +# Hey Emacs, this is a -*- makefile -*-
 +#----------------------------------------------------------------------------
 +# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
 +#  >> Modified for use with the LUFA project. <<
 +#
 +# Released to the Public Domain
 +#
 +# Additional material for this makefile was written by:
 +# Peter Fleury
 +# Tim Henigan
 +# Colin O'Flynn
 +# Reiner Patommel
 +# Markus Pfaff
 +# Sander Pool
 +# Frederik Rouleau
 +# Carlos Lamas
 +# Dean Camera
 +# Opendous Inc.
 +# Denver Gingerich
 +#
 +#----------------------------------------------------------------------------
 +# On command line:
 +#
 +# make all = Make software.
 +#
 +# make clean = Clean out built project files.
 +#
 +# make coff = Convert ELF to AVR COFF.
 +#
 +# make extcoff = Convert ELF to AVR Extended COFF.
 +#
 +# make program = Download the hex file to the device, using avrdude.
 +#                Please customize the avrdude settings below first!
 +#
 +# make doxygen = Generate DoxyGen documentation for the project (must have
 +#                DoxyGen installed)
 +#
 +# make debug = Start either simulavr or avarice as specified for debugging, 
 +#              with avr-gdb or avr-insight as the front end for debugging.
 +#
 +# make filename.s = Just compile filename.c into the assembler code only.
 +#
 +# make filename.i = Create a preprocessed source file for use in submitting
 +#                   bug reports to the GCC project.
 +#
 +# To rebuild project do "make clean" then "make all".
 +#----------------------------------------------------------------------------
 +
 +
 +# MCU name
 +MCU = atmega8u2
 +MCU_AVRDUDE = at90usb82
 +
 +# Specify the Arduino model using the assigned PID.  This is used by Descriptors.c
 +#   to set the product descriptor string (for DFU we must use the PID for each
 +#   chip that dfu-bootloader or Flip expect)
 +# Uno PID:
 +ARDUINO_MODEL_PID = 0x0001
 +# Mega 2560 PID:
 +#ARDUINO_MODEL_PID = 0x0010
 +
 +# Target board (see library "Board Types" documentation, NONE for projects not requiring
 +# LUFA board drivers). If USER is selected, put custom board drivers in a directory called 
 +# "Board" inside the application directory.
 +BOARD  = USER
 +
 +
 +# Processor frequency.
 +#     This will define a symbol, F_CPU, in all source code files equal to the 
 +#     processor frequency in Hz. You can then use this symbol in your source code to 
 +#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
 +#     automatically to create a 32-bit value in your source code.
 +#
 +#     This will be an integer division of F_CLOCK below, as it is sourced by
 +#     F_CLOCK after it has run through any CPU prescalers. Note that this value
 +#     does not *change* the processor frequency - it should merely be updated to
 +#     reflect the processor speed set externally so that the code can use accurate
 +#     software delays.
 +F_CPU = 16000000
 +
 +
 +# Input clock frequency.
 +#     This will define a symbol, F_CLOCK, in all source code files equal to the 
 +#     input clock frequency (before any prescaling is performed) in Hz. This value may
 +#     differ from F_CPU if prescaling is used on the latter, and is required as the
 +#     raw input clock is fed directly to the PLL sections of the AVR for high speed
 +#     clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
 +#     at the end, this will be done automatically to create a 32-bit value in your
 +#     source code.
 +#
 +#     If no clock division is performed on the input clock inside the AVR (via the
 +#     CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
 +F_CLOCK = $(F_CPU)
 +
 +
 +# Starting byte address of the bootloader, as a byte address - computed via the formula
 +#   BOOT_START = ((TOTAL_FLASH_BYTES - BOOTLOADER_SECTION_SIZE_BYTES) * 1024)
 +#
 +# Note that the bootloader size and start address given in AVRStudio is in words and not
 +# bytes, and so will need to be doubled to obtain the byte address needed by AVR-GCC.
 +BOOT_START =  0x1000
 +
 +
 +# Output format. (can be srec, ihex, binary)
 +FORMAT = ihex
 +
 +
 +# Target file name (without extension).
 +TARGET = Arduino-usbdfu
 +
 +
 +# Object files directory
 +#     To put object files in current directory, use a dot (.), do NOT make
 +#     this an empty or blank macro!
 +OBJDIR = .
 +
 +
 +# Path to the LUFA library
 +LUFA_PATH = ../..
 +
 +
 +# LUFA library compile-time options and predefined tokens
 +LUFA_OPTS  = -D USB_DEVICE_ONLY
 +LUFA_OPTS += -D DEVICE_STATE_AS_GPIOR=0
 +LUFA_OPTS += -D CONTROL_ONLY_DEVICE
 +LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=32
 +LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
 +LUFA_OPTS += -D USE_RAM_DESCRIPTORS
 +LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 +LUFA_OPTS += -D NO_INTERNAL_SERIAL
 +LUFA_OPTS += -D NO_DEVICE_SELF_POWER
 +LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP
 +LUFA_OPTS += -D NO_STREAM_CALLBACKS
 +
 +
 +# Create the LUFA source path variables by including the LUFA root makefile
 +include $(LUFA_PATH)/LUFA/makefile
 +
 +
 +# List C source files here. (C dependencies are automatically generated.)
 +SRC = $(TARGET).c                                                 \
 +	  Descriptors.c                                               \
 +	  $(LUFA_SRC_USB)                                             \
 +
 +
 +# List C++ source files here. (C dependencies are automatically generated.)
 +CPPSRC = 
 +
 +
 +# List Assembler source files here.
 +#     Make them always end in a capital .S.  Files ending in a lowercase .s
 +#     will not be considered source files but generated files (assembler
 +#     output from the compiler), and will be deleted upon "make clean"!
 +#     Even though the DOS/Win* filesystem matches both .s and .S the same,
 +#     it will preserve the spelling of the filenames, and gcc itself does
 +#     care about how the name is spelled on its command-line.
 +ASRC =
 +
 +
 +# Optimization level, can be [0, 1, 2, 3, s]. 
 +#     0 = turn off optimization. s = optimize for size.
 +#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
 +OPT = s
 +
 +
 +# Debugging format.
 +#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
 +#     AVR Studio 4.10 requires dwarf-2.
 +#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
 +DEBUG = dwarf-2
 +
 +
 +# List any extra directories to look for include files here.
 +#     Each directory must be seperated by a space.
 +#     Use forward slashes for directory separators.
 +#     For a directory that has spaces, enclose it in quotes.
 +EXTRAINCDIRS = $(LUFA_PATH)/
 +
 +
 +# Compiler flag to set the C Standard level.
 +#     c89   = "ANSI" C
 +#     gnu89 = c89 plus GCC extensions
 +#     c99   = ISO C99 standard (not yet fully implemented)
 +#     gnu99 = c99 plus GCC extensions
 +CSTANDARD = -std=c99
 +
 +
 +# Place -D or -U options here for C sources
 +CDEFS  = -DF_CPU=$(F_CPU)UL
 +CDEFS += -DARDUINO_MODEL_PID=$(ARDUINO_MODEL_PID)
 +CDEFS += -DF_CLOCK=$(F_CLOCK)UL
 +CDEFS += -DBOARD=BOARD_$(BOARD)
 +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL
 +CDEFS += -DTX_RX_LED_PULSE_MS=3
 +CDEFS += $(LUFA_OPTS)
 +
 +
 +# Place -D or -U options here for ASM sources
 +ADEFS  = -DF_CPU=$(F_CPU)
 +ADEFS += -DF_CLOCK=$(F_CLOCK)UL
 +ADEFS += -DBOARD=BOARD_$(BOARD)
 +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL
 +ADEFS += $(LUFA_OPTS)
 +
 +# Place -D or -U options here for C++ sources
 +CPPDEFS  = -DF_CPU=$(F_CPU)UL
 +CPPDEFS += -DF_CLOCK=$(F_CLOCK)UL
 +CPPDEFS += -DBOARD=BOARD_$(BOARD)
 +CDEFS += -DBOOT_START_ADDR=$(BOOT_START)UL
 +CPPDEFS += $(LUFA_OPTS)
 +#CPPDEFS += -D__STDC_LIMIT_MACROS
 +#CPPDEFS += -D__STDC_CONSTANT_MACROS
 +
 +
 +
 +#---------------- Compiler Options C ----------------
 +#  -g*:          generate debugging information
 +#  -O*:          optimization level
 +#  -f...:        tuning, see GCC manual and avr-libc documentation
 +#  -Wall...:     warning level
 +#  -Wa,...:      tell GCC to pass this to the assembler.
 +#    -adhlns...: create assembler listing
 +CFLAGS = -g$(DEBUG)
 +CFLAGS += $(CDEFS)
 +CFLAGS += -O$(OPT)
 +CFLAGS += -funsigned-char
 +CFLAGS += -funsigned-bitfields
 +CFLAGS += -ffunction-sections
 +CFLAGS += -fno-inline-small-functions
 +CFLAGS += -fpack-struct
 +CFLAGS += -fshort-enums
 +CFLAGS += -fno-strict-aliasing
 +CFLAGS += -Wall
 +CFLAGS += -Wstrict-prototypes
 +#CFLAGS += -mshort-calls
 +#CFLAGS += -fno-unit-at-a-time
 +#CFLAGS += -Wundef
 +#CFLAGS += -Wunreachable-code
 +#CFLAGS += -Wsign-compare
 +CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
 +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 +CFLAGS += $(CSTANDARD)
 +
 +
 +#---------------- Compiler Options C++ ----------------
 +#  -g*:          generate debugging information
 +#  -O*:          optimization level
 +#  -f...:        tuning, see GCC manual and avr-libc documentation
 +#  -Wall...:     warning level
 +#  -Wa,...:      tell GCC to pass this to the assembler.
 +#    -adhlns...: create assembler listing
 +CPPFLAGS = -g$(DEBUG)
 +CPPFLAGS += $(CPPDEFS)
 +CPPFLAGS += -O$(OPT)
 +CPPFLAGS += -funsigned-char
 +CPPFLAGS += -funsigned-bitfields
 +CPPFLAGS += -fpack-struct
 +CPPFLAGS += -fshort-enums
 +CPPFLAGS += -fno-exceptions
 +CPPFLAGS += -Wall
 +CPPFLAGS += -Wundef
 +#CPPFLAGS += -mshort-calls
 +#CPPFLAGS += -fno-unit-at-a-time
 +#CPPFLAGS += -Wstrict-prototypes
 +#CPPFLAGS += -Wunreachable-code
 +#CPPFLAGS += -Wsign-compare
 +CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
 +CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
 +#CPPFLAGS += $(CSTANDARD)
 +
 +
 +#---------------- Assembler Options ----------------
 +#  -Wa,...:   tell GCC to pass this to the assembler.
 +#  -adhlns:   create listing
 +#  -gstabs:   have the assembler create line number information; note that
 +#             for use in COFF files, additional information about filenames
 +#             and function names needs to be present in the assembler source
 +#             files -- see avr-libc docs [FIXME: not yet described there]
 +#  -listing-cont-lines: Sets the maximum number of continuation lines of hex 
 +#       dump that will be displayed for a given single line of source input.
 +ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
 +
 +
 +#---------------- Library Options ----------------
 +# Minimalistic printf version
 +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
 +
 +# Floating point printf version (requires MATH_LIB = -lm below)
 +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
 +
 +# If this is left blank, then it will use the Standard printf version.
 +PRINTF_LIB = 
 +#PRINTF_LIB = $(PRINTF_LIB_MIN)
 +#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
 +
 +
 +# Minimalistic scanf version
 +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
 +
 +# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
 +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
 +
 +# If this is left blank, then it will use the Standard scanf version.
 +SCANF_LIB = 
 +#SCANF_LIB = $(SCANF_LIB_MIN)
 +#SCANF_LIB = $(SCANF_LIB_FLOAT)
 +
 +
 +MATH_LIB = -lm
 +
 +
 +# List any extra directories to look for libraries here.
 +#     Each directory must be seperated by a space.
 +#     Use forward slashes for directory separators.
 +#     For a directory that has spaces, enclose it in quotes.
 +EXTRALIBDIRS = 
 +
 +
 +
 +#---------------- External Memory Options ----------------
 +
 +# 64 KB of external RAM, starting after internal RAM (ATmega128!),
 +# used for variables (.data/.bss) and heap (malloc()).
 +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
 +
 +# 64 KB of external RAM, starting after internal RAM (ATmega128!),
 +# only used for heap (malloc()).
 +#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
 +
 +EXTMEMOPTS =
 +
 +
 +
 +#---------------- Linker Options ----------------
 +#  -Wl,...:     tell GCC to pass this to linker.
 +#    -Map:      create map file
 +#    --cref:    add cross reference to  map file
 +LDFLAGS  = -Wl,-Map=$(TARGET).map,--cref
 +LDFLAGS += -Wl,--section-start=.text=$(BOOT_START)
 +LDFLAGS += -Wl,--relax 
 +LDFLAGS += -Wl,--gc-sections
 +LDFLAGS += $(EXTMEMOPTS)
 +LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
 +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
 +#LDFLAGS += -T linker_script.x
 +
 +
 +
 +#---------------- Programming Options (avrdude) ----------------
 +
 +# Fuse settings for Arduino Uno DFU bootloader project
 +AVRDUDE_FUSES = -U efuse:w:0xF4:m -U hfuse:w:0xD9:m -U lfuse:w:0xFF:m 
 +
 +# Lock settings for Arduino Uno DFU bootloader project
 +AVRDUDE_LOCK = -U lock:w:0x0F:m
 +
 +# Programming hardware
 +# Type: avrdude -c ?
 +# to get a full listing.
 +#
 +AVRDUDE_PROGRAMMER = avrispmkii
 +
 +# com1 = serial port. Use lpt1 to connect to parallel port.
 +AVRDUDE_PORT = usb
 +
 +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
 +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
 +
 +# Uncomment the following if you want avrdude's erase cycle counter.
 +# Note that this counter needs to be initialized first using -Yn,
 +# see avrdude manual.
 +#AVRDUDE_ERASE_COUNTER = -y
 +
 +# Uncomment the following if you do /not/ wish a verification to be
 +# performed after programming the device.
 +#AVRDUDE_NO_VERIFY = -V
 +
 +# Increase verbosity level.  Please use this when submitting bug
 +# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> 
 +# to submit bug reports.
 +#AVRDUDE_VERBOSE = -v -v
 +
 +AVRDUDE_FLAGS = -p $(MCU_AVRDUDE) -F -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
 +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
 +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
 +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
 +
 +
 +
 +#---------------- Debugging Options ----------------
 +
 +# For simulavr only - target MCU frequency.
 +DEBUG_MFREQ = $(F_CPU)
 +
 +# Set the DEBUG_UI to either gdb or insight.
 +# DEBUG_UI = gdb
 +DEBUG_UI = insight
 +
 +# Set the debugging back-end to either avarice, simulavr.
 +DEBUG_BACKEND = avarice
 +#DEBUG_BACKEND = simulavr
 +
 +# GDB Init Filename.
 +GDBINIT_FILE = __avr_gdbinit
 +
 +# When using avarice settings for the JTAG
 +JTAG_DEV = /dev/com1
 +
 +# Debugging port used to communicate between GDB / avarice / simulavr.
 +DEBUG_PORT = 4242
 +
 +# Debugging host used to communicate between GDB / avarice / simulavr, normally
 +#     just set to localhost unless doing some sort of crazy debugging when 
 +#     avarice is running on a different computer.
 +DEBUG_HOST = localhost
 +
 +
 +
 +#============================================================================
 +
 +
 +# Define programs and commands.
 +SHELL = sh
 +CC = avr-gcc
 +OBJCOPY = avr-objcopy
 +OBJDUMP = avr-objdump
 +SIZE = avr-size
 +AR = avr-ar rcs
 +NM = avr-nm
 +AVRDUDE = avrdude
 +REMOVE = rm -f
 +REMOVEDIR = rm -rf
 +COPY = cp
 +WINSHELL = cmd
 +
 +
 +# Define Messages
 +# English
 +MSG_ERRORS_NONE = Errors: none
 +MSG_BEGIN = -------- begin --------
 +MSG_END = --------  end  --------
 +MSG_SIZE_BEFORE = Size before: 
 +MSG_SIZE_AFTER = Size after:
 +MSG_COFF = Converting to AVR COFF:
 +MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
 +MSG_FLASH = Creating load file for Flash:
 +MSG_EEPROM = Creating load file for EEPROM:
 +MSG_EXTENDED_LISTING = Creating Extended Listing:
 +MSG_SYMBOL_TABLE = Creating Symbol Table:
 +MSG_LINKING = Linking:
 +MSG_COMPILING = Compiling C:
 +MSG_COMPILING_CPP = Compiling C++:
 +MSG_ASSEMBLING = Assembling:
 +MSG_CLEANING = Cleaning project:
 +MSG_CREATING_LIBRARY = Creating library:
 +
 +
 +
 +
 +# Define all object files.
 +OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o) 
 +
 +# Define all listing files.
 +LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst) 
 +
 +
 +# Compiler flags to generate dependency files.
 +GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
 +
 +
 +# Combine all necessary flags and optional flags.
 +# Add target processor to flags.
 +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
 +ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
 +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
 +
 +
 +
 +
 +
 +# Default target.
 +all: begin gccversion sizebefore build sizeafter end
 +
 +# Change the build target to build a HEX file or a library.
 +build: elf hex eep lss sym
 +#build: lib
 +
 +
 +elf: $(TARGET).elf
 +hex: $(TARGET).hex
 +eep: $(TARGET).eep
 +lss: $(TARGET).lss
 +sym: $(TARGET).sym
 +LIBNAME=lib$(TARGET).a
 +lib: $(LIBNAME)
 +
 +
 +
 +# Eye candy.
 +# AVR Studio 3.x does not check make's exit code but relies on
 +# the following magic strings to be generated by the compile job.
 +begin:
 +	@echo
 +	@echo $(MSG_BEGIN)
 +
 +end:
 +	@echo $(MSG_END)
 +	@echo
 +
 +
 +# Display size of file.
 +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
 +ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
 +MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
 +FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
 +
 +
 +sizebefore:
 +	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
 +	2>/dev/null; echo; fi
 +
 +sizeafter:
 +	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
 +	2>/dev/null; echo; fi
 +
 +
 +
 +# Display compiler version information.
 +gccversion : 
 +	@$(CC) --version
 +
 +
 +# Program the device.  
 +program: $(TARGET).hex $(TARGET).eep
 +	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_FUSES) $(AVRDUDE_LOCK)
 +
 +
 +# Generate avr-gdb config/init file which does the following:
 +#     define the reset signal, load the target file, connect to target, and set 
 +#     a breakpoint at main().
 +gdb-config: 
 +	@$(REMOVE) $(GDBINIT_FILE)
 +	@echo define reset >> $(GDBINIT_FILE)
 +	@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
 +	@echo end >> $(GDBINIT_FILE)
 +	@echo file $(TARGET).elf >> $(GDBINIT_FILE)
 +	@echo target remote $(DEBUG_HOST):$(DEBUG_PORT)  >> $(GDBINIT_FILE)
 +ifeq ($(DEBUG_BACKEND),simulavr)
 +	@echo load  >> $(GDBINIT_FILE)
 +endif
 +	@echo break main >> $(GDBINIT_FILE)
 +
 +debug: gdb-config $(TARGET).elf
 +ifeq ($(DEBUG_BACKEND), avarice)
 +	@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
 +	@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
 +	$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
 +	@$(WINSHELL) /c pause
 +
 +else
 +	@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
 +	$(DEBUG_MFREQ) --port $(DEBUG_PORT)
 +endif
 +	@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
 +
 +
 +
 +
 +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
 +COFFCONVERT = $(OBJCOPY) --debugging
 +COFFCONVERT += --change-section-address .data-0x800000
 +COFFCONVERT += --change-section-address .bss-0x800000
 +COFFCONVERT += --change-section-address .noinit-0x800000
 +COFFCONVERT += --change-section-address .eeprom-0x810000
 +
 +
 +
 +coff: $(TARGET).elf
 +	@echo
 +	@echo $(MSG_COFF) $(TARGET).cof
 +	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
 +
 +
 +extcoff: $(TARGET).elf
 +	@echo
 +	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
 +	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
 +
 +
 +
 +# Create final output files (.hex, .eep) from ELF output file.
 +%.hex: %.elf
 +	@echo
 +	@echo $(MSG_FLASH) $@
 +	$(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock $< $@
 +
 +%.eep: %.elf
 +	@echo
 +	@echo $(MSG_EEPROM) $@
 +	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
 +	--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
 +
 +# Create extended listing file from ELF output file.
 +%.lss: %.elf
 +	@echo
 +	@echo $(MSG_EXTENDED_LISTING) $@
 +	$(OBJDUMP) -h -S -z $< > $@
 +
 +# Create a symbol table from ELF output file.
 +%.sym: %.elf
 +	@echo
 +	@echo $(MSG_SYMBOL_TABLE) $@
 +	$(NM) -n $< > $@
 +
 +
 +
 +# Create library from object files.
 +.SECONDARY : $(TARGET).a
 +.PRECIOUS : $(OBJ)
 +%.a: $(OBJ)
 +	@echo
 +	@echo $(MSG_CREATING_LIBRARY) $@
 +	$(AR) $@ $(OBJ)
 +
 +
 +# Link: create ELF output file from object files.
 +.SECONDARY : $(TARGET).elf
 +.PRECIOUS : $(OBJ)
 +%.elf: $(OBJ)
 +	@echo
 +	@echo $(MSG_LINKING) $@
 +	$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
 +
 +
 +# Compile: create object files from C source files.
 +$(OBJDIR)/%.o : %.c
 +	@echo
 +	@echo $(MSG_COMPILING) $<
 +	$(CC) -c $(ALL_CFLAGS) $< -o $@ 
 +
 +
 +# Compile: create object files from C++ source files.
 +$(OBJDIR)/%.o : %.cpp
 +	@echo
 +	@echo $(MSG_COMPILING_CPP) $<
 +	$(CC) -c $(ALL_CPPFLAGS) $< -o $@ 
 +
 +
 +# Compile: create assembler files from C source files.
 +%.s : %.c
 +	$(CC) -S $(ALL_CFLAGS) $< -o $@
 +
 +
 +# Compile: create assembler files from C++ source files.
 +%.s : %.cpp
 +	$(CC) -S $(ALL_CPPFLAGS) $< -o $@
 +
 +
 +# Assemble: create object files from assembler source files.
 +$(OBJDIR)/%.o : %.S
 +	@echo
 +	@echo $(MSG_ASSEMBLING) $<
 +	$(CC) -c $(ALL_ASFLAGS) $< -o $@
 +
 +
 +# Create preprocessed source for use in sending a bug report.
 +%.i : %.c
 +	$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ 
 +
 +
 +# Target: clean project.
 +clean: begin clean_list end
 +
 +clean_list :
 +	@echo
 +	@echo $(MSG_CLEANING)
 +	$(REMOVE) $(TARGET).hex
 +	$(REMOVE) $(TARGET).eep
 +	$(REMOVE) $(TARGET).cof
 +	$(REMOVE) $(TARGET).elf
 +	$(REMOVE) $(TARGET).map
 +	$(REMOVE) $(TARGET).sym
 +	$(REMOVE) $(TARGET).lss
 +	$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o)
 +	$(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst)
 +	$(REMOVE) $(SRC:.c=.s)
 +	$(REMOVE) $(SRC:.c=.d)
 +	$(REMOVE) $(SRC:.c=.i)
 +	$(REMOVEDIR) .dep
 +
 +doxygen:
 +	@echo Generating Project Documentation...
 +	@doxygen Doxygen.conf
 +	@echo Documentation Generation Complete.
 +
 +clean_doxygen:
 +	rm -rf Documentation
 +
 +# Create object files directory
 +$(shell mkdir $(OBJDIR) 2>/dev/null)
 +
 +
 +# Include the dependency files.
 +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
 +
 +
 +# Listing of phony targets.
 +.PHONY : all begin finish end sizebefore sizeafter gccversion \
 +build elf hex eep lss sym coff extcoff doxygen clean          \
 +clean_list clean_doxygen program debug gdb-config
 diff --git a/firmwares/atmegaxxu2/arduino-usbdfu/readme.txt b/firmwares/atmegaxxu2/arduino-usbdfu/readme.txt new file mode 100644 index 0000000..e376679 --- /dev/null +++ b/firmwares/atmegaxxu2/arduino-usbdfu/readme.txt @@ -0,0 +1,7 @@ +To setup the project and program an ATMEG8U2 with the Arduino USB DFU bootloader: +1. unpack the source into LUFA's Bootloader directory +2. set ARDUINO_MODEL_PID in the makefile as appropriate  +3. do "make clean; make; make program" + +Check that the board enumerates as either "Arduino Uno DFU" or "Arduino Mega 2560 DFU".  Test by uploading the Arduino-usbserial application firmware (see instructions in Arduino-usbserial directory) + | 
