diff options
Diffstat (limited to 'Demos/Host')
6 files changed, 197 insertions, 28 deletions
diff --git a/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.c b/Demos/Host/Incomplete/AndroidAccessoryHost/AndroidAccessoryHost.c index 9b5ffbea6..d4df9a11d 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 aea0b4447..59f49c518 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 <LUFA/Version.h> #include <LUFA/Drivers/Misc/TerminalCodes.h> @@ -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 000000000..cd26538eb --- /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 000000000..d5f6fa842 --- /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 <stdint.h>
+ #include <stdbool.h>
+
+ #include <LUFA/Drivers/USB/USB.h>
+
+ /* 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 434bad48c..1d1cb0cbd 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 aecdf965c..b452271b5 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 |