Minor documentation page updates.

Redocumented all device demos, now that they have changed over to the new USB class drivers.

Added C linkage to class drivers for C++ support.

Added prefixes to most of the class driver constants to prevent name clashes.
pull/1469/head
Dean Camera 16 years ago
parent 7c5444b89a
commit a67bd74e3e

@ -113,7 +113,6 @@ LUFA_PATH = ../..
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c \ SRC = $(TARGET).c \
Descriptors.c \ Descriptors.c \
$(LUFA_PATH)/LUFA/Scheduler/Scheduler.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \

@ -113,7 +113,6 @@ LUFA_PATH = ../..
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c \ SRC = $(TARGET).c \
Descriptors.c \ Descriptors.c \
$(LUFA_PATH)/LUFA/Scheduler/Scheduler.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \

@ -113,7 +113,6 @@ LUFA_PATH = ../..
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c \ SRC = $(TARGET).c \
Descriptors.c \ Descriptors.c \
$(LUFA_PATH)/LUFA/Scheduler/Scheduler.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \

@ -28,16 +28,29 @@
this software. 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" #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_t Microphone_Audio_Interface = USB_ClassInfo_Audio_t Microphone_Audio_Interface =
{ {
.InterfaceNumber = 0, .StreamingInterfaceNumber = 1,
.DataINEndpointNumber = AUDIO_STREAM_EPNUM, .DataINEndpointNumber = AUDIO_STREAM_EPNUM,
.DataINEndpointSize = AUDIO_STREAM_EPSIZE, .DataINEndpointSize = AUDIO_STREAM_EPSIZE,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -53,6 +66,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -72,6 +86,9 @@ void SetupHardware(void)
ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | MIC_IN_ADC_CHANNEL); ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | MIC_IN_ADC_CHANNEL);
} }
/** Processes the next audio sample by reading the last ADC conversion and writing it to the audio
* interface, each time the sample reload timer period elapses to give a constant sample rate.
*/
void ProcessNextSample(void) void ProcessNextSample(void)
{ {
if ((TIFR0 & (1 << OCF0A)) && USB_Audio_IsReadyForNextSample(&Microphone_Audio_Interface)) if ((TIFR0 & (1 << OCF0A)) && USB_Audio_IsReadyForNextSample(&Microphone_Audio_Interface))
@ -90,6 +107,7 @@ void ProcessNextSample(void)
} }
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
@ -100,6 +118,7 @@ void EVENT_USB_Connect(void)
TCCR0B = (1 << CS00); // Fcpu speed TCCR0B = (1 << CS00); // Fcpu speed
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
/* Stop the sample reload timer */ /* Stop the sample reload timer */
@ -108,6 +127,7 @@ void EVENT_USB_Disconnect(void)
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -116,6 +136,7 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_Audio_ProcessControlPacket(&Microphone_Audio_Interface); USB_Audio_ProcessControlPacket(&Microphone_Audio_Interface);

@ -61,9 +61,16 @@
#define ADC_MAX_RANGE 0x3FF #define ADC_MAX_RANGE 0x3FF
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -201,7 +201,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.BitResolution = 16, .BitResolution = 16,
.SampleFrequencyType = (sizeof(ConfigurationDescriptor.AudioFormat.SampleFrequencies) / sizeof(AudioSampleFreq_t)), .SampleFrequencyType = (sizeof(ConfigurationDescriptor.AudioFormat.SampleFrequencies) / sizeof(AudioSampleFreq_t)),
.SampleFrequencies = {SAMPLE_FREQ(AUDIO_SAMPLE_FREQUENCY)} .SampleFrequencies = {AUDIO_SAMPLE_FREQ(AUDIO_SAMPLE_FREQUENCY)}
}, },
.AudioEndpoint = .AudioEndpoint =

@ -28,16 +28,29 @@
this software. 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" #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_t Speaker_Audio_Interface = USB_ClassInfo_Audio_t Speaker_Audio_Interface =
{ {
.InterfaceNumber = 0, .StreamingInterfaceNumber = 1,
.DataOUTEndpointNumber = AUDIO_STREAM_EPNUM, .DataOUTEndpointNumber = AUDIO_STREAM_EPNUM,
.DataOUTEndpointSize = AUDIO_STREAM_EPSIZE, .DataOUTEndpointSize = AUDIO_STREAM_EPSIZE,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -53,6 +66,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -67,6 +81,9 @@ void SetupHardware(void)
USB_Init(); USB_Init();
} }
/** Processes the next audio sample by reading the last ADC conversion and writing it to the audio
* interface, each time the sample reload timer period elapses to give a constant sample rate.
*/
void ProcessNextSample(void) void ProcessNextSample(void)
{ {
if ((TIFR0 & (1 << OCF0A)) && USB_Audio_IsSampleReceived(&Speaker_Audio_Interface)) if ((TIFR0 & (1 << OCF0A)) && USB_Audio_IsSampleReceived(&Speaker_Audio_Interface))
@ -82,10 +99,10 @@ void ProcessNextSample(void)
int8_t LeftSample_8Bit = (LeftSample_16Bit >> 8); int8_t LeftSample_8Bit = (LeftSample_16Bit >> 8);
int8_t RightSample_8Bit = (RightSample_16Bit >> 8); int8_t RightSample_8Bit = (RightSample_16Bit >> 8);
#if defined(AUDIO_OUT_MONO)
/* Mix the two channels together to produce a mono, 8-bit sample */ /* 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); 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 */ /* Load the sample into the PWM timer channel */
OCRxA = ((uint8_t)MixedSample_8Bit ^ (1 << 7)); OCRxA = ((uint8_t)MixedSample_8Bit ^ (1 << 7));
#elif defined(AUDIO_OUT_STEREO) #elif defined(AUDIO_OUT_STEREO)
@ -93,42 +110,32 @@ void ProcessNextSample(void)
OCRxA = ((uint8_t)LeftSample_8Bit ^ (1 << 7)); OCRxA = ((uint8_t)LeftSample_8Bit ^ (1 << 7));
OCRxB = ((uint8_t)RightSample_8Bit ^ (1 << 7)); OCRxB = ((uint8_t)RightSample_8Bit ^ (1 << 7));
#elif defined(AUDIO_OUT_PORTC) #elif defined(AUDIO_OUT_PORTC)
/* 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);
PORTC = MixedSample_8Bit; PORTC = MixedSample_8Bit;
#else #else
uint8_t LEDMask = LEDS_NO_LEDS; uint8_t LEDMask = LEDS_NO_LEDS;
/* Make left channel positive (absolute) */ /* Make mixed sample value positive (absolute) */
if (LeftSample_8Bit < 0) if (MixedSample_8Bit < 0)
LeftSample_8Bit = -LeftSample_8Bit; MixedSample_8Bit = -MixedSample_8Bit;
/* Make right channel positive (absolute) */ if (MixedSample_8Bit > ((128 / 8) * 1))
if (RightSample_8Bit < 0) LEDMask |= LEDS_LED1;
RightSample_8Bit = -RightSample_8Bit;
/* Set first LED based on sample value */ if (MixedSample_8Bit > ((128 / 8) * 2))
if (LeftSample_8Bit < ((128 / 8) * 1))
LEDMask |= LEDS_LED2; LEDMask |= LEDS_LED2;
else if (LeftSample_8Bit < ((128 / 8) * 3))
LEDMask |= (LEDS_LED1 | LEDS_LED2);
else
LEDMask |= LEDS_LED1;
/* Set second LED based on sample value */ if (MixedSample_8Bit > ((128 / 8) * 3))
if (RightSample_8Bit < ((128 / 8) * 1))
LEDMask |= LEDS_LED4;
else if (RightSample_8Bit < ((128 / 8) * 3))
LEDMask |= (LEDS_LED3 | LEDS_LED4);
else
LEDMask |= LEDS_LED3; LEDMask |= LEDS_LED3;
if (MixedSample_8Bit > ((128 / 8) * 4))
LEDMask |= LEDS_LED4;
LEDs_SetAllLEDs(LEDMask); LEDs_SetAllLEDs(LEDMask);
#endif #endif
} }
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
@ -157,16 +164,16 @@ void EVENT_USB_Connect(void)
#endif #endif
} }
/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via /** Event handler for the library USB Disconnection event. */
* the status LEDs, disables the sample update and PWM output timers and stops the USB and Audio management tasks.
*/
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
/* Stop the timers */ /* Stop the sample reload timer */
TCCR0B = 0; TCCR0B = 0;
#if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO)) #if (defined(AUDIO_OUT_MONO) || defined(AUDIO_OUT_STEREO))
/* Stop the PWM generation timer */
TCCRxB = 0; TCCRxB = 0;
#endif #endif
@ -182,6 +189,7 @@ void EVENT_USB_Disconnect(void)
#endif #endif
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -190,6 +198,7 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_Audio_ProcessControlPacket(&Speaker_Audio_Interface); USB_Audio_ProcessControlPacket(&Speaker_Audio_Interface);

@ -99,9 +99,16 @@
#endif #endif
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -201,7 +201,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.BitResolution = 16, .BitResolution = 16,
.SampleFrequencyType = (sizeof(ConfigurationDescriptor.AudioFormat.SampleFrequencies) / sizeof(AudioSampleFreq_t)), .SampleFrequencyType = (sizeof(ConfigurationDescriptor.AudioFormat.SampleFrequencies) / sizeof(AudioSampleFreq_t)),
.SampleFrequencies = {SAMPLE_FREQ(AUDIO_SAMPLE_FREQUENCY)} .SampleFrequencies = {AUDIO_SAMPLE_FREQ(AUDIO_SAMPLE_FREQUENCY)}
}, },
.AudioEndpoint = .AudioEndpoint =

@ -28,8 +28,18 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the CDC demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "CDC.h" #include "CDC.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.
*/
USB_ClassInfo_CDC_t VirtualSerial_CDC_Interface = USB_ClassInfo_CDC_t VirtualSerial_CDC_Interface =
{ {
.ControlInterfaceNumber = 0, .ControlInterfaceNumber = 0,
@ -44,6 +54,9 @@ USB_ClassInfo_CDC_t VirtualSerial_CDC_Interface =
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -63,6 +76,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -78,6 +92,7 @@ void SetupHardware(void)
USB_Init(); USB_Init();
} }
/** Checks for changes in the position of the board joystick, sending strings to the host upon each change. */
void CheckJoystickMovement(void) void CheckJoystickMovement(void)
{ {
uint8_t JoyStatus_LCL = Joystick_GetStatus(); uint8_t JoyStatus_LCL = Joystick_GetStatus();
@ -114,16 +129,19 @@ void CheckJoystickMovement(void)
} }
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -132,6 +150,7 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_CDC_ProcessControlPacket(&VirtualSerial_CDC_Interface); USB_CDC_ProcessControlPacket(&VirtualSerial_CDC_Interface);

@ -51,9 +51,16 @@
#include <LUFA/Drivers/USB/Class/Device/CDC.h> #include <LUFA/Drivers/USB/Class/Device/CDC.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -28,8 +28,19 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the DualCDC demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "DualCDC.h" #include "DualCDC.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_t VirtualSerial1_CDC_Interface = USB_ClassInfo_CDC_t VirtualSerial1_CDC_Interface =
{ {
.ControlInterfaceNumber = 0, .ControlInterfaceNumber = 0,
@ -44,9 +55,14 @@ USB_ClassInfo_CDC_t VirtualSerial1_CDC_Interface =
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
}; };
/** 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_t VirtualSerial2_CDC_Interface = USB_ClassInfo_CDC_t VirtualSerial2_CDC_Interface =
{ {
.ControlInterfaceNumber = 0, .ControlInterfaceNumber = 2,
.DataINEndpointNumber = CDC2_TX_EPNUM, .DataINEndpointNumber = CDC2_TX_EPNUM,
.DataINEndpointSize = CDC_TXRX_EPSIZE, .DataINEndpointSize = CDC_TXRX_EPSIZE,
@ -58,6 +74,9 @@ USB_ClassInfo_CDC_t VirtualSerial2_CDC_Interface =
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -68,10 +87,12 @@ int main(void)
{ {
CheckJoystickMovement(); CheckJoystickMovement();
/* Discard all received data on the first CDC interface */
uint16_t BytesToDiscard = USB_CDC_BytesReceived(&VirtualSerial1_CDC_Interface); uint16_t BytesToDiscard = USB_CDC_BytesReceived(&VirtualSerial1_CDC_Interface);
while (BytesToDiscard--) while (BytesToDiscard--)
USB_CDC_ReceiveByte(&VirtualSerial1_CDC_Interface); USB_CDC_ReceiveByte(&VirtualSerial1_CDC_Interface);
/* Echo all received data on the second CDC interface */
uint16_t BytesToEcho = USB_CDC_BytesReceived(&VirtualSerial2_CDC_Interface); uint16_t BytesToEcho = USB_CDC_BytesReceived(&VirtualSerial2_CDC_Interface);
while (BytesToEcho--) while (BytesToEcho--)
USB_CDC_SendByte(&VirtualSerial2_CDC_Interface, USB_CDC_ReceiveByte(&VirtualSerial2_CDC_Interface)); USB_CDC_SendByte(&VirtualSerial2_CDC_Interface, USB_CDC_ReceiveByte(&VirtualSerial2_CDC_Interface));
@ -82,6 +103,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -97,6 +119,9 @@ void SetupHardware(void)
USB_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) void CheckJoystickMovement(void)
{ {
uint8_t JoyStatus_LCL = Joystick_GetStatus(); uint8_t JoyStatus_LCL = Joystick_GetStatus();
@ -133,16 +158,19 @@ void CheckJoystickMovement(void)
} }
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -154,6 +182,7 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_CDC_ProcessControlPacket(&VirtualSerial1_CDC_Interface); USB_CDC_ProcessControlPacket(&VirtualSerial1_CDC_Interface);

@ -51,9 +51,16 @@
#include <LUFA/Drivers/USB/Class/Device/CDC.h> #include <LUFA/Drivers/USB/Class/Device/CDC.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -28,8 +28,18 @@
this software. 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" #include "GenericHID.h"
/** 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_t Generic_HID_Interface = USB_ClassInfo_HID_t Generic_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -45,6 +55,9 @@ USB_ClassInfo_HID_t Generic_HID_Interface =
.UsingReportProtocol = true, .UsingReportProtocol = true,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -58,6 +71,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -78,16 +92,19 @@ void SetupHardware(void)
TIMSK0 = (1 << OCIE0A); TIMSK0 = (1 << OCIE0A);
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -96,17 +113,26 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_HID_ProcessControlPacket(&Generic_HID_Interface); USB_HID_ProcessControlPacket(&Generic_HID_Interface);
} }
/** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK) ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{ {
if (Generic_HID_Interface.IdleMSRemaining) if (Generic_HID_Interface.IdleMSRemaining)
Generic_HID_Interface.IdleMSRemaining--; Generic_HID_Interface.IdleMSRemaining--;
} }
/** HID class driver callback function for the creation of HID reports to the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report should be stored
*
* \return Number of bytes written in the report (or zero if no report is to be sent
*/
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData) uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
{ {
// Create generic HID report here // Create generic HID report here
@ -114,6 +140,12 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
return 0; return 0;
} }
/** HID class driver callback function for the processing of HID reports from the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report has been stored
* \param ReportSize Size in bytes of the received HID report
*/
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize) void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
{ {
// Process received generic HID report here // Process received generic HID report here

@ -52,9 +52,16 @@
#include <LUFA/Drivers/USB/Class/Device/HID.h> #include <LUFA/Drivers/USB/Class/Device/HID.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -28,8 +28,18 @@
this software. 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" #include "Joystick.h"
/** 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_t Joystick_HID_Interface = USB_ClassInfo_HID_t Joystick_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -42,6 +52,9 @@ USB_ClassInfo_HID_t Joystick_HID_Interface =
.UsingReportProtocol = true, .UsingReportProtocol = true,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -55,6 +68,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -77,16 +91,19 @@ void SetupHardware(void)
TIMSK0 = (1 << OCIE0A); TIMSK0 = (1 << OCIE0A);
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -95,17 +112,26 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_HID_ProcessControlPacket(&Joystick_HID_Interface); USB_HID_ProcessControlPacket(&Joystick_HID_Interface);
} }
/** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK) ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{ {
if (Joystick_HID_Interface.IdleMSRemaining) if (Joystick_HID_Interface.IdleMSRemaining)
Joystick_HID_Interface.IdleMSRemaining--; Joystick_HID_Interface.IdleMSRemaining--;
} }
/** HID class driver callback function for the creation of HID reports to the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report should be stored
*
* \return Number of bytes written in the report (or zero if no report is to be sent
*/
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData) uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
{ {
USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData; USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
@ -132,6 +158,12 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
return sizeof(USB_JoystickReport_Data_t); return sizeof(USB_JoystickReport_Data_t);
} }
/** HID class driver callback function for the processing of HID reports from the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report has been stored
* \param ReportSize Size in bytes of the received HID report
*/
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize) void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
{ {
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports // Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports

@ -63,9 +63,16 @@
} USB_JoystickReport_Data_t; } USB_JoystickReport_Data_t;
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -29,8 +29,18 @@
this software. 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" #include "Keyboard.h"
/** 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_t Keyboard_HID_Interface = USB_ClassInfo_HID_t Keyboard_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -46,6 +56,9 @@ USB_ClassInfo_HID_t Keyboard_HID_Interface =
.IdleCount = 500, .IdleCount = 500,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -59,6 +72,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware() void SetupHardware()
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -81,16 +95,19 @@ void SetupHardware()
TIMSK0 = (1 << OCIE0A); TIMSK0 = (1 << OCIE0A);
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -99,17 +116,26 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_HID_ProcessControlPacket(&Keyboard_HID_Interface); USB_HID_ProcessControlPacket(&Keyboard_HID_Interface);
} }
/** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK) ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{ {
if (Keyboard_HID_Interface.IdleMSRemaining) if (Keyboard_HID_Interface.IdleMSRemaining)
Keyboard_HID_Interface.IdleMSRemaining--; Keyboard_HID_Interface.IdleMSRemaining--;
} }
/** HID class driver callback function for the creation of HID reports to the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report should be stored
*
* \return Number of bytes written in the report (or zero if no report is to be sent
*/
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData) uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
{ {
USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData; USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;
@ -136,6 +162,12 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
return sizeof(USB_KeyboardReport_Data_t); return sizeof(USB_KeyboardReport_Data_t);
} }
/** HID class driver callback function for the processing of HID reports from the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report has been stored
* \param ReportSize Size in bytes of the received HID report
*/
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize) void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
{ {
uint8_t LEDMask = LEDS_NO_LEDS; uint8_t LEDMask = LEDS_NO_LEDS;

@ -66,9 +66,16 @@
} USB_KeyboardReport_Data_t; } USB_KeyboardReport_Data_t;
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -29,8 +29,19 @@
this software. 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" #include "KeyboardMouse.h"
/** 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_t Keyboard_HID_Interface = USB_ClassInfo_HID_t Keyboard_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -46,6 +57,11 @@ USB_ClassInfo_HID_t Keyboard_HID_Interface =
.IdleCount = 500, .IdleCount = 500,
}; };
/** 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_t Mouse_HID_Interface = USB_ClassInfo_HID_t Mouse_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -59,6 +75,9 @@ USB_ClassInfo_HID_t Mouse_HID_Interface =
.ReportOUTEndpointSize = 0, .ReportOUTEndpointSize = 0,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -73,6 +92,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware() void SetupHardware()
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -94,16 +114,19 @@ void SetupHardware()
TIMSK0 = (1 << OCIE0A); TIMSK0 = (1 << OCIE0A);
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -115,12 +138,14 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_HID_ProcessControlPacket(&Keyboard_HID_Interface); USB_HID_ProcessControlPacket(&Keyboard_HID_Interface);
USB_HID_ProcessControlPacket(&Mouse_HID_Interface); USB_HID_ProcessControlPacket(&Mouse_HID_Interface);
} }
/** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK) ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{ {
if (Keyboard_HID_Interface.IdleMSRemaining) if (Keyboard_HID_Interface.IdleMSRemaining)
@ -130,6 +155,13 @@ ISR(TIMER0_COMPA_vect, ISR_BLOCK)
Mouse_HID_Interface.IdleMSRemaining--; Mouse_HID_Interface.IdleMSRemaining--;
} }
/** HID class driver callback function for the creation of HID reports to the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report should be stored
*
* \return Number of bytes written in the report (or zero if no report is to be sent
*/
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData) uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
{ {
uint8_t JoyStatus_LCL = Joystick_GetStatus(); uint8_t JoyStatus_LCL = Joystick_GetStatus();
@ -183,6 +215,12 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
} }
} }
/** HID class driver callback function for the processing of HID reports from the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report has been stored
* \param ReportSize Size in bytes of the received HID report
*/
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize) void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
{ {
if (HIDInterfaceInfo == &Keyboard_HID_Interface) if (HIDInterfaceInfo == &Keyboard_HID_Interface)

@ -49,9 +49,16 @@
#include <LUFA/Drivers/USB/Class/Device/HID.h> #include <LUFA/Drivers/USB/Class/Device/HID.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Type Defines: */ /* Type Defines: */

@ -145,7 +145,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.Header = {.Size = sizeof(USB_MIDI_In_Jack_t), .Type = DTYPE_AudioInterface}, .Header = {.Size = sizeof(USB_MIDI_In_Jack_t), .Type = DTYPE_AudioInterface},
.Subtype = DSUBTYPE_InputJack, .Subtype = DSUBTYPE_InputJack,
.JackType = JACKTYPE_EMBEDDED, .JackType = MIDI_JACKTYPE_EMBEDDED,
.JackID = 0x01, .JackID = 0x01,
.JackStrIndex = NO_DESCRIPTOR .JackStrIndex = NO_DESCRIPTOR
@ -156,7 +156,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.Header = {.Size = sizeof(USB_MIDI_In_Jack_t), .Type = DTYPE_AudioInterface}, .Header = {.Size = sizeof(USB_MIDI_In_Jack_t), .Type = DTYPE_AudioInterface},
.Subtype = DSUBTYPE_InputJack, .Subtype = DSUBTYPE_InputJack,
.JackType = JACKTYPE_EXTERNAL, .JackType = MIDI_JACKTYPE_EXTERNAL,
.JackID = 0x02, .JackID = 0x02,
.JackStrIndex = NO_DESCRIPTOR .JackStrIndex = NO_DESCRIPTOR
@ -167,7 +167,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.Header = {.Size = sizeof(USB_MIDI_Out_Jack_t), .Type = DTYPE_AudioInterface}, .Header = {.Size = sizeof(USB_MIDI_Out_Jack_t), .Type = DTYPE_AudioInterface},
.Subtype = DSUBTYPE_OutputJack, .Subtype = DSUBTYPE_OutputJack,
.JackType = JACKTYPE_EMBEDDED, .JackType = MIDI_JACKTYPE_EMBEDDED,
.JackID = 0x03, .JackID = 0x03,
.NumberOfPins = 1, .NumberOfPins = 1,
@ -182,7 +182,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.Header = {.Size = sizeof(USB_MIDI_Out_Jack_t), .Type = DTYPE_AudioInterface}, .Header = {.Size = sizeof(USB_MIDI_Out_Jack_t), .Type = DTYPE_AudioInterface},
.Subtype = DSUBTYPE_OutputJack, .Subtype = DSUBTYPE_OutputJack,
.JackType = JACKTYPE_EXTERNAL, .JackType = MIDI_JACKTYPE_EXTERNAL,
.JackID = 0x04, .JackID = 0x04,
.NumberOfPins = 1, .NumberOfPins = 1,

@ -28,11 +28,21 @@
this software. 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" #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_t Keyboard_MIDI_Interface = USB_ClassInfo_MIDI_t Keyboard_MIDI_Interface =
{ {
.InterfaceNumber = 0, .StreamingInterfaceNumber = 1,
.DataINEndpointNumber = MIDI_STREAM_IN_EPNUM, .DataINEndpointNumber = MIDI_STREAM_IN_EPNUM,
.DataINEndpointSize = MIDI_STREAM_EPSIZE, .DataINEndpointSize = MIDI_STREAM_EPSIZE,
@ -41,6 +51,9 @@ USB_ClassInfo_MIDI_t Keyboard_MIDI_Interface =
.DataOUTEndpointSize = MIDI_STREAM_EPSIZE, .DataOUTEndpointSize = MIDI_STREAM_EPSIZE,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -55,6 +68,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -71,6 +85,7 @@ void SetupHardware(void)
USB_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) void CheckJoystickMovement(void)
{ {
static uint8_t PrevJoystickStatus; static uint8_t PrevJoystickStatus;
@ -133,16 +148,19 @@ void CheckJoystickMovement(void)
PrevJoystickStatus = JoystickStatus; PrevJoystickStatus = JoystickStatus;
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);

@ -53,9 +53,16 @@
#include <LUFA/Drivers/USB/Class/Device/MIDI.h> #include <LUFA/Drivers/USB/Class/Device/MIDI.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -28,8 +28,18 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the MassStorage demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "MassStorage.h" #include "MassStorage.h"
/** LUFA Mass Storage Class driver interface configuration and state information. This structure is
* passed to all Mass Storage Class driver functions, so that multiple instances of the same class
* within a device can be differentiated from one another.
*/
USB_ClassInfo_MS_t Disk_MS_Interface = USB_ClassInfo_MS_t Disk_MS_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -43,6 +53,9 @@ USB_ClassInfo_MS_t Disk_MS_Interface =
.TotalLUNs = TOTAL_LUNS, .TotalLUNs = TOTAL_LUNS,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -56,6 +69,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -74,16 +88,19 @@ void SetupHardware(void)
DataflashManager_ResetDataflashProtections(); DataflashManager_ResetDataflashProtections();
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -92,11 +109,16 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_MS_ProcessControlPacket(&Disk_MS_Interface); USB_MS_ProcessControlPacket(&Disk_MS_Interface);
} }
/** Mass Storage class driver callback function the reception of SCSI commands from the host, which must be processed.
*
* \param MSInterfaceInfo Pointer to the Mass Storage class interface configuration structure being referenced
*/
bool CALLBACK_USB_MS_SCSICommandReceived(USB_ClassInfo_MS_t* MSInterfaceInfo) bool CALLBACK_USB_MS_SCSICommandReceived(USB_ClassInfo_MS_t* MSInterfaceInfo)
{ {
bool CommandSuccess; bool CommandSuccess;

@ -54,12 +54,22 @@
#include <LUFA/Drivers/USB/Class/Device/MassStorage.h> #include <LUFA/Drivers/USB/Class/Device/MassStorage.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
#define LEDMASK_USB_BUSY LEDS_LED2
/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
#define LEDMASK_USB_BUSY (LEDS_LED2)
/** Total number of logical drives within the device - must be non-zero. */
#define TOTAL_LUNS 2 #define TOTAL_LUNS 2
/** Blocks in each LUN, calculated from the total capacity divided by the total number of Logical Units in the device. */ /** Blocks in each LUN, calculated from the total capacity divided by the total number of Logical Units in the device. */

@ -28,8 +28,18 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the Mouse demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "Mouse.h" #include "Mouse.h"
/** 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_t Mouse_HID_Interface = USB_ClassInfo_HID_t Mouse_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -40,6 +50,9 @@ USB_ClassInfo_HID_t Mouse_HID_Interface =
.ReportINBufferSize = sizeof(USB_MouseReport_Data_t), .ReportINBufferSize = sizeof(USB_MouseReport_Data_t),
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -53,6 +66,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -75,16 +89,19 @@ void SetupHardware(void)
TIMSK0 = (1 << OCIE0A); TIMSK0 = (1 << OCIE0A);
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -93,17 +110,26 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_HID_ProcessControlPacket(&Mouse_HID_Interface); USB_HID_ProcessControlPacket(&Mouse_HID_Interface);
} }
/** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK) ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{ {
if (Mouse_HID_Interface.IdleMSRemaining) if (Mouse_HID_Interface.IdleMSRemaining)
Mouse_HID_Interface.IdleMSRemaining--; Mouse_HID_Interface.IdleMSRemaining--;
} }
/** HID class driver callback function for the creation of HID reports to the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report should be stored
*
* \return Number of bytes written in the report (or zero if no report is to be sent
*/
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData) uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
{ {
USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData; USB_MouseReport_Data_t* MouseReport = (USB_MouseReport_Data_t*)ReportData;
@ -130,6 +156,12 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
return sizeof(USB_MouseReport_Data_t); return sizeof(USB_MouseReport_Data_t);
} }
/** HID class driver callback function for the processing of HID reports from the host.
*
* \param HIDInterfaceInfo Pointer to the HID class interface configuration structure being referenced
* \param ReportData Pointer to a buffer where the created report has been stored
* \param ReportSize Size in bytes of the received HID report
*/
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize) void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
{ {
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports // Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports

@ -65,9 +65,16 @@
} USB_MouseReport_Data_t; } USB_MouseReport_Data_t;
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -28,8 +28,18 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the RNDISEthernet demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "RNDISEthernet.h" #include "RNDISEthernet.h"
/** LUFA RNDIS Class driver interface configuration and state information. This structure is
* passed to all RNDIS Class driver functions, so that multiple instances of the same class
* within a device can be differentiated from one another.
*/
USB_ClassInfo_RNDIS_t Ethernet_RNDIS_Interface = USB_ClassInfo_RNDIS_t Ethernet_RNDIS_Interface =
{ {
.ControlInterfaceNumber = 0, .ControlInterfaceNumber = 0,
@ -47,12 +57,18 @@ USB_ClassInfo_RNDIS_t Ethernet_RNDIS_Interface =
.AdapterMACAddress = {ADAPTER_MAC_ADDRESS}, .AdapterMACAddress = {ADAPTER_MAC_ADDRESS},
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
TCP_Init();
Webserver_Init();
printf_P(PSTR("\r\n\r\n****** RNDIS Demo running. ******\r\n")); printf_P(PSTR("\r\n\r\n****** RNDIS Demo running. ******\r\n"));
for (;;) for (;;)
@ -71,6 +87,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -84,22 +101,21 @@ void SetupHardware(void)
LEDs_Init(); LEDs_Init();
SerialStream_Init(9600, false); SerialStream_Init(9600, false);
USB_Init(); USB_Init();
/* Initialize TCP and Webserver modules */
TCP_Init();
Webserver_Init();
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -108,6 +124,7 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_RNDIS_ProcessControlPacket(&Ethernet_RNDIS_Interface); USB_RNDIS_ProcessControlPacket(&Ethernet_RNDIS_Interface);

@ -58,11 +58,20 @@
#include <LUFA/Drivers/USB/Class/Device/RNDIS.h> #include <LUFA/Drivers/USB/Class/Device/RNDIS.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
#define LEDMASK_USB_BUSY LEDS_LED2
/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
#define LEDMASK_USB_BUSY (LEDS_LED2)
/* Function Prototypes: */ /* Function Prototypes: */
void SetupHardware(void); void SetupHardware(void);

@ -28,11 +28,24 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the USBtoSerial demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "USBtoSerial.h" #include "USBtoSerial.h"
/** Circular buffer to hold data from the host before it is sent to the device via the serial port. */
RingBuff_t Rx_Buffer; RingBuff_t Rx_Buffer;
/** Circular buffer to hold data from the serial port before it is sent to the host. */
RingBuff_t Tx_Buffer; RingBuff_t Tx_Buffer;
/** 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.
*/
USB_ClassInfo_CDC_t VirtualSerial_CDC_Interface = USB_ClassInfo_CDC_t VirtualSerial_CDC_Interface =
{ {
.ControlInterfaceNumber = 0, .ControlInterfaceNumber = 0,
@ -47,6 +60,9 @@ USB_ClassInfo_CDC_t VirtualSerial_CDC_Interface =
.NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE, .NotificationEndpointSize = CDC_NOTIFICATION_EPSIZE,
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -77,6 +93,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -92,16 +109,19 @@ void SetupHardware(void)
USB_Init(); USB_Init();
} }
/** Event handler for the library USB Connection event. */
void EVENT_USB_Connect(void) void EVENT_USB_Connect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
} }
/** Event handler for the library USB Disconnection event. */
void EVENT_USB_Disconnect(void) void EVENT_USB_Disconnect(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
LEDs_SetAllLEDs(LEDMASK_USB_READY); LEDs_SetAllLEDs(LEDMASK_USB_READY);
@ -110,27 +130,35 @@ void EVENT_USB_ConfigurationChanged(void)
LEDs_SetAllLEDs(LEDMASK_USB_ERROR); LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_CDC_ProcessControlPacket(&VirtualSerial_CDC_Interface); USB_CDC_ProcessControlPacket(&VirtualSerial_CDC_Interface);
} }
/** ISR to manage the reception of data from the serial port, placing received bytes into a circular buffer
* for later transmission to the host.
*/
ISR(USART1_RX_vect, ISR_BLOCK) ISR(USART1_RX_vect, ISR_BLOCK)
{ {
if (USB_IsConnected) if (USB_IsConnected)
Buffer_StoreElement(&Tx_Buffer, UDR1); Buffer_StoreElement(&Tx_Buffer, UDR1);
} }
/** Event handler for the CDC Class driver Line Encoding Changed event.
*
* \param CDCInterfaceInfo Pointer to the CDC class interface configuration structure being referenced
*/
void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo) void EVENT_USB_CDC_LineEncodingChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo)
{ {
uint8_t ConfigMask = 0; uint8_t ConfigMask = 0;
if (CDCInterfaceInfo->LineEncoding.ParityType == Parity_Odd) if (CDCInterfaceInfo->LineEncoding.ParityType == CDC_PARITY_Odd)
ConfigMask = ((1 << UPM11) | (1 << UPM10)); ConfigMask = ((1 << UPM11) | (1 << UPM10));
else if (CDCInterfaceInfo->LineEncoding.ParityType == Parity_Even) else if (CDCInterfaceInfo->LineEncoding.ParityType == CDC_PARITY_Even)
ConfigMask = (1 << UPM11); ConfigMask = (1 << UPM11);
if (CDCInterfaceInfo->LineEncoding.CharFormat == TwoStopBits) if (CDCInterfaceInfo->LineEncoding.CharFormat == CDC_LINEENCODING_TwoStopBits)
ConfigMask |= (1 << USBS1); ConfigMask |= (1 << USBS1);
if (CDCInterfaceInfo->LineEncoding.DataBits == 6) if (CDCInterfaceInfo->LineEncoding.DataBits == 6)

@ -54,9 +54,16 @@
#include <LUFA/Drivers/USB/Class/Device/CDC.h> #include <LUFA/Drivers/USB/Class/Device/CDC.h>
/* Macros: */ /* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1 #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) #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) #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) #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/* Function Prototypes: */ /* Function Prototypes: */

@ -6,10 +6,10 @@
========== TODO: =========== ========== TODO: ===========
- Document new class drivers - Document new class drivers
- Re-document all demos now that they have changed
- Add standardized descriptor names to class driver structures, controlled by USE_NONSTANDARD_DESCRIPTOR_NAMES - Add standardized descriptor names to class driver structures, controlled by USE_NONSTANDARD_DESCRIPTOR_NAMES
- Add C++ compatibility to class drivers
- Disable JTAG in demos - Disable JTAG in demos
- Convert Host mode demos to class drivers
- Remake AVRStudio projects to reflect file structure changes
============================ ============================
/** \page Page_ChangeLog Project Changelog /** \page Page_ChangeLog Project Changelog

@ -20,19 +20,6 @@
* this token is defined, all ANSI control codes in the application code from the TerminalCodes.h header are removed from * this token is defined, all ANSI control codes in the application code from the TerminalCodes.h header are removed from
* the source code at compile time. * the source code at compile time.
* *
* <b>NUM_BLOCKS</b> - ( \ref Group_MemoryAllocator ) \n
* Sets the number of allocable blocks in the pseudo-heap of the dynamic memory allocation driver. This should be
* defined as a constant larger than zero.
*
* <b>BLOCK_SIZE</b> - ( \ref Group_MemoryAllocator ) \n
* Sets the size of each allocable block in the pseudo-heap of the dynamic memory allocation driver. This should be
* defined as a constant larger than zero.
*
* <b>NUM_HANDLES</b> - ( \ref Group_MemoryAllocator ) \n
* Sets the maximum number of managed memory handles which can be handed out by the dynamic memory allocation driver
* simultaneously, before a handle (and its associated allocated memory) must be freed.
*
*
* \section Sec_SummaryUSBClassTokens USB Class Driver Related Tokens * \section Sec_SummaryUSBClassTokens USB Class Driver Related Tokens
* This section describes compile tokens which affect USB class-specific drivers in the LUFA library. * This section describes compile tokens which affect USB class-specific drivers in the LUFA library.
* *

@ -35,7 +35,7 @@ void USB_Audio_ProcessControlPacket(USB_ClassInfo_Audio_t* AudioInterfaceInfo)
if (!(Endpoint_IsSETUPReceived())) if (!(Endpoint_IsSETUPReceived()))
return; return;
if (USB_ControlRequest.wIndex != AudioInterfaceInfo->InterfaceNumber) if (USB_ControlRequest.wIndex != AudioInterfaceInfo->StreamingInterfaceNumber)
return; return;
switch (USB_ControlRequest.bRequest) switch (USB_ControlRequest.bRequest)

@ -36,6 +36,11 @@
#include <string.h> #include <string.h>
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Macros: */ /* Macros: */
/** Descriptor header constant to indicate a Audio class interface descriptor. */ /** Descriptor header constant to indicate a Audio class interface descriptor. */
#define DTYPE_AudioInterface 0x24 #define DTYPE_AudioInterface 0x24
@ -120,7 +125,7 @@
* *
* \param freq Required audio sampling frequency in HZ * \param freq Required audio sampling frequency in HZ
*/ */
#define SAMPLE_FREQ(freq) {LowWord: ((uint32_t)freq & 0x00FFFF), HighByte: (((uint32_t)freq >> 16) & 0x0000FF)} #define AUDIO_SAMPLE_FREQ(freq) {LowWord: ((uint32_t)freq & 0x00FFFF), HighByte: (((uint32_t)freq >> 16) & 0x0000FF)}
/** Mask for the attributes parameter of an Audio class specific Endpoint descriptor, indicating that the endpoint /** Mask for the attributes parameter of an Audio class specific Endpoint descriptor, indicating that the endpoint
* accepts only filled endpoint packets of audio samples. * accepts only filled endpoint packets of audio samples.
@ -277,7 +282,7 @@
typedef struct typedef struct
{ {
uint8_t InterfaceNumber; uint8_t StreamingInterfaceNumber;
uint8_t DataINEndpointNumber; uint8_t DataINEndpointNumber;
uint16_t DataINEndpointSize; uint16_t DataINEndpointSize;
@ -301,4 +306,10 @@
void USB_Audio_WriteSample24(int32_t Sample); void USB_Audio_WriteSample24(int32_t Sample);
bool USB_Audio_IsSampleReceived(USB_ClassInfo_Audio_t* AudioInterfaceInfo); bool USB_Audio_IsSampleReceived(USB_ClassInfo_Audio_t* AudioInterfaceInfo);
bool USB_Audio_IsReadyForNextSample(USB_ClassInfo_Audio_t* AudioInterfaceInfo); bool USB_Audio_IsReadyForNextSample(USB_ClassInfo_Audio_t* AudioInterfaceInfo);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif #endif

@ -36,6 +36,11 @@
#include <string.h> #include <string.h>
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Macros: */ /* Macros: */
/** CDC Class specific request to get the current virtual serial port configuration settings. */ /** CDC Class specific request to get the current virtual serial port configuration settings. */
#define REQ_GetLineEncoding 0x21 #define REQ_GetLineEncoding 0x21
@ -55,47 +60,47 @@
/** Mask for the DTR handshake line for use with the REQ_SetControlLineState class specific request /** Mask for the DTR handshake line for use with the REQ_SetControlLineState class specific request
* from the host, to indicate that the DTR line state should be high. * from the host, to indicate that the DTR line state should be high.
*/ */
#define CONTROL_LINE_OUT_DTR (1 << 0) #define CDC_CONTROL_LINE_OUT_DTR (1 << 0)
/** Mask for the RTS handshake line for use with the REQ_SetControlLineState class specific request /** Mask for the RTS handshake line for use with the REQ_SetControlLineState class specific request
* from the host, to indicate that theRTS line state should be high. * from the host, to indicate that theRTS line state should be high.
*/ */
#define CONTROL_LINE_OUT_RTS (1 << 1) #define CDC_CONTROL_LINE_OUT_RTS (1 << 1)
/** Mask for the DCD handshake line for use with the a NOTIF_SerialState class specific notification /** Mask for the DCD handshake line for use with the a NOTIF_SerialState class specific notification
* from the device to the host, to indicate that the DCD line state is currently high. * from the device to the host, to indicate that the DCD line state is currently high.
*/ */
#define CONTROL_LINE_IN_DCD (1 << 0) #define CDC_CONTROL_LINE_IN_DCD (1 << 0)
/** Mask for the DSR handshake line for use with the a NOTIF_SerialState class specific notification /** Mask for the DSR handshake line for use with the a NOTIF_SerialState class specific notification
* from the device to the host, to indicate that the DSR line state is currently high. * from the device to the host, to indicate that the DSR line state is currently high.
*/ */
#define CONTROL_LINE_IN_DSR (1 << 1) #define CDC_CONTROL_LINE_IN_DSR (1 << 1)
/** Mask for the BREAK handshake line for use with the a NOTIF_SerialState class specific notification /** Mask for the BREAK handshake line for use with the a NOTIF_SerialState class specific notification
* from the device to the host, to indicate that the BREAK line state is currently high. * from the device to the host, to indicate that the BREAK line state is currently high.
*/ */
#define CONTROL_LINE_IN_BREAK (1 << 2) #define CDC_CONTROL_LINE_IN_BREAK (1 << 2)
/** Mask for the RING handshake line for use with the a NOTIF_SerialState class specific notification /** Mask for the RING handshake line for use with the a NOTIF_SerialState class specific notification
* from the device to the host, to indicate that the RING line state is currently high. * from the device to the host, to indicate that the RING line state is currently high.
*/ */
#define CONTROL_LINE_IN_RING (1 << 3) #define CDC_CONTROL_LINE_IN_RING (1 << 3)
/** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host, /** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host,
* to indicate that a framing error has occurred on the virtual serial port. * to indicate that a framing error has occurred on the virtual serial port.
*/ */
#define CONTROL_LINE_IN_FRAMEERROR (1 << 4) #define CDC_CONTROL_LINE_IN_FRAMEERROR (1 << 4)
/** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host, /** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host,
* to indicate that a parity error has occurred on the virtual serial port. * to indicate that a parity error has occurred on the virtual serial port.
*/ */
#define CONTROL_LINE_IN_PARITYERROR (1 << 5) #define CDC_CONTROL_LINE_IN_PARITYERROR (1 << 5)
/** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host, /** Mask for use with the a NOTIF_SerialState class specific notification from the device to the host,
* to indicate that a data overrun error has occurred on the virtual serial port. * to indicate that a data overrun error has occurred on the virtual serial port.
*/ */
#define CONTROL_LINE_IN_OVERRUNERROR (1 << 6) #define CDC_CONTROL_LINE_IN_OVERRUNERROR (1 << 6)
/** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a /** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a
* uniform structure but variable sized data payloads, thus cannot be represented accurately by * uniform structure but variable sized data payloads, thus cannot be represented accurately by
@ -116,19 +121,19 @@
/** Enum for the possible line encoding formats of a virtual serial port. */ /** Enum for the possible line encoding formats of a virtual serial port. */
enum CDCDevice_CDC_LineCodingFormats_t enum CDCDevice_CDC_LineCodingFormats_t
{ {
OneStopBit = 0, /**< Each frame contains one stop bit */ CDC_LINEENCODING_OneStopBit = 0, /**< Each frame contains one stop bit */
OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits */ CDC_LINEENCODING_OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits */
TwoStopBits = 2, /**< Each frame contains two stop bits */ CDC_LINEENCODING_TwoStopBits = 2, /**< Each frame contains two stop bits */
}; };
/** Enum for the possible line encoding parity settings of a virtual serial port. */ /** Enum for the possible line encoding parity settings of a virtual serial port. */
enum CDCDevice_LineCodingParity_t enum CDCDevice_LineCodingParity_t
{ {
Parity_None = 0, /**< No parity bit mode on each frame */ CDC_PARITY_None = 0, /**< No parity bit mode on each frame */
Parity_Odd = 1, /**< Odd parity bit mode on each frame */ CDC_PARITY_Odd = 1, /**< Odd parity bit mode on each frame */
Parity_Even = 2, /**< Even parity bit mode on each frame */ CDC_PARITY_Even = 2, /**< Even parity bit mode on each frame */
Parity_Mark = 3, /**< Mark parity bit mode on each frame */ CDC_PARITY_Mark = 3, /**< Mark parity bit mode on each frame */
Parity_Space = 4, /**< Space parity bit mode on each frame */ CDC_PARITY_Space = 4, /**< Space parity bit mode on each frame */
}; };
/* Type Defines: */ /* Type Defines: */
@ -171,7 +176,6 @@
void EVENT_USB_CDC_ControLineStateChanged(void) ATTR_WEAK ATTR_ALIAS(USB_CDC_Event_Stub);; void EVENT_USB_CDC_ControLineStateChanged(void) ATTR_WEAK ATTR_ALIAS(USB_CDC_Event_Stub);;
#endif #endif
void USB_CDC_USBTask(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
bool USB_CDC_ConfigureEndpoints(USB_ClassInfo_CDC_t* CDCInterfaceInfo); bool USB_CDC_ConfigureEndpoints(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo); void USB_CDC_ProcessControlPacket(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
void USB_CDC_USBTask(USB_ClassInfo_CDC_t* CDCInterfaceInfo); void USB_CDC_USBTask(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
@ -185,4 +189,9 @@
uint8_t USB_CDC_ReceiveByte(USB_ClassInfo_CDC_t* CDCInterfaceInfo); uint8_t USB_CDC_ReceiveByte(USB_ClassInfo_CDC_t* CDCInterfaceInfo);
void USB_CDC_SendSerialLineStateChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo, uint16_t LineStateMask); void USB_CDC_SendSerialLineStateChanged(USB_ClassInfo_CDC_t* CDCInterfaceInfo, uint16_t LineStateMask);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif #endif

@ -36,6 +36,11 @@
#include <string.h> #include <string.h>
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Macros: */ /* Macros: */
/** HID Class Specific Request to get the current HID report from the device. */ /** HID Class Specific Request to get the current HID report from the device. */
#define REQ_GetReport 0x01 #define REQ_GetReport 0x01
@ -111,4 +116,9 @@
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData); uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData);
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize); void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif #endif

@ -37,6 +37,11 @@
#include <string.h> #include <string.h>
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Macros: */ /* Macros: */
/** Audio class descriptor subtype value for a Audio class specific MIDI input jack descriptor. */ /** Audio class descriptor subtype value for a Audio class specific MIDI input jack descriptor. */
#define DSUBTYPE_InputJack 0x02 #define DSUBTYPE_InputJack 0x02
@ -45,10 +50,10 @@
#define DSUBTYPE_OutputJack 0x03 #define DSUBTYPE_OutputJack 0x03
/** Audio class descriptor jack type value for an embedded (logical) MIDI input or output jack. */ /** Audio class descriptor jack type value for an embedded (logical) MIDI input or output jack. */
#define JACKTYPE_EMBEDDED 0x01 #define MIDI_JACKTYPE_EMBEDDED 0x01
/** Audio class descriptor jack type value for an external (physical) MIDI input or output jack. */ /** Audio class descriptor jack type value for an external (physical) MIDI input or output jack. */
#define JACKTYPE_EXTERNAL 0x02 #define MIDI_JACKTYPE_EXTERNAL 0x02
/** MIDI command for a note on (activation) event */ /** MIDI command for a note on (activation) event */
#define MIDI_COMMAND_NOTE_ON 0x09 #define MIDI_COMMAND_NOTE_ON 0x09
@ -137,7 +142,7 @@
typedef struct typedef struct
{ {
uint8_t InterfaceNumber; uint8_t StreamingInterfaceNumber;
uint8_t DataINEndpointNumber; uint8_t DataINEndpointNumber;
uint16_t DataINEndpointSize; uint16_t DataINEndpointSize;
@ -155,4 +160,9 @@
void USB_MIDI_SendEventPacket(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, USB_MIDI_EventPacket_t* Event); void USB_MIDI_SendEventPacket(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, USB_MIDI_EventPacket_t* Event);
bool USB_MIDI_ReceiveEventPacket(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, USB_MIDI_EventPacket_t* Event); bool USB_MIDI_ReceiveEventPacket(USB_ClassInfo_MIDI_t* MIDIInterfaceInfo, USB_MIDI_EventPacket_t* Event);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif #endif

@ -102,16 +102,16 @@ void USB_MS_USBTask(USB_ClassInfo_MS_t* MSInterfaceInfo)
{ {
if (USB_MS_ReadInCommandBlock(MSInterfaceInfo)) if (USB_MS_ReadInCommandBlock(MSInterfaceInfo))
{ {
if (MSInterfaceInfo->CommandBlock.Flags & COMMAND_DIRECTION_DATA_IN) if (MSInterfaceInfo->CommandBlock.Flags & MS_COMMAND_DIR_DATA_IN)
Endpoint_SelectEndpoint(MSInterfaceInfo->DataINEndpointNumber); Endpoint_SelectEndpoint(MSInterfaceInfo->DataINEndpointNumber);
MSInterfaceInfo->CommandStatus.Status = CALLBACK_USB_MS_SCSICommandReceived(MSInterfaceInfo) ? MSInterfaceInfo->CommandStatus.Status = CALLBACK_USB_MS_SCSICommandReceived(MSInterfaceInfo) ?
Command_Pass : Command_Fail; SCSI_Command_Pass : SCSI_Command_Fail;
MSInterfaceInfo->CommandStatus.Signature = CSW_SIGNATURE; MSInterfaceInfo->CommandStatus.Signature = MS_CSW_SIGNATURE;
MSInterfaceInfo->CommandStatus.Tag = MSInterfaceInfo->CommandBlock.Tag; MSInterfaceInfo->CommandStatus.Tag = MSInterfaceInfo->CommandBlock.Tag;
MSInterfaceInfo->CommandStatus.DataTransferResidue = MSInterfaceInfo->CommandBlock.DataTransferLength; MSInterfaceInfo->CommandStatus.DataTransferResidue = MSInterfaceInfo->CommandBlock.DataTransferLength;
if ((MSInterfaceInfo->CommandStatus.Status == Command_Fail) && (MSInterfaceInfo->CommandStatus.DataTransferResidue)) if ((MSInterfaceInfo->CommandStatus.Status == SCSI_Command_Fail) && (MSInterfaceInfo->CommandStatus.DataTransferResidue))
Endpoint_StallTransaction(); Endpoint_StallTransaction();
USB_MS_ReturnCommandStatus(MSInterfaceInfo); USB_MS_ReturnCommandStatus(MSInterfaceInfo);
@ -138,12 +138,12 @@ static bool USB_MS_ReadInCommandBlock(USB_ClassInfo_MS_t* MSInterfaceInfo)
CallbackMSInterfaceInfo = MSInterfaceInfo; CallbackMSInterfaceInfo = MSInterfaceInfo;
Endpoint_Read_Stream_LE(&MSInterfaceInfo->CommandBlock, Endpoint_Read_Stream_LE(&MSInterfaceInfo->CommandBlock,
(sizeof(CommandBlockWrapper_t) - MAX_SCSI_COMMAND_LENGTH), (sizeof(CommandBlockWrapper_t) - 16),
StreamCallback_AbortOnMassStoreReset); StreamCallback_AbortOnMassStoreReset);
if ((MSInterfaceInfo->CommandBlock.Signature != CBW_SIGNATURE) || if ((MSInterfaceInfo->CommandBlock.Signature != MS_CBW_SIGNATURE) ||
(MSInterfaceInfo->CommandBlock.LUN >= MSInterfaceInfo->TotalLUNs) || (MSInterfaceInfo->CommandBlock.LUN >= MSInterfaceInfo->TotalLUNs) ||
(MSInterfaceInfo->CommandBlock.SCSICommandLength > MAX_SCSI_COMMAND_LENGTH)) (MSInterfaceInfo->CommandBlock.SCSICommandLength > 16))
{ {
Endpoint_StallTransaction(); Endpoint_StallTransaction();
Endpoint_SelectEndpoint(MSInterfaceInfo->DataINEndpointNumber); Endpoint_SelectEndpoint(MSInterfaceInfo->DataINEndpointNumber);

@ -36,6 +36,11 @@
#include <string.h> #include <string.h>
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Macros: */ /* Macros: */
/** Mass Storage Class specific request to reset the Mass Storage interface, ready for the next command. */ /** Mass Storage Class specific request to reset the Mass Storage interface, ready for the next command. */
#define REQ_MassStorageReset 0xFF #define REQ_MassStorageReset 0xFF
@ -43,20 +48,17 @@
/** Mass Storage Class specific request to retrieve the total number of Logical Units (drives) in the SCSI device. */ /** Mass Storage Class specific request to retrieve the total number of Logical Units (drives) in the SCSI device. */
#define REQ_GetMaxLUN 0xFE #define REQ_GetMaxLUN 0xFE
/** Maximum length of a SCSI command which can be issued by the device or host in a Mass Storage bulk wrapper. */
#define MAX_SCSI_COMMAND_LENGTH 16
/** Magic signature for a Command Block Wrapper used in the Mass Storage Bulk-Only transport protocol. */ /** Magic signature for a Command Block Wrapper used in the Mass Storage Bulk-Only transport protocol. */
#define CBW_SIGNATURE 0x43425355UL #define MS_CBW_SIGNATURE 0x43425355UL
/** Magic signature for a Command Status Wrapper used in the Mass Storage Bulk-Only transport protocol. */ /** Magic signature for a Command Status Wrapper used in the Mass Storage Bulk-Only transport protocol. */
#define CSW_SIGNATURE 0x53425355UL #define MS_CSW_SIGNATURE 0x53425355UL
/** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from host-to-device. */ /** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from host-to-device. */
#define COMMAND_DIRECTION_DATA_OUT (0 << 7) #define MS_COMMAND_DIR_DATA_OUT (0 << 7)
/** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from device-to-host. */ /** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from device-to-host. */
#define COMMAND_DIRECTION_DATA_IN (1 << 7) #define MS_COMMAND_DIR_DATA_IN (1 << 7)
/* Type defines: */ /* Type defines: */
/** Type define for a Command Block Wrapper, used in the Mass Storage Bulk-Only Transport protocol. */ /** Type define for a Command Block Wrapper, used in the Mass Storage Bulk-Only Transport protocol. */
@ -68,7 +70,7 @@
uint8_t Flags; /**< Command block flags, indicating command data direction */ uint8_t Flags; /**< Command block flags, indicating command data direction */
uint8_t LUN; /**< Logical Unit number this command is issued to */ uint8_t LUN; /**< Logical Unit number this command is issued to */
uint8_t SCSICommandLength; /**< Length of the issued SCSI command within the SCSI command data array */ uint8_t SCSICommandLength; /**< Length of the issued SCSI command within the SCSI command data array */
uint8_t SCSICommandData[MAX_SCSI_COMMAND_LENGTH]; /**< Issued SCSI command in the Command Block */ uint8_t SCSICommandData[16]; /**< Issued SCSI command in the Command Block */
} CommandBlockWrapper_t; } CommandBlockWrapper_t;
/** Type define for a Command Status Wrapper, used in the Mass Storage Bulk-Only Transport protocol. */ /** Type define for a Command Status Wrapper, used in the Mass Storage Bulk-Only Transport protocol. */
@ -84,9 +86,9 @@
/** Enum for the possible command status wrapper return status codes. */ /** Enum for the possible command status wrapper return status codes. */
enum MassStorage_CommandStatusCodes_t enum MassStorage_CommandStatusCodes_t
{ {
Command_Pass = 0, /**< Command completed with no error */ SCSI_Command_Pass = 0, /**< Command completed with no error */
Command_Fail = 1, /**< Command failed to complete - host may check the exact error via a SCSI REQUEST SENSE command */ SCSI_Command_Fail = 1, /**< Command failed to complete - host may check the exact error via a SCSI REQUEST SENSE command */
Phase_Error = 2 /**< Command failed due to being invalid in the current phase */ SCSI_Phase_Error = 2 /**< Command failed due to being invalid in the current phase */
}; };
/* Type Defines: */ /* Type Defines: */
@ -118,10 +120,15 @@
static uint8_t StreamCallback_AbortOnMassStoreReset(void); static uint8_t StreamCallback_AbortOnMassStoreReset(void);
#endif #endif
void USB_MS_USBTask(USB_ClassInfo_MS_t* MSInterfaceInfo);
bool USB_MS_ConfigureEndpoints(USB_ClassInfo_MS_t* MSInterfaceInfo); bool USB_MS_ConfigureEndpoints(USB_ClassInfo_MS_t* MSInterfaceInfo);
void USB_MS_ProcessControlPacket(USB_ClassInfo_MS_t* MSInterfaceInfo); void USB_MS_ProcessControlPacket(USB_ClassInfo_MS_t* MSInterfaceInfo);
void USB_MS_USBTask(USB_ClassInfo_MS_t* MSInterfaceInfo);
bool CALLBACK_USB_MS_SCSICommandReceived(USB_ClassInfo_MS_t* MSInterfaceInfo); bool CALLBACK_USB_MS_SCSICommandReceived(USB_ClassInfo_MS_t* MSInterfaceInfo);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif #endif

@ -37,6 +37,11 @@
#include "../../USB.h" #include "../../USB.h"
#include "RNDISConstants.h" #include "RNDISConstants.h"
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
extern "C" {
#endif
/* Macros: */ /* Macros: */
/** Implemented RNDIS Version Major */ /** Implemented RNDIS Version Major */
#define REMOTE_NDIS_VERSION_MAJOR 0x01 #define REMOTE_NDIS_VERSION_MAJOR 0x01
@ -252,8 +257,13 @@
void* SetData, uint16_t SetSize); void* SetData, uint16_t SetSize);
#endif #endif
void USB_RNDIS_USBTask(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo);
bool USB_RNDIS_ConfigureEndpoints(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo); bool USB_RNDIS_ConfigureEndpoints(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo);
void USB_RNDIS_ProcessControlPacket(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo); void USB_RNDIS_ProcessControlPacket(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo);
void USB_RNDIS_USBTask(USB_ClassInfo_RNDIS_t* RNDISInterfaceInfo);
/* Disable C linkage for C++ Compilers: */
#if defined(__cplusplus)
}
#endif
#endif #endif

@ -165,7 +165,7 @@
* \note This event does not exist if the USB_DEVICE_ONLY token is supplied to the compiler (see * \note This event does not exist if the USB_DEVICE_ONLY token is supplied to the compiler (see
* \ref Group_USBManagement documentation). * \ref Group_USBManagement documentation).
* *
* \see \ref TASK(USB_USBTask) for more information on the USB management task and reducing CPU usage. * \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
*/ */
void EVENT_USB_DeviceAttached(void); void EVENT_USB_DeviceAttached(void);
@ -178,7 +178,7 @@
* \note This event does not exist if the USB_DEVICE_ONLY token is supplied to the compiler (see * \note This event does not exist if the USB_DEVICE_ONLY token is supplied to the compiler (see
* \ref Group_USBManagement documentation). * \ref Group_USBManagement documentation).
* *
* \see \ref TASK(USB_USBTask) for more information on the USB management task and reducing CPU usage. * \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage.
*/ */
void EVENT_USB_DeviceUnattached(void); void EVENT_USB_DeviceUnattached(void);

@ -19,11 +19,11 @@
* - AT90USB1287 (USB Host and Device) * - AT90USB1287 (USB Host and Device)
* - AT90USB646 (USB Device Only) * - AT90USB646 (USB Device Only)
* - AT90USB647 (USB Host and Device) * - AT90USB647 (USB Host and Device)
* - AT90USB162 (USB Device Only)
* - AT90USB82 (USB Device Only) * - AT90USB82 (USB Device Only)
* - AT90USB162 (USB Device Only)
* - ATMEGA16U4 (USB Device Only) * - ATMEGA16U4 (USB Device Only)
* - ATMEGA32U6 (USB Device Only)
* - ATMEGA32U4 (USB Device Only) * - ATMEGA32U4 (USB Device Only)
* - ATMEGA32U6 (USB Device Only)
* *
* Currently supported Atmel boards: * Currently supported Atmel boards:
* - AT90USBKEY * - AT90USBKEY
@ -95,9 +95,9 @@
* *
* *
* \section Sec_Donations Donate * \section Sec_Donations Donate
* I am a 20 year old University student studying for a double degree in Computer Science and Electronics * I am a 20 year old University student studying for a double degree in Computer Science and Electronics Engineering.
* Engineering. This leaves little time for any sort of work or leisure. Please consider donating a small amount * The development and support of this library requires much effort from myself. Please consider donating a small amount
* to myself to support this and my future Open Source projects. You can donate any amount via PayPal on my * to myself to support this and my future Open Source projects. You can donate any amount via PayPal on my website,
* website, http://www.fourwalledcubicle.com . All donations are greatly appreciated. * http://www.fourwalledcubicle.com . All donations are greatly appreciated.
*/ */

@ -16,7 +16,6 @@
* - Support for non-control data endpoint interrupts has been dropped due to many issues in the implementation. All existing * - Support for non-control data endpoint interrupts has been dropped due to many issues in the implementation. All existing
* projects using interrupts on non-control endpoints should switch to polling. For control interrupts, the library can * projects using interrupts on non-control endpoints should switch to polling. For control interrupts, the library can
* manage the control endpoint via interrupts automatically by compiling with the INTERRUPT_CONTROL_ENDPOINT token defined. * manage the control endpoint via interrupts automatically by compiling with the INTERRUPT_CONTROL_ENDPOINT token defined.
* - The Endpoint_ClearEndpointInterrupt() macro has been deleted and references to it should be removed.
* - The DESCRIPTOR_ADDRESS() macro has been removed. User applications should use normal casts to obtain a descriptor's memory * - The DESCRIPTOR_ADDRESS() macro has been removed. User applications should use normal casts to obtain a descriptor's memory
* address. * address.
* - The library events system has been rewritten, so that all macros have been removed to allow for clearer user code. See * - The library events system has been rewritten, so that all macros have been removed to allow for clearer user code. See
@ -32,13 +31,12 @@
* <b>Host Mode</b> * <b>Host Mode</b>
* - Support for non-control data pipe interrupts has been dropped due to many issues in the implementation. All existing * - Support for non-control data pipe interrupts has been dropped due to many issues in the implementation. All existing
* projects using interrupts on non-control pipes should switch to polling. * projects using interrupts on non-control pipes should switch to polling.
* - The Pipe_ClearPipeInterrupt() macro has been deleted and references to it should be removed.
* - The library events system has been rewritten, so that all macros have been removed to allow for clearer user code. See * - The library events system has been rewritten, so that all macros have been removed to allow for clearer user code. See
* \ref Group_Events for new API details. * \ref Group_Events for new API details.
* - The STREAM_CALLBACK() macro has been removed. User applications should replace all instances of the macro with regular * - The STREAM_CALLBACK() macro has been removed. User applications should replace all instances of the macro with regular
* function signatures of a function accepting no arguments and returning a uint8_t value. * function signatures of a function accepting no arguments and returning a uint8_t value.
* - The DESCRIPTOR_COMPARATOR() macro has been removed. User applications should replace all instances of the macro with * - The DESCRIPTOR_COMPARATOR() macro has been removed. User applications should replace all instances of the macro with
* regular function signatures of a function accepting a pointer to the descriptor to test, and returning a uint8_t value. * regular function signatures of a function accepting a void pointer to the descriptor to test, and returning a uint8_t value.
* *
* *
* \section Sec_Migration090510 Migrating from 090401 to 090510 * \section Sec_Migration090510 Migrating from 090401 to 090510

@ -48,7 +48,7 @@
* 0x2041 * 0x2041
* </td> * </td>
* <td> * <td>
* Mouse Demo Application (and derivatives) * Mouse Demo Application
* </td> * </td>
* </tr> * </tr>
* *
@ -60,7 +60,7 @@
* 0x2042 * 0x2042
* </td> * </td>
* <td> * <td>
* Keyboard Demo Application (and derivatives) * Keyboard Demo Application
* </td> * </td>
* </tr> * </tr>
* *

@ -29,10 +29,23 @@
this software. this software.
*/ */
/** \file
*
* Main source file for the MagStripe reader program. This file contains the main tasks of
* the project and is responsible for the initial application hardware configuration.
*/
#include "Magstripe.h" #include "Magstripe.h"
/** Bit buffers to hold the read bits for each of the three magnetic card tracks before they are transmitted
* to the host as keyboard presses.
*/
BitBuffer_t TrackDataBuffers[3]; BitBuffer_t TrackDataBuffers[3];
/** 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_t Keyboard_HID_Interface = USB_ClassInfo_HID_t Keyboard_HID_Interface =
{ {
.InterfaceNumber = 0, .InterfaceNumber = 0,
@ -43,6 +56,9 @@ USB_ClassInfo_HID_t Keyboard_HID_Interface =
.ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t), .ReportINBufferSize = sizeof(USB_KeyboardReport_Data_t),
}; };
/** 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) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -60,6 +76,7 @@ int main(void)
} }
} }
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void) void SetupHardware(void)
{ {
/* Disable watchdog if enabled by bootloader/fuses */ /* Disable watchdog if enabled by bootloader/fuses */
@ -80,6 +97,9 @@ void SetupHardware(void)
TIMSK0 = (1 << OCIE0A); TIMSK0 = (1 << OCIE0A);
} }
/** Determines if a card has been inserted, and if so reads in each track's contents into the bit buffers
* until they are read out to the host as a series of keyboard presses.
*/
void ReadMagstripeData(void) void ReadMagstripeData(void)
{ {
/* Arrays to hold the buffer pointers, clock and data bit masks for the separate card tracks */ /* Arrays to hold the buffer pointers, clock and data bit masks for the separate card tracks */
@ -111,22 +131,32 @@ void ReadMagstripeData(void)
} }
} }
/** Event handler for the library USB Configuration Changed event. */
void EVENT_USB_ConfigurationChanged(void) void EVENT_USB_ConfigurationChanged(void)
{ {
USB_HID_ConfigureEndpoints(&Keyboard_HID_Interface); USB_HID_ConfigureEndpoints(&Keyboard_HID_Interface);
} }
/** Event handler for the library USB Unhandled Control Packet event. */
void EVENT_USB_UnhandledControlPacket(void) void EVENT_USB_UnhandledControlPacket(void)
{ {
USB_HID_ProcessControlPacket(&Keyboard_HID_Interface); USB_HID_ProcessControlPacket(&Keyboard_HID_Interface);
} }
/** Timer 0 CTC ISR, firing once each millisecond to keep track of elapsed idle time in the HID interface. */
ISR(TIMER0_COMPA_vect, ISR_BLOCK) ISR(TIMER0_COMPA_vect, ISR_BLOCK)
{ {
if (Keyboard_HID_Interface.IdleMSRemaining) if (Keyboard_HID_Interface.IdleMSRemaining)
Keyboard_HID_Interface.IdleMSRemaining--; Keyboard_HID_Interface.IdleMSRemaining--;
} }
/** HID Class driver callback function for the creation of a HID report for the host.
*
* \param HIDInterfaceInfo Pointer to the HID interface structure for the HID interface being referenced
* \param ReportData Pointer to the preallocated report buffer where the created report should be stored
*
* \return Number of bytes in the created report
*/
uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData) uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData)
{ {
static bool IsKeyReleaseReport; static bool IsKeyReleaseReport;
@ -168,6 +198,12 @@ uint16_t CALLBACK_USB_HID_CreateNextHIDReport(USB_ClassInfo_HID_t* HIDInterfaceI
return sizeof(USB_KeyboardReport_Data_t); return sizeof(USB_KeyboardReport_Data_t);
} }
/** HID Class driver callback function for the processing of a received HID report from the host.
*
* \param HIDInterfaceInfo Pointer to the HID interface structure for the HID interface being referenced
* \param ReportData Pointer to the report buffer where the received report is stored
* \param ReportSize Size in bytes of the report received from the host
*/
void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize) void CALLBACK_USB_HID_ProcessReceivedHIDReport(USB_ClassInfo_HID_t* HIDInterfaceInfo, void* ReportData, uint16_t ReportSize)
{ {
// Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports // Unused (but mandatory for the HID class driver) in this demo, since there are no Host->Device reports

Loading…
Cancel
Save