Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
87b2572a
Commit
87b2572a
authored
Nov 04, 2009
by
Dean Camera
Browse files
Added new JoystickHostWithParser demos to the library.
Add some missing documentation to some of the library demos.
parent
f93f7321
Changes
35
Expand all
Hide whitespace changes
Inline
Side-by-side
Demos/Device/ClassDriver/makefile
View file @
87b2572a
...
...
@@ -60,6 +60,7 @@ all:
make
-C
AudioInput
$@
make
-C
AudioOutput
$@
make
-C
CDC
$@
make
-C
CDCMouse
$@
make
-C
DualCDC
$@
make
-C
GenericHID
$@
make
-C
Joystick
$@
...
...
Demos/Host/ClassDriver/JoystickHostWithParser/Doxygen.conf
0 → 100644
View file @
87b2572a
This diff is collapsed.
Click to expand it.
Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.c
0 → 100644
View file @
87b2572a
/*
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 JoystickHostWithParser demo. This file contains the main tasks of
* the demo and is responsible for the initial application hardware configuration.
*/
#include
"JoystickHostWithParser.h"
/** Processed HID report descriptor items structure, containing information on each HID report element */
HID_ReportInfo_t
HIDReportInfo
;
/** 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_Host_t
Joystick_HID_Interface
=
{
.
Config
=
{
.
DataINPipeNumber
=
1
,
.
DataOUTPipeNumber
=
2
,
.
HIDInterfaceProtocol
=
HID_NON_BOOT_PROTOCOL
,
.
HIDParserData
=
&
HIDReportInfo
},
};
/** Main program entry point. This routine configures the hardware required by the application, then
* enters a loop to run the application tasks in sequence.
*/
int
main
(
void
)
{
SetupHardware
();
puts_P
(
PSTR
(
ESC_FG_CYAN
"Joystick Host Demo running.
\r\n
"
ESC_FG_WHITE
));
LEDs_SetAllLEDs
(
LEDMASK_USB_NOTREADY
);
for
(;;)
{
switch
(
USB_HostState
)
{
case
HOST_STATE_Addressed
:
LEDs_SetAllLEDs
(
LEDMASK_USB_ENUMERATING
);
uint16_t
ConfigDescriptorSize
;
uint8_t
ConfigDescriptorData
[
512
];
if
(
USB_GetDeviceConfigDescriptor
(
1
,
&
ConfigDescriptorSize
,
ConfigDescriptorData
,
sizeof
(
ConfigDescriptorData
))
!=
HOST_GETCONFIG_Successful
)
{
printf
(
"Error Retrieving Configuration Descriptor.
\r\n
"
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
break
;
}
if
(
HID_Host_ConfigurePipes
(
&
Joystick_HID_Interface
,
ConfigDescriptorSize
,
ConfigDescriptorData
)
!=
HID_ENUMERROR_NoError
)
{
printf
(
"Attached Device Not a Valid Joystick.
\r\n
"
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
break
;
}
if
(
USB_Host_SetDeviceConfiguration
(
1
)
!=
HOST_SENDCONTROL_Successful
)
{
printf
(
"Error Setting Device Configuration.
\r\n
"
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
break
;
}
if
(
HID_Host_SetReportProtocol
(
&
Joystick_HID_Interface
)
!=
0
)
{
printf
(
"Error Setting Report Protocol Mode or Not a Valid Joystick.
\r\n
"
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
USB_HostState
=
HOST_STATE_WaitForDeviceRemoval
;
break
;
}
LEDs_SetAllLEDs
(
LEDS_NO_LEDS
);
printf
(
"Joystick Enumerated.
\r\n
"
);
USB_HostState
=
HOST_STATE_Configured
;
break
;
case
HOST_STATE_Configured
:
if
(
HID_Host_IsReportReceived
(
&
Joystick_HID_Interface
))
{
uint8_t
JoystickReport
[
Joystick_HID_Interface
.
State
.
LargestReportSize
];
HID_Host_ReceiveReport
(
&
Joystick_HID_Interface
,
&
JoystickReport
);
uint8_t
LEDMask
=
LEDS_NO_LEDS
;
for
(
uint8_t
ReportNumber
=
0
;
ReportNumber
<
HIDReportInfo
.
TotalReportItems
;
ReportNumber
++
)
{
HID_ReportItem_t
*
ReportItem
=
&
HIDReportInfo
.
ReportItems
[
ReportNumber
];
if
((
ReportItem
->
Attributes
.
Usage
.
Page
==
USAGE_PAGE_BUTTON
)
&&
(
ReportItem
->
ItemType
==
REPORT_ITEM_TYPE_In
))
{
/* Get the joystick button value if it is contained within the current report, if not,
* skip to the next item in the parser list
*/
if
(
!
(
USB_GetHIDReportItemInfo
(
JoystickReport
,
ReportItem
)))
continue
;
if
(
ReportItem
->
Value
)
LEDMask
=
LEDS_ALL_LEDS
;
}
else
if
((
ReportItem
->
Attributes
.
Usage
.
Page
==
USAGE_PAGE_GENERIC_DCTRL
)
&&
((
ReportItem
->
Attributes
.
Usage
.
Usage
==
USAGE_X
)
||
(
ReportItem
->
Attributes
.
Usage
.
Usage
==
USAGE_Y
))
&&
(
ReportItem
->
ItemType
==
REPORT_ITEM_TYPE_In
))
{
/* Get the joystick relative position value if it is contained within the current
* report, if not, skip to the next item in the parser list
*/
if
(
!
(
USB_GetHIDReportItemInfo
(
JoystickReport
,
ReportItem
)))
continue
;
int16_t
DeltaMovement
=
(
int16_t
)(
ReportItem
->
Value
<<
(
16
-
ReportItem
->
Attributes
.
BitSize
));
if
(
ReportItem
->
Attributes
.
Usage
.
Usage
==
USAGE_X
)
{
if
(
DeltaMovement
)
LEDMask
|=
((
DeltaMovement
>
0
)
?
LEDS_LED1
:
LEDS_LED2
);
}
else
{
if
(
DeltaMovement
)
LEDMask
|=
((
DeltaMovement
>
0
)
?
LEDS_LED3
:
LEDS_LED4
);
}
}
}
LEDs_SetAllLEDs
(
LEDMask
);
}
break
;
}
HID_Host_USBTask
(
&
Joystick_HID_Interface
);
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
);
wdt_disable
();
/* Disable clock division */
clock_prescale_set
(
clock_div_1
);
/* Hardware Initialization */
SerialStream_Init
(
9600
,
false
);
LEDs_Init
();
USB_Init
();
}
/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
* starts the library USB task to begin the enumeration and USB management process.
*/
void
EVENT_USB_Host_DeviceAttached
(
void
)
{
puts_P
(
PSTR
(
"Device Attached.
\r\n
"
));
LEDs_SetAllLEDs
(
LEDMASK_USB_ENUMERATING
);
}
/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
* stops the library USB task management process.
*/
void
EVENT_USB_Host_DeviceUnattached
(
void
)
{
puts_P
(
PSTR
(
"
\r\n
Device Unattached.
\r\n
"
));
LEDs_SetAllLEDs
(
LEDMASK_USB_NOTREADY
);
}
/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
* enumerated by the host and is now ready to be used by the application.
*/
void
EVENT_USB_Host_DeviceEnumerationComplete
(
void
)
{
LEDs_SetAllLEDs
(
LEDMASK_USB_READY
);
}
/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
void
EVENT_USB_Host_HostError
(
const
uint8_t
ErrorCode
)
{
USB_ShutDown
();
printf_P
(
PSTR
(
ESC_FG_RED
"Host Mode Error
\r\n
"
" -- Error Code %d
\r\n
"
ESC_FG_WHITE
),
ErrorCode
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
for
(;;);
}
/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
* enumerating an attached USB device.
*/
void
EVENT_USB_Host_DeviceEnumerationFailed
(
const
uint8_t
ErrorCode
,
const
uint8_t
SubErrorCode
)
{
printf_P
(
PSTR
(
ESC_FG_RED
"Dev Enum Error
\r\n
"
" -- Error Code %d
\r\n
"
" -- Sub Error Code %d
\r\n
"
" -- In State %d
\r\n
"
ESC_FG_WHITE
),
ErrorCode
,
SubErrorCode
,
USB_HostState
);
LEDs_SetAllLEDs
(
LEDMASK_USB_ERROR
);
}
/** Callback for the HID Report Parser. This function is called each time the HID report parser is about to store
* an IN, OUT or FEATURE item into the HIDReportInfo structure. To save on RAM, we are able to filter out items
* we aren't interested in (preventing us from being able to extract them later on, but saving on the RAM they would
* have occupied).
*
* \param[in] CurrentItem Pointer to the item the HID report parser is currently working with
*
* \return Boolean true if the item should be stored into the HID report structure, false if it should be discarded
*/
bool
CALLBACK_HIDParser_FilterHIDReportItem
(
HID_ReportItem_t
*
CurrentItem
)
{
bool
IsJoystick
=
false
;
/* Iterate through the item's collection path, until either the root collection node or a collection with the
* Joystick Usage is found - this prevents Mice, which use identical descriptors except for the Joystick usage
* parent node, from being erronously treated as a joystick
*/
for
(
HID_CollectionPath_t
*
CurrPath
=
CurrentItem
->
CollectionPath
;
CurrPath
!=
NULL
;
CurrPath
=
CurrPath
->
Parent
)
{
if
((
CurrPath
->
Usage
.
Page
==
USAGE_PAGE_GENERIC_DCTRL
)
&&
(
CurrPath
->
Usage
.
Usage
==
USAGE_JOYSTICK
))
{
IsJoystick
=
true
;
break
;
}
}
/* If a collection with the joystick usage was not found, indicate that we are not interested in this item */
if
(
!
IsJoystick
)
return
false
;
/* Check the attributes of the current item - see if we are interested in it or not;
* only store BUTTON and GENERIC_DESKTOP_CONTROL items into the Processed HID Report
* structure to save RAM and ignore the rest
*/
return
((
CurrentItem
->
Attributes
.
Usage
.
Page
==
USAGE_PAGE_BUTTON
)
||
(
CurrentItem
->
Attributes
.
Usage
.
Page
==
USAGE_PAGE_GENERIC_DCTRL
));
}
Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.h
0 → 100644
View file @
87b2572a
/*
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 JoystickHostWithParser.c.
*/
#ifndef _JOYSTICK_HOST_H_
#define _JOYSTICK_HOST_H_
/* Includes: */
#include
<avr/io.h>
#include
<avr/wdt.h>
#include
<avr/pgmspace.h>
#include
<avr/power.h>
#include
<stdio.h>
#include
<LUFA/Version.h>
#include
<LUFA/Drivers/Misc/TerminalCodes.h>
#include
<LUFA/Drivers/Peripheral/SerialStream.h>
#include
<LUFA/Drivers/Board/LEDs.h>
#include
<LUFA/Drivers/USB/USB.h>
#include
<LUFA/Drivers/USB/Class/HID.h>
/* Macros: */
/** LED mask for the library LED driver, to indicate that the USB interface is not ready. */
#define LEDMASK_USB_NOTREADY LEDS_LED1
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
#define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)
/** LED mask for the library LED driver, to indicate that the USB interface is ready. */
#define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)
/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
#define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)
/** HID Report Descriptor Usage Page value for a toggle button */
#define USAGE_PAGE_BUTTON 0x09
/** HID Report Descriptor Usage Page value for a Generic Desktop Control */
#define USAGE_PAGE_GENERIC_DCTRL 0x01
/** HID Report Descriptor Usage for a Joystick */
#define USAGE_JOYSTICK 0x04
/** HID Report Descriptor Usage value for a X axis movement */
#define USAGE_X 0x30
/** HID Report Descriptor Usage value for a Y axis movement */
#define USAGE_Y 0x31
/* Function Prototypes: */
void
SetupHardware
(
void
);
void
EVENT_USB_Host_HostError
(
const
uint8_t
ErrorCode
);
void
EVENT_USB_Host_DeviceAttached
(
void
);
void
EVENT_USB_Host_DeviceUnattached
(
void
);
void
EVENT_USB_Host_DeviceEnumerationFailed
(
const
uint8_t
ErrorCode
,
const
uint8_t
SubErrorCode
);
void
EVENT_USB_Host_DeviceEnumerationComplete
(
void
);
bool
CALLBACK_HIDParser_FilterHIDReportItem
(
HID_ReportItem_t
*
CurrentItem
);
#endif
Demos/Host/ClassDriver/JoystickHostWithParser/JoystickHostWithParser.txt
0 → 100644
View file @
87b2572a
/** \file
*
* This file contains special DoxyGen information for the generation of the main page and other special
* documentation pages. It is not a project source file.
*/
/** \mainpage Joystick Host With HID Descriptor Parser Demo
*
* \section SSec_Compat Demo Compatibility:
*
* The following list indicates what microcontrollers are compatible with this demo.
*
* - Series 7 USB AVRs
*
* \section SSec_Info USB Information:
*
* The following table gives a rundown of the USB utilization of this demo.
*
* <table>
* <tr>
* <td><b>USB Mode:</b></td>
* <td>Host</td>
* </tr>
* <tr>
* <td><b>USB Class:</b></td>
* <td>Human Interface Device (HID)</td>
* </tr>
* <tr>
* <td><b>USB Subclass:</b></td>
* <td>N/A</td>
* </tr>
* <tr>
* <td><b>Relevant Standards:</b></td>
* <td>USBIF HID Specification, USBIF HID Usage Tables</td>
* </tr>
* <tr>
* <td><b>Usable Speeds:</b></td>
* <td>Low Speed Mode, Full Speed Mode</td>
* </tr>
* </table>
*
* \section SSec_Description Project Description:
*
* Joystick host demonstration application. This gives a simple reference
* application for implementing a USB Joystick host, for USB joysticks using
* the standard joystick HID profile. It uses a HID parser for the HID
* reports, allowing for correct operation across all USB joysticks. This
* demo supports joysticks with a single HID report.
*
* Joystick movement and button presses are displayed on the board LEDs.
* On connection to a USB joystick, the report items will be processed and
* printed as a formatted list through the USART before the joystick is
* fully enumerated.
*
* Currently only single interface joysticks are supported.
*
* \section SSec_Options Project Options
*
* The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
*
* <table>
* <tr>
* <td>
* None
* </td>
* </tr>
* </table>
*/
\ No newline at end of file
Demos/Host/ClassDriver/JoystickHostWithParser/makefile
0 → 100644
View file @
87b2572a
This diff is collapsed.
Click to expand it.
Demos/Host/ClassDriver/MouseHostWithParser/MouseHostWithParser.h
View file @
87b2572a
...
...
@@ -52,16 +52,16 @@
/* 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)
/** HID Report Descriptor Usage Page value for a toggle button */
#define USAGE_PAGE_BUTTON 0x09
...
...
Demos/Host/ClassDriver/makefile
View file @
87b2572a
...
...
@@ -17,6 +17,9 @@ all:
make
-C
CDCHost clean
make
-C
CDCHost all
make
-C
JoystickHostWithParser
clean
make
-C
JoystickHostWithParser
all
make
-C
KeyboardHost
clean
make
-C
KeyboardHost
all
...
...
@@ -40,6 +43,7 @@ all:
%
:
make
-C
CDCHost
$@
make
-C
JoystickHostWithParser
$@
make
-C
KeyboardHost
$@
make
-C
KeyboardHostWithParser
$@
make
-C
MouseHost
$@
...
...
Demos/Host/LowLevel/CDCHost/ConfigDescriptor.c
View file @
87b2572a
...
...
@@ -43,7 +43,7 @@
*
* This routine searches for a CDC interface descriptor containing bulk data IN and OUT endpoints, and an interrupt event endpoint.
*
* \return An error code from the CDCHost_GetConfigDescriptorDataCodes_t enum.
* \return An error code from the
\ref
CDCHost_GetConfigDescriptorDataCodes_t enum.
*/
uint8_t
ProcessConfigurationDescriptor
(
void
)
{
...
...
@@ -174,7 +174,7 @@ uint8_t ProcessConfigurationDescriptor(void)
*
* This comparator searches for the next Interface descriptor of the correct CDC control Class, Subclass and Protocol values.
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
* \return A value from the
\ref
DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t
DComp_NextCDCControlInterface
(
void
*
CurrentDescriptor
)
{
...
...
@@ -198,7 +198,7 @@ uint8_t DComp_NextCDCControlInterface(void* CurrentDescriptor)
*
* This comparator searches for the next Interface descriptor of the correct CDC data Class, Subclass and Protocol values.
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
* \return A value from the
\ref
DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t
DComp_NextCDCDataInterface
(
void
*
CurrentDescriptor
)
{
...
...
@@ -224,7 +224,7 @@ uint8_t DComp_NextCDCDataInterface(void* CurrentDescriptor)
* aborting the search if another interface descriptor is found before the required endpoint (so that it may be compared
* using a different comparator to determine if it is another CDC class interface).
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
* \return A value from the
\ref
DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t
DComp_NextCDCDataInterfaceEndpoint
(
void
*
CurrentDescriptor
)
{
...
...
Demos/Host/LowLevel/GenericHIDHost/ConfigDescriptor.c
View file @
87b2572a
...
...
@@ -43,7 +43,7 @@
*
* This routine searches for a HID interface descriptor containing at least one Interrupt type IN endpoint.
*
* \return An error code from the GenericHIDHost_GetConfigDescriptorDataCodes_t enum.
* \return An error code from the
\ref
GenericHIDHost_GetConfigDescriptorDataCodes_t enum.
*/
uint8_t
ProcessConfigurationDescriptor
(
void
)
{
...
...
@@ -120,7 +120,7 @@ uint8_t ProcessConfigurationDescriptor(void)
*
* This comparator searches for the next Interface descriptor of the correct HID Class value.
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
* \return A value from the
\ref
DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t
DComp_NextHIDInterface
(
void
*
CurrentDescriptor
)
{
...
...
@@ -146,7 +146,7 @@ uint8_t DComp_NextHIDInterface(void* CurrentDescriptor)
* This comparator searches for the next Endpoint descriptor inside the current interface descriptor,
* aborting the search if another interface descriptor is found before the required endpoint.
*
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
* \return A value from the
\ref
DSEARCH_Return_ErrorCodes_t enum
*/
uint8_t
DComp_NextHIDInterfaceDataEndpoint
(
void
*
CurrentDescriptor
)
{
...
...
Demos/Host/LowLevel/JoystickHostWithParser/ConfigDescriptor.c
0 → 100644
View file @
87b2572a
/*
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.
*/