Commit bdedbd55 authored by Dean Camera's avatar Dean Camera
Browse files

Add new MIDIHost LowLevel demo application.

Make unfinished device mode applications use the VID/PID reserved for LUFA development devices.
parent 09575f96
...@@ -54,8 +54,8 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor = ...@@ -54,8 +54,8 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
.VendorID = 0x03EB, .VendorID = 0x03EB,
.ProductID = 0x2048, .ProductID = 0x2040,
.ReleaseNumber = 0x0000, .ReleaseNumber = 0x0002,
.ManufacturerStrIndex = 0x01, .ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02, .ProductStrIndex = 0x02,
......
...@@ -42,8 +42,8 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor = ...@@ -42,8 +42,8 @@ USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
Endpoint0Size: 8, Endpoint0Size: 8,
VendorID: 0x03EB, VendorID: 0x03EB,
ProductID: 0x2060, ProductID: 0x2040,
ReleaseNumber: 0x0000, ReleaseNumber: 0x0001,
ManufacturerStrIndex: 0x01, ManufacturerStrIndex: 0x01,
ProductStrIndex: 0x02, ProductStrIndex: 0x02,
......
...@@ -53,13 +53,13 @@ ...@@ -53,13 +53,13 @@
/* Macros: */ /* Macros: */
/** Pipe number for the CDC data IN pipe */ /** Pipe number for the CDC data IN pipe */
#define CDC_DATAPIPE_IN 1 #define CDC_DATAPIPE_IN 1
/** Pipe number for the CDC data OUT pipe */ /** Pipe number for the CDC data OUT pipe */
#define CDC_DATAPIPE_OUT 2 #define CDC_DATAPIPE_OUT 2
/** Pipe number for the CDC notification pipe */ /** Pipe number for the CDC notification pipe */
#define CDC_NOTIFICATIONPIPE 3 #define CDC_NOTIFICATIONPIPE 3
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ /** 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
...@@ -72,47 +72,7 @@ ...@@ -72,47 +72,7 @@
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ /** 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: */
/** Class state structure. An instance of this structure should be made for each CDC interface
* within the user application, and passed to each of the CDC class driver functions as the
* CDCInterfaceInfo parameter. The contents of this structure should be set to their correct
* values when used, or ommitted to force the library to use default values.
*/
typedef struct
{
const struct
{
uint8_t ControlInterfaceNumber; /**< Interface number of the CDC control interface within the device */
uint8_t DataINEndpointNumber; /**< Endpoint number of the CDC interface's IN data endpoint */
uint16_t DataINEndpointSize; /**< Size in bytes of the CDC interface's IN data endpoint */
uint8_t DataOUTEndpointNumber; /**< Endpoint number of the CDC interface's OUT data endpoint */
uint16_t DataOUTEndpointSize; /**< Size in bytes of the CDC interface's OUT data endpoint */
uint8_t NotificationEndpointNumber; /**< Endpoint number of the CDC interface's IN notification endpoint, if used */
uint16_t NotificationEndpointSize; /**< Size in bytes of the CDC interface's IN notification endpoint, if used */
} Config;
struct
{
uint8_t ControlLineState; /**< Current control line states, as set by the host */
struct
{
uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second */
uint8_t CharFormat; /**< Character format of the virtual serial port, a value from the
* CDCDevice_CDC_LineCodingFormats_t enum
*/
uint8_t ParityType; /**< Parity setting of the virtual serial port, a value from the
* CDCDevice_LineCodingParity_t enum
*/
uint8_t DataBits; /**< Bits of data per character of the virtual serial port */
} LineEncoding;
} State;
} USB_ClassInfo_CDC_Host_t;
/* Function Prototypes: */ /* Function Prototypes: */
void SetupHardware(void); void SetupHardware(void);
void CDC_Host_Task(void); void CDC_Host_Task(void);
......
...@@ -73,12 +73,12 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -73,12 +73,12 @@ uint8_t ProcessConfigurationDescriptor(void)
return NoCDCInterfaceFound; return NoCDCInterfaceFound;
} }
/* Get the IN and OUT data endpoints for the CDC interface */ /* Get the IN and OUT data and IN notification endpoints for the CDC interface */
while (FoundEndpoints != ((1 << CDC_NOTIFICATIONPIPE) | (1 << CDC_DATAPIPE_IN) | (1 << CDC_DATAPIPE_OUT))) while (FoundEndpoints != ((1 << CDC_NOTIFICATIONPIPE) | (1 << CDC_DATAPIPE_IN) | (1 << CDC_DATAPIPE_OUT)))
{ {
/* Fetch the next bulk or interrupt endpoint from the current CDC interface */ /* Fetch the next bulk or interrupt endpoint from the current CDC interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextCDCDataInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Check to see if the control interface's notification pipe has been found, if so search for the data interface */ /* Check to see if the control interface's notification pipe has been found, if so search for the data interface */
if (FoundEndpoints & (1 << CDC_NOTIFICATIONPIPE)) if (FoundEndpoints & (1 << CDC_NOTIFICATIONPIPE))
...@@ -115,7 +115,7 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -115,7 +115,7 @@ uint8_t ProcessConfigurationDescriptor(void)
/* Fetch the next bulk or interrupt endpoint from the current CDC interface */ /* Fetch the next bulk or interrupt endpoint from the current CDC interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextInterfaceCDCDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextCDCDataInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Descriptor not found, error out */ /* Descriptor not found, error out */
return NoEndpointFound; return NoEndpointFound;
...@@ -226,7 +226,7 @@ uint8_t DComp_NextCDCDataInterface(void* CurrentDescriptor) ...@@ -226,7 +226,7 @@ uint8_t DComp_NextCDCDataInterface(void* CurrentDescriptor)
* *
* \return A value from the DSEARCH_Return_ErrorCodes_t enum * \return A value from the DSEARCH_Return_ErrorCodes_t enum
*/ */
uint8_t DComp_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor) uint8_t DComp_NextCDCDataInterfaceEndpoint(void* CurrentDescriptor)
{ {
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
{ {
......
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
/** Interface Class value for the CDC data class */ /** Interface Class value for the CDC data class */
#define CDC_DATA_CLASS 0x0A #define CDC_DATA_CLASS 0x0A
/** Interface Class value for the CDC data subclass (unused) */ /** Interface Class value for the CDC data subclass */
#define CDC_DATA_SUBCLASS 0x00 #define CDC_DATA_SUBCLASS 0x00
/** Interface Class value for the CDC data protocol */ /** Interface Class value for the CDC data protocol */
...@@ -80,6 +80,6 @@ ...@@ -80,6 +80,6 @@
uint8_t DComp_NextCDCControlInterface(void* CurrentDescriptor); uint8_t DComp_NextCDCControlInterface(void* CurrentDescriptor);
uint8_t DComp_NextCDCDataInterface(void* CurrentDescriptor); uint8_t DComp_NextCDCDataInterface(void* CurrentDescriptor);
uint8_t DComp_NextInterfaceCDCDataEndpoint(void* CurrentDescriptor); uint8_t DComp_NextCDCDataInterfaceEndpoint(void* CurrentDescriptor);
#endif #endif
...@@ -77,7 +77,7 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -77,7 +77,7 @@ uint8_t ProcessConfigurationDescriptor(void)
{ {
/* Get the next HID interface's data endpoint descriptor */ /* Get the next HID interface's data endpoint descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextInterfaceHIDDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextHIDInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor /* Not all HID devices have an OUT endpoint - if we've reached the end of the HID descriptor
* but only found the mandatory IN endpoint, it's safe to continue with the device enumeration */ * but only found the mandatory IN endpoint, it's safe to continue with the device enumeration */
...@@ -148,7 +148,7 @@ uint8_t DComp_NextHIDInterface(void* CurrentDescriptor) ...@@ -148,7 +148,7 @@ uint8_t DComp_NextHIDInterface(void* CurrentDescriptor)
* *
* \return A value from the DSEARCH_Return_ErrorCodes_t enum * \return A value from the DSEARCH_Return_ErrorCodes_t enum
*/ */
uint8_t DComp_NextInterfaceHIDDataEndpoint(void* CurrentDescriptor) uint8_t DComp_NextHIDInterfaceDataEndpoint(void* CurrentDescriptor)
{ {
/* Determine the type of the current descriptor */ /* Determine the type of the current descriptor */
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
......
...@@ -64,6 +64,6 @@ ...@@ -64,6 +64,6 @@
uint8_t ProcessConfigurationDescriptor(void); uint8_t ProcessConfigurationDescriptor(void);
uint8_t DComp_NextHIDInterface(void* CurrentDescriptor); uint8_t DComp_NextHIDInterface(void* CurrentDescriptor);
uint8_t DComp_NextInterfaceHIDDataEndpoint(void* CurrentDescriptor); uint8_t DComp_NextHIDInterfaceDataEndpoint(void* CurrentDescriptor);
#endif #endif
...@@ -74,7 +74,7 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -74,7 +74,7 @@ uint8_t ProcessConfigurationDescriptor(void)
/* Get the keyboard interface's data endpoint descriptor */ /* Get the keyboard interface's data endpoint descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextInterfaceKeyboardDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Descriptor not found, error out */ /* Descriptor not found, error out */
return NoEndpointFound; return NoEndpointFound;
...@@ -123,7 +123,7 @@ uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor) ...@@ -123,7 +123,7 @@ uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor)
* *
* \return A value from the DSEARCH_Return_ErrorCodes_t enum * \return A value from the DSEARCH_Return_ErrorCodes_t enum
*/ */
uint8_t DComp_NextInterfaceKeyboardDataEndpoint(void* CurrentDescriptor) uint8_t DComp_NextKeyboardInterfaceDataEndpoint(void* CurrentDescriptor)
{ {
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
{ {
......
...@@ -67,6 +67,6 @@ ...@@ -67,6 +67,6 @@
uint8_t ProcessConfigurationDescriptor(void); uint8_t ProcessConfigurationDescriptor(void);
uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor); uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor);
uint8_t DComp_NextInterfaceKeyboardDataEndpoint(void* CurrentDescriptor); uint8_t DComp_NextKeyboardInterfaceDataEndpoint(void* CurrentDescriptor);
#endif #endif
...@@ -85,7 +85,7 @@ uint8_t ProcessConfigurationDescriptor(void) ...@@ -85,7 +85,7 @@ uint8_t ProcessConfigurationDescriptor(void)
/* Get the keyboard interface's data endpoint descriptor */ /* Get the keyboard interface's data endpoint descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation, if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextInterfaceKeyboardDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) DComp_NextKeyboardInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{ {
/* Descriptor not found, error out */ /* Descriptor not found, error out */
return NoEndpointFound; return NoEndpointFound;
...@@ -134,7 +134,7 @@ uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor) ...@@ -134,7 +134,7 @@ uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor)
* *
* \return A value from the DSEARCH_Return_ErrorCodes_t enum * \return A value from the DSEARCH_Return_ErrorCodes_t enum
*/ */
uint8_t DComp_NextInterfaceKeyboardDataEndpoint(void* CurrentDescriptor) uint8_t DComp_NextKeyboardInterfaceDataEndpoint(void* CurrentDescriptor)
{ {
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
{ {
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
uint8_t ProcessConfigurationDescriptor(void); uint8_t ProcessConfigurationDescriptor(void);
uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor); uint8_t DComp_NextKeyboardInterface(void* CurrentDescriptor);
uint8_t DComp_NextInterfaceKeyboardDataEndpoint(void* CurrentDescriptor); uint8_t DComp_NextKeyboardInterfaceDataEndpoint(void* CurrentDescriptor);
uint8_t DComp_NextHID(void* CurrentDescriptor); uint8_t DComp_NextHID(void* CurrentDescriptor);
#endif #endif
/*
LUFA Library
Copyright (C) Dean Camera, 2009.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
* needed to communication with an attached USB device. Descriptors are special computer-readable structures
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
*/
#include "ConfigDescriptor.h"
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
* with compatible devices.
*
* This routine searches for a MIDI interface descriptor pair containing bulk data IN and OUT endpoints.
*
* \return An error code from the MIDIHost_GetConfigDescriptorDataCodes_t enum.
*/
uint8_t ProcessConfigurationDescriptor(void)
{
uint8_t ConfigDescriptorData[512];
uint8_t* CurrConfigLocation = ConfigDescriptorData;
uint16_t CurrConfigBytesRem;
uint8_t FoundEndpoints = 0;
/* Retrieve the entire configuration descriptor into the allocated buffer */
switch (USB_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
{
case HOST_GETCONFIG_Successful:
break;
case HOST_GETCONFIG_InvalidData:
return InvalidConfigDataReturned;
case HOST_GETCONFIG_BuffOverflow:
return DescriptorTooLarge;
default:
return ControlError;
}
/* Get the MIDI Audio Streaming interface from the configuration descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoCDCInterfaceFound;
}
/* Get the IN and OUT data endpoints for the MIDI interface */
while (FoundEndpoints != ((1 << MIDI_DATAPIPE_IN) | (1 << MIDI_DATAPIPE_OUT)))
{
/* Fetch the next bulk endpoint from the current MIDI streaming interface */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DComp_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{
/* Descriptor not found, error out */
return NoEndpointFound;
}
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
/* Check if the endpoint is a bulk IN or bulk OUT endpoint */
if (EndpointData->EndpointAddress & ENDPOINT_DESCRIPTOR_DIR_IN)
{
/* Configure the data IN pipe */
Pipe_ConfigurePipe(MIDI_DATAPIPE_IN, EP_TYPE_BULK, PIPE_TOKEN_IN,
EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
/* Set the flag indicating that the data IN pipe has been found */
FoundEndpoints |= (1 << MIDI_DATAPIPE_IN);
}
else
{
/* Configure the data OUT pipe */
Pipe_ConfigurePipe(MIDI_DATAPIPE_OUT, EP_TYPE_BULK, PIPE_TOKEN_OUT,
EndpointData->EndpointAddress, EndpointData->EndpointSize, PIPE_BANK_SINGLE);
/* Set the flag indicating that the data OUT pipe has been found */
FoundEndpoints |= (1 << MIDI_DATAPIPE_OUT);
}
}
/* Valid data found, return success */
return SuccessfulConfigRead;
}
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
* descriptor processing if an incompatible descriptor configuration is found.
*
* This comparator searches for the next Interface descriptor of the correct MIDI Streaming Class, Subclass and Protocol values.
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t DComp_NextMIDIStreamingInterface(void* CurrentDescriptor)
{
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
{
/* Check the MIDI descriptor class, subclass and protocol, break out if correct data interface found */
if ((DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Class == MIDI_STREAMING_CLASS) &&
(DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).SubClass == MIDI_STREAMING_SUBCLASS) &&
(DESCRIPTOR_CAST(CurrentDescriptor, USB_Descriptor_Interface_t).Protocol == MIDI_STREAMING_PROTOCOL))
{
return DESCRIPTOR_SEARCH_Found;
}
}
return DESCRIPTOR_SEARCH_NotFound;
}
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
* descriptor processing if an incompatible descriptor configuration is found.
*
* This comparator searches for the next bulk IN or OUT endpoint within the current interface, aborting the search if
* another interface descriptor is found before the required endpoint.
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t DComp_NextMIDIStreamingDataEndpoint(void* CurrentDescriptor)
{
if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint)
{
uint8_t EndpointType = (DESCRIPTOR_CAST(CurrentDescriptor,
USB_Descriptor_Endpoint_t).Attributes & EP_TYPE_MASK);
/* Check the endpoint type, break out if correct BULK type endpoint found */
if (EndpointType == EP_TYPE_BULK)
return DESCRIPTOR_SEARCH_Found;
}
else if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Interface)
{
return DESCRIPTOR_SEARCH_Fail;
}
return DESCRIPTOR_SEARCH_NotFound;
}
/*
LUFA Library
Copyright (C) Dean Camera, 2009.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Header file for ConfigDescriptor.c.
*/
#ifndef _CONFIGDESCRIPTOR_H_
#define _CONFIGDESCRIPTOR_H_
/* Includes: */
#include <LUFA/Drivers/USB/USB.h> // USB Functionality
#include "MIDIHost.h"
/* Macros: */
/** Interface Class value for the MIDI Audio class */
#define MIDI_STREAMING_CLASS 0x01
/** Interface Class value for the MIDI Audio Streaming subclass */
#define MIDI_STREAMING_SUBCLASS 0x03
/** Interface Class value for the MIDI Audio Streaming protocol */
#define MIDI_STREAMING_PROTOCOL 0x00
/** Maximum size of a device configuration descriptor which can be processed by the host, in bytes */
#define MAX_CONFIG_DESCRIPTOR_SIZE 512
/* Enums: */
/** Enum for the possible return codes of the ProcessConfigurationDescriptor() function. */
enum MIDIHost_GetConfigDescriptorDataCodes_t
{
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
ControlError = 1, /**< A control request to the device failed to complete successfully */
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
NoCDCInterfaceFound = 4, /**< A compatible CDC interface was not found in the device's Configuration Descriptor */
NoEndpointFound = 5, /**< Compatible CDC endpoints were not found in the device's CDC interface */
};
/* Function Prototypes: */
uint8_t ProcessConfigurationDescriptor(void);
uint8_t DComp_NextMIDIStreamingInterface(void* CurrentDescriptor);
uint8_t DComp_NextMIDIStreamingDataEndpoint(void* CurrentDescriptor);
#endif
This diff is collapsed.
/*
LUFA Library
Copyright (C) Dean Camera, 2009.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Main source file for the MIDIHost demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include "MIDIHost.h"
/** Main program entry point. This routine configures the hardware required by the application, then
* starts the scheduler to run the application tasks.
*/
int main(void)
{
SetupHardware();
puts_P(PSTR(ESC_FG_CYAN "MIDI Host Demo running.\r\n" ESC_FG_WHITE));
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
for (;;)
{
MIDI_Host_Task();
USB_USBTask();
}
}
/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
MCUSR &= ~(1 << WDRF);