Add missing SVN eol-style property to files where it was missing.
This commit is contained in:
		
							parent
							
								
									a36012fc4b
								
							
						
					
					
						commit
						0c2ad9eb34
					
				
					 105 changed files with 27742 additions and 27742 deletions
				
			
		| 
						 | 
				
			
			@ -1,164 +1,164 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Main source file for the HID class bootloader. This file contains the complete bootloader logic.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#include "BootloaderHID.h"
 | 
			
		||||
 | 
			
		||||
/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run
 | 
			
		||||
 *  via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application
 | 
			
		||||
 *  started via a forced watchdog reset.
 | 
			
		||||
 */
 | 
			
		||||
static bool RunBootloader = true;
 | 
			
		||||
 | 
			
		||||
/** 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.
 | 
			
		||||
 */
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Setup hardware required for the bootloader */
 | 
			
		||||
	SetupHardware();
 | 
			
		||||
	
 | 
			
		||||
	/* Enable global interrupts so that the USB stack can function */
 | 
			
		||||
	sei();
 | 
			
		||||
 | 
			
		||||
	while (RunBootloader)
 | 
			
		||||
	  USB_USBTask();
 | 
			
		||||
	
 | 
			
		||||
	/* Disconnect from the host - USB interface will be reset later along with the AVR */
 | 
			
		||||
	USB_Detach();
 | 
			
		||||
 | 
			
		||||
	/* Enable the watchdog and force a timeout to reset the AVR */
 | 
			
		||||
	wdt_enable(WDTO_250MS);
 | 
			
		||||
 | 
			
		||||
	for (;;);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Configures all hardware required for the bootloader. */
 | 
			
		||||
void SetupHardware(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Disable watchdog if enabled by bootloader/fuses */
 | 
			
		||||
	MCUSR &= ~(1 << WDRF);
 | 
			
		||||
	wdt_disable();
 | 
			
		||||
 | 
			
		||||
	/* Relocate the interrupt vector table to the bootloader section */
 | 
			
		||||
	MCUCR = (1 << IVCE);
 | 
			
		||||
	MCUCR = (1 << IVSEL);
 | 
			
		||||
 | 
			
		||||
	/* Initialize USB subsystem */
 | 
			
		||||
	USB_Init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 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 HID Report Endpoint */
 | 
			
		||||
	Endpoint_ConfigureEndpoint(HID_IN_EPNUM, EP_TYPE_INTERRUPT,
 | 
			
		||||
		                       ENDPOINT_DIR_IN, HID_IN_EPSIZE,
 | 
			
		||||
	                           ENDPOINT_BANK_SINGLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 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 HID interface */
 | 
			
		||||
	if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) !=
 | 
			
		||||
	    (REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Process HID specific control requests */
 | 
			
		||||
	switch (USB_ControlRequest.bRequest)
 | 
			
		||||
	{
 | 
			
		||||
		case HID_REQ_SetReport:
 | 
			
		||||
			Endpoint_ClearSETUP();
 | 
			
		||||
			
 | 
			
		||||
			/* Wait until the command has been sent by the host */
 | 
			
		||||
			while (!(Endpoint_IsOUTReceived()));
 | 
			
		||||
		
 | 
			
		||||
			/* Read in the write destination address */
 | 
			
		||||
			#if (FLASHEND > 0xFFFF)
 | 
			
		||||
			uint32_t PageAddress = ((uint32_t)Endpoint_Read_16_LE() << 8);
 | 
			
		||||
			#else
 | 
			
		||||
			uint16_t PageAddress = Endpoint_Read_16_LE();
 | 
			
		||||
			#endif
 | 
			
		||||
			
 | 
			
		||||
			/* Check if the command is a program page command, or a start application command */
 | 
			
		||||
			#if (FLASHEND > 0xFFFF)
 | 
			
		||||
			if ((uint16_t)(PageAddress >> 8) == COMMAND_STARTAPPLICATION)
 | 
			
		||||
			#else
 | 
			
		||||
			if (PageAddress == COMMAND_STARTAPPLICATION)
 | 
			
		||||
			#endif
 | 
			
		||||
			{
 | 
			
		||||
				RunBootloader = false;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Erase the given FLASH page, ready to be programmed */
 | 
			
		||||
				boot_page_erase(PageAddress);
 | 
			
		||||
				boot_spm_busy_wait();
 | 
			
		||||
				
 | 
			
		||||
				/* Write each of the FLASH page's bytes in sequence */
 | 
			
		||||
				for (uint8_t PageWord = 0; PageWord < (SPM_PAGESIZE / 2); PageWord++)				
 | 
			
		||||
				{
 | 
			
		||||
					/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 | 
			
		||||
					if (!(Endpoint_BytesInEndpoint()))
 | 
			
		||||
					{
 | 
			
		||||
						Endpoint_ClearOUT();
 | 
			
		||||
						while (!(Endpoint_IsOUTReceived()));
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					/* Write the next data word to the FLASH page */
 | 
			
		||||
					boot_page_fill(PageAddress + ((uint16_t)PageWord << 1), Endpoint_Read_16_LE());
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* Write the filled FLASH page to memory */
 | 
			
		||||
				boot_page_write(PageAddress);
 | 
			
		||||
				boot_spm_busy_wait();
 | 
			
		||||
 | 
			
		||||
				/* Re-enable RWW section */
 | 
			
		||||
				boot_rww_enable();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Endpoint_ClearOUT();
 | 
			
		||||
 | 
			
		||||
			Endpoint_ClearStatusStage();
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Main source file for the HID class bootloader. This file contains the complete bootloader logic.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#include "BootloaderHID.h"
 | 
			
		||||
 | 
			
		||||
/** Flag to indicate if the bootloader should be running, or should exit and allow the application code to run
 | 
			
		||||
 *  via a soft reset. When cleared, the bootloader will abort, the USB interface will shut down and the application
 | 
			
		||||
 *  started via a forced watchdog reset.
 | 
			
		||||
 */
 | 
			
		||||
static bool RunBootloader = true;
 | 
			
		||||
 | 
			
		||||
/** 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.
 | 
			
		||||
 */
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Setup hardware required for the bootloader */
 | 
			
		||||
	SetupHardware();
 | 
			
		||||
	
 | 
			
		||||
	/* Enable global interrupts so that the USB stack can function */
 | 
			
		||||
	sei();
 | 
			
		||||
 | 
			
		||||
	while (RunBootloader)
 | 
			
		||||
	  USB_USBTask();
 | 
			
		||||
	
 | 
			
		||||
	/* Disconnect from the host - USB interface will be reset later along with the AVR */
 | 
			
		||||
	USB_Detach();
 | 
			
		||||
 | 
			
		||||
	/* Enable the watchdog and force a timeout to reset the AVR */
 | 
			
		||||
	wdt_enable(WDTO_250MS);
 | 
			
		||||
 | 
			
		||||
	for (;;);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Configures all hardware required for the bootloader. */
 | 
			
		||||
void SetupHardware(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Disable watchdog if enabled by bootloader/fuses */
 | 
			
		||||
	MCUSR &= ~(1 << WDRF);
 | 
			
		||||
	wdt_disable();
 | 
			
		||||
 | 
			
		||||
	/* Relocate the interrupt vector table to the bootloader section */
 | 
			
		||||
	MCUCR = (1 << IVCE);
 | 
			
		||||
	MCUCR = (1 << IVSEL);
 | 
			
		||||
 | 
			
		||||
	/* Initialize USB subsystem */
 | 
			
		||||
	USB_Init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 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 HID Report Endpoint */
 | 
			
		||||
	Endpoint_ConfigureEndpoint(HID_IN_EPNUM, EP_TYPE_INTERRUPT,
 | 
			
		||||
		                       ENDPOINT_DIR_IN, HID_IN_EPSIZE,
 | 
			
		||||
	                           ENDPOINT_BANK_SINGLE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 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 HID interface */
 | 
			
		||||
	if ((USB_ControlRequest.bmRequestType & (CONTROL_REQTYPE_TYPE | CONTROL_REQTYPE_RECIPIENT)) !=
 | 
			
		||||
	    (REQTYPE_CLASS | REQREC_INTERFACE))
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Process HID specific control requests */
 | 
			
		||||
	switch (USB_ControlRequest.bRequest)
 | 
			
		||||
	{
 | 
			
		||||
		case HID_REQ_SetReport:
 | 
			
		||||
			Endpoint_ClearSETUP();
 | 
			
		||||
			
 | 
			
		||||
			/* Wait until the command has been sent by the host */
 | 
			
		||||
			while (!(Endpoint_IsOUTReceived()));
 | 
			
		||||
		
 | 
			
		||||
			/* Read in the write destination address */
 | 
			
		||||
			#if (FLASHEND > 0xFFFF)
 | 
			
		||||
			uint32_t PageAddress = ((uint32_t)Endpoint_Read_16_LE() << 8);
 | 
			
		||||
			#else
 | 
			
		||||
			uint16_t PageAddress = Endpoint_Read_16_LE();
 | 
			
		||||
			#endif
 | 
			
		||||
			
 | 
			
		||||
			/* Check if the command is a program page command, or a start application command */
 | 
			
		||||
			#if (FLASHEND > 0xFFFF)
 | 
			
		||||
			if ((uint16_t)(PageAddress >> 8) == COMMAND_STARTAPPLICATION)
 | 
			
		||||
			#else
 | 
			
		||||
			if (PageAddress == COMMAND_STARTAPPLICATION)
 | 
			
		||||
			#endif
 | 
			
		||||
			{
 | 
			
		||||
				RunBootloader = false;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				/* Erase the given FLASH page, ready to be programmed */
 | 
			
		||||
				boot_page_erase(PageAddress);
 | 
			
		||||
				boot_spm_busy_wait();
 | 
			
		||||
				
 | 
			
		||||
				/* Write each of the FLASH page's bytes in sequence */
 | 
			
		||||
				for (uint8_t PageWord = 0; PageWord < (SPM_PAGESIZE / 2); PageWord++)				
 | 
			
		||||
				{
 | 
			
		||||
					/* Check if endpoint is empty - if so clear it and wait until ready for next packet */
 | 
			
		||||
					if (!(Endpoint_BytesInEndpoint()))
 | 
			
		||||
					{
 | 
			
		||||
						Endpoint_ClearOUT();
 | 
			
		||||
						while (!(Endpoint_IsOUTReceived()));
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					/* Write the next data word to the FLASH page */
 | 
			
		||||
					boot_page_fill(PageAddress + ((uint16_t)PageWord << 1), Endpoint_Read_16_LE());
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				/* Write the filled FLASH page to memory */
 | 
			
		||||
				boot_page_write(PageAddress);
 | 
			
		||||
				boot_spm_busy_wait();
 | 
			
		||||
 | 
			
		||||
				/* Re-enable RWW section */
 | 
			
		||||
				boot_rww_enable();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Endpoint_ClearOUT();
 | 
			
		||||
 | 
			
		||||
			Endpoint_ClearStatusStage();
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,61 +1,61 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
	  
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for TeensyHID.c.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#ifndef _TEENSYHID_H_
 | 
			
		||||
#define _TEENSYHID_H_
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include <avr/io.h>
 | 
			
		||||
		#include <avr/wdt.h>
 | 
			
		||||
		#include <avr/boot.h>
 | 
			
		||||
		#include <avr/power.h>
 | 
			
		||||
		#include <avr/interrupt.h>
 | 
			
		||||
		#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
		#include "Descriptors.h"
 | 
			
		||||
 | 
			
		||||
		#include <LUFA/Drivers/USB/USB.h>
 | 
			
		||||
		
 | 
			
		||||
	/* Macros: */		
 | 
			
		||||
		/** Bootloader special address to start the user application */
 | 
			
		||||
		#define COMMAND_STARTAPPLICATION   0xFFFF
 | 
			
		||||
		
 | 
			
		||||
	/* Function Prototypes: */
 | 
			
		||||
		void SetupHardware(void);
 | 
			
		||||
 | 
			
		||||
		void EVENT_USB_Device_ConfigurationChanged(void);
 | 
			
		||||
		void EVENT_USB_Device_UnhandledControlRequest(void);
 | 
			
		||||
		
 | 
			
		||||
#endif
 | 
			
		||||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
	  
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for TeensyHID.c.
 | 
			
		||||
 */
 | 
			
		||||
 
 | 
			
		||||
#ifndef _TEENSYHID_H_
 | 
			
		||||
#define _TEENSYHID_H_
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include <avr/io.h>
 | 
			
		||||
		#include <avr/wdt.h>
 | 
			
		||||
		#include <avr/boot.h>
 | 
			
		||||
		#include <avr/power.h>
 | 
			
		||||
		#include <avr/interrupt.h>
 | 
			
		||||
		#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
		#include "Descriptors.h"
 | 
			
		||||
 | 
			
		||||
		#include <LUFA/Drivers/USB/USB.h>
 | 
			
		||||
		
 | 
			
		||||
	/* Macros: */		
 | 
			
		||||
		/** Bootloader special address to start the user application */
 | 
			
		||||
		#define COMMAND_STARTAPPLICATION   0xFFFF
 | 
			
		||||
		
 | 
			
		||||
	/* Function Prototypes: */
 | 
			
		||||
		void SetupHardware(void);
 | 
			
		||||
 | 
			
		||||
		void EVENT_USB_Device_ConfigurationChanged(void);
 | 
			
		||||
		void EVENT_USB_Device_UnhandledControlRequest(void);
 | 
			
		||||
		
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,88 +1,88 @@
 | 
			
		|||
/** \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 HID Class USB AVR Bootloader
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_Compat Demo Compatibility:
 | 
			
		||||
 *
 | 
			
		||||
 *  The following list indicates what microcontrollers are compatible with this demo.
 | 
			
		||||
 *
 | 
			
		||||
 *  - Series 7 USB AVRs (AT90USBxxx7)
 | 
			
		||||
 *  - Series 6 USB AVRs (AT90USBxxx6)
 | 
			
		||||
 *  - Series 4 USB AVRs (ATMEGAxxU4)
 | 
			
		||||
 *  - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2)
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_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>Human Interface Device Class (HID)</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 *  <tr> 
 | 
			
		||||
 *   <td><b>USB Subclass:</b></td>
 | 
			
		||||
 *   <td>N/A</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 *  <tr>
 | 
			
		||||
 *   <td><b>Relevant Standards:</b></td>
 | 
			
		||||
 *   <td>USBIF HID Class Standard \n
 | 
			
		||||
 *       Teensy Programming Protocol Specification</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 *  <tr>
 | 
			
		||||
 *   <td><b>Usable Speeds:</b></td>
 | 
			
		||||
 *   <td>Low Speed Mode \n
 | 
			
		||||
 *       Full Speed Mode</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 * </table>
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_Description Project Description: 
 | 
			
		||||
 *
 | 
			
		||||
 *  This bootloader enumerates to the host as a HID Class device, allowing for device FLASH programming through
 | 
			
		||||
 *  the supplied command line software, which is a modified version of Paul's TeensyHID Command Line loader code
 | 
			
		||||
 *  from PJRC (used with permission). This bootloader is deliberatley non-compatible with the properietary PJRC
 | 
			
		||||
 *  HalfKay bootloader GUI; only the command line interface software accompanying this bootloader will work with it.
 | 
			
		||||
 *  
 | 
			
		||||
 *  Out of the box this bootloader builds for the USB1287, and will fit into 2KB of bootloader space for the
 | 
			
		||||
 *  Series 2 USB AVRs (ATMEGAxxU2, AT90USBxx2) or 4KB of bootloader space for all other models. If you wish to
 | 
			
		||||
 *  enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU values in the
 | 
			
		||||
 *  accompanying makefile.
 | 
			
		||||
 *
 | 
			
		||||
 *  \section Sec_Installation Driver Installation
 | 
			
		||||
 *
 | 
			
		||||
 *  This bootloader uses the HID class driver inbuilt into all modern operating systems, thus no additional drivers
 | 
			
		||||
 *  need to be supplied for correct operation.
 | 
			
		||||
 *
 | 
			
		||||
 *  \section Sec_HostApp Host Controller Application
 | 
			
		||||
 *
 | 
			
		||||
 *  Due to licensing issues, the supplied bootloader is compatible with the HalfKay bootloader protocol designed
 | 
			
		||||
 *  by PJRC, but is non-compatible with the cross-platform loader GUI. A modified version of the open source
 | 
			
		||||
 *  cross-platform TeensyLoader application is supplied, which can be compiled under most operating systems. The
 | 
			
		||||
 *  command-line loader application should remain compatible with genuine Teensy boards in addition to boards using
 | 
			
		||||
 *  this custom bootloader.
 | 
			
		||||
 *
 | 
			
		||||
 *  Once compiled, programs can be loaded into the AVR's FLASH memory through the following example command:
 | 
			
		||||
 *  \code
 | 
			
		||||
 *  hid_bootloader_cli -mmcu=at90usb1287 Mouse.hex
 | 
			
		||||
 *  \endcode
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_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>
 | 
			
		||||
 *    <td>
 | 
			
		||||
 *     None
 | 
			
		||||
 *    </td>
 | 
			
		||||
 *   </tr>
 | 
			
		||||
 *  </table>
 | 
			
		||||
 */
 | 
			
		||||
/** \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 HID Class USB AVR Bootloader
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_Compat Demo Compatibility:
 | 
			
		||||
 *
 | 
			
		||||
 *  The following list indicates what microcontrollers are compatible with this demo.
 | 
			
		||||
 *
 | 
			
		||||
 *  - Series 7 USB AVRs (AT90USBxxx7)
 | 
			
		||||
 *  - Series 6 USB AVRs (AT90USBxxx6)
 | 
			
		||||
 *  - Series 4 USB AVRs (ATMEGAxxU4)
 | 
			
		||||
 *  - Series 2 USB AVRs (AT90USBxx2, ATMEGAxxU2)
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_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>Human Interface Device Class (HID)</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 *  <tr> 
 | 
			
		||||
 *   <td><b>USB Subclass:</b></td>
 | 
			
		||||
 *   <td>N/A</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 *  <tr>
 | 
			
		||||
 *   <td><b>Relevant Standards:</b></td>
 | 
			
		||||
 *   <td>USBIF HID Class Standard \n
 | 
			
		||||
 *       Teensy Programming Protocol Specification</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 *  <tr>
 | 
			
		||||
 *   <td><b>Usable Speeds:</b></td>
 | 
			
		||||
 *   <td>Low Speed Mode \n
 | 
			
		||||
 *       Full Speed Mode</td>
 | 
			
		||||
 *  </tr>
 | 
			
		||||
 * </table>
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_Description Project Description: 
 | 
			
		||||
 *
 | 
			
		||||
 *  This bootloader enumerates to the host as a HID Class device, allowing for device FLASH programming through
 | 
			
		||||
 *  the supplied command line software, which is a modified version of Paul's TeensyHID Command Line loader code
 | 
			
		||||
 *  from PJRC (used with permission). This bootloader is deliberatley non-compatible with the properietary PJRC
 | 
			
		||||
 *  HalfKay bootloader GUI; only the command line interface software accompanying this bootloader will work with it.
 | 
			
		||||
 *  
 | 
			
		||||
 *  Out of the box this bootloader builds for the USB1287, and will fit into 2KB of bootloader space for the
 | 
			
		||||
 *  Series 2 USB AVRs (ATMEGAxxU2, AT90USBxx2) or 4KB of bootloader space for all other models. If you wish to
 | 
			
		||||
 *  enlarge this space and/or change the AVR model, you will need to edit the BOOT_START and MCU values in the
 | 
			
		||||
 *  accompanying makefile.
 | 
			
		||||
 *
 | 
			
		||||
 *  \section Sec_Installation Driver Installation
 | 
			
		||||
 *
 | 
			
		||||
 *  This bootloader uses the HID class driver inbuilt into all modern operating systems, thus no additional drivers
 | 
			
		||||
 *  need to be supplied for correct operation.
 | 
			
		||||
 *
 | 
			
		||||
 *  \section Sec_HostApp Host Controller Application
 | 
			
		||||
 *
 | 
			
		||||
 *  Due to licensing issues, the supplied bootloader is compatible with the HalfKay bootloader protocol designed
 | 
			
		||||
 *  by PJRC, but is non-compatible with the cross-platform loader GUI. A modified version of the open source
 | 
			
		||||
 *  cross-platform TeensyLoader application is supplied, which can be compiled under most operating systems. The
 | 
			
		||||
 *  command-line loader application should remain compatible with genuine Teensy boards in addition to boards using
 | 
			
		||||
 *  this custom bootloader.
 | 
			
		||||
 *
 | 
			
		||||
 *  Once compiled, programs can be loaded into the AVR's FLASH memory through the following example command:
 | 
			
		||||
 *  \code
 | 
			
		||||
 *  hid_bootloader_cli -mmcu=at90usb1287 Mouse.hex
 | 
			
		||||
 *  \endcode
 | 
			
		||||
 *
 | 
			
		||||
 *  \section SSec_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>
 | 
			
		||||
 *    <td>
 | 
			
		||||
 *     None
 | 
			
		||||
 *    </td>
 | 
			
		||||
 *   </tr>
 | 
			
		||||
 *  </table>
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,186 +1,186 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
	  
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special 
 | 
			
		||||
 *  computer-readable structures which the host requests upon device enumeration, to determine
 | 
			
		||||
 *  the device's capabilities and functions.  
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "Descriptors.h"
 | 
			
		||||
 | 
			
		||||
/** HID class report descriptor. This is a special descriptor constructed with values from the
 | 
			
		||||
 *  USBIF HID class specification to describe the reports and capabilities of the HID device. This
 | 
			
		||||
 *  descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
 | 
			
		||||
 *  the device will send, and what it may be sent back from the host. Refer to the HID specification for
 | 
			
		||||
 *  more details on HID report descriptors.
 | 
			
		||||
 */
 | 
			
		||||
const USB_Descriptor_HIDReport_Datatype_t HIDReport[] =
 | 
			
		||||
{
 | 
			
		||||
	HID_RI_USAGE_PAGE(16, 0xFFDC), /* Vendor Page 0xDC */
 | 
			
		||||
	HID_RI_USAGE(8, 0xFB), /* Vendor Usage 0xFB */
 | 
			
		||||
	HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
 | 
			
		||||
	    HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
 | 
			
		||||
	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
			
		||||
	    HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
 | 
			
		||||
	    HID_RI_REPORT_SIZE(8, 0x08),
 | 
			
		||||
	    HID_RI_REPORT_COUNT(16, (sizeof(uint16_t) + SPM_PAGESIZE)),		
 | 
			
		||||
	    HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
 | 
			
		||||
	HID_RI_END_COLLECTION(0),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 | 
			
		||||
 *  device characteristics, including the supported USB version, control endpoint size and the
 | 
			
		||||
 *  number of device configurations. The descriptor is read out by the USB host when the enumeration
 | 
			
		||||
 *  process begins.
 | 
			
		||||
 */
 | 
			
		||||
const USB_Descriptor_Device_t DeviceDescriptor =
 | 
			
		||||
{
 | 
			
		||||
	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
 | 
			
		||||
 | 
			
		||||
	.USBSpecification       = VERSION_BCD(01.10),
 | 
			
		||||
	.Class                  = USB_CSCP_NoDeviceClass,
 | 
			
		||||
	.SubClass               = USB_CSCP_NoDeviceSubclass,
 | 
			
		||||
	.Protocol               = USB_CSCP_NoDeviceProtocol,
 | 
			
		||||
 | 
			
		||||
	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
 | 
			
		||||
 | 
			
		||||
	.VendorID               = 0x03EB,
 | 
			
		||||
	.ProductID              = 0x2067,
 | 
			
		||||
	.ReleaseNumber          = VERSION_BCD(00.01),
 | 
			
		||||
 | 
			
		||||
	.ManufacturerStrIndex   = NO_DESCRIPTOR,
 | 
			
		||||
	.ProductStrIndex        = NO_DESCRIPTOR,
 | 
			
		||||
	.SerialNumStrIndex      = NO_DESCRIPTOR,
 | 
			
		||||
 | 
			
		||||
	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 | 
			
		||||
 *  of the device in one of its supported configurations, including information about any device interfaces
 | 
			
		||||
 *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
 | 
			
		||||
 *  a configuration so that the host may correctly communicate with the USB device.
 | 
			
		||||
 */
 | 
			
		||||
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        = 1,
 | 
			
		||||
				
 | 
			
		||||
			.ConfigurationNumber    = 1,
 | 
			
		||||
			.ConfigurationStrIndex  = NO_DESCRIPTOR,
 | 
			
		||||
				
 | 
			
		||||
			.ConfigAttributes       = USB_CONFIG_ATTR_BUSPOWERED,
 | 
			
		||||
			
 | 
			
		||||
			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
	.HID_Interface = 
 | 
			
		||||
		{
 | 
			
		||||
			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
			
		||||
 | 
			
		||||
			.InterfaceNumber        = 0x00,
 | 
			
		||||
			.AlternateSetting       = 0x00,
 | 
			
		||||
			
 | 
			
		||||
			.TotalEndpoints         = 1,
 | 
			
		||||
				
 | 
			
		||||
			.Class                  = HID_CSCP_HIDClass,
 | 
			
		||||
			.SubClass               = HID_CSCP_NonBootSubclass,
 | 
			
		||||
			.Protocol               = HID_CSCP_NonBootProtocol,
 | 
			
		||||
				
 | 
			
		||||
			.InterfaceStrIndex      = NO_DESCRIPTOR
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
	.HID_VendorHID = 
 | 
			
		||||
		{  
 | 
			
		||||
			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
 | 
			
		||||
			
 | 
			
		||||
			.HIDSpec                = VERSION_BCD(01.11),
 | 
			
		||||
			.CountryCode            = 0x00,
 | 
			
		||||
			.TotalReportDescriptors = 1,
 | 
			
		||||
			.HIDReportType          = HID_DTYPE_Report,
 | 
			
		||||
			.HIDReportLength        = sizeof(HIDReport)
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
	.HID_ReportINEndpoint = 
 | 
			
		||||
		{
 | 
			
		||||
			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
			
		||||
 | 
			
		||||
			.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | HID_IN_EPNUM),
 | 
			
		||||
			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
			
		||||
			.EndpointSize           = HID_IN_EPSIZE,
 | 
			
		||||
			.PollingIntervalMS      = 0x01
 | 
			
		||||
		},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 | 
			
		||||
 *  documentation) by the application code so that the address and size of a requested descriptor can be given
 | 
			
		||||
 *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
 | 
			
		||||
 *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
 | 
			
		||||
 *  USB host.
 | 
			
		||||
 */
 | 
			
		||||
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
			
		||||
                                    const uint8_t wIndex,
 | 
			
		||||
                                    const void** const DescriptorAddress)
 | 
			
		||||
{
 | 
			
		||||
	const uint8_t DescriptorType   = (wValue >> 8);
 | 
			
		||||
 | 
			
		||||
	const void* Address = NULL;
 | 
			
		||||
	uint16_t    Size    = NO_DESCRIPTOR;
 | 
			
		||||
	
 | 
			
		||||
	/* If/Else If chain compiles slightly smaller than a switch case */
 | 
			
		||||
	if (DescriptorType == DTYPE_Device)
 | 
			
		||||
	{
 | 
			
		||||
		Address = &DeviceDescriptor;
 | 
			
		||||
		Size    = sizeof(USB_Descriptor_Device_t);	
 | 
			
		||||
	}
 | 
			
		||||
	else if (DescriptorType == DTYPE_Configuration)
 | 
			
		||||
	{
 | 
			
		||||
		Address = &ConfigurationDescriptor;
 | 
			
		||||
		Size    = sizeof(USB_Descriptor_Configuration_t);	
 | 
			
		||||
	}
 | 
			
		||||
	else if (DescriptorType == HID_DTYPE_HID)
 | 
			
		||||
	{
 | 
			
		||||
		Address = &ConfigurationDescriptor.HID_VendorHID;
 | 
			
		||||
		Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		Address = &HIDReport;
 | 
			
		||||
		Size    = sizeof(HIDReport);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*DescriptorAddress = Address;
 | 
			
		||||
	return Size;
 | 
			
		||||
}
 | 
			
		||||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
	  
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special 
 | 
			
		||||
 *  computer-readable structures which the host requests upon device enumeration, to determine
 | 
			
		||||
 *  the device's capabilities and functions.  
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "Descriptors.h"
 | 
			
		||||
 | 
			
		||||
/** HID class report descriptor. This is a special descriptor constructed with values from the
 | 
			
		||||
 *  USBIF HID class specification to describe the reports and capabilities of the HID device. This
 | 
			
		||||
 *  descriptor is parsed by the host and its contents used to determine what data (and in what encoding)
 | 
			
		||||
 *  the device will send, and what it may be sent back from the host. Refer to the HID specification for
 | 
			
		||||
 *  more details on HID report descriptors.
 | 
			
		||||
 */
 | 
			
		||||
const USB_Descriptor_HIDReport_Datatype_t HIDReport[] =
 | 
			
		||||
{
 | 
			
		||||
	HID_RI_USAGE_PAGE(16, 0xFFDC), /* Vendor Page 0xDC */
 | 
			
		||||
	HID_RI_USAGE(8, 0xFB), /* Vendor Usage 0xFB */
 | 
			
		||||
	HID_RI_COLLECTION(8, 0x01), /* Vendor Usage 1 */
 | 
			
		||||
	    HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
 | 
			
		||||
	    HID_RI_LOGICAL_MINIMUM(8, 0x00),
 | 
			
		||||
	    HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
 | 
			
		||||
	    HID_RI_REPORT_SIZE(8, 0x08),
 | 
			
		||||
	    HID_RI_REPORT_COUNT(16, (sizeof(uint16_t) + SPM_PAGESIZE)),		
 | 
			
		||||
	    HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
 | 
			
		||||
	HID_RI_END_COLLECTION(0),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Device descriptor structure. This descriptor, located in FLASH memory, describes the overall
 | 
			
		||||
 *  device characteristics, including the supported USB version, control endpoint size and the
 | 
			
		||||
 *  number of device configurations. The descriptor is read out by the USB host when the enumeration
 | 
			
		||||
 *  process begins.
 | 
			
		||||
 */
 | 
			
		||||
const USB_Descriptor_Device_t DeviceDescriptor =
 | 
			
		||||
{
 | 
			
		||||
	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
 | 
			
		||||
 | 
			
		||||
	.USBSpecification       = VERSION_BCD(01.10),
 | 
			
		||||
	.Class                  = USB_CSCP_NoDeviceClass,
 | 
			
		||||
	.SubClass               = USB_CSCP_NoDeviceSubclass,
 | 
			
		||||
	.Protocol               = USB_CSCP_NoDeviceProtocol,
 | 
			
		||||
 | 
			
		||||
	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE,
 | 
			
		||||
 | 
			
		||||
	.VendorID               = 0x03EB,
 | 
			
		||||
	.ProductID              = 0x2067,
 | 
			
		||||
	.ReleaseNumber          = VERSION_BCD(00.01),
 | 
			
		||||
 | 
			
		||||
	.ManufacturerStrIndex   = NO_DESCRIPTOR,
 | 
			
		||||
	.ProductStrIndex        = NO_DESCRIPTOR,
 | 
			
		||||
	.SerialNumStrIndex      = NO_DESCRIPTOR,
 | 
			
		||||
 | 
			
		||||
	.NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage
 | 
			
		||||
 *  of the device in one of its supported configurations, including information about any device interfaces
 | 
			
		||||
 *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting
 | 
			
		||||
 *  a configuration so that the host may correctly communicate with the USB device.
 | 
			
		||||
 */
 | 
			
		||||
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        = 1,
 | 
			
		||||
				
 | 
			
		||||
			.ConfigurationNumber    = 1,
 | 
			
		||||
			.ConfigurationStrIndex  = NO_DESCRIPTOR,
 | 
			
		||||
				
 | 
			
		||||
			.ConfigAttributes       = USB_CONFIG_ATTR_BUSPOWERED,
 | 
			
		||||
			
 | 
			
		||||
			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100)
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
	.HID_Interface = 
 | 
			
		||||
		{
 | 
			
		||||
			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
 | 
			
		||||
 | 
			
		||||
			.InterfaceNumber        = 0x00,
 | 
			
		||||
			.AlternateSetting       = 0x00,
 | 
			
		||||
			
 | 
			
		||||
			.TotalEndpoints         = 1,
 | 
			
		||||
				
 | 
			
		||||
			.Class                  = HID_CSCP_HIDClass,
 | 
			
		||||
			.SubClass               = HID_CSCP_NonBootSubclass,
 | 
			
		||||
			.Protocol               = HID_CSCP_NonBootProtocol,
 | 
			
		||||
				
 | 
			
		||||
			.InterfaceStrIndex      = NO_DESCRIPTOR
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
	.HID_VendorHID = 
 | 
			
		||||
		{  
 | 
			
		||||
			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
 | 
			
		||||
			
 | 
			
		||||
			.HIDSpec                = VERSION_BCD(01.11),
 | 
			
		||||
			.CountryCode            = 0x00,
 | 
			
		||||
			.TotalReportDescriptors = 1,
 | 
			
		||||
			.HIDReportType          = HID_DTYPE_Report,
 | 
			
		||||
			.HIDReportLength        = sizeof(HIDReport)
 | 
			
		||||
		},
 | 
			
		||||
		
 | 
			
		||||
	.HID_ReportINEndpoint = 
 | 
			
		||||
		{
 | 
			
		||||
			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
 | 
			
		||||
 | 
			
		||||
			.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | HID_IN_EPNUM),
 | 
			
		||||
			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
 | 
			
		||||
			.EndpointSize           = HID_IN_EPSIZE,
 | 
			
		||||
			.PollingIntervalMS      = 0x01
 | 
			
		||||
		},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
 | 
			
		||||
 *  documentation) by the application code so that the address and size of a requested descriptor can be given
 | 
			
		||||
 *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
 | 
			
		||||
 *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
 | 
			
		||||
 *  USB host.
 | 
			
		||||
 */
 | 
			
		||||
uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
			
		||||
                                    const uint8_t wIndex,
 | 
			
		||||
                                    const void** const DescriptorAddress)
 | 
			
		||||
{
 | 
			
		||||
	const uint8_t DescriptorType   = (wValue >> 8);
 | 
			
		||||
 | 
			
		||||
	const void* Address = NULL;
 | 
			
		||||
	uint16_t    Size    = NO_DESCRIPTOR;
 | 
			
		||||
	
 | 
			
		||||
	/* If/Else If chain compiles slightly smaller than a switch case */
 | 
			
		||||
	if (DescriptorType == DTYPE_Device)
 | 
			
		||||
	{
 | 
			
		||||
		Address = &DeviceDescriptor;
 | 
			
		||||
		Size    = sizeof(USB_Descriptor_Device_t);	
 | 
			
		||||
	}
 | 
			
		||||
	else if (DescriptorType == DTYPE_Configuration)
 | 
			
		||||
	{
 | 
			
		||||
		Address = &ConfigurationDescriptor;
 | 
			
		||||
		Size    = sizeof(USB_Descriptor_Configuration_t);	
 | 
			
		||||
	}
 | 
			
		||||
	else if (DescriptorType == HID_DTYPE_HID)
 | 
			
		||||
	{
 | 
			
		||||
		Address = &ConfigurationDescriptor.HID_VendorHID;
 | 
			
		||||
		Size    = sizeof(USB_HID_Descriptor_HID_t);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		Address = &HIDReport;
 | 
			
		||||
		Size    = sizeof(HIDReport);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	*DescriptorAddress = Address;
 | 
			
		||||
	return Size;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,70 +1,70 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
	  
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for Descriptors.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _DESCRIPTORS_H_
 | 
			
		||||
#define _DESCRIPTORS_H_
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include <LUFA/Drivers/USB/USB.h>
 | 
			
		||||
 | 
			
		||||
	/* 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;
 | 
			
		||||
			
 | 
			
		||||
			// Generic HID Interface
 | 
			
		||||
			USB_Descriptor_Interface_t            HID_Interface;
 | 
			
		||||
			USB_HID_Descriptor_HID_t              HID_VendorHID;
 | 
			
		||||
	        USB_Descriptor_Endpoint_t             HID_ReportINEndpoint;
 | 
			
		||||
		} USB_Descriptor_Configuration_t;
 | 
			
		||||
					
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		/** Endpoint number of the HID data IN endpoint. */
 | 
			
		||||
		#define HID_IN_EPNUM                 1
 | 
			
		||||
 | 
			
		||||
		/** Size in bytes of the HID reporting IN endpoint. */		
 | 
			
		||||
		#define HID_IN_EPSIZE                64
 | 
			
		||||
 | 
			
		||||
	/* Function Prototypes: */
 | 
			
		||||
		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
			
		||||
		                                    const uint8_t wIndex,
 | 
			
		||||
		                                    const void** const DescriptorAddress)
 | 
			
		||||
		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2011.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
	  
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this 
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in 
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting 
 | 
			
		||||
  documentation, and that the name of the author not be used in 
 | 
			
		||||
  advertising or publicity pertaining to distribution of the 
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaim all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *
 | 
			
		||||
 *  Header file for Descriptors.c.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef _DESCRIPTORS_H_
 | 
			
		||||
#define _DESCRIPTORS_H_
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include <LUFA/Drivers/USB/USB.h>
 | 
			
		||||
 | 
			
		||||
	/* 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;
 | 
			
		||||
			
 | 
			
		||||
			// Generic HID Interface
 | 
			
		||||
			USB_Descriptor_Interface_t            HID_Interface;
 | 
			
		||||
			USB_HID_Descriptor_HID_t              HID_VendorHID;
 | 
			
		||||
	        USB_Descriptor_Endpoint_t             HID_ReportINEndpoint;
 | 
			
		||||
		} USB_Descriptor_Configuration_t;
 | 
			
		||||
					
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		/** Endpoint number of the HID data IN endpoint. */
 | 
			
		||||
		#define HID_IN_EPNUM                 1
 | 
			
		||||
 | 
			
		||||
		/** Size in bytes of the HID reporting IN endpoint. */		
 | 
			
		||||
		#define HID_IN_EPSIZE                64
 | 
			
		||||
 | 
			
		||||
	/* Function Prototypes: */
 | 
			
		||||
		uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
 | 
			
		||||
		                                    const uint8_t wIndex,
 | 
			
		||||
		                                    const void** const DescriptorAddress)
 | 
			
		||||
		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue