diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.c b/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.c index 9b5ffbea6b..d4df9a11d9 100644 --- a/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.c +++ b/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.c @@ -139,9 +139,8 @@ void Android_Host_Task(void) /* Get and process the configuration descriptor data */ ErrorCode = ProcessDeviceDescriptor(); - /* Save whether the Android device needs to be mode-switched later on */ bool RequiresModeSwitch = (ErrorCode == NonAccessoryModeAndroidDevice); - + /* Error out if the device is not an Android device or an error occurred */ if ((ErrorCode != AccessoryModeAndroidDevice) && !(RequiresModeSwitch)) { @@ -179,20 +178,43 @@ void Android_Host_Task(void) /* Check if a valid Android device was attached, but it is not current in Accessory mode */ if (RequiresModeSwitch) { - USB_ControlRequest = (USB_Request_Header_t) + uint16_t AndroidProtocol; + + /* Fetch the version of the Android Accessory Protocol supported by the device */ + if ((ErrorCode = Android_GetAccessoryProtocol(&AndroidProtocol)) != HOST_SENDCONTROL_Successful) { - .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE), - .bRequest = ANDROID_Req_StartAccessoryMode, - .wValue = 0, - .wIndex = 0, - .wLength = 0, - }; - - /* Send the control request for the Android device to switch to accessory mode */ - Pipe_SelectPipe(PIPE_CONTROLPIPE); - USB_Host_SendControlRequest(NULL); + printf_P(PSTR(ESC_FG_RED "Control Error (Get Protocol).\r\n" + " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode); + + /* Indicate error via status LEDs */ + LEDs_SetAllLEDs(LEDS_LED1); + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } - puts_P(PSTR("Switching to Accessory Mode.\r\n")); + /* Validate the returned protocol version */ + if (AndroidProtocol != ANDROID_PROTOCOL_Accessory) + { + puts_P(PSTR(ESC_FG_RED "Accessory Mode Not Supported.")); + + /* Indicate error via status LEDs */ + LEDs_SetAllLEDs(LEDS_LED1); + + /* Wait until USB device disconnected */ + USB_HostState = HOST_STATE_WaitForDeviceRemoval; + break; + } + + /* Send the device strings and start the Android Accessory Mode */ + Android_SendString(ANDROID_STRING_Manufacturer, "Dean Camera"); + Android_SendString(ANDROID_STRING_Model, "LUFA Android Demo"); + Android_SendString(ANDROID_STRING_Description, "LUFA Android Demo"); + Android_SendString(ANDROID_STRING_Version, "1.0"); + Android_SendString(ANDROID_STRING_URI, "http://www.lufa-lib.org"); + Android_SendString(ANDROID_STRING_Serial, "0000000012345678"); + Android_StartAccessoryMode(); /* Wait until USB device disconnected */ USB_HostState = HOST_STATE_WaitForDeviceRemoval; diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.h b/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.h index aea0b44472..59f49c5185 100644 --- a/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.h +++ b/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.h @@ -46,6 +46,7 @@ #include "DeviceDescriptor.h" #include "ConfigDescriptor.h" + #include "Lib/AndroidAccessoryCommands.h" #include #include @@ -69,17 +70,6 @@ /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ #define LEDMASK_USB_BUSY LEDS_LED2 - /* Enums: */ - enum Android_Requests_t - { - ANDROID_Req_GetAccessoryProtocol = 51, - ANDROID_Req_GetString = 52, - ANDROID_Req_StartAccessoryMode = 53, - }; - - /* Task Definitions: */ - void Android_Host_Task(void); - /* Event Handlers: */ void EVENT_USB_Host_DeviceAttached(void); void EVENT_USB_Host_DeviceUnattached(void); @@ -89,6 +79,7 @@ const uint8_t SubErrorCode); /* Function Prototypes: */ + void Android_Host_Task(void); void SetupHardware(void); #endif diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/Lib/AndroidAccessoryCommands.c b/Demos/Host/Incomplete/AndroidAccessoryHost/Lib/AndroidAccessoryCommands.c new file mode 100644 index 0000000000..cd26538ebd --- /dev/null +++ b/Demos/Host/Incomplete/AndroidAccessoryHost/Lib/AndroidAccessoryCommands.c @@ -0,0 +1,83 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author 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 + * + * Android Accessory Mode utility functions, for the configuration of an attached + * Android device into Android Accessory Mode ready for general communication. + */ + +#include "AndroidAccessoryCommands.h" + +uint8_t Android_GetAccessoryProtocol(uint16_t* const Protocol) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE), + .bRequest = ANDROID_Req_GetAccessoryProtocol, + .wValue = 0, + .wIndex = 0, + .wLength = sizeof(uint16_t), + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + return USB_Host_SendControlRequest(Protocol); +} + +uint8_t Android_SendString(const uint8_t StringIndex, + char* String) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE), + .bRequest = ANDROID_Req_SendString, + .wValue = 0, + .wIndex = StringIndex, + .wLength = (strlen(String) + 1), + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + return USB_Host_SendControlRequest(String); +} + +uint8_t Android_StartAccessoryMode(void) +{ + USB_ControlRequest = (USB_Request_Header_t) + { + .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE), + .bRequest = ANDROID_Req_StartAccessoryMode, + .wValue = 0, + .wIndex = 0, + .wLength = 0, + }; + + Pipe_SelectPipe(PIPE_CONTROLPIPE); + return USB_Host_SendControlRequest(NULL); +} diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/Lib/AndroidAccessoryCommands.h b/Demos/Host/Incomplete/AndroidAccessoryHost/Lib/AndroidAccessoryCommands.h new file mode 100644 index 0000000000..d5f6fa8424 --- /dev/null +++ b/Demos/Host/Incomplete/AndroidAccessoryHost/Lib/AndroidAccessoryCommands.h @@ -0,0 +1,74 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2011. + + dean [at] fourwalledcubicle [dot] com + www.lufa-lib.org +*/ + +/* + Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author 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 AndroidAccessoryCommands.c. + */ + +#ifndef _ANDROID_ACCESSORY_COMMANDS_H_ +#define _ANDROID_ACCESSORY_COMMANDS_H_ + + /* Includes: */ + #include + #include + + #include + + /* Enums: */ + enum Android_Requests_t + { + ANDROID_Req_GetAccessoryProtocol = 51, + ANDROID_Req_SendString = 52, + ANDROID_Req_StartAccessoryMode = 53, + }; + + enum Android_Strings_t + { + ANDROID_STRING_Manufacturer = 0, + ANDROID_STRING_Model = 1, + ANDROID_STRING_Description = 2, + ANDROID_STRING_Version = 3, + ANDROID_STRING_URI = 4, + ANDROID_STRING_Serial = 5, + }; + + enum Android_Protocols_t + { + ANDROID_PROTOCOL_Accessory = 0x0001, + }; + + /* Function Prototypes: */ + uint8_t Android_GetAccessoryProtocol(uint16_t* const Protocol); + uint8_t Android_SendString(const uint8_t StringIndex, + char* String); + uint8_t Android_StartAccessoryMode(void); + +#endif diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/makefile b/Demos/Host/Incomplete/AndroidAccessoryHost/makefile index 434bad48cd..1d1cb0cbd4 100644 --- a/Demos/Host/Incomplete/AndroidAccessoryHost/makefile +++ b/Demos/Host/Incomplete/AndroidAccessoryHost/makefile @@ -132,6 +132,7 @@ include $(LUFA_PATH)/LUFA/makefile SRC = $(TARGET).c \ DeviceDescriptor.c \ ConfigDescriptor.c \ + Lib/AndroidAccessoryCommands.c \ $(LUFA_SRC_USB) \ $(LUFA_SRC_SERIAL) diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h index aecdf965ca..b452271b51 100644 --- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h @@ -71,9 +71,6 @@ /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ #define LEDMASK_USB_BUSY LEDS_LED2 - /* Task Definitions: */ - void Bluetooth_Host_Task(void); - /* Event Handlers: */ void EVENT_USB_Host_DeviceAttached(void); void EVENT_USB_Host_DeviceUnattached(void); @@ -83,6 +80,7 @@ const uint8_t SubErrorCode); /* Function Prototypes: */ + void Bluetooth_Host_Task(void); void SetupHardware(void); #endif diff --git a/LUFA.pnproj b/LUFA.pnproj index b4b29b9ce0..af54f5a24c 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file