aboutsummaryrefslogtreecommitdiffstats
path: root/Demos/Host
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2011-07-10 07:15:57 +0000
committerDean Camera <dean@fourwalledcubicle.com>2011-07-10 07:15:57 +0000
commit55aadf97d5d2bd86f2a0c3a53d4608c0cf96471e (patch)
tree768f8ff0fd860d20715f45b65b246035be037830 /Demos/Host
parentd9c16402b9059628a9c45a129a99cae86b48aa5d (diff)
downloadlufa-55aadf97d5d2bd86f2a0c3a53d4608c0cf96471e.tar.gz
lufa-55aadf97d5d2bd86f2a0c3a53d4608c0cf96471e.tar.bz2
lufa-55aadf97d5d2bd86f2a0c3a53d4608c0cf96471e.zip
Replace blind interface descriptor search in the incomplete AndroidAccessoryHost demo with an intelligent search for the correct interface in the device matching the correct class/subclass/protocol values.
Diffstat (limited to 'Demos/Host')
-rw-r--r--Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.c48
-rw-r--r--Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.h5
2 files changed, 43 insertions, 10 deletions
diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.c b/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.c
index 664e065ad..0dc19e9ab 100644
--- a/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.c
+++ b/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.c
@@ -66,18 +66,17 @@ uint8_t ProcessConfigurationDescriptor(void)
default:
return DevControlError;
}
-
- /* The Android Accessory Mode specification mandates that the accessory communications endpoints
- be in the first interface descriptor (interface 0) */
- USB_GetNextDescriptorOfType(&CurrConfigBytesRem, &CurrConfigLocation, DTYPE_Interface);
-
- /* Ensure that an interface was found, and the end of the descriptor was not reached */
- if (!(CurrConfigBytesRem))
- return NoCompatibleInterfaceFound;
+
+ /* There should be only one compatible Android Accessory Mode interface in the device, attempt to find it */
+ if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
+ DCOMP_NextAndroidAccessoryInterface) != DESCRIPTOR_SEARCH_COMP_Found)
+ {
+ return NoCompatibleInterfaceFound;
+ }
while (!(DataINEndpoint) || !(DataOUTEndpoint))
{
- /* Get the next Still Image interface's data endpoint descriptor */
+ /* Get the next Android Accessory Mode interface's data endpoint descriptor */
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
DCOMP_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
{
@@ -111,7 +110,35 @@ uint8_t ProcessConfigurationDescriptor(void)
* 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 Endpoint descriptor inside the current interface descriptor, aborting the
+ * This comparator searches for the next Interface descriptor containing the correct Android Accessory Mode Class, Subclass
+ * and Protocol values.
+ *
+ * \return A value from the DSEARCH_Return_ErrorCodes_t enum
+ */
+uint8_t DCOMP_NextAndroidAccessoryInterface(void* const CurrentDescriptor)
+{
+ USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
+
+ if (Header->Type == DTYPE_Interface)
+ {
+ USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
+
+ if ((Interface->Class == ANDROID_INTERFACE_CLASS) &&
+ (Interface->SubClass == ANDROID_INTERFACE_SUBCLASS) &&
+ (Interface->Protocol == ANDROID_INTERFACE_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 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
@@ -125,6 +152,7 @@ uint8_t DCOMP_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
+
if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
return DESCRIPTOR_SEARCH_Found;
}
diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.h b/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.h
index 92c0d99a9..4989d9d88 100644
--- a/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.h
+++ b/Demos/Host/Incomplete/AndroidAccessoryHost/ConfigDescriptor.h
@@ -42,6 +42,10 @@
/* Macros: */
#define ANDROID_DATA_IN_PIPE 1
#define ANDROID_DATA_OUT_PIPE 2
+
+ #define ANDROID_INTERFACE_CLASS 0xFF
+ #define ANDROID_INTERFACE_SUBCLASS 0x42
+ #define ANDROID_INTERFACE_PROTOCOL 0x01
/* Enums: */
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
@@ -57,6 +61,7 @@
/* Function Prototypes: */
uint8_t ProcessConfigurationDescriptor(void);
+ uint8_t DCOMP_NextAndroidAccessoryInterface(void* const CurrentDescriptor);
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* CurrentDescriptor);
#endif