Cleans up quantum/keymap situation, removes extra lufa folders (#416)
* sorts out keycodes * move midi around * remove mbed * replaces keymap with qmk/keymap_common * fixes keymap.h * keymap, config, quantum rearrange * removes unneeded lufa stuff
This commit is contained in:
		| @@ -18,11 +18,7 @@ LUFA_SRC = lufa.c \ | ||||
| 	   $(LUFA_SRC_USB) | ||||
|  | ||||
| ifeq ($(strip $(MIDI_ENABLE)), yes) | ||||
| 	LUFA_SRC += midi/midi.c \ | ||||
| 	   midi/midi_device.c \ | ||||
| 	   midi/bytequeue/bytequeue.c \ | ||||
| 	   midi/bytequeue/interrupt_setting.c \ | ||||
| 	   $(LUFA_SRC_USBCLASS) | ||||
| 	include $(TMK_PATH)/protocol/midi.mk | ||||
| endif | ||||
|  | ||||
| ifeq ($(strip $(BLUETOOTH_ENABLE)), yes) | ||||
|   | ||||
| @@ -1,274 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 AudioInput demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "AudioInput.h" | ||||
|  | ||||
| /** LUFA Audio Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all Audio Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_Audio_Device_t Microphone_Audio_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.ControlInterfaceNumber   = INTERFACE_ID_AudioControl, | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = AUDIO_STREAM_EPADDR, | ||||
| 						.Size             = AUDIO_STREAM_EPSIZE, | ||||
| 						.Banks            = 2, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
| /** Current audio sampling frequency of the streaming audio endpoint. */ | ||||
| static uint32_t CurrentAudioSampleFrequency = 48000; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		Audio_Device_USBTask(&Microphone_Audio_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32); | ||||
| 	ADC_SetupChannel(MIC_IN_ADC_CHANNEL); | ||||
| 	USB_Init(); | ||||
|  | ||||
| 	/* Start the ADC conversion in free running mode */ | ||||
| 	ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_GET_CHANNEL_MASK(MIC_IN_ADC_CHANNEL)); | ||||
| } | ||||
|  | ||||
| /** ISR to handle the reloading of the data endpoint with the next sample. */ | ||||
| ISR(TIMER0_COMPA_vect, ISR_BLOCK) | ||||
| { | ||||
| 	uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); | ||||
|  | ||||
| 	/* Check that the USB bus is ready for the next sample to write */ | ||||
| 	if (Audio_Device_IsReadyForNextSample(&Microphone_Audio_Interface)) | ||||
| 	{ | ||||
| 		int16_t AudioSample; | ||||
|  | ||||
| 		#if defined(USE_TEST_TONE) | ||||
| 			static uint8_t SquareWaveSampleCount; | ||||
| 			static int16_t CurrentWaveValue; | ||||
|  | ||||
| 			/* In test tone mode, generate a square wave at 1/256 of the sample rate */ | ||||
| 			if (SquareWaveSampleCount++ == 0xFF) | ||||
| 			  CurrentWaveValue ^= 0x8000; | ||||
|  | ||||
| 			/* Only generate audio if the board button is being pressed */ | ||||
| 			AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0; | ||||
| 		#else | ||||
| 			/* Audio sample is ADC value scaled to fit the entire range */ | ||||
| 			AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult()); | ||||
|  | ||||
| 			#if defined(MICROPHONE_BIASED_TO_HALF_RAIL) | ||||
| 			/* Microphone is biased to half rail voltage, subtract the bias from the sample value */ | ||||
| 			AudioSample -= (SAMPLE_MAX_RANGE / 2); | ||||
| 			#endif | ||||
| 		#endif | ||||
|  | ||||
| 		Audio_Device_WriteSample16(&Microphone_Audio_Interface, AudioSample); | ||||
| 	} | ||||
|  | ||||
| 	Endpoint_SelectEndpoint(PrevEndpoint); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
|  | ||||
| 	/* Sample reload timer initialization */ | ||||
| 	TIMSK0  = (1 << OCIE0A); | ||||
| 	OCR0A   = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 	TCCR0A  = (1 << WGM01);  // CTC mode | ||||
| 	TCCR0B  = (1 << CS01);   // Fcpu/8 speed | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	/* Stop the sample reload timer */ | ||||
| 	TCCR0B = 0; | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= Audio_Device_ConfigureEndpoints(&Microphone_Audio_Interface); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	Audio_Device_ProcessControlRequest(&Microphone_Audio_Interface); | ||||
| } | ||||
|  | ||||
| /** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented | ||||
|  *  in the user application to handle property manipulations on streaming audio endpoints. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced. | ||||
|  *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from Audio_EndpointControls_t. | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property get/set was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                   const uint8_t EndpointProperty, | ||||
|                                                   const uint8_t EndpointAddress, | ||||
|                                                   const uint8_t EndpointControl, | ||||
|                                                   uint16_t* const DataLength, | ||||
|                                                   uint8_t* Data) | ||||
| { | ||||
| 	/* Check the requested endpoint to see if a supported endpoint is being manipulated */ | ||||
| 	if (EndpointAddress == Microphone_Audio_Interface.Config.DataINEndpoint.Address) | ||||
| 	{ | ||||
| 		/* Check the requested control to see if a supported control is being manipulated */ | ||||
| 		if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq) | ||||
| 		{ | ||||
| 			switch (EndpointProperty) | ||||
| 			{ | ||||
| 				case AUDIO_REQ_SetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually adjusting it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						/* Set the new sampling frequency to the value given by the host */ | ||||
| 						CurrentAudioSampleFrequency = (((uint32_t)Data[2] << 16) | ((uint32_t)Data[1] << 8) | (uint32_t)Data[0]); | ||||
|  | ||||
| 						/* Adjust sample reload timer to the new frequency */ | ||||
| 						OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 					} | ||||
|  | ||||
| 					return true; | ||||
| 				case AUDIO_REQ_GetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually reading it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						*DataLength = 3; | ||||
|  | ||||
| 						Data[2] = (CurrentAudioSampleFrequency >> 16); | ||||
| 						Data[1] = (CurrentAudioSampleFrequency >> 8); | ||||
| 						Data[0] = (CurrentAudioSampleFrequency &  0xFF); | ||||
| 					} | ||||
|  | ||||
| 					return true; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| /** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented | ||||
|  *  in the user application to handle property manipulations on streaming audio interfaces. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     Property            Property of the interface to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EntityAddress       Address of the audio entity whose property is being referenced. | ||||
|  *  \param[in]     Parameter           Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification). | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                    const uint8_t Property, | ||||
|                                                    const uint8_t EntityAddress, | ||||
|                                                    const uint16_t Parameter, | ||||
|                                                    uint16_t* const DataLength, | ||||
|                                                    uint8_t* Data) | ||||
| { | ||||
| 	/* No audio interface entities in the device descriptor, thus no properties to get or set. */ | ||||
| 	return false; | ||||
| } | ||||
| @@ -1,94 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 AudioInput.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _AUDIO_INPUT_H_ | ||||
| #define _AUDIO_INPUT_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/Peripheral/ADC.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
| 		#include "Config/AppConfig.h" | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Maximum audio sample value for the microphone input. */ | ||||
| 		#define SAMPLE_MAX_RANGE          0xFFFF | ||||
|  | ||||
| 		/** Maximum ADC range for the microphone input. */ | ||||
| 		#define ADC_MAX_RANGE             0x3FF | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
|  | ||||
| 		bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                  const uint8_t EndpointProperty, | ||||
| 		                                                  const uint8_t EndpointAddress, | ||||
| 		                                                  const uint8_t EndpointControl, | ||||
| 		                                                  uint16_t* const DataLength, | ||||
| 		                                                  uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); | ||||
| 		bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                   const uint8_t Property, | ||||
| 		                                                   const uint8_t EntityAddress, | ||||
| 		                                                   const uint16_t Parameter, | ||||
| 		                                                   uint16_t* const DataLength, | ||||
| 		                                                   uint8_t* Data); | ||||
| #endif | ||||
|  | ||||
| @@ -1,92 +0,0 @@ | ||||
| /** \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 Audio Input Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  * | ||||
|  *  \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>Audio Class</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Standard Audio Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Audio 1.0 Class Specification \n | ||||
|  *        USBIF Audio 1.0 Class Terminal Types Specification \n | ||||
|  *        USBIF Audio 1.0 Data Formats Specification</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Audio demonstration application. This gives a simple reference | ||||
|  *  application for implementing a USB Audio Input device using the | ||||
|  *  basic USB Audio 1.0 drivers in all modern OSes (i.e. no special drivers | ||||
|  *  required). | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function as a | ||||
|  *  USB microphone. By default, the demo will produce a square wave test tone | ||||
|  *  when the board button is pressed. If USE_TEST_TONE is not defined in the | ||||
|  *  project makefile, incoming audio from the ADC channel 1 will be sampled | ||||
|  *  and sent to the host computer instead. | ||||
|  * | ||||
|  *  When in microphone mode, connect a microphone to the ADC channel 2. | ||||
|  * | ||||
|  *  Under Windows, if a driver request dialogue pops up, select the option | ||||
|  *  to automatically install the appropriate drivers. | ||||
|  * | ||||
|  *  \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>MIC_IN_ADC_CHANNEL</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>Sets the ADC channel used by the demo for the input audio samples from an attached microphone.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>USE_TEST_TONE</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed | ||||
|  *        instead of sampling the board microphone.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>MICROPHONE_BIASED_TO_HALF_RAIL</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,51 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 some of | ||||
|  *  the application's compile time options, as an alternative to | ||||
|  *  specifying the compile time constants supplied through a | ||||
|  *  makefile or build system. | ||||
|  * | ||||
|  *  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 MIC_IN_ADC_CHANNEL               2 | ||||
|  | ||||
| 	#define MICROPHONE_BIASED_TO_HALF_RAIL | ||||
| 	#define USE_TEST_TONE | ||||
|  | ||||
| #endif | ||||
| @@ -1,93 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
| @@ -1,312 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(2,0,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2047, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,2), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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 | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 0, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
|  | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = (sizeof(USB_Audio_Descriptor_Interface_AC_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_InputTerminal_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_OutputTerminal_t)), | ||||
|  | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_InputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_InputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.TerminalID               = 0x01, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_IN_MIC, | ||||
| 			.AssociatedOutputTerminal = 0x00, | ||||
|  | ||||
| 			.TotalChannels            = 1, | ||||
| 			.ChannelConfig            = 0, | ||||
|  | ||||
| 			.ChannelStrIndex          = NO_DESCRIPTOR, | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_OutputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_OutputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.TerminalID               = 0x02, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_STREAMING, | ||||
| 			.AssociatedInputTerminal  = 0x00, | ||||
|  | ||||
| 			.SourceID                 = 0x01, | ||||
|  | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_Alt0 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 0, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_Alt1 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 1, | ||||
|  | ||||
| 			.TotalEndpoints           = 1, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
|  | ||||
| 			.TerminalLink             = 0x02, | ||||
|  | ||||
| 			.FrameDelay               = 1, | ||||
| 			.AudioFormat              = 0x0001 | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_AudioFormat = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Format_t) + | ||||
| 			                                     sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates), | ||||
| 			                             .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_FormatType, | ||||
|  | ||||
| 			.FormatType               = 0x01, | ||||
| 			.Channels                 = 0x01, | ||||
|  | ||||
| 			.SubFrameSize             = 0x02, | ||||
| 			.BitResolution            = 16, | ||||
|  | ||||
| 			.TotalDiscreteSampleRates = (sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates) / sizeof(USB_Audio_SampleFreq_t)) | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_AudioFormatSampleRates = | ||||
| 		{ | ||||
| 			AUDIO_SAMPLE_FREQ(8000), | ||||
| 			AUDIO_SAMPLE_FREQ(11025), | ||||
| 			AUDIO_SAMPLE_FREQ(22050), | ||||
| 			AUDIO_SAMPLE_FREQ(44100), | ||||
| 			AUDIO_SAMPLE_FREQ(48000), | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamEndpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 					.EndpointAddress     = AUDIO_STREAM_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = AUDIO_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x01 | ||||
| 				}, | ||||
|  | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamEndpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
|  | ||||
| 			.Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL), | ||||
|  | ||||
| 			.LockDelayUnits           = 0x00, | ||||
| 			.LockDelay                = 0x0000 | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Audio In Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,106 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#include "Config/AppConfig.h" | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Audio isochronous streaming data IN endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPADDR           (ENDPOINT_DIR_IN | 1) | ||||
|  | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPSIZE           256 | ||||
|  | ||||
| 	/* 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; | ||||
|  | ||||
| 			// Audio Control Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
| 			USB_Audio_Descriptor_InputTerminal_t      Audio_InputTerminal; | ||||
| 			USB_Audio_Descriptor_OutputTerminal_t     Audio_OutputTerminal; | ||||
|  | ||||
| 			// Audio Streaming Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt0; | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt1; | ||||
| 			USB_Audio_Descriptor_Interface_AS_t       Audio_StreamInterface_SPC; | ||||
| 			USB_Audio_Descriptor_Format_t             Audio_AudioFormat; | ||||
| 			USB_Audio_SampleFreq_t                    Audio_AudioFormatSampleRates[5]; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t Audio_StreamEndpoint; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Spc_t Audio_StreamEndpoint_SPC; | ||||
| 		} 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_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio stream 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 uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,52 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Audio Input Device Demo (Class Driver APIs)" id="lufa.demos.device.class.audio_input.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.audio_input"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.audio_input" caption="Audio Input Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Audio 1.0 Input device demo, implementing a basic USB microphone. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="Audio Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="AudioInput.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="AudioInput.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="AudioInput.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="module-config" subtype="required-header-file" value="AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.peripheral.adc"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = AudioInput | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,311 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 AudioOutput demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "AudioOutput.h" | ||||
|  | ||||
| /** LUFA Audio Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all Audio Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_Audio_Device_t Speaker_Audio_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.ControlInterfaceNumber   = INTERFACE_ID_AudioControl, | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataOUTEndpoint          = | ||||
| 					{ | ||||
| 						.Address          = AUDIO_STREAM_EPADDR, | ||||
| 						.Size             = AUDIO_STREAM_EPSIZE, | ||||
| 						.Banks            = 2, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
| /** Current audio sampling frequency of the streaming audio endpoint. */ | ||||
| static uint32_t CurrentAudioSampleFrequency = 48000; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		Audio_Device_USBTask(&Speaker_Audio_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	LEDs_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** ISR to handle the reloading of the PWM timer with the next sample. */ | ||||
| ISR(TIMER0_COMPA_vect, ISR_BLOCK) | ||||
| { | ||||
| 	uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); | ||||
|  | ||||
| 	/* Check that the USB bus is ready for the next sample to read */ | ||||
| 	if (Audio_Device_IsSampleReceived(&Speaker_Audio_Interface)) | ||||
| 	{ | ||||
| 		/* Retrieve the signed 16-bit left and right audio samples, convert to 8-bit */ | ||||
| 		int8_t LeftSample_8Bit  = (Audio_Device_ReadSample16(&Speaker_Audio_Interface) >> 8); | ||||
| 		int8_t RightSample_8Bit = (Audio_Device_ReadSample16(&Speaker_Audio_Interface) >> 8); | ||||
|  | ||||
| 		/* Mix the two channels together to produce a mono, 8-bit sample */ | ||||
| 		int8_t MixedSample_8Bit = (((int16_t)LeftSample_8Bit + (int16_t)RightSample_8Bit) >> 1); | ||||
|  | ||||
| 		#if defined(AUDIO_OUT_MONO) | ||||
| 		/* Load the sample into the PWM timer channel */ | ||||
| 		OCR3A = (MixedSample_8Bit ^ (1 << 7)); | ||||
| 		#elif defined(AUDIO_OUT_STEREO) | ||||
| 		/* Load the dual 8-bit samples into the PWM timer channels */ | ||||
| 		OCR3A = (LeftSample_8Bit  ^ (1 << 7)); | ||||
| 		OCR3B = (RightSample_8Bit ^ (1 << 7)); | ||||
| 		#elif defined(AUDIO_OUT_PORTC) | ||||
| 		/* Load the 8-bit mixed sample into PORTC */ | ||||
| 		PORTC = MixedSample_8Bit; | ||||
| 		#endif | ||||
|  | ||||
| 		uint8_t LEDMask = LEDS_NO_LEDS; | ||||
|  | ||||
| 		/* Turn on LEDs as the sample amplitude increases */ | ||||
| 		if (MixedSample_8Bit > 16) | ||||
| 		  LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4); | ||||
| 		else if (MixedSample_8Bit > 8) | ||||
| 		  LEDMask = (LEDS_LED1 | LEDS_LED2 | LEDS_LED3); | ||||
| 		else if (MixedSample_8Bit > 4) | ||||
| 		  LEDMask = (LEDS_LED1 | LEDS_LED2); | ||||
| 		else if (MixedSample_8Bit > 2) | ||||
| 		  LEDMask = (LEDS_LED1); | ||||
|  | ||||
| 		LEDs_SetAllLEDs(LEDMask); | ||||
| 	} | ||||
|  | ||||
| 	Endpoint_SelectEndpoint(PrevEndpoint); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
|  | ||||
| 	/* Sample reload timer initialization */ | ||||
| 	TIMSK0  = (1 << OCIE0A); | ||||
| 	OCR0A   = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 	TCCR0A  = (1 << WGM01);  // CTC mode | ||||
| 	TCCR0B  = (1 << CS01);   // Fcpu/8 speed | ||||
|  | ||||
| 	#if defined(AUDIO_OUT_MONO) | ||||
| 	/* Set speaker as output */ | ||||
| 	DDRC   |= (1 << 6); | ||||
| 	#elif defined(AUDIO_OUT_STEREO) | ||||
| 	/* Set speakers as outputs */ | ||||
| 	DDRC   |= ((1 << 6) | (1 << 5)); | ||||
| 	#elif defined(AUDIO_OUT_PORTC) | ||||
| 	/* Set PORTC as outputs */ | ||||
| 	DDRC   |= 0xFF; | ||||
| 	#endif | ||||
|  | ||||
| 	#if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) | ||||
| 	/* PWM speaker timer initialization */ | ||||
| 	TCCR3A  = ((1 << WGM30) | (1 << COM3A1) | (1 << COM3A0) | ||||
| 	        | (1 << COM3B1) | (1 << COM3B0)); // Set on match, clear on TOP | ||||
| 	TCCR3B  = ((1 << WGM32) | (1 << CS30));  // Fast 8-Bit PWM, F_CPU speed | ||||
| 	#endif | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
|  | ||||
| 	/* Stop the sample reload timer */ | ||||
| 	TCCR0B = 0; | ||||
|  | ||||
| 	#if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) | ||||
| 	/* Stop the PWM generation timer */ | ||||
| 	TCCR3B = 0; | ||||
| 	#endif | ||||
|  | ||||
| 	#if defined(AUDIO_OUT_MONO) | ||||
| 	/* Set speaker as input to reduce current draw */ | ||||
| 	DDRC  &= ~(1 << 6); | ||||
| 	#elif defined(AUDIO_OUT_STEREO) | ||||
| 	/* Set speakers as inputs to reduce current draw */ | ||||
| 	DDRC  &= ~((1 << 6) | (1 << 5)); | ||||
| 	#elif defined(AUDIO_OUT_PORTC) | ||||
| 	/* Set PORTC low */ | ||||
| 	PORTC = 0x00; | ||||
| 	#endif | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= Audio_Device_ConfigureEndpoints(&Speaker_Audio_Interface); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	Audio_Device_ProcessControlRequest(&Speaker_Audio_Interface); | ||||
| } | ||||
|  | ||||
| /** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented | ||||
|  *  in the user application to handle property manipulations on streaming audio endpoints. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced. | ||||
|  *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from Audio_EndpointControls_t. | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property get/set was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                   const uint8_t EndpointProperty, | ||||
|                                                   const uint8_t EndpointAddress, | ||||
|                                                   const uint8_t EndpointControl, | ||||
|                                                   uint16_t* const DataLength, | ||||
|                                                   uint8_t* Data) | ||||
| { | ||||
| 	/* Check the requested endpoint to see if a supported endpoint is being manipulated */ | ||||
| 	if (EndpointAddress == Speaker_Audio_Interface.Config.DataOUTEndpoint.Address) | ||||
| 	{ | ||||
| 		/* Check the requested control to see if a supported control is being manipulated */ | ||||
| 		if (EndpointControl == AUDIO_EPCONTROL_SamplingFreq) | ||||
| 		{ | ||||
| 			switch (EndpointProperty) | ||||
| 			{ | ||||
| 				case AUDIO_REQ_SetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually adjusting it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						/* Set the new sampling frequency to the value given by the host */ | ||||
| 						CurrentAudioSampleFrequency = (((uint32_t)Data[2] << 16) | ((uint32_t)Data[1] << 8) | (uint32_t)Data[0]); | ||||
|  | ||||
| 						/* Adjust sample reload timer to the new frequency */ | ||||
| 						OCR0A = ((F_CPU / 8 / CurrentAudioSampleFrequency) - 1); | ||||
| 					} | ||||
|  | ||||
| 					return true; | ||||
| 				case AUDIO_REQ_GetCurrent: | ||||
| 					/* Check if we are just testing for a valid property, or actually reading it */ | ||||
| 					if (DataLength != NULL) | ||||
| 					{ | ||||
| 						*DataLength = 3; | ||||
|  | ||||
| 						Data[2] = (CurrentAudioSampleFrequency >> 16); | ||||
| 						Data[1] = (CurrentAudioSampleFrequency >> 8); | ||||
| 						Data[0] = (CurrentAudioSampleFrequency &  0xFF); | ||||
| 					} | ||||
|  | ||||
| 					return true; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| /** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented | ||||
|  *  in the user application to handle property manipulations on streaming audio interfaces. | ||||
|  * | ||||
|  *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for | ||||
|  *  the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations | ||||
|  *  to indicate the size of the retrieved data. | ||||
|  * | ||||
|  *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value | ||||
|  *        of the \c DataLength parameter. | ||||
|  * | ||||
|  *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. | ||||
|  *  \param[in]     Property            Property of the interface to get or set, a value from Audio_ClassRequests_t. | ||||
|  *  \param[in]     EntityAddress       Address of the audio entity whose property is being referenced. | ||||
|  *  \param[in]     Parameter           Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification). | ||||
|  *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum | ||||
|  *                                     length of the retrieved data. When NULL, the function should return whether the given property | ||||
|  *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. | ||||
|  *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where | ||||
|  *                                     the retrieved data is to be stored for GET operations. | ||||
|  * | ||||
|  *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise | ||||
|  */ | ||||
| bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
|                                                    const uint8_t Property, | ||||
|                                                    const uint8_t EntityAddress, | ||||
|                                                    const uint16_t Parameter, | ||||
|                                                    uint16_t* const DataLength, | ||||
|                                                    uint8_t* Data) | ||||
| { | ||||
| 	/* No audio interface entities in the device descriptor, thus no properties to get or set. */ | ||||
| 	return false; | ||||
| } | ||||
| @@ -1,87 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 AudioOutput.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _AUDIO_OUTPUT_H_ | ||||
| #define _AUDIO_OUTPUT_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdlib.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
| 		#include "Config/AppConfig.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
|  | ||||
| 		bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                  const uint8_t EndpointProperty, | ||||
| 		                                                  const uint8_t EndpointAddress, | ||||
| 		                                                  const uint8_t EndpointControl, | ||||
| 		                                                  uint16_t* const DataLength, | ||||
| 		                                                  uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); | ||||
| 		bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, | ||||
| 		                                                   const uint8_t Property, | ||||
| 		                                                   const uint8_t EntityAddress, | ||||
| 		                                                   const uint16_t Parameter, | ||||
| 		                                                   uint16_t* const DataLength, | ||||
| 		                                                   uint8_t* Data); | ||||
| #endif | ||||
|  | ||||
| @@ -1,92 +0,0 @@ | ||||
| /** \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 Audio Output Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  * | ||||
|  *  \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>Audio Class</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Standard Audio Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Audio 1.0 Class Specification \n | ||||
|  *        USBIF Audio 1.0 Class Terminal Types Specification \n | ||||
|  *        USBIF Audio 1.0 Data Formats Specification</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Audio demonstration application. This gives a simple reference | ||||
|  *  application for implementing a USB Audio Output device using the | ||||
|  *  basic USB Audio 1.0 drivers in all modern OSes (i.e. no special drivers | ||||
|  *  required). | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function | ||||
|  *  as a USB speaker. Outgoing audio will output in 8-bit PWM onto | ||||
|  *  the timer 3 output compare channel A for AUDIO_OUT_MONO mode, on | ||||
|  *  timer 3 channels A and B for AUDIO_OUT_STEREO and on PORTC as a signed | ||||
|  *  mono sample for AUDIO_OUT_PORTC. Audio output will also be indicated on | ||||
|  *  the board LEDs in all modes. Decouple audio outputs with a capacitor and | ||||
|  *  attach to a speaker to hear the audio. | ||||
|  * | ||||
|  *  Under Windows, if a driver request dialogue pops up, select the option | ||||
|  *  to automatically install the appropriate drivers. | ||||
|  * | ||||
|  *  \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>AUDIO_OUT_STEREO</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this outputs the audio samples in stereo to the timer output pins of the microcontroller.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>AUDIO_OUT_MONO</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this outputs the audio samples in mono to the timer output pin of the microcontroller.</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td>AUDIO_OUT_PORTC</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>When defined, this outputs the audio samples in mono to port C of the microcontroller, for connection to an | ||||
|  *        external DAC.</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,50 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 some of | ||||
|  *  the application's compile time options, as an alternative to | ||||
|  *  specifying the compile time constants supplied through a | ||||
|  *  makefile or build system. | ||||
|  * | ||||
|  *  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 AUDIO_OUT_STEREO | ||||
| //	#define AUDIO_OUT_MONO | ||||
| //	#define AUDIO_OUT_PORTC | ||||
|  | ||||
| #endif | ||||
| @@ -1,93 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
| @@ -1,312 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(2,0,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2046, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,2), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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 | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 0, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
|  | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = (sizeof(USB_Audio_Descriptor_Interface_AC_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_InputTerminal_t) + | ||||
| 			                             sizeof(USB_Audio_Descriptor_OutputTerminal_t)), | ||||
|  | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_InputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_InputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.TerminalID               = 0x01, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_STREAMING, | ||||
| 			.AssociatedOutputTerminal = 0x00, | ||||
|  | ||||
| 			.TotalChannels            = 2, | ||||
| 			.ChannelConfig            = (AUDIO_CHANNEL_LEFT_FRONT | AUDIO_CHANNEL_RIGHT_FRONT), | ||||
|  | ||||
| 			.ChannelStrIndex          = NO_DESCRIPTOR, | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_OutputTerminal = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_OutputTerminal_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.TerminalID               = 0x02, | ||||
| 			.TerminalType             = AUDIO_TERMINAL_OUT_SPEAKER, | ||||
| 			.AssociatedInputTerminal  = 0x00, | ||||
|  | ||||
| 			.SourceID                 = 0x01, | ||||
|  | ||||
| 			.TerminalStrIndex         = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_Alt0 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 0, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_Alt1 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 1, | ||||
|  | ||||
| 			.TotalEndpoints           = 1, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_AudioStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
|  | ||||
| 			.TerminalLink             = 0x01, | ||||
|  | ||||
| 			.FrameDelay               = 1, | ||||
| 			.AudioFormat              = 0x0001 | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_AudioFormat = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Format_t) + | ||||
| 			                                     sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates), | ||||
| 			                             .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_FormatType, | ||||
|  | ||||
| 			.FormatType               = 0x01, | ||||
| 			.Channels                 = 0x02, | ||||
|  | ||||
| 			.SubFrameSize             = 0x02, | ||||
| 			.BitResolution            = 16, | ||||
|  | ||||
| 			.TotalDiscreteSampleRates = (sizeof(ConfigurationDescriptor.Audio_AudioFormatSampleRates) / sizeof(USB_Audio_SampleFreq_t)), | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_AudioFormatSampleRates = | ||||
| 		{ | ||||
| 			AUDIO_SAMPLE_FREQ(8000), | ||||
| 			AUDIO_SAMPLE_FREQ(11025), | ||||
| 			AUDIO_SAMPLE_FREQ(22050), | ||||
| 			AUDIO_SAMPLE_FREQ(44100), | ||||
| 			AUDIO_SAMPLE_FREQ(48000), | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamEndpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 					.EndpointAddress     = AUDIO_STREAM_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_ISOCHRONOUS | ENDPOINT_ATTR_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = AUDIO_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x01 | ||||
| 				}, | ||||
|  | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamEndpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Spc_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
|  | ||||
| 			.Attributes               = (AUDIO_EP_ACCEPTS_SMALL_PACKETS | AUDIO_EP_SAMPLE_FREQ_CONTROL), | ||||
|  | ||||
| 			.LockDelayUnits           = 0x00, | ||||
| 			.LockDelay                = 0x0000 | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Audio Out Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,106 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#include "Config/AppConfig.h" | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Audio isochronous streaming data OUT endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPADDR           (ENDPOINT_DIR_OUT | 1) | ||||
|  | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data endpoint. */ | ||||
| 		#define AUDIO_STREAM_EPSIZE           256 | ||||
|  | ||||
| 	/* 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; | ||||
|  | ||||
| 			// Audio Control Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
| 			USB_Audio_Descriptor_InputTerminal_t      Audio_InputTerminal; | ||||
| 			USB_Audio_Descriptor_OutputTerminal_t     Audio_OutputTerminal; | ||||
|  | ||||
| 			// Audio Streaming Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt0; | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface_Alt1; | ||||
| 			USB_Audio_Descriptor_Interface_AS_t       Audio_StreamInterface_SPC; | ||||
| 			USB_Audio_Descriptor_Format_t             Audio_AudioFormat; | ||||
| 			USB_Audio_SampleFreq_t                    Audio_AudioFormatSampleRates[5]; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t Audio_StreamEndpoint; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Spc_t Audio_StreamEndpoint_SPC; | ||||
| 		} 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_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio stream 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 uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,50 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Audio Output Device Demo (Class Driver APIs)" id="lufa.demos.device.class.audio_output.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.audio_output"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.audio_output" caption="Audio Output Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Audio 1.0 Output device demo, implementing a basic USB speaker. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="Audio Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="AudioOutput.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="AudioOutput.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="AudioOutput.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="module-config" subtype="required-header-file" value="AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<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> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = AudioOutput | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               2 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,366 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x206D, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,2), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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 | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 0, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
|  | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = sizeof(USB_Audio_Descriptor_Interface_AC_t), | ||||
|  | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 2, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_MIDIStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
|  | ||||
| 			.AudioSpecification       = VERSION_BCD(1,0,0), | ||||
|  | ||||
| 			.TotalLength              = (sizeof(USB_Descriptor_Configuration_t) - | ||||
| 			                             offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC)) | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Emb = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x01, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Emb2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x02, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Ext = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x03, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Ext2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x04, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Emb = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x05, | ||||
|  | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x03}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Emb2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x06, | ||||
|  | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x04}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Ext = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x07, | ||||
|  | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x01}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Ext2 = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x08, | ||||
|  | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x02}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Endpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 					.EndpointAddress     = MIDI_STREAM_OUT_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = MIDI_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x05 | ||||
| 				}, | ||||
|  | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Endpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_DualJack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
|  | ||||
| 			.TotalEmbeddedJacks       = 0x02, | ||||
| 			.AssociatedJackID         = {0x01, 0x02} | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Endpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 					.EndpointAddress     = MIDI_STREAM_IN_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = MIDI_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x05 | ||||
| 				}, | ||||
|  | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Endpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_DualJack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
|  | ||||
| 			.TotalEmbeddedJacks       = 0x02, | ||||
| 			.AssociatedJackID         = {0x05, 0x06} | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Dual MIDI Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,124 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the MIDI streaming data IN endpoint, for device-to-host data transfers. */ | ||||
| 		#define MIDI_STREAM_IN_EPADDR       (ENDPOINT_DIR_IN  | 2) | ||||
|  | ||||
| 		/** Endpoint address of the MIDI streaming data OUT endpoint, for host-to-device data transfers. */ | ||||
| 		#define MIDI_STREAM_OUT_EPADDR      (ENDPOINT_DIR_OUT | 1) | ||||
|  | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data IN and OUT endpoints. */ | ||||
| 		#define MIDI_STREAM_EPSIZE          64 | ||||
|  | ||||
| 	/* Type Defines: */ | ||||
|  		/** Type define for a dual jack endpoint descriptor. This is identical to the LUFA MIDI class driver's | ||||
|  		 *  USB_MIDI_Descriptor_Jack_Endpoint_t, except that it contains two jack association entries. | ||||
|  		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			USB_Descriptor_Header_t   Header; /**< Regular descriptor header containing the descriptor's type and length. */ | ||||
| 			uint8_t                   Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ | ||||
|  | ||||
| 			uint8_t                   TotalEmbeddedJacks; /**< Total number of jacks inside this endpoint. */ | ||||
| 			uint8_t                   AssociatedJackID[2]; /**< IDs of each jack inside the endpoint. */ | ||||
| 		} ATTR_PACKED USB_MIDI_Descriptor_DualJack_Endpoint_t; | ||||
|  | ||||
| 		/** Type define for the device configuration descriptor structure. This must be defined in the | ||||
| 		 *  application code, as the configuration descriptor contains several sub-descriptors which | ||||
| 		 *  vary between devices, and which describe the device's usage to the host. | ||||
| 		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			USB_Descriptor_Configuration_Header_t     Config; | ||||
|  | ||||
| 			// MIDI Audio Control Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
|  | ||||
| 			// MIDI Audio Streaming Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface; | ||||
| 			USB_MIDI_Descriptor_AudioInterface_AS_t   Audio_StreamInterface_SPC; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Emb; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Emb2; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Ext; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Ext2; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Emb; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Emb2; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Ext; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Ext2; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_In_Jack_Endpoint; | ||||
| 			USB_MIDI_Descriptor_DualJack_Endpoint_t   MIDI_In_Jack_Endpoint_SPC; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint; | ||||
| 			USB_MIDI_Descriptor_DualJack_Endpoint_t   MIDI_Out_Jack_Endpoint_SPC; | ||||
| 		} 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_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio streaming 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 uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,211 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 Dual MIDI demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "DualMIDI.h" | ||||
|  | ||||
| /** LUFA MIDI Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all MIDI Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_MIDI_Device_t Keyboard_MIDI_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = MIDI_STREAM_IN_EPADDR, | ||||
| 						.Size             = MIDI_STREAM_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.DataOUTEndpoint          = | ||||
| 					{ | ||||
| 						.Address          = MIDI_STREAM_OUT_EPADDR, | ||||
| 						.Size             = MIDI_STREAM_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		CheckJoystickMovement(); | ||||
|  | ||||
| 		MIDI_EventPacket_t ReceivedMIDIEvent; | ||||
| 		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) | ||||
| 		{ | ||||
| 			if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (ReceivedMIDIEvent.Data3 > 0)) | ||||
| 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | ||||
| 			else | ||||
| 			  LEDs_SetAllLEDs(LEDS_NO_LEDS); | ||||
| 		} | ||||
|  | ||||
| 		MIDI_Device_USBTask(&Keyboard_MIDI_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Checks for changes in the position of the board joystick, sending MIDI events to the host upon each change. */ | ||||
| void CheckJoystickMovement(void) | ||||
| { | ||||
| 	static uint8_t PrevJoystickStatus; | ||||
|  | ||||
| 	uint8_t MIDICommand = 0; | ||||
| 	uint8_t MIDIPitch; | ||||
|  | ||||
| 	/* Get current joystick mask, XOR with previous to detect joystick changes */ | ||||
| 	uint8_t JoystickStatus  = Joystick_GetStatus(); | ||||
| 	uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus); | ||||
|  | ||||
| 	/* Get board button status - if pressed use second virtual cable, otherwise use the first */ | ||||
| 	uint8_t VirtualCable = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? 1 : 0; | ||||
|  | ||||
| 	if (JoystickChanges & JOY_LEFT) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3C; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_UP) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3D; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_RIGHT) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3E; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_DOWN) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3F; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_PRESS) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3B; | ||||
| 	} | ||||
|  | ||||
| 	if (MIDICommand) | ||||
| 	{ | ||||
| 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||
| 			{ | ||||
| 				.Event       = MIDI_EVENT(VirtualCable, MIDICommand), | ||||
|  | ||||
| 				.Data1       = MIDICommand | MIDI_CHANNEL(1), | ||||
| 				.Data2       = MIDIPitch, | ||||
| 				.Data3       = MIDI_STANDARD_VELOCITY, | ||||
| 			}; | ||||
|  | ||||
| 		MIDI_Device_SendEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent); | ||||
| 		MIDI_Device_Flush(&Keyboard_MIDI_Interface); | ||||
| 	} | ||||
|  | ||||
| 	PrevJoystickStatus = JoystickStatus; | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= MIDI_Device_ConfigureEndpoints(&Keyboard_MIDI_Interface); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	MIDI_Device_ProcessControlRequest(&Keyboard_MIDI_Interface); | ||||
| } | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 DualMIDI.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _DUAL_MIDI_H_ | ||||
| #define _DUAL_MIDI_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
| 		void CheckJoystickMovement(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| /** \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 MIDI Dual Input Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Audio Class</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Standard Audio Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Audio Class Specification \n | ||||
|  *        USB-MIDI Audio Class Extension Specification \n | ||||
|  *        General MIDI Specification</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Dual MIDI demonstration application. This gives a simple reference | ||||
|  *  application for implementing the USB-MIDI class in USB devices. | ||||
|  *  It is built upon the USB Audio class. | ||||
|  * | ||||
|  *  Joystick movements are translated into note on/off messages and | ||||
|  *  are sent to the host PC as MIDI streams which can be read by any | ||||
|  *  MIDI program supporting MIDI IN devices. | ||||
|  * | ||||
|  *  If the HWB is not pressed, the first virtual MIDI cable to the host is | ||||
|  *  used. If the HWB is pressed, then the second virtual cable is selected. | ||||
|  * | ||||
|  *  This device implements MIDI-THRU mode, with the IN MIDI data being | ||||
|  *  generated by the device itself. OUT MIDI data is discarded. | ||||
|  * | ||||
|  *  \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> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,62 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Dual MIDI Device Demo (Class Driver APIs)" id="lufa.demos.device.class.dual_midi.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.dual_midi"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="MIDI Device Demo (Class Driver APIs)" id="lufa.demos.device.class.dual_midi.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.dual_midi"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.dual_midi" caption="Dual MIDI Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Dual MIDI device demo, implementing a basic USB MIDI device with two virtual cables that can send messages to the host. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="MIDI Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="DualMIDI.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="DualMIDI.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="DualMIDI.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = DualMIDI | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               6 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,360 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_IADDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_IADDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_IADDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x204E, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.SerialNumStrIndex      = USE_INTERNAL_SERIAL, | ||||
|  | ||||
| 	.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 PROGMEM ConfigurationDescriptor = | ||||
| { | ||||
| 	.Config = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, | ||||
|  | ||||
| 			.TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t), | ||||
| 			.TotalInterfaces        = 4, | ||||
|  | ||||
| 			.ConfigurationNumber    = 1, | ||||
| 			.ConfigurationStrIndex  = NO_DESCRIPTOR, | ||||
|  | ||||
| 			.ConfigAttributes       = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_IAD = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation}, | ||||
|  | ||||
| 			.FirstInterfaceIndex    = INTERFACE_ID_CDC1_CCI, | ||||
| 			.TotalInterfaces        = 2, | ||||
|  | ||||
| 			.Class                  = CDC_CSCP_CDCClass, | ||||
| 			.SubClass               = CDC_CSCP_ACMSubclass, | ||||
| 			.Protocol               = CDC_CSCP_ATCommandProtocol, | ||||
|  | ||||
| 			.IADStrIndex            = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_CCI_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_CDC1_CCI, | ||||
| 			.AlternateSetting       = 0, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = CDC_CSCP_CDCClass, | ||||
| 			.SubClass               = CDC_CSCP_ACMSubclass, | ||||
| 			.Protocol               = CDC_CSCP_ATCommandProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_Functional_Header = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = CDC_DSUBTYPE_CSInterface_Header, | ||||
|  | ||||
| 			.CDCSpecification       = VERSION_BCD(1,1,0), | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_Functional_ACM = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = CDC_DSUBTYPE_CSInterface_ACM, | ||||
|  | ||||
| 			.Capabilities           = 0x06, | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_Functional_Union = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = CDC_DSUBTYPE_CSInterface_Union, | ||||
|  | ||||
| 			.MasterInterfaceNumber  = INTERFACE_ID_CDC1_CCI, | ||||
| 			.SlaveInterfaceNumber   = INTERFACE_ID_CDC1_DCI, | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_ManagementEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = CDC1_NOTIFICATION_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_NOTIFICATION_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0xFF | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_DCI_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_CDC1_DCI, | ||||
| 			.AlternateSetting       = 0, | ||||
|  | ||||
| 			.TotalEndpoints         = 2, | ||||
|  | ||||
| 			.Class                  = CDC_CSCP_CDCDataClass, | ||||
| 			.SubClass               = CDC_CSCP_NoDataSubclass, | ||||
| 			.Protocol               = CDC_CSCP_NoDataProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_DataOutEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = CDC1_RX_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
|  | ||||
| 	.CDC1_DataInEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = CDC1_TX_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_IAD = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_Association_t), .Type = DTYPE_InterfaceAssociation}, | ||||
|  | ||||
| 			.FirstInterfaceIndex    = INTERFACE_ID_CDC2_CCI, | ||||
| 			.TotalInterfaces        = 2, | ||||
|  | ||||
| 			.Class                  = CDC_CSCP_CDCClass, | ||||
| 			.SubClass               = CDC_CSCP_ACMSubclass, | ||||
| 			.Protocol               = CDC_CSCP_ATCommandProtocol, | ||||
|  | ||||
| 			.IADStrIndex            = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_CCI_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_CDC2_CCI, | ||||
| 			.AlternateSetting       = 0, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = CDC_CSCP_CDCClass, | ||||
| 			.SubClass               = CDC_CSCP_ACMSubclass, | ||||
| 			.Protocol               = CDC_CSCP_ATCommandProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_Functional_Header = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalHeader_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = CDC_DSUBTYPE_CSInterface_Header, | ||||
|  | ||||
| 			.CDCSpecification       = VERSION_BCD(1,1,0), | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_Functional_ACM = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalACM_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = CDC_DSUBTYPE_CSInterface_ACM, | ||||
|  | ||||
| 			.Capabilities           = 0x06, | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_Functional_Union = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_CDC_Descriptor_FunctionalUnion_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                = CDC_DSUBTYPE_CSInterface_Union, | ||||
|  | ||||
| 			.MasterInterfaceNumber  = INTERFACE_ID_CDC2_CCI, | ||||
| 			.SlaveInterfaceNumber   = INTERFACE_ID_CDC2_DCI, | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_ManagementEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = CDC2_NOTIFICATION_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_NOTIFICATION_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0xFF | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_DCI_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_CDC2_DCI, | ||||
| 			.AlternateSetting       = 0, | ||||
|  | ||||
| 			.TotalEndpoints         = 2, | ||||
|  | ||||
| 			.Class                  = CDC_CSCP_CDCDataClass, | ||||
| 			.SubClass               = CDC_CSCP_NoDataSubclass, | ||||
| 			.Protocol               = CDC_CSCP_NoDataProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_DataOutEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = CDC2_RX_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = CDC_TXRX_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
|  | ||||
| 	.CDC2_DataInEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = CDC2_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 FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Dual CDC Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,135 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the first CDC interface's device-to-host data IN endpoint. */ | ||||
| 		#define CDC1_TX_EPADDR                 (ENDPOINT_DIR_IN  | 1) | ||||
|  | ||||
| 		/** Endpoint address of the first CDC interface's host-to-device data OUT endpoint. */ | ||||
| 		#define CDC1_RX_EPADDR                 (ENDPOINT_DIR_OUT | 2) | ||||
|  | ||||
| 		/** Endpoint address of the first CDC interface's device-to-host notification IN endpoint. */ | ||||
| 		#define CDC1_NOTIFICATION_EPADDR       (ENDPOINT_DIR_IN  | 3) | ||||
|  | ||||
| 		/** Endpoint address of the second CDC interface's device-to-host data IN endpoint. */ | ||||
| 		#define CDC2_TX_EPADDR                 (ENDPOINT_DIR_IN  | 4) | ||||
|  | ||||
| 		/** Endpoint address of the second CDC interface's host-to-device data OUT endpoint. */ | ||||
| 		#define CDC2_RX_EPADDR                 (ENDPOINT_DIR_OUT | 5) | ||||
|  | ||||
| 		/** Endpoint address of the second CDC interface's device-to-host notification IN endpoint. */ | ||||
| 		#define CDC2_NOTIFICATION_EPADDR       (ENDPOINT_DIR_IN  | 6) | ||||
|  | ||||
| 		/** Size in bytes of the CDC device-to-host notification IN endpoints. */ | ||||
| 		#define CDC_NOTIFICATION_EPSIZE        8 | ||||
|  | ||||
| 		/** Size in bytes of the CDC data IN and OUT endpoints. */ | ||||
| 		#define CDC_TXRX_EPSIZE                16 | ||||
|  | ||||
| 	/* 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; | ||||
|  | ||||
| 			// First CDC Control Interface | ||||
| 			USB_Descriptor_Interface_Association_t   CDC1_IAD; | ||||
| 			USB_Descriptor_Interface_t               CDC1_CCI_Interface; | ||||
| 			USB_CDC_Descriptor_FunctionalHeader_t    CDC1_Functional_Header; | ||||
| 			USB_CDC_Descriptor_FunctionalACM_t       CDC1_Functional_ACM; | ||||
| 			USB_CDC_Descriptor_FunctionalUnion_t     CDC1_Functional_Union; | ||||
| 			USB_Descriptor_Endpoint_t                CDC1_ManagementEndpoint; | ||||
|  | ||||
| 			// First CDC Data Interface | ||||
| 			USB_Descriptor_Interface_t               CDC1_DCI_Interface; | ||||
| 			USB_Descriptor_Endpoint_t                CDC1_DataOutEndpoint; | ||||
| 			USB_Descriptor_Endpoint_t                CDC1_DataInEndpoint; | ||||
|  | ||||
| 			// Second CDC Control Interface | ||||
| 			USB_Descriptor_Interface_Association_t   CDC2_IAD; | ||||
| 			USB_Descriptor_Interface_t               CDC2_CCI_Interface; | ||||
| 			USB_CDC_Descriptor_FunctionalHeader_t    CDC2_Functional_Header; | ||||
| 			USB_CDC_Descriptor_FunctionalACM_t       CDC2_Functional_ACM; | ||||
| 			USB_CDC_Descriptor_FunctionalUnion_t     CDC2_Functional_Union; | ||||
| 			USB_Descriptor_Endpoint_t                CDC2_ManagementEndpoint; | ||||
|  | ||||
| 			// Second CDC Data Interface | ||||
| 			USB_Descriptor_Interface_t               CDC2_DCI_Interface; | ||||
| 			USB_Descriptor_Endpoint_t                CDC2_DataOutEndpoint; | ||||
| 			USB_Descriptor_Endpoint_t                CDC2_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_CDC1_CCI = 0, /**< CDC1 CCI interface descriptor ID */ | ||||
| 			INTERFACE_ID_CDC1_DCI = 1, /**< CDC1 DCI interface descriptor ID */ | ||||
| 			INTERFACE_ID_CDC2_CCI = 2, /**< CDC2 CCI interface descriptor ID */ | ||||
| 			INTERFACE_ID_CDC2_DCI = 3, /**< CDC2 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 uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,218 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 DualVirtualSerial demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "DualVirtualSerial.h" | ||||
|  | ||||
| /** LUFA CDC Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all CDC Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. This is for the first CDC interface, | ||||
|  *  which sends strings to the host for each joystick movement. | ||||
|  */ | ||||
| USB_ClassInfo_CDC_Device_t VirtualSerial1_CDC_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.ControlInterfaceNumber   = INTERFACE_ID_CDC1_CCI, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = CDC1_TX_EPADDR, | ||||
| 						.Size             = CDC_TXRX_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.DataOUTEndpoint = | ||||
| 					{ | ||||
| 						.Address          = CDC1_RX_EPADDR, | ||||
| 						.Size             = CDC_TXRX_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.NotificationEndpoint = | ||||
| 					{ | ||||
| 						.Address          = CDC1_NOTIFICATION_EPADDR, | ||||
| 						.Size             = CDC_NOTIFICATION_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
| /** LUFA CDC Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all CDC Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. This is for the second CDC interface, | ||||
|  *  which echos back all received data from the host. | ||||
|  */ | ||||
| USB_ClassInfo_CDC_Device_t VirtualSerial2_CDC_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.ControlInterfaceNumber   = INTERFACE_ID_CDC2_CCI, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = CDC2_TX_EPADDR, | ||||
| 						.Size             = CDC_TXRX_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.DataOUTEndpoint = | ||||
| 					{ | ||||
| 						.Address          = CDC2_RX_EPADDR, | ||||
| 						.Size             = CDC_TXRX_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.NotificationEndpoint = | ||||
| 					{ | ||||
| 						.Address          = CDC2_NOTIFICATION_EPADDR, | ||||
| 						.Size             = CDC_NOTIFICATION_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
|  | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		CheckJoystickMovement(); | ||||
|  | ||||
| 		/* Discard all received data on the first CDC interface */ | ||||
| 		CDC_Device_ReceiveByte(&VirtualSerial1_CDC_Interface); | ||||
|  | ||||
| 		/* Echo all received data on the second CDC interface */ | ||||
| 		int16_t ReceivedByte = CDC_Device_ReceiveByte(&VirtualSerial2_CDC_Interface); | ||||
| 		if (!(ReceivedByte < 0)) | ||||
| 		  CDC_Device_SendByte(&VirtualSerial2_CDC_Interface, (uint8_t)ReceivedByte); | ||||
|  | ||||
| 		CDC_Device_USBTask(&VirtualSerial1_CDC_Interface); | ||||
| 		CDC_Device_USBTask(&VirtualSerial2_CDC_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Checks for changes in the position of the board joystick, sending strings to the host upon each change | ||||
|  *  through the first of the CDC interfaces. | ||||
|  */ | ||||
| void CheckJoystickMovement(void) | ||||
| { | ||||
| 	uint8_t     JoyStatus_LCL = Joystick_GetStatus(); | ||||
| 	char*       ReportString  = NULL; | ||||
| 	static bool ActionSent = false; | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_UP) | ||||
| 	  ReportString = "Joystick Up\r\n"; | ||||
| 	else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 	  ReportString = "Joystick Down\r\n"; | ||||
| 	else if (JoyStatus_LCL & JOY_LEFT) | ||||
| 	  ReportString = "Joystick Left\r\n"; | ||||
| 	else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 	  ReportString = "Joystick Right\r\n"; | ||||
| 	else if (JoyStatus_LCL & JOY_PRESS) | ||||
| 	  ReportString = "Joystick Pressed\r\n"; | ||||
| 	else | ||||
| 	  ActionSent = false; | ||||
|  | ||||
| 	if ((ReportString != NULL) && (ActionSent == false)) | ||||
| 	{ | ||||
| 		ActionSent = true; | ||||
|  | ||||
| 		CDC_Device_SendString(&VirtualSerial1_CDC_Interface, ReportString); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial1_CDC_Interface); | ||||
| 	ConfigSuccess &= CDC_Device_ConfigureEndpoints(&VirtualSerial2_CDC_Interface); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	CDC_Device_ProcessControlRequest(&VirtualSerial1_CDC_Interface); | ||||
| 	CDC_Device_ProcessControlRequest(&VirtualSerial2_CDC_Interface); | ||||
| } | ||||
|  | ||||
| @@ -1,76 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 DualVirtualSerial.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _DUAL_VIRTUALSERIAL_H_ | ||||
| #define _DUAL_VIRTUALSERIAL_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
| 		void CheckJoystickMovement(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,89 +0,0 @@ | ||||
| /** \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 Dual Communications Device Class (Dual Virtual Serial Port) Device | ||||
|  * | ||||
|  *  \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 AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Interface Association Descriptor ECN \n | ||||
|  *        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: | ||||
|  * | ||||
|  *  Dual Communications Device Class demonstration application. | ||||
|  *  This gives a simple reference application for implementing | ||||
|  *  a composite device with dual CDC functions acting as a pair | ||||
|  *  of virtual serial ports. This demo uses Interface Association | ||||
|  *  Descriptors to link together the pair of related CDC | ||||
|  *  descriptors for each virtual serial port, which may not be | ||||
|  *  supported in all OSes - Windows Vista is supported, as is | ||||
|  *  XP (although the latter may need a hotfix to function). | ||||
|  * | ||||
|  *  Joystick actions are transmitted to the host as strings | ||||
|  *  through the first serial port. The device does not respond to | ||||
|  *  serial data sent from the host in the first serial port. | ||||
|  * | ||||
|  *  The second serial port echoes back data sent from the host. | ||||
|  * | ||||
|  *  After running this demo for the first time on a new computer, | ||||
|  *  you will need to supply the .INF file located in this demo | ||||
|  *  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_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,66 +0,0 @@ | ||||
| ;************************************************************ | ||||
| ; Windows USB CDC ACM Setup File | ||||
| ; Copyright (c) 2000 Microsoft Corporation | ||||
| ;************************************************************ | ||||
|  | ||||
| [DefaultInstall] | ||||
| CopyINF="LUFA DualVirtualSerial.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_204E&MI_00, USB\VID_03EB&PID_204E&MI_02 | ||||
|  | ||||
| [DeviceList.NTx86] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204E&MI_00, USB\VID_03EB&PID_204E&MI_02 | ||||
|  | ||||
| [DeviceList.NTamd64] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204E&MI_00, USB\VID_03EB&PID_204E&MI_02 | ||||
|  | ||||
| [DeviceList.NTia64] | ||||
| %DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204E&MI_00, USB\VID_03EB&PID_204E&MI_02 | ||||
|  | ||||
| ;------------------------------------------------------------------------------ | ||||
| ;  String Definitions | ||||
| ;------------------------------------------------------------------------------ | ||||
| ;Modify these strings to customize your device | ||||
| ;------------------------------------------------------------------------------ | ||||
| [Strings] | ||||
| MFGNAME="http://www.lufa-lib.org" | ||||
| DESCRIPTION="LUFA CDC-ACM Virtual Serial Port" | ||||
| @@ -1,62 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Dual Virtual Serial Device Demo (Class Driver APIs)" id="lufa.demos.device.class.dual_cdc.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.dual_cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="Dual Virtual Serial Device Demo (Class Driver APIs)" id="lufa.demos.device.class.dual_cdc.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.dual_cdc"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.dual_cdc" caption="Dual Virtual Serial Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Dual Virtual Serial (CDC) demo, implementing a pair of virtual serial port interfaces. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="CDC Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="DualVirtualSerial.txt"/> | ||||
| 		<build type="distribute" subtype="user-file" value="LUFA DualVirtualSerial.inf"/> | ||||
|  | ||||
| 		<build type="c-source" value="DualVirtualSerial.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="DualVirtualSerial.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = DualVirtualSerial | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,48 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 some of | ||||
|  *  the application's compile time options, as an alternative to | ||||
|  *  specifying the compile time constants supplied through a | ||||
|  *  makefile or build system. | ||||
|  * | ||||
|  *  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 GENERIC_REPORT_SIZE       8 | ||||
|  | ||||
| #endif | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               1 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,220 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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" | ||||
|  | ||||
| /** 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 PROGMEM GenericReport[] = | ||||
| { | ||||
| 	/* Use the HID class driver's standard Vendor HID report. | ||||
| 	 *  Vendor Usage Page: 0 | ||||
| 	 *  Vendor Collection Usage: 1 | ||||
| 	 *  Vendor Report IN Usage: 2 | ||||
| 	 *  Vendor Report OUT Usage: 3 | ||||
| 	 *  Vendor Report Size: GENERIC_REPORT_SIZE | ||||
| 	 */ | ||||
| 	HID_DESCRIPTOR_VENDOR(0x00, 0x01, 0x02, 0x03, GENERIC_REPORT_SIZE) | ||||
| }; | ||||
|  | ||||
| /** 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x204F, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_GenericHID, | ||||
| 			.AlternateSetting       = 0x00, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = HID_CSCP_HIDClass, | ||||
| 			.SubClass               = HID_CSCP_NonBootSubclass, | ||||
| 			.Protocol               = HID_CSCP_NonBootProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.HID_GenericHID = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
|  | ||||
| 			.HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 			.CountryCode            = 0x00, | ||||
| 			.TotalReportDescriptors = 1, | ||||
| 			.HIDReportType          = HID_DTYPE_Report, | ||||
| 			.HIDReportLength        = sizeof(GenericReport) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_ReportINEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = GENERIC_IN_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = GENERIC_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Generic HID Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 		case HID_DTYPE_HID: | ||||
| 			Address = &ConfigurationDescriptor.HID_GenericHID; | ||||
| 			Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
| 			break; | ||||
| 		case HID_DTYPE_Report: | ||||
| 			Address = &GenericReport; | ||||
| 			Size    = sizeof(GenericReport); | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,95 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
|  | ||||
| 		#include "Config/AppConfig.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_GenericHID; | ||||
| 			USB_Descriptor_Endpoint_t             HID_ReportINEndpoint; | ||||
| 		} 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_GenericHID = 0, /**< GenericHID 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 */ | ||||
| 		}; | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Generic HID reporting IN endpoint. */ | ||||
| 		#define GENERIC_IN_EPADDR         (ENDPOINT_DIR_IN | 1) | ||||
|  | ||||
| 		/** Size in bytes of the Generic HID reporting endpoint. */ | ||||
| 		#define GENERIC_EPSIZE            8 | ||||
|  | ||||
| 	/* 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 | ||||
|  | ||||
| @@ -1,202 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 GenericHID demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "GenericHID.h" | ||||
|  | ||||
| /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */ | ||||
| static uint8_t PrevHIDReportBuffer[GENERIC_REPORT_SIZE]; | ||||
|  | ||||
| /** LUFA HID Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all HID Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_HID_Device_t Generic_HID_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.InterfaceNumber              = INTERFACE_ID_GenericHID, | ||||
| 				.ReportINEndpoint             = | ||||
| 					{ | ||||
| 						.Address              = GENERIC_IN_EPADDR, | ||||
| 						.Size                 = GENERIC_EPSIZE, | ||||
| 						.Banks                = 1, | ||||
| 					}, | ||||
| 				.PrevReportINBuffer           = PrevHIDReportBuffer, | ||||
| 				.PrevReportINBufferSize       = sizeof(PrevHIDReportBuffer), | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		HID_Device_USBTask(&Generic_HID_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	LEDs_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= HID_Device_ConfigureEndpoints(&Generic_HID_Interface); | ||||
|  | ||||
| 	USB_Device_EnableSOFEvents(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	HID_Device_ProcessControlRequest(&Generic_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** Event handler for the USB device Start Of Frame event. */ | ||||
| void EVENT_USB_Device_StartOfFrame(void) | ||||
| { | ||||
| 	HID_Device_MillisecondElapsed(&Generic_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the creation of HID reports to the host. | ||||
|  * | ||||
|  *  \param[in]     HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in,out] ReportID    Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID | ||||
|  *  \param[in]     ReportType  Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature | ||||
|  *  \param[out]    ReportData  Pointer to a buffer where the created report should be stored | ||||
|  *  \param[out]    ReportSize  Number of bytes written in the report (or zero if no report is to be sent) | ||||
|  * | ||||
|  *  \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent | ||||
|  */ | ||||
| bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                          uint8_t* const ReportID, | ||||
|                                          const uint8_t ReportType, | ||||
|                                          void* ReportData, | ||||
|                                          uint16_t* const ReportSize) | ||||
| { | ||||
| 	uint8_t* Data        = (uint8_t*)ReportData; | ||||
| 	uint8_t  CurrLEDMask = LEDs_GetLEDs(); | ||||
|  | ||||
| 	Data[0] = ((CurrLEDMask & LEDS_LED1) ? 1 : 0); | ||||
| 	Data[1] = ((CurrLEDMask & LEDS_LED2) ? 1 : 0); | ||||
| 	Data[2] = ((CurrLEDMask & LEDS_LED3) ? 1 : 0); | ||||
| 	Data[3] = ((CurrLEDMask & LEDS_LED4) ? 1 : 0); | ||||
|  | ||||
| 	*ReportSize = GENERIC_REPORT_SIZE; | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the processing of HID reports from the host. | ||||
|  * | ||||
|  *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in] ReportID    Report ID of the received report from the host | ||||
|  *  \param[in] ReportType  The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature | ||||
|  *  \param[in] ReportData  Pointer to a buffer where the received report has been stored | ||||
|  *  \param[in] ReportSize  Size in bytes of the received HID report | ||||
|  */ | ||||
| void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                           const uint8_t ReportID, | ||||
|                                           const uint8_t ReportType, | ||||
|                                           const void* ReportData, | ||||
|                                           const uint16_t ReportSize) | ||||
| { | ||||
| 	uint8_t* Data       = (uint8_t*)ReportData; | ||||
| 	uint8_t  NewLEDMask = LEDS_NO_LEDS; | ||||
|  | ||||
| 	if (Data[0]) | ||||
| 	  NewLEDMask |= LEDS_LED1; | ||||
|  | ||||
| 	if (Data[1]) | ||||
| 	  NewLEDMask |= LEDS_LED2; | ||||
|  | ||||
| 	if (Data[2]) | ||||
| 	  NewLEDMask |= LEDS_LED3; | ||||
|  | ||||
| 	if (Data[3]) | ||||
| 	  NewLEDMask |= LEDS_LED4; | ||||
|  | ||||
| 	LEDs_SetAllLEDs(NewLEDMask); | ||||
| } | ||||
|  | ||||
| @@ -1,87 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 GenericHID.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _GENERICHID_H_ | ||||
| #define _GENERICHID_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
| 		#include "Config/AppConfig.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 		void EVENT_USB_Device_StartOfFrame(void); | ||||
|  | ||||
| 		bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                         uint8_t* const ReportID, | ||||
| 		                                         const uint8_t ReportType, | ||||
| 		                                         void* ReportData, | ||||
| 		                                         uint16_t* const ReportSize); | ||||
| 		void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                          const uint8_t ReportID, | ||||
| 		                                          const uint8_t ReportType, | ||||
| 		                                          const void* ReportData, | ||||
| 		                                          const uint16_t ReportSize); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,79 +0,0 @@ | ||||
| /** \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 Generic HID Device | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Human Interface Device (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 Specification \n | ||||
|  *        USBIF HID Usage Tables</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Low Speed Mode \n | ||||
|  *        Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Generic HID device demonstration application. This gives a simple reference application | ||||
|  *  for implementing a generic HID device, using the basic USB HID drivers in all modern | ||||
|  *  OSes (i.e. no special drivers required). By default it accepts and sends up to 8 byte reports | ||||
|  *  to and from a USB Host, and transmits the last sent report back to the host. | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function as a vendor HID device. | ||||
|  *  When controlled by a custom HID class application, reports can be sent and received by | ||||
|  *  both the standard data endpoint and control request methods defined in the HID specification. | ||||
|  * | ||||
|  *  \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>GENERIC_REPORT_SIZE</td> | ||||
|  *    <td>AppConfig.h</td> | ||||
|  *    <td>This token defines the size of the device reports, both sent and received (including report ID byte). The value | ||||
|  *        must be an integer ranging from 1 to 255.</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,143 +0,0 @@ | ||||
| #!/usr/bin/env node | ||||
|  | ||||
| //             LUFA Library | ||||
| //     Copyright (C) Dean Camera, 2014. | ||||
| // | ||||
| //  dean [at] fourwalledcubicle [dot] com | ||||
| //           www.lufa-lib.org | ||||
|  | ||||
| // LUFA Generic HID device demo host test script. This script will send a | ||||
| // continuous stream of generic reports to the device, to show a variable LED | ||||
| // pattern on the target board. Send and received report data is printed to | ||||
| // the terminal. | ||||
| // | ||||
| // You have to install the usb and async modules prior to executing this script: | ||||
| // apt-get install libusb-1.0-0-dev | ||||
| // npm install usb async sprintf | ||||
|  | ||||
| var usb = require('usb'); | ||||
| var async = require('async'); | ||||
| var sprintf = require('sprintf'); | ||||
|  | ||||
| var deviceVid = 0x03EB; | ||||
| var devicePid = 0x204F; | ||||
| var reportLength = 8; | ||||
|  | ||||
| function getAndInitHidDeviceAndInterface() | ||||
| { | ||||
|     device = usb.findByIds(deviceVid, devicePid); | ||||
|     if (!device) { | ||||
|         console.log('No device found'); | ||||
|         process.exit(1); | ||||
|     } | ||||
|     device.open(); | ||||
|  | ||||
|     var hidInterface = device.interface(0); | ||||
|     if (hidInterface.isKernelDriverActive()) { | ||||
|         hidInterface.detachKernelDriver(); | ||||
|     } | ||||
|     hidInterface.claim(); | ||||
|  | ||||
|     async.series([ | ||||
|         function(callback) { | ||||
|             setConfiguration(0, function(error, data) { | ||||
|                 callback(); | ||||
|             }); | ||||
|         } | ||||
|     ]); | ||||
|  | ||||
|     return {hidDevice:device, hidInterface:hidInterface}; | ||||
| } | ||||
|  | ||||
| function read(hidInterface, callback) | ||||
| { | ||||
|     endpoint = hidInterface.endpoints[0]; | ||||
|     endpoint.transfer(reportLength, function(error, data) { | ||||
|         if (error) { | ||||
|             console.log(error) | ||||
|         } else { | ||||
|             console.log("Received LED Pattern:", data.slice(0, 4)); | ||||
|         } | ||||
|         callback(); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function write(hidDevice, message, callback) | ||||
| { | ||||
|     hidDevice.controlTransfer(    // Send a Set Report control request | ||||
|         parseInt('00100001', 2),  // bmRequestType (constant for this control request) | ||||
|         0x09,                     // bmRequest (constant for this control request) | ||||
|         0x0809,                   // wValue (MSB is report type, LSB is report number) | ||||
|         0,                        // wIndex (interface number) | ||||
|         message,                  // message to be sent | ||||
|         function(error, data) {   // callback to be executed upon finishing the transfer | ||||
|             console.log("Sent LED Pattern:", message.slice(1, 5)) | ||||
|             callback(); | ||||
|         } | ||||
|     ); | ||||
| } | ||||
|  | ||||
| function setConfiguration(configurationNumber, callback) | ||||
| { | ||||
|     device.controlTransfer(                 // Send a Set Configuration control request | ||||
|         parseInt('00000000', 2),            // bmRequestType | ||||
|         0x09,                               // bmRequest | ||||
|         0,                                  // wValue (Configuration value) | ||||
|         0,                                  // wIndex | ||||
|         new Buffer(0),                      // message to be sent | ||||
|         callback                            // callback to be executed upon finishing the transfer | ||||
|     ); | ||||
| } | ||||
|  | ||||
| // @TODO: Fix this function because apparently it doesn't work for some reason. | ||||
| function getStringDescriptor(stringId, languageId, callback) | ||||
| { | ||||
|     var STRING_DESCRIPTOR_TYPE = 0x03; | ||||
|     var wValue = (STRING_DESCRIPTOR_TYPE << 8) | stringId; | ||||
|  | ||||
|     device.controlTransfer(       // Send a Get Descriptor control request | ||||
|         parseInt('10000000', 2),  // bmRequestType | ||||
|         0x06,                     // bmRequest | ||||
|         wValue,                   // wValue | ||||
|         languageId,               // wIndex | ||||
|         64,                       // response length | ||||
|         callback                  // callback to be executed upon finishing the transfer | ||||
|     ); | ||||
| } | ||||
|  | ||||
| function setNextPattern() | ||||
| { | ||||
|     var pattern = [ | ||||
|         hidInterface.interface, | ||||
|         (p >> 3) & 1, | ||||
|         (p >> 2) & 1, | ||||
|         (p >> 1) & 1, | ||||
|         (p >> 0) & 1 | ||||
|     ]; | ||||
|  | ||||
|     async.series([ | ||||
|         function(callback) { | ||||
|             write(hidDevice, new Buffer(pattern), callback); | ||||
|         }, | ||||
|         function(callback) { | ||||
|             read(hidInterface, callback); | ||||
|         }, | ||||
|         function(callback) { | ||||
|             p = (p + 1) % 16 | ||||
|             setTimeout(setNextPattern, 200); | ||||
|             callback(); | ||||
|         }]); | ||||
| } | ||||
|  | ||||
| var hidDeviceAndInterface = getAndInitHidDeviceAndInterface(); | ||||
| var hidDevice = hidDeviceAndInterface.hidDevice | ||||
| var hidInterface = hidDeviceAndInterface.hidInterface; | ||||
|  | ||||
| console.log(sprintf("Connected to device 0x%04X/0x%04X - %s [%s]", | ||||
|             hidDevice.deviceDescriptor.idVendor, | ||||
|             hidDevice.deviceDescriptor.idProduct, | ||||
|             hidDevice.deviceDescriptor.iProduct, | ||||
|             hidDevice.deviceDescriptor.iManufacturer)); | ||||
|  | ||||
| p = 0 | ||||
| setNextPattern(); | ||||
| @@ -1,98 +0,0 @@ | ||||
| #!/usr/bin/env python | ||||
|  | ||||
| """ | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| """ | ||||
|  | ||||
| """ | ||||
|     LUFA Generic HID device demo host test script. This script will send a | ||||
|     continuous stream of generic reports to the device, to show a variable LED | ||||
|     pattern on the target board. Send and received report data is printed to | ||||
|     the terminal. | ||||
|  | ||||
|     Requires the PyUSB library (http://sourceforge.net/apps/trac/pyusb/). | ||||
| """ | ||||
|  | ||||
| import sys | ||||
| from time import sleep | ||||
| import usb.core | ||||
| import usb.util | ||||
|  | ||||
| # Generic HID device VID, PID and report payload length (length is increased | ||||
| # by one to account for the Report ID byte that must be pre-pended) | ||||
| device_vid = 0x03EB | ||||
| device_pid = 0x204F | ||||
|  | ||||
| def get_and_init_hid_device(): | ||||
|     device = usb.core.find(idVendor=device_vid, idProduct=device_pid) | ||||
|  | ||||
|     if device is None: | ||||
|         sys.exit("Could not find USB device.") | ||||
|  | ||||
|     if device.is_kernel_driver_active(0): | ||||
|         try: | ||||
|             device.detach_kernel_driver(0) | ||||
|         except usb.core.USBError as exception: | ||||
|             sys.exit("Could not detatch kernel driver: %s" % str(exception)) | ||||
|  | ||||
|     try: | ||||
|         device.set_configuration() | ||||
|     except usb.core.USBError as exception: | ||||
|         sys.exit("Could not set configuration: %s" % str(exception)) | ||||
|  | ||||
|     return device | ||||
|  | ||||
| def send_led_pattern(device, led1, led2, led3, led4): | ||||
|     # Report data for the demo is LED on/off data | ||||
|     report_data = [led1, led2, led3, led4] | ||||
|  | ||||
|     # Send the generated report to the device | ||||
|     number_of_bytes_written = device.ctrl_transfer(  # Set Report control request | ||||
|         0b00100001,  # bmRequestType (constant for this control request) | ||||
|         0x09,        # bmRequest (constant for this control request) | ||||
|         0,           # wValue (MSB is report type, LSB is report number) | ||||
|         0,           # wIndex (interface number) | ||||
|         report_data  # report data to be sent | ||||
|     ); | ||||
|     assert number_of_bytes_written == len(report_data) | ||||
|  | ||||
|     print("Sent LED Pattern: {0}".format(report_data)) | ||||
|  | ||||
| def receive_led_pattern(hid_device): | ||||
|     endpoint = hid_device[0][(0,0)][0] | ||||
|     report_data = hid_device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize) | ||||
|     return list(report_data) | ||||
|  | ||||
| def main(): | ||||
|     hid_device = get_and_init_hid_device() | ||||
|  | ||||
|     print("Connected to device 0x%04X/0x%04X - %s [%s]" % | ||||
|           (hid_device.idVendor, hid_device.idProduct, | ||||
|            usb.util.get_string(hid_device, 256, hid_device.iProduct), | ||||
|            usb.util.get_string(hid_device, 256, hid_device.iManufacturer))) | ||||
|  | ||||
|     p = 0 | ||||
|     while (True): | ||||
|         # Convert the current pattern index to a bit-mask and send | ||||
|         send_led_pattern(hid_device, | ||||
|                          (p >> 3) & 1, | ||||
|                          (p >> 2) & 1, | ||||
|                          (p >> 1) & 1, | ||||
|                          (p >> 0) & 1) | ||||
|  | ||||
|         # Receive and print the current LED pattern | ||||
|         led_pattern = receive_led_pattern(hid_device)[0:4] | ||||
|         print("Received LED Pattern: {0}".format(led_pattern)) | ||||
|  | ||||
|         # Compute next LED pattern in sequence | ||||
|         p = (p + 1) % 16 | ||||
|  | ||||
|         # Delay a bit for visual effect | ||||
|         sleep(.2) | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
| @@ -1,96 +0,0 @@ | ||||
| """ | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| """ | ||||
|  | ||||
| """ | ||||
|     LUFA Generic HID device demo host test script. This script will send a | ||||
|     continuous stream of generic reports to the device, to show a variable LED | ||||
|     pattern on the target board. Send and received report data is printed to | ||||
|     the terminal. | ||||
|  | ||||
|     Requires the pywinusb library (https://pypi.python.org/pypi/pywinusb/). | ||||
| """ | ||||
|  | ||||
| import sys | ||||
| from time import sleep | ||||
| import pywinusb.hid as hid | ||||
|  | ||||
| # Generic HID device VID, PID and report payload length (length is increased | ||||
| # by one to account for the Report ID byte that must be pre-pended) | ||||
| device_vid = 0x03EB | ||||
| device_pid = 0x204F | ||||
| report_length = 1 + 8 | ||||
|  | ||||
|  | ||||
| def get_hid_device_handle(): | ||||
|     hid_device_filter = hid.HidDeviceFilter(vendor_id=device_vid, | ||||
|                                             product_id=device_pid) | ||||
|  | ||||
|     valid_hid_devices = hid_device_filter.get_devices() | ||||
|  | ||||
|     if len(valid_hid_devices) is 0: | ||||
|         return None | ||||
|     else: | ||||
|         return valid_hid_devices[0] | ||||
|  | ||||
|  | ||||
| def send_led_pattern(device, led1, led2, led3, led4): | ||||
|     # Report data for the demo is the report ID (always zero) followed by the | ||||
|     # LED on/off data | ||||
|     report_data = [0, led1, led2, led3, led4] | ||||
|  | ||||
|     # Zero-extend the array to the length the report should be | ||||
|     report_data.extend([0] * (report_length - len(report_data))) | ||||
|  | ||||
|     # Send the generated report to the device | ||||
|     device.send_output_report(report_data) | ||||
|  | ||||
|     print("Sent LED Pattern: {0}".format(report_data[1:5])) | ||||
|  | ||||
|  | ||||
| def received_led_pattern(report_data): | ||||
|     print("Received LED Pattern: {0}".format(report_data[1:5])) | ||||
|  | ||||
|  | ||||
| def main(): | ||||
|     hid_device = get_hid_device_handle() | ||||
|  | ||||
|     if hid_device is None: | ||||
|         print("No valid HID device found.") | ||||
|         sys.exit(1) | ||||
|  | ||||
|     try: | ||||
|         hid_device.open() | ||||
|  | ||||
|         print("Connected to device 0x%04X/0x%04X - %s [%s]" % | ||||
|               (hid_device.vendor_id, hid_device.product_id, | ||||
|                hid_device.product_name, hid_device.vendor_name)) | ||||
|  | ||||
|         # Set up the HID input report handler to receive reports | ||||
|         hid_device.set_raw_data_handler(received_led_pattern) | ||||
|  | ||||
|         p = 0 | ||||
|         while (hid_device.is_plugged()): | ||||
|             # Convert the current pattern index to a bit-mask and send | ||||
|             send_led_pattern(hid_device, | ||||
|                              (p >> 3) & 1, | ||||
|                              (p >> 2) & 1, | ||||
|                              (p >> 1) & 1, | ||||
|                              (p >> 0) & 1) | ||||
|  | ||||
|             # Compute next LED pattern in sequence | ||||
|             p = (p + 1) % 16 | ||||
|  | ||||
|             # Delay a bit for visual effect | ||||
|             sleep(.2) | ||||
|  | ||||
|     finally: | ||||
|         hid_device.close() | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     main() | ||||
| @@ -1,63 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Generic HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.generic_hid.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.generic_hid"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="Generic HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.generic_hid.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.generic_hid"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.generic_hid" caption="Generic HID Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Generic HID device demo, implementing a device whose LEDs can be controlled via HID messages from the host. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="HID Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="GenericHID.txt"/> | ||||
| 		<build type="distribute" subtype="directory" value="HostTestApp"/> | ||||
|  | ||||
| 		<build type="c-source" value="GenericHID.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="GenericHID.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="module-config" subtype="required-header-file" value="AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/AppConfig.h"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<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> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = GenericHID | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               1 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,220 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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" | ||||
|  | ||||
| /** 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 PROGMEM JoystickReport[] = | ||||
| { | ||||
| 	/* Use the HID class driver's standard Joystick report. | ||||
| 	 *   Min X/Y/Z Axis values: -100 | ||||
| 	 *   Max X/Y/Z Axis values:  100 | ||||
| 	 *   Min physical X/Y/Z Axis values (used to determine resolution): -1 | ||||
| 	 *   Max physical X/Y/Z Axis values (used to determine resolution):  1 | ||||
| 	 *   Buttons: 2 | ||||
| 	 */ | ||||
| 	HID_DESCRIPTOR_JOYSTICK(-100, 100, -1, 1, 2) | ||||
| }; | ||||
|  | ||||
| /** 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2043, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_Joystick, | ||||
| 			.AlternateSetting       = 0x00, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = HID_CSCP_HIDClass, | ||||
| 			.SubClass               = HID_CSCP_NonBootSubclass, | ||||
| 			.Protocol               = HID_CSCP_NonBootProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.HID_JoystickHID = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
|  | ||||
| 			.HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 			.CountryCode            = 0x00, | ||||
| 			.TotalReportDescriptors = 1, | ||||
| 			.HIDReportType          = HID_DTYPE_Report, | ||||
| 			.HIDReportLength        = sizeof(JoystickReport) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_ReportINEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = JOYSTICK_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = JOYSTICK_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Joystick Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 		case HID_DTYPE_HID: | ||||
| 			Address = &ConfigurationDescriptor.HID_JoystickHID; | ||||
| 			Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
| 			break; | ||||
| 		case HID_DTYPE_Report: | ||||
| 			Address = &JoystickReport; | ||||
| 			Size    = sizeof(JoystickReport); | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,93 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#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; | ||||
|  | ||||
| 			// Joystick HID Interface | ||||
| 			USB_Descriptor_Interface_t            HID_Interface; | ||||
| 			USB_HID_Descriptor_HID_t              HID_JoystickHID; | ||||
| 	        USB_Descriptor_Endpoint_t             HID_ReportINEndpoint; | ||||
| 		} 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_Joystick = 0, /**< Joystick interface desciptor 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 */ | ||||
| 		}; | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Joystick HID reporting IN endpoint. */ | ||||
| 		#define JOYSTICK_EPADDR              (ENDPOINT_DIR_IN | 1) | ||||
|  | ||||
| 		/** Size in bytes of the Joystick HID reporting IN endpoint. */ | ||||
| 		#define JOYSTICK_EPSIZE              8 | ||||
|  | ||||
| 	/* 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 | ||||
|  | ||||
| @@ -1,202 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 Joystick demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "Joystick.h" | ||||
|  | ||||
| /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */ | ||||
| static uint8_t PrevJoystickHIDReportBuffer[sizeof(USB_JoystickReport_Data_t)]; | ||||
|  | ||||
| /** LUFA HID Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all HID Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_HID_Device_t Joystick_HID_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.InterfaceNumber              = INTERFACE_ID_Joystick, | ||||
| 				.ReportINEndpoint             = | ||||
| 					{ | ||||
| 						.Address              = JOYSTICK_EPADDR, | ||||
| 						.Size                 = JOYSTICK_EPSIZE, | ||||
| 						.Banks                = 1, | ||||
| 					}, | ||||
| 				.PrevReportINBuffer           = PrevJoystickHIDReportBuffer, | ||||
| 				.PrevReportINBufferSize       = sizeof(PrevJoystickHIDReportBuffer), | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		HID_Device_USBTask(&Joystick_HID_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= HID_Device_ConfigureEndpoints(&Joystick_HID_Interface); | ||||
|  | ||||
| 	USB_Device_EnableSOFEvents(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	HID_Device_ProcessControlRequest(&Joystick_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** Event handler for the USB device Start Of Frame event. */ | ||||
| void EVENT_USB_Device_StartOfFrame(void) | ||||
| { | ||||
| 	HID_Device_MillisecondElapsed(&Joystick_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the creation of HID reports to the host. | ||||
|  * | ||||
|  *  \param[in]     HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in,out] ReportID    Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID | ||||
|  *  \param[in]     ReportType  Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature | ||||
|  *  \param[out]    ReportData  Pointer to a buffer where the created report should be stored | ||||
|  *  \param[out]    ReportSize  Number of bytes written in the report (or zero if no report is to be sent) | ||||
|  * | ||||
|  *  \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent | ||||
|  */ | ||||
| bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                          uint8_t* const ReportID, | ||||
|                                          const uint8_t ReportType, | ||||
|                                          void* ReportData, | ||||
|                                          uint16_t* const ReportSize) | ||||
| { | ||||
| 	USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData; | ||||
|  | ||||
| 	uint8_t JoyStatus_LCL    = Joystick_GetStatus(); | ||||
| 	uint8_t ButtonStatus_LCL = Buttons_GetStatus(); | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_UP) | ||||
| 	  JoystickReport->Y = -100; | ||||
| 	else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 	  JoystickReport->Y =  100; | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_LEFT) | ||||
| 	  JoystickReport->X = -100; | ||||
| 	else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 	  JoystickReport->X =  100; | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_PRESS) | ||||
| 	  JoystickReport->Button |= (1 << 1); | ||||
|  | ||||
| 	if (ButtonStatus_LCL & BUTTONS_BUTTON1) | ||||
| 	  JoystickReport->Button |= (1 << 0); | ||||
|  | ||||
| 	*ReportSize = sizeof(USB_JoystickReport_Data_t); | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the processing of HID reports from the host. | ||||
|  * | ||||
|  *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in] ReportID    Report ID of the received report from the host | ||||
|  *  \param[in] ReportType  The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature | ||||
|  *  \param[in] ReportData  Pointer to a buffer where the received report has been stored | ||||
|  *  \param[in] ReportSize  Size in bytes of the received HID report | ||||
|  */ | ||||
| void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                           const uint8_t ReportID, | ||||
|                                           const uint8_t ReportType, | ||||
|                                           const void* ReportData, | ||||
|                                           const uint16_t ReportSize) | ||||
| { | ||||
| 	// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports | ||||
| } | ||||
|  | ||||
| @@ -1,100 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 Joystick.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _JOYSTICK_H_ | ||||
| #define _JOYSTICK_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Type Defines: */ | ||||
| 		/** Type define for the joystick HID report structure, for creating and sending HID reports to the host PC. | ||||
| 		 *  This mirrors the layout described to the host in the HID report descriptor, in Descriptors.c. | ||||
| 		 */ | ||||
| 		typedef struct | ||||
| 		{ | ||||
| 			int8_t  X; /**< Current absolute joystick X position, as a signed 8-bit integer */ | ||||
| 			int8_t  Y; /**< Current absolute joystick Y position, as a signed 8-bit integer */ | ||||
| 			int8_t  Z; /**< Current absolute joystick Z position, as a signed 8-bit integer */ | ||||
| 			uint8_t Button; /**< Bit mask of the currently pressed joystick buttons */ | ||||
| 		} USB_JoystickReport_Data_t; | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 		void EVENT_USB_Device_StartOfFrame(void); | ||||
|  | ||||
| 		bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                         uint8_t* const ReportID, | ||||
| 		                                         const uint8_t ReportType, | ||||
| 		                                         void* ReportData, | ||||
| 		                                         uint16_t* const ReportSize); | ||||
| 		void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                          const uint8_t ReportID, | ||||
| 		                                          const uint8_t ReportType, | ||||
| 		                                          const void* ReportData, | ||||
| 		                                          const uint16_t ReportSize); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,77 +0,0 @@ | ||||
| /** \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 Joystick Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Human Interface Device (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 Specification \n | ||||
|  *        USBIF HID Usage Tables</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Low Speed Mode \n | ||||
|  *        Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Joystick demonstration application. This gives a simple reference | ||||
|  *  application for implementing a USB Keyboard device, for USB Joysticks | ||||
|  *  using the standard Keyboard HID profile. | ||||
|  * | ||||
|  *  This device will show up as a generic joystick device, with two buttons. | ||||
|  *  Pressing the joystick inwards is the first button, and the HWB button | ||||
|  *  is the second. | ||||
|  * | ||||
|  *  Moving the joystick on the selected board moves the joystick location on | ||||
|  *  the host computer. | ||||
|  * | ||||
|  *  Currently only single interface joysticks are supported. | ||||
|  * | ||||
|  *  \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> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,62 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Joystick HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.joystick.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.joystick"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="Joystick HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.joystick.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.joystick"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.joystick" caption="Joystick HID Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Joystick HID device demo, implementing a basic USB joystick that can send movement information to the host. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="HID Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="Joystick.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="Joystick.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="Joystick.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = Joystick | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               1 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,216 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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" | ||||
|  | ||||
| /** 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 PROGMEM KeyboardReport[] = | ||||
| { | ||||
| 	/* Use the HID class driver's standard Keyboard report. | ||||
| 	 *   Max simultaneous keys: 6 | ||||
| 	 */ | ||||
| 	HID_DESCRIPTOR_KEYBOARD(6) | ||||
| }; | ||||
|  | ||||
| /** 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2042, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_Keyboard, | ||||
| 			.AlternateSetting       = 0x00, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = HID_CSCP_HIDClass, | ||||
| 			.SubClass               = HID_CSCP_BootSubclass, | ||||
| 			.Protocol               = HID_CSCP_KeyboardBootProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.HID_KeyboardHID = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
|  | ||||
| 			.HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 			.CountryCode            = 0x00, | ||||
| 			.TotalReportDescriptors = 1, | ||||
| 			.HIDReportType          = HID_DTYPE_Report, | ||||
| 			.HIDReportLength        = sizeof(KeyboardReport) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_ReportINEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = KEYBOARD_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = KEYBOARD_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Keyboard Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 		case HID_DTYPE_HID: | ||||
| 			Address = &ConfigurationDescriptor.HID_KeyboardHID; | ||||
| 			Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
| 			break; | ||||
| 		case HID_DTYPE_Report: | ||||
| 			Address = &KeyboardReport; | ||||
| 			Size    = sizeof(KeyboardReport); | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,93 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#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; | ||||
|  | ||||
| 			// Keyboard HID Interface | ||||
| 			USB_Descriptor_Interface_t            HID_Interface; | ||||
| 			USB_HID_Descriptor_HID_t              HID_KeyboardHID; | ||||
| 			USB_Descriptor_Endpoint_t             HID_ReportINEndpoint; | ||||
| 		} 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_Keyboard = 0, /**< Keyboard 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 */ | ||||
| 		}; | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Keyboard HID reporting IN endpoint. */ | ||||
| 		#define KEYBOARD_EPADDR              (ENDPOINT_DIR_IN | 1) | ||||
|  | ||||
| 		/** Size in bytes of the Keyboard HID reporting IN endpoint. */ | ||||
| 		#define KEYBOARD_EPSIZE              8 | ||||
|  | ||||
| 	/* 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 | ||||
|  | ||||
| @@ -1,219 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 Keyboard demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "Keyboard.h" | ||||
|  | ||||
| /** Buffer to hold the previously generated Keyboard HID report, for comparison purposes inside the HID class driver. */ | ||||
| static uint8_t PrevKeyboardHIDReportBuffer[sizeof(USB_KeyboardReport_Data_t)]; | ||||
|  | ||||
| /** LUFA HID Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all HID Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_HID_Device_t Keyboard_HID_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.InterfaceNumber              = INTERFACE_ID_Keyboard, | ||||
| 				.ReportINEndpoint             = | ||||
| 					{ | ||||
| 						.Address              = KEYBOARD_EPADDR, | ||||
| 						.Size                 = KEYBOARD_EPSIZE, | ||||
| 						.Banks                = 1, | ||||
| 					}, | ||||
| 				.PrevReportINBuffer           = PrevKeyboardHIDReportBuffer, | ||||
| 				.PrevReportINBufferSize       = sizeof(PrevKeyboardHIDReportBuffer), | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		HID_Device_USBTask(&Keyboard_HID_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware() | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= HID_Device_ConfigureEndpoints(&Keyboard_HID_Interface); | ||||
|  | ||||
| 	USB_Device_EnableSOFEvents(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	HID_Device_ProcessControlRequest(&Keyboard_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** Event handler for the USB device Start Of Frame event. */ | ||||
| void EVENT_USB_Device_StartOfFrame(void) | ||||
| { | ||||
| 	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the creation of HID reports to the host. | ||||
|  * | ||||
|  *  \param[in]     HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in,out] ReportID    Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID | ||||
|  *  \param[in]     ReportType  Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature | ||||
|  *  \param[out]    ReportData  Pointer to a buffer where the created report should be stored | ||||
|  *  \param[out]    ReportSize  Number of bytes written in the report (or zero if no report is to be sent) | ||||
|  * | ||||
|  *  \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent | ||||
|  */ | ||||
| bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                          uint8_t* const ReportID, | ||||
|                                          const uint8_t ReportType, | ||||
|                                          void* ReportData, | ||||
|                                          uint16_t* const ReportSize) | ||||
| { | ||||
| 	USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData; | ||||
|  | ||||
| 	uint8_t JoyStatus_LCL    = Joystick_GetStatus(); | ||||
| 	uint8_t ButtonStatus_LCL = Buttons_GetStatus(); | ||||
|  | ||||
| 	uint8_t UsedKeyCodes = 0; | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_UP) | ||||
| 	  KeyboardReport->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_A; | ||||
| 	else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 	  KeyboardReport->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_B; | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_LEFT) | ||||
| 	  KeyboardReport->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_C; | ||||
| 	else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 	  KeyboardReport->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_D; | ||||
|  | ||||
| 	if (JoyStatus_LCL & JOY_PRESS) | ||||
| 	  KeyboardReport->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_E; | ||||
|  | ||||
| 	if (ButtonStatus_LCL & BUTTONS_BUTTON1) | ||||
| 	  KeyboardReport->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_F; | ||||
|  | ||||
| 	if (UsedKeyCodes) | ||||
| 	  KeyboardReport->Modifier = HID_KEYBOARD_MODIFIER_LEFTSHIFT; | ||||
|  | ||||
| 	*ReportSize = sizeof(USB_KeyboardReport_Data_t); | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the processing of HID reports from the host. | ||||
|  * | ||||
|  *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in] ReportID    Report ID of the received report from the host | ||||
|  *  \param[in] ReportType  The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature | ||||
|  *  \param[in] ReportData  Pointer to a buffer where the received report has been stored | ||||
|  *  \param[in] ReportSize  Size in bytes of the received HID report | ||||
|  */ | ||||
| void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                           const uint8_t ReportID, | ||||
|                                           const uint8_t ReportType, | ||||
|                                           const void* ReportData, | ||||
|                                           const uint16_t ReportSize) | ||||
| { | ||||
| 	uint8_t  LEDMask   = LEDS_NO_LEDS; | ||||
| 	uint8_t* LEDReport = (uint8_t*)ReportData; | ||||
|  | ||||
| 	if (*LEDReport & HID_KEYBOARD_LED_NUMLOCK) | ||||
| 	  LEDMask |= LEDS_LED1; | ||||
|  | ||||
| 	if (*LEDReport & HID_KEYBOARD_LED_CAPSLOCK) | ||||
| 	  LEDMask |= LEDS_LED3; | ||||
|  | ||||
| 	if (*LEDReport & HID_KEYBOARD_LED_SCROLLLOCK) | ||||
| 	  LEDMask |= LEDS_LED4; | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMask); | ||||
| } | ||||
|  | ||||
| @@ -1,89 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 Keyboard.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _KEYBOARD_H_ | ||||
| #define _KEYBOARD_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 		void EVENT_USB_Device_StartOfFrame(void); | ||||
|  | ||||
| 		bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                         uint8_t* const ReportID, | ||||
| 		                                         const uint8_t ReportType, | ||||
| 		                                         void* ReportData, | ||||
| 		                                         uint16_t* const ReportSize); | ||||
| 		void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                          const uint8_t ReportID, | ||||
| 		                                          const uint8_t ReportType, | ||||
| 		                                          const void* ReportData, | ||||
| 		                                          const uint16_t ReportSize); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,76 +0,0 @@ | ||||
| /** \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 Keyboard Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Human Interface Device (HID)</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Keyboard Subclass</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF HID Specification \n | ||||
|  *        USBIF HID Usage Tables</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Low Speed Mode \n | ||||
|  *        Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Keyboard demonstration application. This gives a simple reference application | ||||
|  *  for implementing a USB Keyboard using the basic USB HID drivers in all modern | ||||
|  *  OSes (i.e. no special drivers required). It is boot protocol compatible, and thus | ||||
|  *  works under compatible BIOS as if it was a native keyboard (e.g. PS/2). | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function as a keyboard | ||||
|  *  when the USB connection to a host is present. To use the keyboard example, | ||||
|  *  manipulate the joystick to send the letters a, b, c, d and e. See the USB HID | ||||
|  *  documentation for more information on sending keyboard event and key presses. Unlike | ||||
|  *  other LUFA Keyboard demos, this example shows explicitly how to send multiple key presses | ||||
|  *  inside the same report to the host. | ||||
|  * | ||||
|  *  \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> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,62 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Keyboard HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.keyboard.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.keyboard"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="Keyboard HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.keyboard.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.keyboard"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.keyboard" caption="Keyboard HID Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Keyboard HID device demo, implementing a basic USB keyboard that can send key press information to the host. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="HID Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="Keyboard.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="Keyboard.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="Keyboard.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = Keyboard | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               3 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,289 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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" | ||||
|  | ||||
| /** 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. | ||||
|  * | ||||
|  *  This descriptor describes the mouse HID interface's report structure. | ||||
|  */ | ||||
| const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] = | ||||
| { | ||||
| 	/* Use the HID class driver's standard Mouse report. | ||||
| 	 *   Min X/Y Axis values: -1 | ||||
| 	 *   Max X/Y Axis values:  1 | ||||
| 	 *   Min physical X/Y Axis values (used to determine resolution): -1 | ||||
| 	 *   Max physical X/Y Axis values (used to determine resolution):  1 | ||||
| 	 *   Buttons: 3 | ||||
| 	 *   Absolute screen coordinates: false | ||||
| 	 */ | ||||
| 	HID_DESCRIPTOR_MOUSE(-1, 1, -1, 1, 3, false) | ||||
| }; | ||||
|  | ||||
| /** Same as the MouseReport structure, but defines the keyboard HID interface's report structure. */ | ||||
| const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] = | ||||
| { | ||||
| 	/* Use the HID class driver's standard Keyboard report. | ||||
| 	 *   Max simultaneous keys: 6 | ||||
| 	 */ | ||||
| 	HID_DESCRIPTOR_KEYBOARD(6) | ||||
| }; | ||||
|  | ||||
| /** 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x204D, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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 | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.HID1_KeyboardInterface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_Keyboard, | ||||
| 			.AlternateSetting       = 0x00, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = HID_CSCP_HIDClass, | ||||
| 			.SubClass               = HID_CSCP_BootSubclass, | ||||
| 			.Protocol               = HID_CSCP_KeyboardBootProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.HID1_KeyboardHID = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
|  | ||||
| 			.HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 			.CountryCode            = 0x00, | ||||
| 			.TotalReportDescriptors = 1, | ||||
| 			.HIDReportType          = HID_DTYPE_Report, | ||||
| 			.HIDReportLength        = sizeof(KeyboardReport) | ||||
| 		}, | ||||
|  | ||||
| 	.HID1_ReportINEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = KEYBOARD_IN_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = HID_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
|  | ||||
| 	.HID2_MouseInterface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_Mouse, | ||||
| 			.AlternateSetting       = 0x00, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = HID_CSCP_HIDClass, | ||||
| 			.SubClass               = HID_CSCP_BootSubclass, | ||||
| 			.Protocol               = HID_CSCP_MouseBootProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.HID2_MouseHID = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
|  | ||||
| 			.HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 			.CountryCode            = 0x00, | ||||
| 			.TotalReportDescriptors = 1, | ||||
| 			.HIDReportType          = HID_DTYPE_Report, | ||||
| 			.HIDReportLength        = sizeof(MouseReport) | ||||
| 		}, | ||||
|  | ||||
| 	.HID2_ReportINEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = MOUSE_IN_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = HID_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Mouse and Keyboard Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 		case HID_DTYPE_HID: | ||||
| 			switch (wIndex) | ||||
| 			{ | ||||
| 				case INTERFACE_ID_Keyboard: | ||||
| 					Address = &ConfigurationDescriptor.HID1_KeyboardHID; | ||||
| 					Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
| 					break; | ||||
| 				case INTERFACE_ID_Mouse: | ||||
| 					Address = &ConfigurationDescriptor.HID2_MouseHID; | ||||
| 					Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 		case HID_DTYPE_Report: | ||||
| 			switch (wIndex) | ||||
| 			{ | ||||
| 				case INTERFACE_ID_Keyboard: | ||||
| 					Address = &KeyboardReport; | ||||
| 					Size    = sizeof(KeyboardReport); | ||||
| 					break; | ||||
| 				case INTERFACE_ID_Mouse: | ||||
| 					Address = &MouseReport; | ||||
| 					Size    = sizeof(MouseReport); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,102 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#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; | ||||
|  | ||||
| 			// Keyboard HID Interface | ||||
| 			USB_Descriptor_Interface_t            HID1_KeyboardInterface; | ||||
| 			USB_HID_Descriptor_HID_t              HID1_KeyboardHID; | ||||
| 			USB_Descriptor_Endpoint_t             HID1_ReportINEndpoint; | ||||
|  | ||||
| 			// Mouse HID Interface | ||||
| 			USB_Descriptor_Interface_t            HID2_MouseInterface; | ||||
| 			USB_HID_Descriptor_HID_t              HID2_MouseHID; | ||||
| 			USB_Descriptor_Endpoint_t             HID2_ReportINEndpoint; | ||||
| 		} 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_Keyboard = 0, /**< Keyboard interface descriptor ID */ | ||||
| 			INTERFACE_ID_Mouse    = 1, /**< Mouse 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 */ | ||||
| 		}; | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the Keyboard HID reporting IN endpoint. */ | ||||
| 		#define KEYBOARD_IN_EPADDR        (ENDPOINT_DIR_IN | 1) | ||||
|  | ||||
| 		/** Endpoint address of the Mouse HID reporting IN endpoint. */ | ||||
| 		#define MOUSE_IN_EPADDR           (ENDPOINT_DIR_IN | 3) | ||||
|  | ||||
| 		/** Size in bytes of each of the HID reporting IN endpoints. */ | ||||
| 		#define HID_EPSIZE                8 | ||||
|  | ||||
| 	/* 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 | ||||
|  | ||||
| @@ -1,276 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 KeyboardMouse demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "KeyboardMouse.h" | ||||
|  | ||||
| /** Buffer to hold the previously generated Keyboard HID report, for comparison purposes inside the HID class driver. */ | ||||
| static uint8_t PrevKeyboardHIDReportBuffer[sizeof(USB_KeyboardReport_Data_t)]; | ||||
|  | ||||
| /** Buffer to hold the previously generated Mouse HID report, for comparison purposes inside the HID class driver. */ | ||||
| static uint8_t PrevMouseHIDReportBuffer[sizeof(USB_MouseReport_Data_t)]; | ||||
|  | ||||
| /** LUFA HID Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all HID Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. This is for the keyboard HID | ||||
|  *  interface within the device. | ||||
|  */ | ||||
| USB_ClassInfo_HID_Device_t Keyboard_HID_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.InterfaceNumber              = INTERFACE_ID_Keyboard, | ||||
| 				.ReportINEndpoint             = | ||||
| 					{ | ||||
| 						.Address              = KEYBOARD_IN_EPADDR, | ||||
| 						.Size                 = HID_EPSIZE, | ||||
| 						.Banks                = 1, | ||||
| 					}, | ||||
| 				.PrevReportINBuffer           = PrevKeyboardHIDReportBuffer, | ||||
| 				.PrevReportINBufferSize       = sizeof(PrevKeyboardHIDReportBuffer), | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
| /** LUFA HID Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all HID Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. This is for the mouse HID | ||||
|  *  interface within the device. | ||||
|  */ | ||||
| USB_ClassInfo_HID_Device_t Mouse_HID_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.InterfaceNumber              = INTERFACE_ID_Mouse, | ||||
| 				.ReportINEndpoint             = | ||||
| 					{ | ||||
| 						.Address              = MOUSE_IN_EPADDR, | ||||
| 						.Size                 = HID_EPSIZE, | ||||
| 						.Banks                = 1, | ||||
| 					}, | ||||
| 				.PrevReportINBuffer           = PrevMouseHIDReportBuffer, | ||||
| 				.PrevReportINBufferSize       = sizeof(PrevMouseHIDReportBuffer), | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		HID_Device_USBTask(&Keyboard_HID_Interface); | ||||
| 		HID_Device_USBTask(&Mouse_HID_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware() | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
|     LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
|     LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= HID_Device_ConfigureEndpoints(&Keyboard_HID_Interface); | ||||
| 	ConfigSuccess &= HID_Device_ConfigureEndpoints(&Mouse_HID_Interface); | ||||
|  | ||||
| 	USB_Device_EnableSOFEvents(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	HID_Device_ProcessControlRequest(&Keyboard_HID_Interface); | ||||
| 	HID_Device_ProcessControlRequest(&Mouse_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** Event handler for the USB device Start Of Frame event. */ | ||||
| void EVENT_USB_Device_StartOfFrame(void) | ||||
| { | ||||
| 	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface); | ||||
| 	HID_Device_MillisecondElapsed(&Mouse_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the creation of HID reports to the host. | ||||
|  * | ||||
|  *  \param[in]     HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in,out] ReportID    Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID | ||||
|  *  \param[in]     ReportType  Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature | ||||
|  *  \param[out]    ReportData  Pointer to a buffer where the created report should be stored | ||||
|  *  \param[out]    ReportSize  Number of bytes written in the report (or zero if no report is to be sent) | ||||
|  * | ||||
|  *  \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent | ||||
|  */ | ||||
| bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                          uint8_t* const ReportID, | ||||
|                                          const uint8_t ReportType, | ||||
|                                          void* ReportData, | ||||
|                                          uint16_t* const ReportSize) | ||||
| { | ||||
| 	uint8_t JoyStatus_LCL    = Joystick_GetStatus(); | ||||
| 	uint8_t ButtonStatus_LCL = Buttons_GetStatus(); | ||||
|  | ||||
| 	/* Determine which interface must have its report generated */ | ||||
| 	if (HIDInterfaceInfo == &Keyboard_HID_Interface) | ||||
| 	{ | ||||
| 		USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData; | ||||
|  | ||||
| 		/* If first board button not being held down, no keyboard report */ | ||||
| 		if (!(ButtonStatus_LCL & BUTTONS_BUTTON1)) | ||||
| 		  return 0; | ||||
|  | ||||
| 		KeyboardReport->Modifier = HID_KEYBOARD_MODIFIER_LEFTSHIFT; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_UP) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_A; | ||||
| 		else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_B; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_LEFT) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_C; | ||||
| 		else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_D; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_PRESS) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_E; | ||||
|  | ||||
| 		*ReportSize = sizeof(USB_KeyboardReport_Data_t); | ||||
| 		return false; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData; | ||||
|  | ||||
| 		/* If first board button being held down, no mouse report */ | ||||
| 		if (ButtonStatus_LCL & BUTTONS_BUTTON1) | ||||
| 		  return 0; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_UP) | ||||
| 		  MouseReport->Y = -1; | ||||
| 		else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 		  MouseReport->Y =  1; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_LEFT) | ||||
| 		  MouseReport->X = -1; | ||||
| 		else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 		  MouseReport->X =  1; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_PRESS) | ||||
| 		  MouseReport->Button |= (1 << 0); | ||||
|  | ||||
| 		*ReportSize = sizeof(USB_MouseReport_Data_t); | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the processing of HID reports from the host. | ||||
|  * | ||||
|  *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in] ReportID    Report ID of the received report from the host | ||||
|  *  \param[in] ReportType  The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature | ||||
|  *  \param[in] ReportData  Pointer to a buffer where the received report has been stored | ||||
|  *  \param[in] ReportSize  Size in bytes of the received HID report | ||||
|  */ | ||||
| void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                           const uint8_t ReportID, | ||||
|                                           const uint8_t ReportType, | ||||
|                                           const void* ReportData, | ||||
|                                           const uint16_t ReportSize) | ||||
| { | ||||
| 	if (HIDInterfaceInfo == &Keyboard_HID_Interface) | ||||
| 	{ | ||||
| 		uint8_t  LEDMask   = LEDS_NO_LEDS; | ||||
| 		uint8_t* LEDReport = (uint8_t*)ReportData; | ||||
|  | ||||
| 		if (*LEDReport & HID_KEYBOARD_LED_NUMLOCK) | ||||
| 		  LEDMask |= LEDS_LED1; | ||||
|  | ||||
| 		if (*LEDReport & HID_KEYBOARD_LED_CAPSLOCK) | ||||
| 		  LEDMask |= LEDS_LED3; | ||||
|  | ||||
| 		if (*LEDReport & HID_KEYBOARD_LED_SCROLLLOCK) | ||||
| 		  LEDMask |= LEDS_LED4; | ||||
|  | ||||
| 		LEDs_SetAllLEDs(LEDMask); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -1,84 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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. | ||||
| */ | ||||
|  | ||||
| #ifndef _KEYBOARD_MOUSE_H_ | ||||
| #define _KEYBOARD_MOUSE_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 		void EVENT_USB_Device_StartOfFrame(void); | ||||
|  | ||||
| 		bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                         uint8_t* const ReportID, | ||||
| 		                                         const uint8_t ReportType, | ||||
| 		                                         void* ReportData, | ||||
| 		                                         uint16_t* const ReportSize); | ||||
| 		void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                          const uint8_t ReportID, | ||||
| 		                                          const uint8_t ReportType, | ||||
| 		                                          const void* ReportData, | ||||
| 		                                          const uint16_t ReportSize); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,81 +0,0 @@ | ||||
| /** \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 Dual HID Keyboard and Mouse Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Human Interface Device (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 Specification \n | ||||
|  *        USBIF HID Usage Tables</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Low Speed Mode \n | ||||
|  *        Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Keyboard/Mouse demonstration application. This gives a simple reference | ||||
|  *  application for implementing a composite device containing both USB Keyboard | ||||
|  *  and USB Mouse functionality using the basic USB HID drivers in all modern OSes | ||||
|  *  (i.e. no special drivers required). This example uses two separate HID | ||||
|  *  interfaces for each function. It is boot protocol compatible, and thus works under | ||||
|  *  compatible BIOS as if it was a native keyboard and mouse (e.g. PS/2). | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function | ||||
|  *  as a keyboard when the USB connection to a host is present and the HWB is not | ||||
|  *  pressed. When enabled, manipulate the joystick to send the letters | ||||
|  *  a, b, c, d and e. See the USB HID documentation for more information | ||||
|  *  on sending keyboard event and key presses. | ||||
|  * | ||||
|  *  When the HWB is pressed, the mouse mode is enabled. When enabled, move the | ||||
|  *  joystick to move the pointer, and push the joystick inwards to simulate a | ||||
|  *  left-button click. | ||||
|  * | ||||
|  *  \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> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,62 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Keyboard and Mouse HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.keyboard_mouse.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.keyboard_mouse"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="Keyboard and Mouse HID Device Demo (Class Driver APIs)" id="lufa.demos.device.class.keyboard_mouse.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.keyboard_mouse"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.keyboard_mouse" caption="Keyboard and Mouse HID Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Keyboard and Mouse HID device demo, implementing a basic USB keyboard and mouse using a pair of HID interfaces. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="HID Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="KeyboardMouse.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="KeyboardMouse.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="KeyboardMouse.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = KeyboardMouse | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               1 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,279 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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" | ||||
|  | ||||
| /** 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. | ||||
|  * | ||||
|  *  This descriptor describes the multiple possible reports of the HID interface's report structure. | ||||
|  */ | ||||
| const USB_Descriptor_HIDReport_Datatype_t PROGMEM HIDReport[] = | ||||
| { | ||||
| 	/* Mouse Report */ | ||||
| 	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | ||||
| 	HID_RI_USAGE(8, 0x02), /* Mouse */ | ||||
| 	HID_RI_COLLECTION(8, 0x01), /* Application */ | ||||
| 		HID_RI_REPORT_ID(8, HID_REPORTID_MouseReport), | ||||
| 		HID_RI_USAGE(8, 0x01), /* Pointer */ | ||||
| 		HID_RI_COLLECTION(8, 0x00), /* Physical */ | ||||
| 			HID_RI_USAGE_PAGE(8, 0x09), /* Button */ | ||||
| 			HID_RI_USAGE_MINIMUM(8, 0x01), | ||||
| 			HID_RI_USAGE_MAXIMUM(8, 0x03), | ||||
| 			HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||||
| 			HID_RI_LOGICAL_MAXIMUM(8, 0x01), | ||||
| 			HID_RI_REPORT_COUNT(8, 0x03), | ||||
| 			HID_RI_REPORT_SIZE(8, 0x01), | ||||
| 			HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||||
| 			HID_RI_REPORT_COUNT(8, 0x01), | ||||
| 			HID_RI_REPORT_SIZE(8, 0x05), | ||||
| 			HID_RI_INPUT(8, HID_IOF_CONSTANT), | ||||
| 			HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | ||||
| 			HID_RI_USAGE(8, 0x30), /* Usage X */ | ||||
| 			HID_RI_USAGE(8, 0x31), /* Usage Y */ | ||||
| 			HID_RI_LOGICAL_MINIMUM(8, -1), | ||||
| 			HID_RI_LOGICAL_MAXIMUM(8, 1), | ||||
| 			HID_RI_PHYSICAL_MINIMUM(8, -1), | ||||
| 			HID_RI_PHYSICAL_MAXIMUM(8, 1), | ||||
| 			HID_RI_REPORT_COUNT(8, 0x02), | ||||
| 			HID_RI_REPORT_SIZE(8, 0x08), | ||||
| 			HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE), | ||||
| 		HID_RI_END_COLLECTION(0), | ||||
| 	HID_RI_END_COLLECTION(0), | ||||
|  | ||||
| 	/* Keyboard Report */ | ||||
| 	HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */ | ||||
| 	HID_RI_USAGE(8, 0x06), /* Keyboard */ | ||||
| 	HID_RI_COLLECTION(8, 0x01), /* Application */ | ||||
| 		HID_RI_REPORT_ID(8, HID_REPORTID_KeyboardReport), | ||||
| 		HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */ | ||||
| 		HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */ | ||||
| 		HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */ | ||||
| 		HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||||
| 		HID_RI_LOGICAL_MAXIMUM(8, 0x01), | ||||
| 		HID_RI_REPORT_SIZE(8, 0x01), | ||||
| 		HID_RI_REPORT_COUNT(8, 0x08), | ||||
| 		HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), | ||||
| 		HID_RI_REPORT_COUNT(8, 0x01), | ||||
| 		HID_RI_REPORT_SIZE(8, 0x08), | ||||
| 		HID_RI_INPUT(8, HID_IOF_CONSTANT), | ||||
| 		HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */ | ||||
| 		HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */ | ||||
| 		HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */ | ||||
| 		HID_RI_REPORT_COUNT(8, 0x05), | ||||
| 		HID_RI_REPORT_SIZE(8, 0x01), | ||||
| 		HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), | ||||
| 		HID_RI_REPORT_COUNT(8, 0x01), | ||||
| 		HID_RI_REPORT_SIZE(8, 0x03), | ||||
| 		HID_RI_OUTPUT(8, HID_IOF_CONSTANT), | ||||
| 		HID_RI_LOGICAL_MINIMUM(8, 0x00), | ||||
| 		HID_RI_LOGICAL_MAXIMUM(8, 0x65), | ||||
| 		HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */ | ||||
| 		HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */ | ||||
| 		HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */ | ||||
| 		HID_RI_REPORT_COUNT(8, 0x06), | ||||
| 		HID_RI_REPORT_SIZE(8, 0x08), | ||||
| 		HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), | ||||
| 	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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2066, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption    = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_Interface = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber        = INTERFACE_ID_KeyboardAndMouse, | ||||
| 			.AlternateSetting       = 0x00, | ||||
|  | ||||
| 			.TotalEndpoints         = 1, | ||||
|  | ||||
| 			.Class                  = HID_CSCP_HIDClass, | ||||
| 			.SubClass               = HID_CSCP_NonBootSubclass, | ||||
| 			.Protocol               = HID_CSCP_NonBootProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex      = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.HID_HIDData = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
|  | ||||
| 			.HIDSpec                = VERSION_BCD(1,1,1), | ||||
| 			.CountryCode            = 0x00, | ||||
| 			.TotalReportDescriptors = 1, | ||||
| 			.HIDReportType          = HID_DTYPE_Report, | ||||
| 			.HIDReportLength        = sizeof(HIDReport) | ||||
| 		}, | ||||
|  | ||||
| 	.HID_ReportINEndpoint = | ||||
| 		{ | ||||
| 			.Header                 = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 			.EndpointAddress        = HID_IN_EPADDR, | ||||
| 			.Attributes             = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 			.EndpointSize           = HID_EPSIZE, | ||||
| 			.PollingIntervalMS      = 0x05 | ||||
| 		}, | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA Multi HID Report Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 		case HID_DTYPE_HID: | ||||
| 			Address = &ConfigurationDescriptor.HID_HIDData; | ||||
| 			Size    = sizeof(USB_HID_Descriptor_HID_t); | ||||
| 			break; | ||||
| 		case HID_DTYPE_Report: | ||||
| 			Address = &HIDReport; | ||||
| 			Size    = sizeof(HIDReport); | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,101 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 		#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; | ||||
|  | ||||
| 			// Combined Keyboard/Mouse HID Interface | ||||
| 			USB_Descriptor_Interface_t            HID_Interface; | ||||
| 			USB_HID_Descriptor_HID_t              HID_HIDData; | ||||
| 			USB_Descriptor_Endpoint_t             HID_ReportINEndpoint; | ||||
| 		} 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_KeyboardAndMouse = 0, /**< Combined keyboard and mouse 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 */ | ||||
| 		}; | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the HID reporting IN endpoint. */ | ||||
| 		#define HID_IN_EPADDR             (ENDPOINT_DIR_IN | 1) | ||||
|  | ||||
| 		/** Size in bytes of each of the HID reporting IN endpoint. */ | ||||
| 		#define HID_EPSIZE                8 | ||||
|  | ||||
| 	/* Enums: */ | ||||
| 		/** Enum for the HID report IDs used in the device. */ | ||||
| 		enum | ||||
| 		{ | ||||
| 			HID_REPORTID_MouseReport    = 0x01, /**< Report ID for the Mouse report within the device. */ | ||||
| 			HID_REPORTID_KeyboardReport = 0x02, /**< Report ID for the Keyboard report within the device. */ | ||||
| 		} HID_Report_IDs; | ||||
|  | ||||
| 	/* 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 | ||||
|  | ||||
| @@ -1,237 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 KeyboardMouseMultiReport demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "KeyboardMouseMultiReport.h" | ||||
|  | ||||
| /** Buffer to hold the previously generated HID report, for comparison purposes inside the HID class driver. */ | ||||
| static uint8_t PrevHIDReportBuffer[MAX(sizeof(USB_KeyboardReport_Data_t), sizeof(USB_MouseReport_Data_t))]; | ||||
|  | ||||
| /** LUFA HID Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all HID Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_HID_Device_t Device_HID_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.InterfaceNumber              = INTERFACE_ID_KeyboardAndMouse, | ||||
| 				.ReportINEndpoint             = | ||||
| 					{ | ||||
| 						.Address              = HID_IN_EPADDR, | ||||
| 						.Size                 = HID_EPSIZE, | ||||
| 						.Banks                = 1, | ||||
| 					}, | ||||
| 				.PrevReportINBuffer           = PrevHIDReportBuffer, | ||||
| 				.PrevReportINBufferSize       = sizeof(PrevHIDReportBuffer), | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		HID_Device_USBTask(&Device_HID_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware() | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= HID_Device_ConfigureEndpoints(&Device_HID_Interface); | ||||
|  | ||||
| 	USB_Device_EnableSOFEvents(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	HID_Device_ProcessControlRequest(&Device_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** Event handler for the USB device Start Of Frame event. */ | ||||
| void EVENT_USB_Device_StartOfFrame(void) | ||||
| { | ||||
| 	HID_Device_MillisecondElapsed(&Device_HID_Interface); | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the creation of HID reports to the host. | ||||
|  * | ||||
|  *  \param[in]     HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in,out] ReportID    Report ID requested by the host if non-zero, otherwise callback should set to the generated report ID | ||||
|  *  \param[in]     ReportType  Type of the report to create, either HID_REPORT_ITEM_In or HID_REPORT_ITEM_Feature | ||||
|  *  \param[out]    ReportData  Pointer to a buffer where the created report should be stored | ||||
|  *  \param[out]    ReportSize  Number of bytes written in the report (or zero if no report is to be sent) | ||||
|  * | ||||
|  *  \return Boolean \c true to force the sending of the report, \c false to let the library determine if it needs to be sent | ||||
|  */ | ||||
| bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                          uint8_t* const ReportID, | ||||
|                                          const uint8_t ReportType, | ||||
|                                          void* ReportData, | ||||
|                                          uint16_t* const ReportSize) | ||||
| { | ||||
| 	uint8_t JoyStatus_LCL    = Joystick_GetStatus(); | ||||
| 	uint8_t ButtonStatus_LCL = Buttons_GetStatus(); | ||||
|  | ||||
| 	if (!(ButtonStatus_LCL & BUTTONS_BUTTON1)) | ||||
| 	{ | ||||
| 		USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData; | ||||
|  | ||||
| 		KeyboardReport->Modifier = HID_KEYBOARD_MODIFIER_LEFTSHIFT; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_UP) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_A; | ||||
| 		else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_B; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_LEFT) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_C; | ||||
| 		else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_D; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_PRESS) | ||||
| 		  KeyboardReport->KeyCode[0] = HID_KEYBOARD_SC_E; | ||||
|  | ||||
| 		*ReportID   = HID_REPORTID_KeyboardReport; | ||||
| 		*ReportSize = sizeof(USB_KeyboardReport_Data_t); | ||||
| 		return false; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_UP) | ||||
| 		  MouseReport->Y = -1; | ||||
| 		else if (JoyStatus_LCL & JOY_DOWN) | ||||
| 		  MouseReport->Y =  1; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_LEFT) | ||||
| 		  MouseReport->X = -1; | ||||
| 		else if (JoyStatus_LCL & JOY_RIGHT) | ||||
| 		  MouseReport->X =  1; | ||||
|  | ||||
| 		if (JoyStatus_LCL & JOY_PRESS) | ||||
| 		  MouseReport->Button |= (1 << 0); | ||||
|  | ||||
| 		*ReportID   = HID_REPORTID_MouseReport; | ||||
| 		*ReportSize = sizeof(USB_MouseReport_Data_t); | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** HID class driver callback function for the processing of HID reports from the host. | ||||
|  * | ||||
|  *  \param[in] HIDInterfaceInfo  Pointer to the HID class interface configuration structure being referenced | ||||
|  *  \param[in] ReportID    Report ID of the received report from the host | ||||
|  *  \param[in] ReportType  The type of report that the host has sent, either HID_REPORT_ITEM_Out or HID_REPORT_ITEM_Feature | ||||
|  *  \param[in] ReportData  Pointer to a buffer where the received report has been stored | ||||
|  *  \param[in] ReportSize  Size in bytes of the received HID report | ||||
|  */ | ||||
| void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
|                                           const uint8_t ReportID, | ||||
|                                           const uint8_t ReportType, | ||||
|                                           const void* ReportData, | ||||
|                                           const uint16_t ReportSize) | ||||
| { | ||||
| 	uint8_t  LEDMask   = LEDS_NO_LEDS; | ||||
| 	uint8_t* LEDReport = (uint8_t*)ReportData; | ||||
|  | ||||
| 	if (*LEDReport & HID_KEYBOARD_LED_NUMLOCK) | ||||
| 	  LEDMask |= LEDS_LED1; | ||||
|  | ||||
| 	if (*LEDReport & HID_KEYBOARD_LED_CAPSLOCK) | ||||
| 	  LEDMask |= LEDS_LED3; | ||||
|  | ||||
| 	if (*LEDReport & HID_KEYBOARD_LED_SCROLLLOCK) | ||||
| 	  LEDMask |= LEDS_LED4; | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMask); | ||||
| } | ||||
|  | ||||
| @@ -1,84 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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. | ||||
| */ | ||||
|  | ||||
| #ifndef _KEYBOARD_MOUSE_H_ | ||||
| #define _KEYBOARD_MOUSE_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
| 		void EVENT_USB_Device_StartOfFrame(void); | ||||
|  | ||||
| 		bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                         uint8_t* const ReportID, | ||||
| 		                                         const uint8_t ReportType, | ||||
| 		                                         void* ReportData, | ||||
| 		                                         uint16_t* const ReportSize); | ||||
| 		void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, | ||||
| 		                                          const uint8_t ReportID, | ||||
| 		                                          const uint8_t ReportType, | ||||
| 		                                          const void* ReportData, | ||||
| 		                                          const uint16_t ReportSize); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| /** \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 Multiple Report HID Keyboard and Mouse Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Human Interface Device (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 Specification \n | ||||
|  *        USBIF HID Usage Tables</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Low Speed Mode \n | ||||
|  *        Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  Keyboard/Mouse demonstration application, using a single HID interface. This gives | ||||
|  *  a simple reference application for implementing a multiple HID report device | ||||
|  *  containing both USB Keyboard and USB Mouse functionality using the basic USB HID | ||||
|  *  drivers in all modern OSes (i.e. no special drivers required). This example uses a | ||||
|  *  single HID interface that is shared between the two functions. | ||||
|  * | ||||
|  *  On start-up the system will automatically enumerate and function as a keyboard when | ||||
|  *  the USB connection to a host is present and the HWB is not pressed. When enabled, | ||||
|  *  manipulate the joystick to send the letters a, b, c, d and e. See the USB HID | ||||
|  *  documentation for more information on sending keyboard event and key presses. | ||||
|  * | ||||
|  *  When the HWB is pressed, the mouse mode is enabled. When enabled, move the joystick | ||||
|  *  to move the pointer, and push the joystick inwards to simulate a left-button click. | ||||
|  * | ||||
|  *  \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> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,61 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="Keyboard and Mouse HID (Multi Report) Device Demo (Class Driver APIs)" id="lufa.demos.device.class.keyboard_mouse_mr.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.keyboard_mouse_mr"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="Keyboard and Mouse HID (Multi Report) Device Demo (Class Driver APIs)" id="lufa.demos.device.class.keyboard_mouse_mr.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.keyboard_mouse_mr"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.keyboard_mouse_mr" caption="Keyboard and Mouse HID (Multi Report) Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		Keyboard and Mouse HID device demo, implementing a basic USB keyboard and mouse using a single HID interface and multiple logical reports. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="HID Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="KeyboardMouseMultiReport.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="KeyboardMouseMultiReport.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="KeyboardMouseMultiReport.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = KeyboardMouseMultiReport | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               2 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
| @@ -1,314 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 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 PROGMEM DeviceDescriptor = | ||||
| { | ||||
| 	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, | ||||
|  | ||||
| 	.USBSpecification       = VERSION_BCD(1,1,0), | ||||
| 	.Class                  = USB_CSCP_NoDeviceClass, | ||||
| 	.SubClass               = USB_CSCP_NoDeviceSubclass, | ||||
| 	.Protocol               = USB_CSCP_NoDeviceProtocol, | ||||
|  | ||||
| 	.Endpoint0Size          = FIXED_CONTROL_ENDPOINT_SIZE, | ||||
|  | ||||
| 	.VendorID               = 0x03EB, | ||||
| 	.ProductID              = 0x2048, | ||||
| 	.ReleaseNumber          = VERSION_BCD(0,0,1), | ||||
|  | ||||
| 	.ManufacturerStrIndex   = STRING_ID_Manufacturer, | ||||
| 	.ProductStrIndex        = STRING_ID_Product, | ||||
| 	.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 PROGMEM 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 | USB_CONFIG_ATTR_SELFPOWERED), | ||||
|  | ||||
| 			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioControl, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 0, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_ControlSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_ControlProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_ControlInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Audio_Descriptor_Interface_AC_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_Header, | ||||
|  | ||||
| 			.ACSpecification          = VERSION_BCD(1,0,0), | ||||
| 			.TotalLength              = sizeof(USB_Audio_Descriptor_Interface_AC_t), | ||||
|  | ||||
| 			.InCollection             = 1, | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
|  | ||||
| 			.InterfaceNumber          = INTERFACE_ID_AudioStream, | ||||
| 			.AlternateSetting         = 0, | ||||
|  | ||||
| 			.TotalEndpoints           = 2, | ||||
|  | ||||
| 			.Class                    = AUDIO_CSCP_AudioClass, | ||||
| 			.SubClass                 = AUDIO_CSCP_MIDIStreamingSubclass, | ||||
| 			.Protocol                 = AUDIO_CSCP_StreamingProtocol, | ||||
|  | ||||
| 			.InterfaceStrIndex        = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.Audio_StreamInterface_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_AudioInterface_AS_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_General, | ||||
|  | ||||
| 			.AudioSpecification       = VERSION_BCD(1,0,0), | ||||
|  | ||||
| 			.TotalLength              = (sizeof(USB_Descriptor_Configuration_t) - | ||||
| 			                             offsetof(USB_Descriptor_Configuration_t, Audio_StreamInterface_SPC)) | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Emb = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x01, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Ext = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_InputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_InputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x02, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Emb = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_Embedded, | ||||
| 			.JackID                   = 0x03, | ||||
|  | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x02}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Ext = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_OutputJack_t), .Type = DTYPE_CSInterface}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSInterface_OutputTerminal, | ||||
|  | ||||
| 			.JackType                 = MIDI_JACKTYPE_External, | ||||
| 			.JackID                   = 0x04, | ||||
|  | ||||
| 			.NumberOfPins             = 1, | ||||
| 			.SourceJackID             = {0x01}, | ||||
| 			.SourcePinID              = {0x01}, | ||||
|  | ||||
| 			.JackStrIndex             = NO_DESCRIPTOR | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Endpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 					.EndpointAddress     = MIDI_STREAM_OUT_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = MIDI_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x05 | ||||
| 				}, | ||||
|  | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_In_Jack_Endpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
|  | ||||
| 			.TotalEmbeddedJacks       = 0x01, | ||||
| 			.AssociatedJackID         = {0x01} | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Endpoint = | ||||
| 		{ | ||||
| 			.Endpoint = | ||||
| 				{ | ||||
| 					.Header              = {.Size = sizeof(USB_Audio_Descriptor_StreamEndpoint_Std_t), .Type = DTYPE_Endpoint}, | ||||
|  | ||||
| 					.EndpointAddress     = MIDI_STREAM_IN_EPADDR, | ||||
| 					.Attributes          = (EP_TYPE_BULK | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA), | ||||
| 					.EndpointSize        = MIDI_STREAM_EPSIZE, | ||||
| 					.PollingIntervalMS   = 0x05 | ||||
| 				}, | ||||
|  | ||||
| 			.Refresh                  = 0, | ||||
| 			.SyncEndpointNumber       = 0 | ||||
| 		}, | ||||
|  | ||||
| 	.MIDI_Out_Jack_Endpoint_SPC = | ||||
| 		{ | ||||
| 			.Header                   = {.Size = sizeof(USB_MIDI_Descriptor_Jack_Endpoint_t), .Type = DTYPE_CSEndpoint}, | ||||
| 			.Subtype                  = AUDIO_DSUBTYPE_CSEndpoint_General, | ||||
|  | ||||
| 			.TotalEmbeddedJacks       = 0x01, | ||||
| 			.AssociatedJackID         = {0x03} | ||||
| 		} | ||||
| }; | ||||
|  | ||||
| /** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests | ||||
|  *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate | ||||
|  *  via the language ID table available at USB.org what languages the device supports for its string descriptors. | ||||
|  */ | ||||
| const USB_Descriptor_String_t PROGMEM 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 PROGMEM 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 PROGMEM ProductString = USB_STRING_DESCRIPTOR(L"LUFA MIDI Demo"); | ||||
|  | ||||
| /** 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 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: | ||||
| 			switch (DescriptorNumber) | ||||
| 			{ | ||||
| 				case STRING_ID_Language: | ||||
| 					Address = &LanguageString; | ||||
| 					Size    = pgm_read_byte(&LanguageString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Manufacturer: | ||||
| 					Address = &ManufacturerString; | ||||
| 					Size    = pgm_read_byte(&ManufacturerString.Header.Size); | ||||
| 					break; | ||||
| 				case STRING_ID_Product: | ||||
| 					Address = &ProductString; | ||||
| 					Size    = pgm_read_byte(&ProductString.Header.Size); | ||||
| 					break; | ||||
| 			} | ||||
|  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	*DescriptorAddress = Address; | ||||
| 	return Size; | ||||
| } | ||||
|  | ||||
| @@ -1,108 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 <avr/pgmspace.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** Endpoint address of the MIDI streaming data IN endpoint, for device-to-host data transfers. */ | ||||
| 		#define MIDI_STREAM_IN_EPADDR       (ENDPOINT_DIR_IN  | 2) | ||||
|  | ||||
| 		/** Endpoint address of the MIDI streaming data OUT endpoint, for host-to-device data transfers. */ | ||||
| 		#define MIDI_STREAM_OUT_EPADDR      (ENDPOINT_DIR_OUT | 1) | ||||
|  | ||||
| 		/** Endpoint size in bytes of the Audio isochronous streaming data IN and OUT endpoints. */ | ||||
| 		#define MIDI_STREAM_EPSIZE          64 | ||||
|  | ||||
| 	/* 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; | ||||
|  | ||||
| 			// MIDI Audio Control Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_ControlInterface; | ||||
| 			USB_Audio_Descriptor_Interface_AC_t       Audio_ControlInterface_SPC; | ||||
|  | ||||
| 			// MIDI Audio Streaming Interface | ||||
| 			USB_Descriptor_Interface_t                Audio_StreamInterface; | ||||
| 			USB_MIDI_Descriptor_AudioInterface_AS_t   Audio_StreamInterface_SPC; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Emb; | ||||
| 			USB_MIDI_Descriptor_InputJack_t           MIDI_In_Jack_Ext; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Emb; | ||||
| 			USB_MIDI_Descriptor_OutputJack_t          MIDI_Out_Jack_Ext; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_In_Jack_Endpoint; | ||||
| 			USB_MIDI_Descriptor_Jack_Endpoint_t       MIDI_In_Jack_Endpoint_SPC; | ||||
| 			USB_Audio_Descriptor_StreamEndpoint_Std_t MIDI_Out_Jack_Endpoint; | ||||
| 			USB_MIDI_Descriptor_Jack_Endpoint_t       MIDI_Out_Jack_Endpoint_SPC; | ||||
| 		} 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_AudioControl = 0, /**< Audio control interface descriptor ID */ | ||||
| 			INTERFACE_ID_AudioStream  = 1, /**< Audio streaming 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 uint8_t wIndex, | ||||
| 		                                    const void** const DescriptorAddress) | ||||
| 		                                    ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,211 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 MIDI demo. This file contains the main tasks of | ||||
|  *  the demo and is responsible for the initial application hardware configuration. | ||||
|  */ | ||||
|  | ||||
| #include "MIDI.h" | ||||
|  | ||||
| /** LUFA MIDI Class driver interface configuration and state information. This structure is | ||||
|  *  passed to all MIDI Class driver functions, so that multiple instances of the same class | ||||
|  *  within a device can be differentiated from one another. | ||||
|  */ | ||||
| USB_ClassInfo_MIDI_Device_t Keyboard_MIDI_Interface = | ||||
| 	{ | ||||
| 		.Config = | ||||
| 			{ | ||||
| 				.StreamingInterfaceNumber = INTERFACE_ID_AudioStream, | ||||
| 				.DataINEndpoint           = | ||||
| 					{ | ||||
| 						.Address          = MIDI_STREAM_IN_EPADDR, | ||||
| 						.Size             = MIDI_STREAM_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 				.DataOUTEndpoint          = | ||||
| 					{ | ||||
| 						.Address          = MIDI_STREAM_OUT_EPADDR, | ||||
| 						.Size             = MIDI_STREAM_EPSIZE, | ||||
| 						.Banks            = 1, | ||||
| 					}, | ||||
| 			}, | ||||
| 	}; | ||||
|  | ||||
|  | ||||
| /** Main program entry point. This routine contains the overall program flow, including initial | ||||
|  *  setup of all components and the main program loop. | ||||
|  */ | ||||
| int main(void) | ||||
| { | ||||
| 	SetupHardware(); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| 	GlobalInterruptEnable(); | ||||
|  | ||||
| 	for (;;) | ||||
| 	{ | ||||
| 		CheckJoystickMovement(); | ||||
|  | ||||
| 		MIDI_EventPacket_t ReceivedMIDIEvent; | ||||
| 		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent)) | ||||
| 		{ | ||||
| 			if ((ReceivedMIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON)) && (ReceivedMIDIEvent.Data3 > 0)) | ||||
| 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2); | ||||
| 			else | ||||
| 			  LEDs_SetAllLEDs(LEDS_NO_LEDS); | ||||
| 		} | ||||
|  | ||||
| 		MIDI_Device_USBTask(&Keyboard_MIDI_Interface); | ||||
| 		USB_USBTask(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** Configures the board hardware and chip peripherals for the demo's functionality. */ | ||||
| void SetupHardware(void) | ||||
| { | ||||
| #if (ARCH == ARCH_AVR8) | ||||
| 	/* Disable watchdog if enabled by bootloader/fuses */ | ||||
| 	MCUSR &= ~(1 << WDRF); | ||||
| 	wdt_disable(); | ||||
|  | ||||
| 	/* Disable clock division */ | ||||
| 	clock_prescale_set(clock_div_1); | ||||
| #elif (ARCH == ARCH_XMEGA) | ||||
| 	/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ | ||||
| 	XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); | ||||
| 	XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); | ||||
|  | ||||
| 	/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ | ||||
| 	XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); | ||||
| 	XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); | ||||
|  | ||||
| 	PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; | ||||
| #endif | ||||
|  | ||||
| 	/* Hardware Initialization */ | ||||
| 	Joystick_Init(); | ||||
| 	LEDs_Init(); | ||||
| 	Buttons_Init(); | ||||
| 	USB_Init(); | ||||
| } | ||||
|  | ||||
| /** Checks for changes in the position of the board joystick, sending MIDI events to the host upon each change. */ | ||||
| void CheckJoystickMovement(void) | ||||
| { | ||||
| 	static uint8_t PrevJoystickStatus; | ||||
|  | ||||
| 	uint8_t MIDICommand = 0; | ||||
| 	uint8_t MIDIPitch; | ||||
|  | ||||
| 	/* Get current joystick mask, XOR with previous to detect joystick changes */ | ||||
| 	uint8_t JoystickStatus  = Joystick_GetStatus(); | ||||
| 	uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus); | ||||
|  | ||||
| 	/* Get board button status - if pressed use channel 10 (percussion), otherwise use channel 1 */ | ||||
| 	uint8_t Channel = ((Buttons_GetStatus() & BUTTONS_BUTTON1) ? MIDI_CHANNEL(10) : MIDI_CHANNEL(1)); | ||||
|  | ||||
| 	if (JoystickChanges & JOY_LEFT) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3C; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_UP) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3D; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_RIGHT) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3E; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_DOWN) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3F; | ||||
| 	} | ||||
|  | ||||
| 	if (JoystickChanges & JOY_PRESS) | ||||
| 	{ | ||||
| 		MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF); | ||||
| 		MIDIPitch   = 0x3B; | ||||
| 	} | ||||
|  | ||||
| 	if (MIDICommand) | ||||
| 	{ | ||||
| 		MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t) | ||||
| 			{ | ||||
| 				.Event       = MIDI_EVENT(0, MIDICommand), | ||||
|  | ||||
| 				.Data1       = MIDICommand | Channel, | ||||
| 				.Data2       = MIDIPitch, | ||||
| 				.Data3       = MIDI_STANDARD_VELOCITY, | ||||
| 			}; | ||||
|  | ||||
| 		MIDI_Device_SendEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent); | ||||
| 		MIDI_Device_Flush(&Keyboard_MIDI_Interface); | ||||
| 	} | ||||
|  | ||||
| 	PrevJoystickStatus = JoystickStatus; | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Connection event. */ | ||||
| void EVENT_USB_Device_Connect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Disconnection event. */ | ||||
| void EVENT_USB_Device_Disconnect(void) | ||||
| { | ||||
| 	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Configuration Changed event. */ | ||||
| void EVENT_USB_Device_ConfigurationChanged(void) | ||||
| { | ||||
| 	bool ConfigSuccess = true; | ||||
|  | ||||
| 	ConfigSuccess &= MIDI_Device_ConfigureEndpoints(&Keyboard_MIDI_Interface); | ||||
|  | ||||
| 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); | ||||
| } | ||||
|  | ||||
| /** Event handler for the library USB Control Request reception event. */ | ||||
| void EVENT_USB_Device_ControlRequest(void) | ||||
| { | ||||
| 	MIDI_Device_ProcessControlRequest(&Keyboard_MIDI_Interface); | ||||
| } | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 MIDI.c. | ||||
|  */ | ||||
|  | ||||
| #ifndef _MIDI_H_ | ||||
| #define _MIDI_H_ | ||||
|  | ||||
| 	/* Includes: */ | ||||
| 		#include <avr/io.h> | ||||
| 		#include <avr/wdt.h> | ||||
| 		#include <avr/power.h> | ||||
| 		#include <avr/interrupt.h> | ||||
| 		#include <stdbool.h> | ||||
| 		#include <string.h> | ||||
|  | ||||
| 		#include "Descriptors.h" | ||||
|  | ||||
| 		#include <LUFA/Drivers/Board/LEDs.h> | ||||
| 		#include <LUFA/Drivers/Board/Joystick.h> | ||||
| 		#include <LUFA/Drivers/Board/Buttons.h> | ||||
| 		#include <LUFA/Drivers/USB/USB.h> | ||||
| 		#include <LUFA/Platform/Platform.h> | ||||
|  | ||||
| 	/* Macros: */ | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ | ||||
| 		#define LEDMASK_USB_NOTREADY      LEDS_LED1 | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ | ||||
| 		#define LEDMASK_USB_ENUMERATING  (LEDS_LED2 | LEDS_LED3) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that the USB interface is ready. */ | ||||
| 		#define LEDMASK_USB_READY        (LEDS_LED2 | LEDS_LED4) | ||||
|  | ||||
| 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ | ||||
| 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3) | ||||
|  | ||||
| 	/* Function Prototypes: */ | ||||
| 		void SetupHardware(void); | ||||
| 		void CheckJoystickMovement(void); | ||||
|  | ||||
| 		void EVENT_USB_Device_Connect(void); | ||||
| 		void EVENT_USB_Device_Disconnect(void); | ||||
| 		void EVENT_USB_Device_ConfigurationChanged(void); | ||||
| 		void EVENT_USB_Device_ControlRequest(void); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| /** \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 MIDI Input Device Demo | ||||
|  * | ||||
|  *  \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) | ||||
|  *  \li Series AU XMEGA AVRs (ATXMEGAxxxAxU) | ||||
|  *  \li Series B XMEGA AVRs (ATXMEGAxxxBxU) | ||||
|  *  \li Series C XMEGA AVRs (ATXMEGAxxxCxU) | ||||
|  * | ||||
|  *  \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>Audio Class</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>USB Subclass:</b></td> | ||||
|  *    <td>Standard Audio Device</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Relevant Standards:</b></td> | ||||
|  *    <td>USBIF Audio Class Specification \n | ||||
|  *        USB-MIDI Audio Class Extension Specification \n | ||||
|  *        General MIDI Specification</td> | ||||
|  *   </tr> | ||||
|  *   <tr> | ||||
|  *    <td><b>Supported USB Speeds:</b></td> | ||||
|  *    <td>Full Speed Mode</td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  * | ||||
|  *  \section Sec_Description Project Description: | ||||
|  * | ||||
|  *  MIDI demonstration application. This gives a simple reference | ||||
|  *  application for implementing the USB-MIDI class in USB devices. | ||||
|  *  It is built upon the USB Audio class. | ||||
|  * | ||||
|  *  Joystick movements are translated into note on/off messages and | ||||
|  *  are sent to the host PC as MIDI streams which can be read by any | ||||
|  *  MIDI program supporting MIDI IN devices. | ||||
|  * | ||||
|  *  If the HWB is not pressed, channel 1 (default piano) is used. If | ||||
|  *  the HWB is pressed, then channel 10 (default percussion) is selected. | ||||
|  * | ||||
|  *  This device implements MIDI-THRU mode, with the IN MIDI data being | ||||
|  *  generated by the device itself. OUT MIDI data is discarded. | ||||
|  * | ||||
|  *  \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> | ||||
|  *    <td> | ||||
|  *     None | ||||
|  *    </td> | ||||
|  *   </tr> | ||||
|  *  </table> | ||||
|  */ | ||||
|  | ||||
| @@ -1,62 +0,0 @@ | ||||
| <asf xmlversion="1.0"> | ||||
| 	<project caption="MIDI Device Demo (Class Driver APIs)" id="lufa.demos.device.class.midi.example.avr8"> | ||||
| 		<require idref="lufa.demos.device.class.midi"/> | ||||
| 		<require idref="lufa.boards.dummy.avr8"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="at90usb1287"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="16000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="16000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<project caption="MIDI Device Demo (Class Driver APIs)" id="lufa.demos.device.class.midi.example.xmega"> | ||||
| 		<require idref="lufa.demos.device.class.midi"/> | ||||
| 		<require idref="lufa.boards.dummy.xmega"/> | ||||
| 		<generator value="as5_8"/> | ||||
|  | ||||
| 		<device-support value="atxmega128a1u"/> | ||||
| 		<config name="lufa.drivers.board.name" value="none"/> | ||||
|  | ||||
| 		<build type="define" name="F_CPU" value="32000000UL"/> | ||||
| 		<build type="define" name="F_USB" value="48000000UL"/> | ||||
| 	</project> | ||||
|  | ||||
| 	<module type="application" id="lufa.demos.device.class.midi" caption="MIDI Device Demo (Class Driver APIs)"> | ||||
| 		<info type="description" value="summary"> | ||||
| 		MIDI device demo, implementing a basic USB MIDI device that can send messages to the host. This demo uses the user-friendly USB Class Driver APIs to provide a simple, abstracted interface into the USB stack. | ||||
| 		</info> | ||||
|  | ||||
|  		<info type="gui-flag" value="move-to-root"/> | ||||
|  | ||||
| 		<info type="keyword" value="Technology"> | ||||
| 			<keyword value="Class Driver APIs"/> | ||||
| 			<keyword value="USB Device"/> | ||||
| 			<keyword value="MIDI Class"/> | ||||
| 		</info> | ||||
|  | ||||
| 		<device-support-alias value="lufa_avr8"/> | ||||
| 		<device-support-alias value="lufa_xmega"/> | ||||
| 		<device-support-alias value="lufa_uc3"/> | ||||
|  | ||||
| 		<build type="distribute" subtype="user-file" value="doxyfile"/> | ||||
| 		<build type="distribute" subtype="user-file" value="MIDI.txt"/> | ||||
|  | ||||
| 		<build type="c-source" value="MIDI.c"/> | ||||
| 		<build type="c-source" value="Descriptors.c"/> | ||||
| 		<build type="header-file" value="MIDI.h"/> | ||||
| 		<build type="header-file" value="Descriptors.h"/> | ||||
|  | ||||
| 		<build type="module-config" subtype="path" value="Config"/> | ||||
| 		<build type="header-file" value="Config/LUFAConfig.h"/> | ||||
|  | ||||
| 		<require idref="lufa.common"/> | ||||
| 		<require idref="lufa.platform"/> | ||||
| 		<require idref="lufa.drivers.usb"/> | ||||
| 		<require idref="lufa.drivers.board"/> | ||||
| 		<require idref="lufa.drivers.board.leds"/> | ||||
| 		<require idref="lufa.drivers.board.buttons"/> | ||||
| 		<require idref="lufa.drivers.board.joystick"/> | ||||
| 	</module> | ||||
| </asf> | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,38 +0,0 @@ | ||||
| # | ||||
| #             LUFA Library | ||||
| #     Copyright (C) Dean Camera, 2014. | ||||
| # | ||||
| #  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       = MIDI | ||||
| SRC          = $(TARGET).c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) | ||||
| LUFA_PATH    = ../../../../LUFA | ||||
| CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ | ||||
| LD_FLAGS     = | ||||
|  | ||||
| # Default target | ||||
| all: | ||||
|  | ||||
| # Include LUFA build script makefiles | ||||
| include $(LUFA_PATH)/Build/lufa_core.mk | ||||
| include $(LUFA_PATH)/Build/lufa_sources.mk | ||||
| include $(LUFA_PATH)/Build/lufa_build.mk | ||||
| include $(LUFA_PATH)/Build/lufa_cppcheck.mk | ||||
| include $(LUFA_PATH)/Build/lufa_doxygen.mk | ||||
| include $(LUFA_PATH)/Build/lufa_dfu.mk | ||||
| include $(LUFA_PATH)/Build/lufa_hid.mk | ||||
| include $(LUFA_PATH)/Build/lufa_avrdude.mk | ||||
| include $(LUFA_PATH)/Build/lufa_atprogram.mk | ||||
| @@ -1,50 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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 some of | ||||
|  *  the application's compile time options, as an alternative to | ||||
|  *  specifying the compile time constants supplied through a | ||||
|  *  makefile or build system. | ||||
|  * | ||||
|  *  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 TOTAL_LUNS                1 | ||||
|  | ||||
| 	#define DISK_READ_ONLY            false | ||||
|  | ||||
| #endif | ||||
| @@ -1,126 +0,0 @@ | ||||
| /* | ||||
|              LUFA Library | ||||
|      Copyright (C) Dean Camera, 2014. | ||||
|  | ||||
|   dean [at] fourwalledcubicle [dot] com | ||||
|            www.lufa-lib.org | ||||
| */ | ||||
|  | ||||
| /* | ||||
|   Copyright 2014  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            {Insert Value Here} | ||||
| 		#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 | ||||
|  | ||||
| 	#elif (ARCH == ARCH_XMEGA) | ||||
|  | ||||
| 		/* 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 USE_STATIC_OPTIONS               (USB_DEVICE_OPT_FULLSPEED | USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH) | ||||
| //		#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            {Insert Value Here} | ||||
| 		#define FIXED_NUM_CONFIGURATIONS         1 | ||||
| //		#define CONTROL_ONLY_DEVICE | ||||
| 		#define MAX_ENDPOINT_INDEX               4 | ||||
| //		#define NO_DEVICE_REMOTE_WAKEUP | ||||
| //		#define NO_DEVICE_SELF_POWER | ||||
|  | ||||
| 	#else | ||||
|  | ||||
| 		#error Unsupported architecture for this LUFA configuration file. | ||||
|  | ||||
| 	#endif | ||||
| #endif | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user