Merge commit '60b30c0363' as 'lib/lufa'
				
					
				
			This commit is contained in:
		
						commit
						8655d4f494
					
				
					 1455 changed files with 394541 additions and 0 deletions
				
			
		
							
								
								
									
										75
									
								
								lib/lufa/Bootloaders/CDC/BootloaderAPI.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								lib/lufa/Bootloaders/CDC/BootloaderAPI.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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
 | ||||
|  * | ||||
|  *  Bootloader user application API functions. | ||||
|  */ | ||||
| 
 | ||||
| #include "BootloaderAPI.h" | ||||
| 
 | ||||
| void BootloaderAPI_ErasePage(const uint32_t Address) | ||||
| { | ||||
| 	boot_page_erase_safe(Address); | ||||
| 	boot_spm_busy_wait(); | ||||
| 	boot_rww_enable(); | ||||
| } | ||||
| 
 | ||||
| void BootloaderAPI_WritePage(const uint32_t Address) | ||||
| { | ||||
| 	boot_page_write_safe(Address); | ||||
| 	boot_spm_busy_wait(); | ||||
| 	boot_rww_enable(); | ||||
| } | ||||
| 
 | ||||
| void BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word) | ||||
| { | ||||
| 	boot_page_fill_safe(Address, Word); | ||||
| } | ||||
| 
 | ||||
| uint8_t BootloaderAPI_ReadSignature(const uint16_t Address) | ||||
| { | ||||
| 	return boot_signature_byte_get(Address); | ||||
| } | ||||
| 
 | ||||
| uint8_t BootloaderAPI_ReadFuse(const uint16_t Address) | ||||
| { | ||||
| 	return boot_lock_fuse_bits_get(Address); | ||||
| } | ||||
| 
 | ||||
| uint8_t BootloaderAPI_ReadLock(void) | ||||
| { | ||||
| 	return boot_lock_fuse_bits_get(GET_LOCK_BITS); | ||||
| } | ||||
| 
 | ||||
| void BootloaderAPI_WriteLock(const uint8_t LockBits) | ||||
| { | ||||
| 	boot_lock_bits_set_safe(LockBits); | ||||
| } | ||||
							
								
								
									
										58
									
								
								lib/lufa/Bootloaders/CDC/BootloaderAPI.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								lib/lufa/Bootloaders/CDC/BootloaderAPI.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,58 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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 BootloaderAPI.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _BOOTLOADER_API_H_ | ||||
| #define _BOOTLOADER_API_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/boot.h> | ||||
| 		#include <stdbool.h> | ||||
| 
 | ||||
| 		#include <LUFA/Common/Common.h> | ||||
| 
 | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		void    BootloaderAPI_ErasePage(const uint32_t Address); | ||||
| 		void    BootloaderAPI_WritePage(const uint32_t Address); | ||||
| 		void    BootloaderAPI_FillWord(const uint32_t Address, const uint16_t Word); | ||||
| 		uint8_t BootloaderAPI_ReadSignature(const uint16_t Address); | ||||
| 		uint8_t BootloaderAPI_ReadFuse(const uint16_t Address); | ||||
| 		uint8_t BootloaderAPI_ReadLock(void); | ||||
| 		void    BootloaderAPI_WriteLock(const uint8_t LockBits); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
							
								
								
									
										91
									
								
								lib/lufa/Bootloaders/CDC/BootloaderAPITable.S
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								lib/lufa/Bootloaders/CDC/BootloaderAPITable.S
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,91 @@ | |||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /* | ||||
|   Copyright 2017  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 disclaims 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. | ||||
| */ | ||||
| 
 | ||||
| ; Trampolines to actual API implementations if the target address is outside the
 | ||||
| ; range of a rjmp instruction (can happen with large bootloader sections)
 | ||||
| .section .apitable_trampolines, "ax" | ||||
| .global BootloaderAPI_Trampolines
 | ||||
| BootloaderAPI_Trampolines: | ||||
| 
 | ||||
| 	BootloaderAPI_ErasePage_Trampoline: | ||||
| 		jmp BootloaderAPI_ErasePage | ||||
| 	BootloaderAPI_WritePage_Trampoline: | ||||
| 		jmp BootloaderAPI_WritePage | ||||
| 	BootloaderAPI_FillWord_Trampoline: | ||||
| 		jmp BootloaderAPI_FillWord | ||||
| 	BootloaderAPI_ReadSignature_Trampoline: | ||||
| 		jmp BootloaderAPI_ReadSignature | ||||
| 	BootloaderAPI_ReadFuse_Trampoline: | ||||
| 		jmp BootloaderAPI_ReadFuse | ||||
| 	BootloaderAPI_ReadLock_Trampoline: | ||||
| 		jmp BootloaderAPI_ReadLock | ||||
| 	BootloaderAPI_WriteLock_Trampoline: | ||||
| 		jmp BootloaderAPI_WriteLock | ||||
| 	BootloaderAPI_UNUSED1: | ||||
| 		ret | ||||
| 	BootloaderAPI_UNUSED2: | ||||
| 		ret | ||||
| 	BootloaderAPI_UNUSED3: | ||||
| 		ret | ||||
| 	BootloaderAPI_UNUSED4: | ||||
| 		ret | ||||
| 	BootloaderAPI_UNUSED5: | ||||
| 		ret | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ; API function jump table
 | ||||
| .section .apitable_jumptable, "ax" | ||||
| .global BootloaderAPI_JumpTable
 | ||||
| BootloaderAPI_JumpTable: | ||||
| 
 | ||||
| 	rjmp BootloaderAPI_ErasePage_Trampoline | ||||
| 	rjmp BootloaderAPI_WritePage_Trampoline | ||||
| 	rjmp BootloaderAPI_FillWord_Trampoline | ||||
| 	rjmp BootloaderAPI_ReadSignature_Trampoline | ||||
| 	rjmp BootloaderAPI_ReadFuse_Trampoline | ||||
| 	rjmp BootloaderAPI_ReadLock_Trampoline | ||||
| 	rjmp BootloaderAPI_WriteLock_Trampoline | ||||
| 	rjmp BootloaderAPI_UNUSED1 ; UNUSED ENTRY 1
 | ||||
| 	rjmp BootloaderAPI_UNUSED2 ; UNUSED ENTRY 2
 | ||||
| 	rjmp BootloaderAPI_UNUSED3 ; UNUSED ENTRY 3
 | ||||
| 	rjmp BootloaderAPI_UNUSED4 ; UNUSED ENTRY 4
 | ||||
| 	rjmp BootloaderAPI_UNUSED5 ; UNUSED ENTRY 5
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ; Bootloader table signatures and information
 | ||||
| .section .apitable_signatures, "ax" | ||||
| .global BootloaderAPI_Signatures
 | ||||
| BootloaderAPI_Signatures: | ||||
| 
 | ||||
| 	.long BOOT_START_ADDR ; Start address of the bootloader
 | ||||
| 	.word 0xDF00 ; Signature for the CDC class bootloader
 | ||||
| 	.word 0xDCFB ; Signature for a LUFA class bootloader
 | ||||
							
								
								
									
										673
									
								
								lib/lufa/Bootloaders/CDC/BootloaderCDC.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										673
									
								
								lib/lufa/Bootloaders/CDC/BootloaderCDC.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,673 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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 CDC class bootloader. This file contains the complete bootloader logic. | ||||
|  */ | ||||
| 
 | ||||
| #define  INCLUDE_FROM_BOOTLOADERCDC_C | ||||
| #include "BootloaderCDC.h" | ||||
| 
 | ||||
| /** 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. | ||||
|  */ | ||||
| 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.) | ||||
|  */ | ||||
| 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. | ||||
|  */ | ||||
| static bool RunBootloader = true; | ||||
| 
 | ||||
| /** Magic lock for forced application start. If the HWBE fuse is programmed and BOOTRST is unprogrammed, the bootloader
 | ||||
|  *  will start if the /HWB line of the AVR is held low and the system is reset. However, if the /HWB line is still held | ||||
|  *  low when the application attempts to start via a watchdog reset, the bootloader will re-start. If set to the value | ||||
|  *  \ref MAGIC_BOOT_KEY the special init function \ref Application_Jump_Check() will force the application to start. | ||||
|  */ | ||||
| uint16_t MagicBootKey ATTR_NO_INIT; | ||||
| 
 | ||||
| 
 | ||||
| /** Special startup routine to check if the bootloader was started via a watchdog reset, and if the magic application
 | ||||
|  *  start key has been loaded into \ref MagicBootKey. If the bootloader started via the watchdog and the key is valid, | ||||
|  *  this will force the user application to start via a software jump. | ||||
|  */ | ||||
| void Application_Jump_Check(void) | ||||
| { | ||||
| 	bool JumpToApplication = false; | ||||
| 
 | ||||
| 	#if (BOARD == BOARD_LEONARDO) | ||||
| 		/* Enable pull-up on the IO13 pin so we can use it to select the mode */ | ||||
| 		PORTC |= (1 << 7); | ||||
| 		Delay_MS(10); | ||||
| 
 | ||||
| 		/* If IO13 is not jumpered to ground, start the user application instead */ | ||||
| 		JumpToApplication = ((PINC & (1 << 7)) != 0); | ||||
| 
 | ||||
| 		/* Disable pull-up after the check has completed */ | ||||
| 		PORTC &= ~(1 << 7); | ||||
| 	#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) | ||||
| 		/* Disable JTAG debugging */ | ||||
| 		JTAG_DISABLE(); | ||||
| 
 | ||||
| 		/* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */ | ||||
| 		PORTF |= (1 << 4); | ||||
| 		Delay_MS(10); | ||||
| 
 | ||||
| 		/* If the TCK pin is not jumpered to ground, start the user application instead */ | ||||
| 		JumpToApplication = ((PINF & (1 << 4)) != 0); | ||||
| 
 | ||||
| 		/* Re-enable JTAG debugging */ | ||||
| 		JTAG_ENABLE(); | ||||
| 	#else | ||||
| 		/* Check if the device's BOOTRST fuse is set */ | ||||
| 		if (boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS) & FUSE_BOOTRST) | ||||
| 		{ | ||||
| 			/* If the reset source was not an external reset or the key is correct, clear it and jump to the application */ | ||||
| 			if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY)) | ||||
| 			  JumpToApplication = true; | ||||
| 
 | ||||
| 			/* Clear reset source */ | ||||
| 			MCUSR &= ~(1 << EXTRF); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* If the reset source was the bootloader and the key is correct, clear it and jump to the application;
 | ||||
| 			 * this can happen in the HWBE fuse is set, and the HBE pin is low during the watchdog reset */ | ||||
| 			if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY)) | ||||
| 				JumpToApplication = true; | ||||
| 
 | ||||
| 			/* Clear reset source */ | ||||
| 			MCUSR &= ~(1 << WDRF); | ||||
| 		} | ||||
| 	#endif | ||||
| 
 | ||||
| 	/* Don't run the user application if the reset vector is blank (no app loaded) */ | ||||
| 	bool ApplicationValid = (pgm_read_word_near(0) != 0xFFFF); | ||||
| 
 | ||||
| 	/* If a request has been made to jump to the user application, honor it */ | ||||
| 	if (JumpToApplication && ApplicationValid) | ||||
| 	{ | ||||
| 		/* Turn off the watchdog */ | ||||
| 		MCUSR &= ~(1 << WDRF); | ||||
| 		wdt_disable(); | ||||
| 
 | ||||
| 		/* Clear the boot key and jump to the user application */ | ||||
| 		MagicBootKey = 0; | ||||
| 
 | ||||
| 		// cppcheck-suppress constStatement
 | ||||
| 		((void (*)(void))0x0000)(); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /** 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) | ||||
| { | ||||
| 	/* 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 */ | ||||
| 	GlobalInterruptEnable(); | ||||
| 
 | ||||
| 	while (RunBootloader) | ||||
| 	{ | ||||
| 		CDC_Task(); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Wait a short time to end all USB transactions and then disconnect */ | ||||
| 	_delay_us(1000); | ||||
| 
 | ||||
| 	/* Disconnect from the host - USB interface will be reset later along with the AVR */ | ||||
| 	USB_Detach(); | ||||
| 
 | ||||
| 	/* Unlock the forced application start mode of the bootloader if it is restarted */ | ||||
| 	MagicBootKey = MAGIC_BOOT_KEY; | ||||
| 
 | ||||
| 	/* Enable the watchdog and force a timeout to reset the AVR */ | ||||
| 	wdt_enable(WDTO_250MS); | ||||
| 
 | ||||
| 	for (;;); | ||||
| } | ||||
| 
 | ||||
| /** Configures all hardware required for the bootloader. */ | ||||
| static 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); | ||||
| 
 | ||||
| 	/* 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
 | ||||
|  *  to relay data to and from the attached USB host. | ||||
|  */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	/* Setup CDC Notification, Rx and Tx Endpoints */ | ||||
| 	Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPADDR, EP_TYPE_INTERRUPT, | ||||
| 	                           CDC_NOTIFICATION_EPSIZE, 1); | ||||
| 
 | ||||
| 	Endpoint_ConfigureEndpoint(CDC_TX_EPADDR, EP_TYPE_BULK, CDC_TXRX_EPSIZE, 1); | ||||
| 
 | ||||
| 	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
 | ||||
|  *  the device from the USB host before passing along unhandled control requests to the library for processing | ||||
|  *  internally. | ||||
|  */ | ||||
| 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) | ||||
| 	{ | ||||
| 		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 */ | ||||
| 				Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); | ||||
| 				Endpoint_ClearOUT(); | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 		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 */ | ||||
| 				Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_LineEncoding_t)); | ||||
| 				Endpoint_ClearIN(); | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
|         case CDC_REQ_SetControlLineState: | ||||
| 	        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) | ||||
| 	        { | ||||
| 	            Endpoint_ClearSETUP(); | ||||
| 	            Endpoint_ClearStatusStage(); | ||||
| 	        } | ||||
| 
 | ||||
| 	        break; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| #if !defined(NO_BLOCK_SUPPORT) | ||||
| /** Reads or writes a block of EEPROM or FLASH memory to or from the appropriate CDC data endpoint, depending
 | ||||
|  *  on the AVR109 protocol command issued. | ||||
|  * | ||||
|  *  \param[in] Command  Single character AVR109 protocol command indicating what memory operation to perform | ||||
|  */ | ||||
| static void ReadWriteMemoryBlock(const uint8_t Command) | ||||
| { | ||||
| 	uint16_t BlockSize; | ||||
| 	char     MemoryType; | ||||
| 
 | ||||
| 	uint8_t  HighByte = 0; | ||||
| 	uint8_t  LowByte  = 0; | ||||
| 
 | ||||
| 	BlockSize  = (FetchNextCommandByte() << 8); | ||||
| 	BlockSize |=  FetchNextCommandByte(); | ||||
| 
 | ||||
| 	MemoryType =  FetchNextCommandByte(); | ||||
| 
 | ||||
| 	if ((MemoryType != MEMORY_TYPE_FLASH) && (MemoryType != MEMORY_TYPE_EEPROM)) | ||||
| 	{ | ||||
| 		/* Send error byte back to the host */ | ||||
| 		WriteNextResponseByte('?'); | ||||
| 
 | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Check if command is to read a memory block */ | ||||
| 	if (Command == AVR109_COMMAND_BlockRead) | ||||
| 	{ | ||||
| 		/* Re-enable RWW section */ | ||||
| 		boot_rww_enable(); | ||||
| 
 | ||||
| 		while (BlockSize--) | ||||
| 		{ | ||||
| 			if (MemoryType == MEMORY_TYPE_FLASH) | ||||
| 			{ | ||||
| 				/* Read the next FLASH byte from the current FLASH page */ | ||||
| 				#if (FLASHEND > 0xFFFF) | ||||
| 				WriteNextResponseByte(pgm_read_byte_far(CurrAddress | HighByte)); | ||||
| 				#else | ||||
| 				WriteNextResponseByte(pgm_read_byte(CurrAddress | HighByte)); | ||||
| 				#endif | ||||
| 
 | ||||
| 				/* If both bytes in current word have been read, increment the address counter */ | ||||
| 				if (HighByte) | ||||
| 				  CurrAddress += 2; | ||||
| 
 | ||||
| 				HighByte = !HighByte; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* Read the next EEPROM byte into the endpoint */ | ||||
| 				WriteNextResponseByte(eeprom_read_byte((uint8_t*)(intptr_t)(CurrAddress >> 1))); | ||||
| 
 | ||||
| 				/* Increment the address counter after use */ | ||||
| 				CurrAddress += 2; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		uint32_t PageStartAddress = CurrAddress; | ||||
| 
 | ||||
| 		if (MemoryType == MEMORY_TYPE_FLASH) | ||||
| 		{ | ||||
| 			boot_page_erase(PageStartAddress); | ||||
| 			boot_spm_busy_wait(); | ||||
| 		} | ||||
| 
 | ||||
| 		while (BlockSize--) | ||||
| 		{ | ||||
| 			if (MemoryType == MEMORY_TYPE_FLASH) | ||||
| 			{ | ||||
| 				/* If both bytes in current word have been written, increment the address counter */ | ||||
| 				if (HighByte) | ||||
| 				{ | ||||
| 					/* Write the next FLASH word to the current FLASH page */ | ||||
| 					boot_page_fill(CurrAddress, ((FetchNextCommandByte() << 8) | LowByte)); | ||||
| 
 | ||||
| 					/* Increment the address counter after use */ | ||||
| 					CurrAddress += 2; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					LowByte = FetchNextCommandByte(); | ||||
| 				} | ||||
| 
 | ||||
| 				HighByte = !HighByte; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* Write the next EEPROM byte from the endpoint */ | ||||
| 				eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); | ||||
| 
 | ||||
| 				/* Increment the address counter after use */ | ||||
| 				CurrAddress += 2; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		/* If in FLASH programming mode, commit the page after writing */ | ||||
| 		if (MemoryType == MEMORY_TYPE_FLASH) | ||||
| 		{ | ||||
| 			/* Commit the flash page to memory */ | ||||
| 			boot_page_write(PageStartAddress); | ||||
| 
 | ||||
| 			/* Wait until write operation has completed */ | ||||
| 			boot_spm_busy_wait(); | ||||
| 		} | ||||
| 
 | ||||
| 		/* Send response byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /** Retrieves the next byte from the host in the CDC data OUT endpoint, and clears the endpoint bank if needed
 | ||||
|  *  to allow reception of the next data packet from the host. | ||||
|  * | ||||
|  *  \return Next received byte from the host in the CDC data OUT endpoint | ||||
|  */ | ||||
| static uint8_t FetchNextCommandByte(void) | ||||
| { | ||||
| 	/* Select the OUT endpoint so that the next data byte can be read */ | ||||
| 	Endpoint_SelectEndpoint(CDC_RX_EPADDR); | ||||
| 
 | ||||
| 	/* If OUT endpoint empty, clear it and wait for the next packet from the host */ | ||||
| 	while (!(Endpoint_IsReadWriteAllowed())) | ||||
| 	{ | ||||
| 		Endpoint_ClearOUT(); | ||||
| 
 | ||||
| 		while (!(Endpoint_IsOUTReceived())) | ||||
| 		{ | ||||
| 			if (USB_DeviceState == DEVICE_STATE_Unattached) | ||||
| 			  return 0; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Fetch the next byte from the OUT endpoint */ | ||||
| 	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
 | ||||
|  *  bank when full ready for the next byte in the packet to the host. | ||||
|  * | ||||
|  *  \param[in] Response  Next response byte to send to the host | ||||
|  */ | ||||
| static void WriteNextResponseByte(const uint8_t Response) | ||||
| { | ||||
| 	/* Select the IN endpoint so that the next data byte can be written */ | ||||
| 	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())) | ||||
| 	{ | ||||
| 		Endpoint_ClearIN(); | ||||
| 
 | ||||
| 		while (!(Endpoint_IsINReady())) | ||||
| 		{ | ||||
| 			if (USB_DeviceState == DEVICE_STATE_Unattached) | ||||
| 			  return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Write the next byte to the IN endpoint */ | ||||
| 	Endpoint_Write_8(Response); | ||||
| } | ||||
| 
 | ||||
| /** Task to read in AVR109 commands from the CDC data OUT endpoint, process them, perform the required actions
 | ||||
|  *  and send the appropriate response back to the host. | ||||
|  */ | ||||
| static void CDC_Task(void) | ||||
| { | ||||
| 	/* Select the OUT endpoint */ | ||||
| 	Endpoint_SelectEndpoint(CDC_RX_EPADDR); | ||||
| 
 | ||||
| 	/* Check if endpoint has a command in it sent from the host */ | ||||
| 	if (!(Endpoint_IsOUTReceived())) | ||||
| 	  return; | ||||
| 
 | ||||
| 	/* Read in the bootloader command (first byte sent from host) */ | ||||
| 	uint8_t Command = FetchNextCommandByte(); | ||||
| 
 | ||||
| 	if (Command == AVR109_COMMAND_ExitBootloader) | ||||
| 	{ | ||||
| 		RunBootloader = false; | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if ((Command == AVR109_COMMAND_SetLED) || (Command == AVR109_COMMAND_ClearLED) || | ||||
| 	         (Command == AVR109_COMMAND_SelectDeviceType)) | ||||
| 	{ | ||||
| 		FetchNextCommandByte(); | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if ((Command == AVR109_COMMAND_EnterProgrammingMode) || (Command == AVR109_COMMAND_LeaveProgrammingMode)) | ||||
| 	{ | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadPartCode) | ||||
| 	{ | ||||
| 		/* Return ATMEGA128 part code - this is only to allow AVRProg to use the bootloader */ | ||||
| 		WriteNextResponseByte(0x44); | ||||
| 		WriteNextResponseByte(0x00); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadAutoAddressIncrement) | ||||
| 	{ | ||||
| 		/* Indicate auto-address increment is supported */ | ||||
| 		WriteNextResponseByte('Y'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_SetCurrentAddress) | ||||
| 	{ | ||||
| 		/* Set the current address to that given by the host (translate 16-bit word address to byte address) */ | ||||
| 		CurrAddress   = (FetchNextCommandByte() << 9); | ||||
| 		CurrAddress  |= (FetchNextCommandByte() << 1); | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadBootloaderInterface) | ||||
| 	{ | ||||
| 		/* Indicate serial programmer back to the host */ | ||||
| 		WriteNextResponseByte('S'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadBootloaderIdentifier) | ||||
| 	{ | ||||
| 		/* Write the 7-byte software identifier to the endpoint */ | ||||
| 		for (uint8_t CurrByte = 0; CurrByte < 7; CurrByte++) | ||||
| 		  WriteNextResponseByte(SOFTWARE_IDENTIFIER[CurrByte]); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadBootloaderSWVersion) | ||||
| 	{ | ||||
| 		WriteNextResponseByte('0' + BOOTLOADER_VERSION_MAJOR); | ||||
| 		WriteNextResponseByte('0' + BOOTLOADER_VERSION_MINOR); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadSignature) | ||||
| 	{ | ||||
| 		WriteNextResponseByte(AVR_SIGNATURE_3); | ||||
| 		WriteNextResponseByte(AVR_SIGNATURE_2); | ||||
| 		WriteNextResponseByte(AVR_SIGNATURE_1); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_EraseFLASH) | ||||
| 	{ | ||||
| 		/* Clear the application section of flash */ | ||||
| 		for (uint32_t CurrFlashAddress = 0; CurrFlashAddress < (uint32_t)BOOT_START_ADDR; CurrFlashAddress += SPM_PAGESIZE) | ||||
| 		{ | ||||
| 			boot_page_erase(CurrFlashAddress); | ||||
| 			boot_spm_busy_wait(); | ||||
| 			boot_page_write(CurrFlashAddress); | ||||
| 			boot_spm_busy_wait(); | ||||
| 		} | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	#if !defined(NO_LOCK_BYTE_WRITE_SUPPORT) | ||||
| 	else if (Command == AVR109_COMMAND_WriteLockbits) | ||||
| 	{ | ||||
| 		/* Set the lock bits to those given by the host */ | ||||
| 		boot_lock_bits_set(FetchNextCommandByte()); | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	#endif | ||||
| 	else if (Command == AVR109_COMMAND_ReadLockbits) | ||||
| 	{ | ||||
| 		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOCK_BITS)); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadLowFuses) | ||||
| 	{ | ||||
| 		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS)); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadHighFuses) | ||||
| 	{ | ||||
| 		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS)); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadExtendedFuses) | ||||
| 	{ | ||||
| 		WriteNextResponseByte(boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS)); | ||||
| 	} | ||||
| 	#if !defined(NO_BLOCK_SUPPORT) | ||||
| 	else if (Command == AVR109_COMMAND_GetBlockWriteSupport) | ||||
| 	{ | ||||
| 		WriteNextResponseByte('Y'); | ||||
| 
 | ||||
| 		/* Send block size to the host */ | ||||
| 		WriteNextResponseByte(SPM_PAGESIZE >> 8); | ||||
| 		WriteNextResponseByte(SPM_PAGESIZE & 0xFF); | ||||
| 	} | ||||
| 	else if ((Command == AVR109_COMMAND_BlockWrite) || (Command == AVR109_COMMAND_BlockRead)) | ||||
| 	{ | ||||
| 		/* Delegate the block write/read to a separate function for clarity */ | ||||
| 		ReadWriteMemoryBlock(Command); | ||||
| 	} | ||||
| 	#endif | ||||
| 	#if !defined(NO_FLASH_BYTE_SUPPORT) | ||||
| 	else if (Command == AVR109_COMMAND_FillFlashPageWordHigh) | ||||
| 	{ | ||||
| 		/* Write the high byte to the current flash page */ | ||||
| 		boot_page_fill(CurrAddress, FetchNextCommandByte()); | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_FillFlashPageWordLow) | ||||
| 	{ | ||||
| 		/* Write the low byte to the current flash page */ | ||||
| 		boot_page_fill(CurrAddress | 0x01, FetchNextCommandByte()); | ||||
| 
 | ||||
| 		/* Increment the address */ | ||||
| 		CurrAddress += 2; | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_WriteFlashPage) | ||||
| 	{ | ||||
| 		/* Commit the flash page to memory */ | ||||
| 		boot_page_write(CurrAddress); | ||||
| 
 | ||||
| 		/* Wait until write operation has completed */ | ||||
| 		boot_spm_busy_wait(); | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadFLASHWord) | ||||
| 	{ | ||||
| 		#if (FLASHEND > 0xFFFF) | ||||
| 		uint16_t ProgramWord = pgm_read_word_far(CurrAddress); | ||||
| 		#else | ||||
| 		uint16_t ProgramWord = pgm_read_word(CurrAddress); | ||||
| 		#endif | ||||
| 
 | ||||
| 		WriteNextResponseByte(ProgramWord >> 8); | ||||
| 		WriteNextResponseByte(ProgramWord & 0xFF); | ||||
| 	} | ||||
| 	#endif | ||||
| 	#if !defined(NO_EEPROM_BYTE_SUPPORT) | ||||
| 	else if (Command == AVR109_COMMAND_WriteEEPROM) | ||||
| 	{ | ||||
| 		/* Read the byte from the endpoint and write it to the EEPROM */ | ||||
| 		eeprom_update_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)), FetchNextCommandByte()); | ||||
| 
 | ||||
| 		/* Increment the address after use */ | ||||
| 		CurrAddress += 2; | ||||
| 
 | ||||
| 		/* Send confirmation byte back to the host */ | ||||
| 		WriteNextResponseByte('\r'); | ||||
| 	} | ||||
| 	else if (Command == AVR109_COMMAND_ReadEEPROM) | ||||
| 	{ | ||||
| 		/* Read the EEPROM byte and write it to the endpoint */ | ||||
| 		WriteNextResponseByte(eeprom_read_byte((uint8_t*)((intptr_t)(CurrAddress >> 1)))); | ||||
| 
 | ||||
| 		/* Increment the address after use */ | ||||
| 		CurrAddress += 2; | ||||
| 	} | ||||
| 	#endif | ||||
| 	else if (Command != AVR109_COMMAND_Sync) | ||||
| 	{ | ||||
| 		/* Unknown (non-sync) command, return fail code */ | ||||
| 		WriteNextResponseByte('?'); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Select the IN endpoint */ | ||||
| 	Endpoint_SelectEndpoint(CDC_TX_EPADDR); | ||||
| 
 | ||||
| 	/* Remember if the endpoint is completely full before clearing it */ | ||||
| 	bool IsEndpointFull = !(Endpoint_IsReadWriteAllowed()); | ||||
| 
 | ||||
| 	/* Send the endpoint data to the host */ | ||||
| 	Endpoint_ClearIN(); | ||||
| 
 | ||||
| 	/* If a full endpoint's worth of data was sent, we need to send an empty packet afterwards to signal end of transfer */ | ||||
| 	if (IsEndpointFull) | ||||
| 	{ | ||||
| 		while (!(Endpoint_IsINReady())) | ||||
| 		{ | ||||
| 			if (USB_DeviceState == DEVICE_STATE_Unattached) | ||||
| 			  return; | ||||
| 		} | ||||
| 
 | ||||
| 		Endpoint_ClearIN(); | ||||
| 	} | ||||
| 
 | ||||
| 	/* Wait until the data has been sent to the host */ | ||||
| 	while (!(Endpoint_IsINReady())) | ||||
| 	{ | ||||
| 		if (USB_DeviceState == DEVICE_STATE_Unattached) | ||||
| 		  return; | ||||
| 	} | ||||
| 
 | ||||
| 	/* Select the OUT endpoint */ | ||||
| 	Endpoint_SelectEndpoint(CDC_RX_EPADDR); | ||||
| 
 | ||||
| 	/* Acknowledge the command from the host */ | ||||
| 	Endpoint_ClearOUT(); | ||||
| } | ||||
							
								
								
									
										144
									
								
								lib/lufa/Bootloaders/CDC/BootloaderCDC.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										144
									
								
								lib/lufa/Bootloaders/CDC/BootloaderCDC.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,144 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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 BootloaderCDC.c. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _CDC_H_ | ||||
| #define _CDC_H_ | ||||
| 
 | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/boot.h> | ||||
| 		#include <avr/eeprom.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 
 | ||||
| 		#include "Descriptors.h" | ||||
| 		#include "BootloaderAPI.h" | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
| 
 | ||||
| 	/* Preprocessor Checks: */ | ||||
| 		#if !defined(__OPTIMIZE_SIZE__) | ||||
| 			#error This bootloader requires that it be optimized for size, not speed, to fit into the target device. Change optimization settings and try again. | ||||
| 		#endif | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		/** Version major of the CDC bootloader. */ | ||||
| 		#define BOOTLOADER_VERSION_MAJOR     0x01 | ||||
| 
 | ||||
| 		/** Version minor of the CDC bootloader. */ | ||||
| 		#define BOOTLOADER_VERSION_MINOR     0x00 | ||||
| 
 | ||||
| 		/** Hardware version major of the CDC bootloader. */ | ||||
| 		#define BOOTLOADER_HWVERSION_MAJOR   0x01 | ||||
| 
 | ||||
| 		/** Hardware version minor of the CDC bootloader. */ | ||||
| 		#define BOOTLOADER_HWVERSION_MINOR   0x00 | ||||
| 
 | ||||
| 		/** Eight character bootloader firmware identifier reported to the host when requested. */ | ||||
| 		#define SOFTWARE_IDENTIFIER          "LUFACDC" | ||||
| 
 | ||||
| 		/** Magic bootloader key to unlock forced application start mode. */ | ||||
| 		#define MAGIC_BOOT_KEY               0xDC42 | ||||
| 
 | ||||
| 	/* Enums: */ | ||||
| 		/** Possible memory types that can be addressed via the bootloader. */ | ||||
| 		enum AVR109_Memories | ||||
| 		{ | ||||
| 			MEMORY_TYPE_FLASH  = 'F', | ||||
| 			MEMORY_TYPE_EEPROM = 'E', | ||||
| 		}; | ||||
| 
 | ||||
| 		/** Possible commands that can be issued to the bootloader. */ | ||||
| 		enum AVR109_Commands | ||||
| 		{ | ||||
| 			AVR109_COMMAND_Sync                     = 27, | ||||
| 			AVR109_COMMAND_ReadEEPROM               = 'd', | ||||
| 			AVR109_COMMAND_WriteEEPROM              = 'D', | ||||
| 			AVR109_COMMAND_ReadFLASHWord            = 'R', | ||||
| 			AVR109_COMMAND_WriteFlashPage           = 'm', | ||||
| 			AVR109_COMMAND_FillFlashPageWordLow     = 'c', | ||||
| 			AVR109_COMMAND_FillFlashPageWordHigh    = 'C', | ||||
| 			AVR109_COMMAND_GetBlockWriteSupport     = 'b', | ||||
| 			AVR109_COMMAND_BlockWrite               = 'B', | ||||
| 			AVR109_COMMAND_BlockRead                = 'g', | ||||
| 			AVR109_COMMAND_ReadExtendedFuses        = 'Q', | ||||
| 			AVR109_COMMAND_ReadHighFuses            = 'N', | ||||
| 			AVR109_COMMAND_ReadLowFuses             = 'F', | ||||
| 			AVR109_COMMAND_ReadLockbits             = 'r', | ||||
| 			AVR109_COMMAND_WriteLockbits            = 'l', | ||||
| 			AVR109_COMMAND_EraseFLASH               = 'e', | ||||
| 			AVR109_COMMAND_ReadSignature            = 's', | ||||
| 			AVR109_COMMAND_ReadBootloaderSWVersion  = 'V', | ||||
| 			AVR109_COMMAND_ReadBootloaderHWVersion  = 'v', | ||||
| 			AVR109_COMMAND_ReadBootloaderIdentifier = 'S', | ||||
| 			AVR109_COMMAND_ReadBootloaderInterface  = 'p', | ||||
| 			AVR109_COMMAND_SetCurrentAddress        = 'A', | ||||
| 			AVR109_COMMAND_ReadAutoAddressIncrement = 'a', | ||||
| 			AVR109_COMMAND_ReadPartCode             = 't', | ||||
| 			AVR109_COMMAND_EnterProgrammingMode     = 'P', | ||||
| 			AVR109_COMMAND_LeaveProgrammingMode     = 'L', | ||||
| 			AVR109_COMMAND_SelectDeviceType         = 'T', | ||||
| 			AVR109_COMMAND_SetLED                   = 'x', | ||||
| 			AVR109_COMMAND_ClearLED                 = 'y', | ||||
| 			AVR109_COMMAND_ExitBootloader           = 'E', | ||||
| 		}; | ||||
| 
 | ||||
| 	/* Type Defines: */ | ||||
| 		/** Type define for a non-returning pointer to the start of the loaded application in flash memory. */ | ||||
| 		typedef void (*AppPtr_t)(void) ATTR_NO_RETURN; | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		static void CDC_Task(void); | ||||
| 		static void SetupHardware(void); | ||||
| 
 | ||||
| 		void Application_Jump_Check(void) ATTR_INIT_SECTION(3); | ||||
| 
 | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 
 | ||||
| 		#if defined(INCLUDE_FROM_BOOTLOADERCDC_C) || defined(__DOXYGEN__) | ||||
| 			#if !defined(NO_BLOCK_SUPPORT) | ||||
| 			static void    ReadWriteMemoryBlock(const uint8_t Command); | ||||
| 			#endif | ||||
| 			static uint8_t FetchNextCommandByte(void); | ||||
| 			static void    WriteNextResponseByte(const uint8_t Response); | ||||
| 		#endif | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
							
								
								
									
										242
									
								
								lib/lufa/Bootloaders/CDC/BootloaderCDC.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								lib/lufa/Bootloaders/CDC/BootloaderCDC.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,242 @@ | |||
| /** \file | ||||
|  * | ||||
|  *  This file contains special DoxyGen information for the generation of the main page and other special | ||||
|  *  documentation pages. It is not a project source file. | ||||
|  */ | ||||
| 
 | ||||
| /** \mainpage CDC Class USB AVR Bootloader | ||||
|  * | ||||
|  *  \section Sec_Compat Demo Compatibility: | ||||
|  * | ||||
|  *  The following list indicates what microcontrollers are compatible with this demo. | ||||
|  * | ||||
|  *  \li Series 7 USB AVRs (AT90USBxxx7) | ||||
|  *  \li Series 6 USB AVRs (AT90USBxxx6) | ||||
|  *  \li Series 4 USB AVRs (ATMEGAxxU4) | ||||
|  *  \li Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2) | ||||
|  * | ||||
|  *  \section Sec_Info USB Information: | ||||
|  * | ||||
|  *  The following table gives a rundown of the USB utilization of this demo. | ||||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Mode:</b></td> | ||||
|  *    <td>Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Class:</b></td> | ||||
|  *    <td>Communications Device Class (CDC)</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Abstract Control Model (ACM)</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF CDC Class Standard</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  This bootloader enumerates to the host as a CDC Class device (virtual serial port), allowing for AVR109 | ||||
|  *  protocol compatible programming software to load firmware onto the AVR. | ||||
|  * | ||||
|  *  Out of the box this bootloader builds for the AT90USB1287 with an 8KB bootloader section size, and will fit | ||||
|  *  into 4KB of bootloader space. If you wish to alter this size and/or change the AVR model, you will need to | ||||
|  *  edit the MCU, FLASH_SIZE_KB and BOOT_SECTION_SIZE_KB values in the accompanying makefile. | ||||
|  * | ||||
|  *  When the bootloader is running, the board's LED(s) will flash at regular intervals to distinguish the | ||||
|  *  bootloader from the normal user application. | ||||
|  * | ||||
|  *  \warning <b>THIS BOOTLOADER IS NOT SECURE.</b> Malicious entities can recover written data, even if the device | ||||
|  *           lockbits are set. | ||||
|  * | ||||
|  *  \section Sec_Running Running the Bootloader | ||||
|  * | ||||
|  *  On the USB AVR8 devices, setting the \c HWBE device fuse will cause the bootloader to run if the \c HWB pin of | ||||
|  *  the AVR is grounded when the device is reset. | ||||
|  * | ||||
|  *  The are two behaviours of this bootloader, depending on the device's fuses: | ||||
|  * | ||||
|  *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is reset from | ||||
|  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the | ||||
|  *  device's external reset pin should be grounded momentarily. | ||||
|  * | ||||
|  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software | ||||
|  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set). | ||||
|  * | ||||
|  *  For board specific exceptions to the above, see below. | ||||
|  * | ||||
|  *  \subsection SSec_XPLAIN Atmel Xplain Board | ||||
|  *  Ground the USB AVR JTAG's \c TCK pin to ground when powering on the board to start the bootloader. This assumes the | ||||
|  *  \c HWBE fuse is cleared and the \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board. | ||||
|  * | ||||
|  *  \subsection SSec_Leonardo Arduino Leonardo Board | ||||
|  *  Ground \c IO13 when powering the board to start the bootloader. This assumes the \c HWBE fuse is cleared and the | ||||
|  *  \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board. | ||||
|  * | ||||
|  *  \section Sec_Installation Driver Installation | ||||
|  * | ||||
|  *  After running this bootloader for the first time on a new computer, you will need to supply the .INF | ||||
|  *  file located in this bootloader project's directory as the device's driver when running under Windows. | ||||
|  *  This will enable Windows to use its inbuilt CDC drivers, negating the need for custom drivers for the | ||||
|  *  device. Other Operating Systems should automatically use their own inbuilt CDC-ACM drivers. | ||||
|  * | ||||
|  *  \section Sec_HostApp Host Controller Application | ||||
|  * | ||||
|  *  This bootloader is compatible with the open source application AVRDUDE, Atmel's AVRPROG, or other | ||||
|  *  applications implementing the AVR109 protocol, which is documented on the Atmel website as an application | ||||
|  *  note. | ||||
|  * | ||||
|  *  \subsection SSec_AVRDude AVRDUDE (Windows, Mac, Linux) | ||||
|  * | ||||
|  *  AVRDude is a free, cross-platform and open source command line programmer for Atmel and third party AVR | ||||
|  *  programmers. It is available on the the Windows platform as part of the "WinAVR" package, or on other systems | ||||
|  *  either from a build from the official source code, or in many distributions as a precompiled binary package. | ||||
|  * | ||||
|  *  To load a new HEX file with AVRDude, specify "AVR109" as the programmer, with the allocated COM port. On Windows | ||||
|  *  platforms this will be a COMx port name: | ||||
|  *  \code | ||||
|  *  avrdude -c AVR109 -p at90usb1287 -P COM0 -U flash:w:Mouse.hex | ||||
|  *  \endcode | ||||
|  * | ||||
|  *  On Linux systems, this will typically be a /dev/ttyACMx port name: | ||||
|  *  \code | ||||
|  *  avrdude -c AVR109 -p at90usb1287 -P /dev/ttyACM0 -U flash:w:Mouse.hex | ||||
|  *  \endcode | ||||
|  * | ||||
|  *  Refer to the AVRDude project documentation for additional usage instructions. | ||||
|  * | ||||
|  *  \section Sec_API User Application API | ||||
|  * | ||||
|  *  Several user application functions for FLASH and other special memory area manipulations are exposed by the bootloader, | ||||
|  *  allowing the user application to call into the bootloader at runtime to read and write FLASH data. | ||||
|  * | ||||
|  *  By default, the bootloader API jump table is located 32 bytes from the end of the device's FLASH memory, and follows the | ||||
|  *  following layout: | ||||
|  * | ||||
|  *  \code | ||||
|  *  #define BOOTLOADER_API_TABLE_SIZE          32 | ||||
|  *  #define BOOTLOADER_API_TABLE_START         ((FLASHEND + 1UL) - BOOTLOADER_API_TABLE_SIZE) | ||||
|  *  #define BOOTLOADER_API_CALL(Index)         (void*)((BOOTLOADER_API_TABLE_START + (Index * 2)) / 2) | ||||
|  * | ||||
|  *  void    (*BootloaderAPI_ErasePage)(uint32_t Address)               = BOOTLOADER_API_CALL(0); | ||||
|  *  void    (*BootloaderAPI_WritePage)(uint32_t Address)               = BOOTLOADER_API_CALL(1); | ||||
|  *  void    (*BootloaderAPI_FillWord)(uint32_t Address, uint16_t Word) = BOOTLOADER_API_CALL(2); | ||||
|  *  uint8_t (*BootloaderAPI_ReadSignature)(uint16_t Address)           = BOOTLOADER_API_CALL(3); | ||||
|  *  uint8_t (*BootloaderAPI_ReadFuse)(uint16_t Address)                = BOOTLOADER_API_CALL(4); | ||||
|  *  uint8_t (*BootloaderAPI_ReadLock)(void)                            = BOOTLOADER_API_CALL(5); | ||||
|  *  void    (*BootloaderAPI_WriteLock)(uint8_t LockBits)               = BOOTLOADER_API_CALL(6); | ||||
|  * | ||||
|  *  #define BOOTLOADER_MAGIC_SIGNATURE_START   (BOOTLOADER_API_TABLE_START + (BOOTLOADER_API_TABLE_SIZE - 2)) | ||||
|  *  #define BOOTLOADER_MAGIC_SIGNATURE         0xDCFB | ||||
|  * | ||||
|  *  #define BOOTLOADER_CLASS_SIGNATURE_START   (BOOTLOADER_API_TABLE_START + (BOOTLOADER_API_TABLE_SIZE - 4)) | ||||
|  *  #define BOOTLOADER_CDC_SIGNATURE           0xDF00 | ||||
|  * | ||||
|  *  #define BOOTLOADER_ADDRESS_START           (BOOTLOADER_API_TABLE_START + (BOOTLOADER_API_TABLE_SIZE - 8)) | ||||
|  *  #define BOOTLOADER_ADDRESS_LENGTH          4 | ||||
|  *  \endcode | ||||
|  * | ||||
|  *  From the application the API support of the bootloader can be detected by reading the FLASH memory bytes located at address | ||||
|  *  \c BOOTLOADER_MAGIC_SIGNATURE_START and comparing them to the value \c BOOTLOADER_MAGIC_SIGNATURE. The class of bootloader | ||||
|  *  can be determined by reading the FLASH memory bytes located at address \c BOOTLOADER_CLASS_SIGNATURE_START and comparing them | ||||
|  *  to the value \c BOOTLOADER_CDC_SIGNATURE. The start address of the bootloader can be retrieved by reading the bytes of FLASH | ||||
|  *  memory starting from address \c BOOTLOADER_ADDRESS_START. | ||||
|  * | ||||
|  *  \subsection SSec_API_MemLayout Device Memory Map | ||||
|  *  The following illustration indicates the final memory map of the device when loaded with the bootloader. | ||||
|  * | ||||
|  *  \verbatim | ||||
|  *  +----------------------------+ 0x0000 | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |      User Application      | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  |                            | | ||||
|  *  +----------------------------+ FLASHEND - BOOT_SECTION_SIZE | ||||
|  *  |                            | | ||||
|  *  |   Bootloader Application   | | ||||
|  *  | (Not User App. Accessible) | | ||||
|  *  |                            | | ||||
|  *  +----------------------------+ FLASHEND - 96 | ||||
|  *  |   API Table Trampolines    | | ||||
|  *  | (Not User App. Accessible) | | ||||
|  *  +----------------------------+ FLASHEND - 32 | ||||
|  *  |    Bootloader API Table    | | ||||
|  *  |   (User App. Accessible)   | | ||||
|  *  +----------------------------+ FLASHEND - 8 | ||||
|  *  |   Bootloader ID Constants  | | ||||
|  *  |   (User App. Accessible)   | | ||||
|  *  +----------------------------+ FLASHEND | ||||
|  *  \endverbatim | ||||
|  * | ||||
|  *  \section Sec_KnownIssues Known Issues: | ||||
|  * | ||||
|  *  \par On Linux machines, the CDC bootloader is unstable or inaccessible. | ||||
|  *  A change to the \c ModemManager module in many Linux distributions causes | ||||
|  *  this module to try to take control over inserted CDC devices, corrupting the | ||||
|  *  datastream. A UDEV rule is required to prevent this. | ||||
|  *  See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps. | ||||
|  *  If the issue still persists then uninstall modemmanager by executing <tt>sudo apt-get remove modemmanager</tt>, or | ||||
|  *  the equivalent using your chosen distribution's package manager. | ||||
|  * | ||||
|  *  \par On Linux machines, the CDC bootloader is inaccessible. | ||||
|  *  On many Linux systems, non-root users do not have automatic access to newly | ||||
|  *  inserted CDC devices. Root privileges or a UDEV rule is required to gain | ||||
|  *  access. | ||||
|  *  See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps. | ||||
|  * | ||||
|  *  \section Sec_Options Project Options | ||||
|  * | ||||
|  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. | ||||
|  * | ||||
|  *  <table> | ||||
|  *   <tr> | ||||
|  *    <th><b>Define Name:</b></th> | ||||
|  *    <th><b>Location:</b></th> | ||||
|  *    <th><b>Description:</b></th> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>NO_BLOCK_SUPPORT</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>Define to disable memory block read/write support in the bootloader, requiring all reads and writes to be made | ||||
|  *        using the byte-level commands.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>NO_EEPROM_BYTE_SUPPORT</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>Define to disable EEPROM memory byte read/write support in the bootloader, requiring all EEPROM reads and writes | ||||
|  *        to be made using the block-level commands.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>NO_FLASH_BYTE_SUPPORT</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>Define to disable FLASH memory byte read/write support in the bootloader, requiring all FLASH reads and writes | ||||
|  *        to be made using the block-level commands.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>NO_LOCK_BYTE_WRITE_SUPPORT</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>Define to disable lock byte write support in the bootloader, preventing the lock bits from being set programmatically.</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
| 
 | ||||
							
								
								
									
										50
									
								
								lib/lufa/Bootloaders/CDC/Config/AppConfig.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								lib/lufa/Bootloaders/CDC/Config/AppConfig.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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
 | ||||
|  *  \brief Application Configuration Header File | ||||
|  * | ||||
|  *  This is a header file which is be used to configure LUFA's | ||||
|  *  compile time options, as an alternative to the compile time | ||||
|  *  constants supplied through a makefile. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the | ||||
|  *  \ref Sec_Options section of the application documentation. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _APP_CONFIG_H_ | ||||
| #define _APP_CONFIG_H_ | ||||
| 
 | ||||
| //	#define NO_BLOCK_SUPPORT
 | ||||
| //	#define NO_EEPROM_BYTE_SUPPORT
 | ||||
| //	#define NO_FLASH_BYTE_SUPPORT
 | ||||
| //	#define NO_LOCK_BYTE_WRITE_SUPPORT
 | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										93
									
								
								lib/lufa/Bootloaders/CDC/Config/LUFAConfig.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								lib/lufa/Bootloaders/CDC/Config/LUFAConfig.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,93 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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
 | ||||
|  *  \brief LUFA Library Configuration Header File | ||||
|  * | ||||
|  *  This header file is used to configure LUFA's compile time options, | ||||
|  *  as an alternative to the compile time constants supplied through | ||||
|  *  a makefile. | ||||
|  * | ||||
|  *  For information on what each token does, refer to the LUFA | ||||
|  *  manual section "Summary of Compile Tokens". | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _LUFA_CONFIG_H_ | ||||
| #define _LUFA_CONFIG_H_ | ||||
| 
 | ||||
| 	#if (ARCH == ARCH_AVR8) | ||||
| 
 | ||||
| 		/* Non-USB Related Configuration Tokens: */ | ||||
| //		#define DISABLE_TERMINAL_CODES
 | ||||
| 
 | ||||
| 		/* USB Class Driver Related Tokens: */ | ||||
| //		#define HID_HOST_BOOT_PROTOCOL_ONLY
 | ||||
| //		#define HID_STATETABLE_STACK_DEPTH       {Insert Value Here}
 | ||||
| //		#define HID_USAGE_STACK_DEPTH            {Insert Value Here}
 | ||||
| //		#define HID_MAX_COLLECTIONS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORTITEMS              {Insert Value Here}
 | ||||
| //		#define HID_MAX_REPORT_IDS               {Insert Value Here}
 | ||||
| //		#define NO_CLASS_DRIVER_AUTOFLUSH
 | ||||
| 
 | ||||
| 		/* General USB Driver Related Tokens: */ | ||||
| 		#define ORDERED_EP_CONFIG | ||||
| 		#define USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL) | ||||
| 		#define USB_DEVICE_ONLY | ||||
| //		#define USB_HOST_ONLY
 | ||||
| //		#define USB_STREAM_TIMEOUT_MS            {Insert Value Here}
 | ||||
| //		#define NO_LIMITED_CONTROLLER_CONNECT
 | ||||
| 		#define NO_SOF_EVENTS | ||||
| 
 | ||||
| 		/* USB Device Mode Driver Related Tokens: */ | ||||
| 		#define USE_RAM_DESCRIPTORS | ||||
| //		#define USE_FLASH_DESCRIPTORS
 | ||||
| //		#define USE_EEPROM_DESCRIPTORS
 | ||||
| 		#define NO_INTERNAL_SERIAL | ||||
| 		#define FIXED_CONTROL_ENDPOINT_SIZE      8 | ||||
| 		#define DEVICE_STATE_AS_GPIOR            0 | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE
 | ||||
| //		#define INTERRUPT_CONTROL_ENDPOINT
 | ||||
| 		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| 		#define NO_DEVICE_SELF_POWER | ||||
| 
 | ||||
| 		/* USB Host Mode Driver Related Tokens: */ | ||||
| //		#define HOST_STATE_AS_GPIOR              {Insert Value Here}
 | ||||
| //		#define USB_HOST_TIMEOUT_MS              {Insert Value Here}
 | ||||
| //		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here}
 | ||||
| //		#define NO_AUTO_VBUS_MANAGEMENT
 | ||||
| //		#define INVERTED_VBUS_ENABLE_LINE
 | ||||
| 
 | ||||
| 	#else | ||||
| 
 | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
| 
 | ||||
| 	#endif | ||||
| #endif | ||||
							
								
								
									
										244
									
								
								lib/lufa/Bootloaders/CDC/Descriptors.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								lib/lufa/Bootloaders/CDC/Descriptors.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,244 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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 SRAM 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. | ||||
|  */ | ||||
| const USB_Descriptor_Device_t DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
| 
 | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = CDC_CSCP_CDCClass, | ||||
| 	.SubClass               = CDC_CSCP_NoSpecificSubclass, | ||||
| 	.Protocol               = CDC_CSCP_NoSpecificProtocol, | ||||
| 
 | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
| 
 | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x204A, | ||||
| 	.ReleaseNumber          = VERSION_BCD(1,0,0), | ||||
| 
 | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.SerialNumStrIndex      = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS | ||||
| }; | ||||
| 
 | ||||
| /** Configuration descriptor structure. This descriptor, located in SRAM 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. | ||||
|  */ | ||||
| const USB_Descriptor_Configuration_t ConfigurationDescriptor = | ||||
| { | ||||
| 	.Config = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | ||||
| 
 | ||||
| 			.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), | ||||
| 			.TotalInterfaces        = 2, | ||||
| 
 | ||||
| 			.ConfigurationNumber    = 1, | ||||
| 			.ConfigurationStrIndex  = NO_DESCRIPTOR, | ||||
| 
 | ||||
| 			.ConfigAttributes       = USB_CONFIG_ATTR_RESERVED, | ||||
| 
 | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_CCI_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber        = INTERFACE_ID_CDC_CCI, | ||||
| 			.AlternateSetting       = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints         = 1, | ||||
| 
 | ||||
| 			.Class                  = CDC_CSCP_CDCClass, | ||||
| 			.SubClass               = CDC_CSCP_ACMSubclass, | ||||
| 			.Protocol               = CDC_CSCP_ATCommandProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_Functional_Header = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = 0x00, | ||||
| 
 | ||||
| 			.CDCSpecification       = VERSION_BCD(1,1,0), | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_Functional_ACM = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = 0x02, | ||||
| 
 | ||||
| 			.Capabilities           = 0x02, | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_Functional_Union = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = 0x06, | ||||
| 
 | ||||
| 			.MasterInterfaceNumber  = INTERFACE_ID_CDC_CCI, | ||||
| 			.SlaveInterfaceNumber   = INTERFACE_ID_CDC_DCI, | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_NotificationEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 			.EndpointAddress        = CDC_NOTIFICATION_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_NOTIFICATION_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0xFF | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_DCI_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
| 
 | ||||
| 			.InterfaceNumber        = INTERFACE_ID_CDC_DCI, | ||||
| 			.AlternateSetting       = 0, | ||||
| 
 | ||||
| 			.TotalEndpoints         = 2, | ||||
| 
 | ||||
| 			.Class                  = CDC_CSCP_CDCDataClass, | ||||
| 			.SubClass               = CDC_CSCP_NoDataSubclass, | ||||
| 			.Protocol               = CDC_CSCP_NoDataProtocol, | ||||
| 
 | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_DataOutEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 			.EndpointAddress        = CDC_RX_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
| 
 | ||||
| 	.CDC_DataInEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
| 
 | ||||
| 			.EndpointAddress        = CDC_TX_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		} | ||||
| }; | ||||
| 
 | ||||
| /** Language descriptor structure. This descriptor, located in SRAM 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. | ||||
|  */ | ||||
| const USB_Descriptor_String_t LanguageString = USB_STRING_DESCRIPTOR_ARRAY(LANGUAGE_ID_ENG); | ||||
| 
 | ||||
| /** Manufacturer descriptor string. This is a Unicode string containing the manufacturer'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. | ||||
|  */ | ||||
| const USB_Descriptor_String_t ManufacturerString = USB_STRING_DESCRIPTOR(L"Dean Camera"); | ||||
| 
 | ||||
| /** 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. | ||||
|  */ | ||||
| const USB_Descriptor_String_t ProductString = USB_STRING_DESCRIPTOR(L"LUFA CDC"); | ||||
| 
 | ||||
| /** This function is called by the library when in device mode, and must be overridden (see LUFA 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 uint16_t wIndex, | ||||
|                                     const void** const DescriptorAddress) | ||||
| { | ||||
| 	const uint8_t  DescriptorType   = (wValue >> 8); | ||||
| 	const uint8_t  DescriptorNumber = (wValue & 0xFF); | ||||
| 
 | ||||
| 	const 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 == STRING_ID_Language) | ||||
| 			{ | ||||
| 				Address = &LanguageString; | ||||
| 				Size    = LanguageString.Header.Size; | ||||
| 			} | ||||
| 			else if (DescriptorNumber == STRING_ID_Manufacturer) | ||||
| 			{ | ||||
| 				Address = &ManufacturerString; | ||||
| 				Size    = ManufacturerString.Header.Size; | ||||
| 			} | ||||
| 			else if (DescriptorNumber == STRING_ID_Product) | ||||
| 			{ | ||||
| 				Address = &ProductString; | ||||
| 				Size    = ProductString.Header.Size; | ||||
| 			} | ||||
| 
 | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										158
									
								
								lib/lufa/Bootloaders/CDC/Descriptors.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								lib/lufa/Bootloaders/CDC/Descriptors.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,158 @@ | |||
| /*
 | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2017. | ||||
| 
 | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
| 
 | ||||
| /*
 | ||||
|   Copyright 2017  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 disclaims 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> | ||||
| 
 | ||||
| 		#include "Config/AppConfig.h" | ||||
| 
 | ||||
| 	/* Macros: */ | ||||
| 		#if defined(__AVR_AT90USB1287__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x97 | ||||
| 			#define AVR_SIGNATURE_3               0x82 | ||||
| 		#elif defined(__AVR_AT90USB647__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x96 | ||||
| 			#define AVR_SIGNATURE_3               0x82 | ||||
| 		#elif defined(__AVR_AT90USB1286__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x97 | ||||
| 			#define AVR_SIGNATURE_3               0x82 | ||||
| 		#elif defined(__AVR_AT90USB646__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x96 | ||||
| 			#define AVR_SIGNATURE_3               0x82 | ||||
| 		#elif defined(__AVR_ATmega32U4__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x95 | ||||
| 			#define AVR_SIGNATURE_3               0x87 | ||||
| 		#elif defined(__AVR_ATmega16U4__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x94 | ||||
| 			#define AVR_SIGNATURE_3               0x88 | ||||
| 		#elif defined(__AVR_ATmega32U2__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x95 | ||||
| 			#define AVR_SIGNATURE_3               0x8A | ||||
| 		#elif defined(__AVR_ATmega16U2__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x94 | ||||
| 			#define AVR_SIGNATURE_3               0x89 | ||||
| 		#elif defined(__AVR_AT90USB162__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x94 | ||||
| 			#define AVR_SIGNATURE_3               0x82 | ||||
| 		#elif defined(__AVR_ATmega8U2__) | ||||
| 			#define AVR_SIGNATURE_1               0x1E | ||||
| 			#define AVR_SIGNATURE_2               0x93 | ||||
| 			#define AVR_SIGNATURE_3               0x89 | ||||
| 		#elif defined(__AVR_AT90USB82__) | ||||
| 			#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 | ||||
| 
 | ||||
| 		/** Endpoint address for the CDC control interface event notification endpoint. */ | ||||
| 		#define CDC_NOTIFICATION_EPADDR        (ENDPOINT_DIR_IN | 2) | ||||
| 
 | ||||
| 		/** Endpoint address for the CDC data interface TX (data IN) endpoint. */ | ||||
| 		#define CDC_TX_EPADDR                  (ENDPOINT_DIR_IN | 3) | ||||
| 
 | ||||
| 		/** Endpoint address for the CDC data interface RX (data OUT) endpoint. */ | ||||
| 		#define CDC_RX_EPADDR                  (ENDPOINT_DIR_OUT | 4) | ||||
| 
 | ||||
| 		/** Size of the CDC data interface TX and RX data endpoint banks, in bytes. */ | ||||
| 		#define CDC_TXRX_EPSIZE                16 | ||||
| 
 | ||||
| 		/** Size of the CDC control interface notification endpoint bank, in bytes. */ | ||||
| 		#define CDC_NOTIFICATION_EPSIZE        8 | ||||
| 
 | ||||
| 	/* Type Defines: */ | ||||
| 		/** 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; | ||||
| 
 | ||||
| 			// CDC Control Interface
 | ||||
| 			USB_Descriptor_Interface_t               CDC_CCI_Interface; | ||||
| 			USB_CDC_Descriptor_FunctionalHeader_t    CDC_Functional_Header; | ||||
| 			USB_CDC_Descriptor_FunctionalACM_t       CDC_Functional_ACM; | ||||
| 			USB_CDC_Descriptor_FunctionalUnion_t     CDC_Functional_Union; | ||||
| 			USB_Descriptor_Endpoint_t                CDC_NotificationEndpoint; | ||||
| 
 | ||||
| 			// CDC Data Interface
 | ||||
| 			USB_Descriptor_Interface_t               CDC_DCI_Interface; | ||||
| 			USB_Descriptor_Endpoint_t                CDC_DataOutEndpoint; | ||||
| 			USB_Descriptor_Endpoint_t                CDC_DataInEndpoint; | ||||
| 		} USB_Descriptor_Configuration_t; | ||||
| 
 | ||||
| 		/** Enum for the device interface descriptor IDs within the device. Each interface descriptor
 | ||||
| 		 *  should have a unique ID index associated with it, which can be used to refer to the | ||||
| 		 *  interface from other descriptors. | ||||
| 		 */ | ||||
| 		enum InterfaceDescriptors_t | ||||
| 		{ | ||||
| 			INTERFACE_ID_CDC_CCI = 0, /**< CDC CCI interface descriptor ID */ | ||||
| 			INTERFACE_ID_CDC_DCI = 1, /**< CDC DCI interface descriptor ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 		/** Enum for the device string descriptor IDs within the device. Each string descriptor should
 | ||||
| 		 *  have a unique ID index associated with it, which can be used to refer to the string from | ||||
| 		 *  other descriptors. | ||||
| 		 */ | ||||
| 		enum StringDescriptors_t | ||||
| 		{ | ||||
| 			STRING_ID_Language     = 0, /**< Supported Languages string descriptor ID (must be zero) */ | ||||
| 			STRING_ID_Manufacturer = 1, /**< Manufacturer string ID */ | ||||
| 			STRING_ID_Product      = 2, /**< Product string ID */ | ||||
| 		}; | ||||
| 
 | ||||
| 	/* Function Prototypes: */ | ||||
| 		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, | ||||
| 		                                    const uint16_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
							
								
								
									
										66
									
								
								lib/lufa/Bootloaders/CDC/LUFA CDC Bootloader.inf
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								lib/lufa/Bootloaders/CDC/LUFA CDC Bootloader.inf
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,66 @@ | |||
| ;************************************************************ | ||||
| ; Windows USB CDC ACM Setup File | ||||
| ; Copyright (c) 2000 Microsoft Corporation | ||||
| ;************************************************************ | ||||
| 
 | ||||
| [DefaultInstall] | ||||
| CopyINF="LUFA CDC Bootloader.inf" | ||||
| 
 | ||||
| [Version] | ||||
| Signature="$Windows NT$" | ||||
| Class=Ports | ||||
| ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} | ||||
| Provider=%MFGNAME% | ||||
| DriverVer=7/1/2012,10.0.0.0 | ||||
| 
 | ||||
| [Manufacturer] | ||||
| %MFGNAME%=DeviceList, NTx86, NTamd64, NTia64 | ||||
| 
 | ||||
| [SourceDisksNames] | ||||
| 
 | ||||
| [SourceDisksFiles] | ||||
| 
 | ||||
| [DestinationDirs] | ||||
| DefaultDestDir=12 | ||||
| 
 | ||||
| [DriverInstall] | ||||
| Include=mdmcpq.inf | ||||
| CopyFiles=FakeModemCopyFileSection | ||||
| AddReg=DriverInstall.AddReg | ||||
| 
 | ||||
| [DriverInstall.Services] | ||||
| Include=mdmcpq.inf | ||||
| AddService=usbser, 0x00000002, LowerFilter_Service_Inst | ||||
| 
 | ||||
| [DriverInstall.AddReg] | ||||
| HKR,,EnumPropPages32,,"msports.dll,SerialPortPropPageProvider" | ||||
| 
 | ||||
| ;------------------------------------------------------------------------------ | ||||
| ;  Vendor and Product ID Definitions | ||||
| ;------------------------------------------------------------------------------ | ||||
| ; When developing your USB device, the VID and PID used in the PC side | ||||
| ; application program and the firmware on the microcontroller must match. | ||||
| ; Modify the below line to use your VID and PID.  Use the format as shown below. | ||||
| ; Note: One INF file can be used for multiple devices with different VID and PIDs. | ||||
| ; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. | ||||
| ;------------------------------------------------------------------------------ | ||||
| [DeviceList] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A | ||||
| 
 | ||||
| [DeviceList.NTx86] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A | ||||
| 
 | ||||
| [DeviceList.NTamd64] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A | ||||
| 
 | ||||
| [DeviceList.NTia64] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204A | ||||
| 
 | ||||
| ;------------------------------------------------------------------------------ | ||||
| ;  String Definitions | ||||
| ;------------------------------------------------------------------------------ | ||||
| ;Modify these strings to customize your device | ||||
| ;------------------------------------------------------------------------------ | ||||
| [Strings] | ||||
| MFGNAME="http://www.lufa-lib.org" | ||||
| DESCRIPTION="LUFA CDC Class Bootloader" | ||||
							
								
								
									
										161
									
								
								lib/lufa/Bootloaders/CDC/asf.xml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								lib/lufa/Bootloaders/CDC/asf.xml
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,161 @@ | |||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="CDC Bootloader - 128KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.128_4" force-caption="true" workspace-name="lufa_cdc_128kb_4kb_"> | ||||
| 		<require idref="lufa.bootloaders.cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<config name="config.compiler.optimization.level" value="size"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 
 | ||||
| 		<build type="define" name="BOOT_START_ADDR" value="0x1F000"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1F000"/> | ||||
| 
 | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FFA0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FFE0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FFF8"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<project caption="CDC Bootloader - 64KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.64_4" force-caption="true" workspace-name="lufa_cdc_64kb_4kb_"> | ||||
| 		<require idref="lufa.bootloaders.cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="at90usb647"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<config name="config.compiler.optimization.level" value="size"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 
 | ||||
| 		<build type="define" name="BOOT_START_ADDR" value="0xF000"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.text=0xF000"/> | ||||
| 
 | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0xFFA0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0xFFE0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0xFFF8"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<project caption="CDC Bootloader - 32KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.32_4" force-caption="true" workspace-name="lufa_cdc_32kb_4kb_"> | ||||
| 		<require idref="lufa.bootloaders.cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="atmega32u4"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<config name="config.compiler.optimization.level" value="size"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 
 | ||||
| 		<build type="define" name="BOOT_START_ADDR" value="0x7000"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.text=0x7000"/> | ||||
| 
 | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x7FA0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x7FE0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x7FF8"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<project caption="CDC Bootloader - 16KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.16_4" force-caption="true" workspace-name="lufa_cdc_16kb_4kb_"> | ||||
| 		<require idref="lufa.bootloaders.cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="atmega16u2"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<config name="config.compiler.optimization.level" value="size"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 
 | ||||
| 		<build type="define" name="BOOT_START_ADDR" value="0x3000"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.text=0x3000"/> | ||||
| 
 | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x3FA0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x3FE0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x3FF8"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<project caption="CDC Bootloader - 8KB FLASH / 4KB Boot - AVR8 Architecture" id="lufa.bootloaders.cdc.avr8.8_4" force-caption="true" workspace-name="lufa_cdc_8kb_4kb_"> | ||||
| 		<require idref="lufa.bootloaders.cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
| 
 | ||||
| 		<device-support value="atmega8u2"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
| 
 | ||||
| 		<config name="config.compiler.optimization.level" value="size"/> | ||||
| 
 | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 
 | ||||
| 		<build type="define" name="BOOT_START_ADDR" value="0x1000"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.text=0x1000"/> | ||||
| 
 | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_trampolines=0x1FA0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Trampolines"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_jumptable=0x1FE0"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_JumpTable"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--section-start=.apitable_signatures=0x1FF8"/> | ||||
| 		<build type="linker-config" subtype="flags" value="--undefined=BootloaderAPI_Signatures"/> | ||||
| 	</project> | ||||
| 
 | ||||
| 	<module type="application" id="lufa.bootloaders.cdc" caption="CDC Bootloader"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		CDC Class Bootloader, capable of reprogramming a device using avrdude or other AVR109 protocol compliant software when plugged into a host. | ||||
| 		</info> | ||||
| 
 | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
| 
 | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Bootloaders"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 		</info> | ||||
| 
 | ||||
|  		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
| 
 | ||||
| 		<build type="include-path" value="."/> | ||||
| 		<build type="c-source" value="BootloaderCDC.c"/> | ||||
| 		<build type="header-file" value="BootloaderCDC.h"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
| 		<build type="c-source" value="BootloaderAPI.c"/> | ||||
| 		<build type="header-file" value="BootloaderAPI.h"/> | ||||
| 		<build type="asm-source" value="BootloaderAPITable.S"/> | ||||
| 
 | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
| 		<build type="header-file" value="Config/AppConfig.h"/> | ||||
| 
 | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="BootloaderCDC.txt"/> | ||||
| 		<build type="distribute" subtype="user-file" value="LUFA CDC Bootloader.inf"/> | ||||
| 
 | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 	</module> | ||||
| </asf> | ||||
							
								
								
									
										2396
									
								
								lib/lufa/Bootloaders/CDC/doxyfile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2396
									
								
								lib/lufa/Bootloaders/CDC/doxyfile
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										62
									
								
								lib/lufa/Bootloaders/CDC/makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								lib/lufa/Bootloaders/CDC/makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,62 @@ | |||
| #
 | ||||
| #             LUFA Library
 | ||||
| #     Copyright (C) Dean Camera, 2017.
 | ||||
| #
 | ||||
| #  dean [at] fourwalledcubicle [dot] com
 | ||||
| #           www.lufa-lib.org
 | ||||
| #
 | ||||
| # --------------------------------------
 | ||||
| #         LUFA Project Makefile.
 | ||||
| # --------------------------------------
 | ||||
| 
 | ||||
| # Run "make help" for target help.
 | ||||
| 
 | ||||
| MCU          = at90usb1287 | ||||
| ARCH         = AVR8 | ||||
| BOARD        = USBKEY | ||||
| F_CPU        = 8000000 | ||||
| F_USB        = $(F_CPU) | ||||
| OPTIMIZATION = s | ||||
| TARGET       = BootloaderCDC | ||||
| SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) | ||||
| LUFA_PATH    = ../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET) | ||||
| LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS) | ||||
| 
 | ||||
| # Flash size and bootloader section sizes of the target, in KB. These must
 | ||||
| # match the target's total FLASH size and the bootloader size set in the
 | ||||
| # device's fuses.
 | ||||
| FLASH_SIZE_KB         = 128 | ||||
| BOOT_SECTION_SIZE_KB  = 8 | ||||
| 
 | ||||
| # Bootloader address calculation formulas
 | ||||
| # Do not modify these macros, but rather modify the dependent values above.
 | ||||
| CALC_ADDRESS_IN_HEX   = $(shell printf "0x%X" $$(( $(1) )) ) | ||||
| BOOT_START_OFFSET     = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) - $(BOOT_SECTION_SIZE_KB)) * 1024 ) | ||||
| BOOT_SEC_OFFSET       = $(call CALC_ADDRESS_IN_HEX, ($(FLASH_SIZE_KB) * 1024) - ($(strip $(1))) ) | ||||
| 
 | ||||
| # Bootloader linker section flags for relocating the API table sections to
 | ||||
| # known FLASH addresses - these should not normally be user-edited.
 | ||||
| BOOT_SECTION_LD_FLAG  = -Wl,--section-start=$(strip $(1))=$(call BOOT_SEC_OFFSET, $(3)) -Wl,--undefined=$(strip $(2)) | ||||
| BOOT_API_LD_FLAGS     = $(call BOOT_SECTION_LD_FLAG, .apitable_trampolines, BootloaderAPI_Trampolines, 96) | ||||
| BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_jumptable,   BootloaderAPI_JumpTable,   32) | ||||
| BOOT_API_LD_FLAGS    += $(call BOOT_SECTION_LD_FLAG, .apitable_signatures,  BootloaderAPI_Signatures,  8) | ||||
| 
 | ||||
| # Default target
 | ||||
| all: | ||||
| 
 | ||||
| # Include LUFA-specific DMBS extension modules
 | ||||
| DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA | ||||
| include $(DMBS_LUFA_PATH)/lufa-sources.mk | ||||
| include $(DMBS_LUFA_PATH)/lufa-gcc.mk | ||||
| 
 | ||||
| # Include common DMBS build system modules
 | ||||
| DMBS_PATH      ?= $(LUFA_PATH)/Build/DMBS/DMBS | ||||
| include $(DMBS_PATH)/core.mk | ||||
| include $(DMBS_PATH)/cppcheck.mk | ||||
| include $(DMBS_PATH)/doxygen.mk | ||||
| include $(DMBS_PATH)/dfu.mk | ||||
| include $(DMBS_PATH)/gcc.mk | ||||
| include $(DMBS_PATH)/hid.mk | ||||
| include $(DMBS_PATH)/avrdude.mk | ||||
| include $(DMBS_PATH)/atprogram.mk | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jack Humbert
						Jack Humbert