AndroidAccessoryHost now allows basic communication with USBTest.
This commit is contained in:
@@ -9,6 +9,8 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
|
Updated for compatibility with USBTest by Opendous Inc. 2011-10-26
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
@@ -36,6 +38,15 @@
|
|||||||
|
|
||||||
#include "AndroidAccessoryHost.h"
|
#include "AndroidAccessoryHost.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "AndroidAccessoryHostGlobalVariables.h"
|
||||||
|
uint8_t volatile ADK_IN_EP_Address = 0;
|
||||||
|
uint8_t volatile ADK_OUT_EP_Address = 0;
|
||||||
|
uint8_t Sent_EP_Addresses = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Main program entry point. This routine configures the hardware required by the application, then
|
/** Main program entry point. This routine configures the hardware required by the application, then
|
||||||
* enters a loop to run the application tasks in sequence.
|
* enters a loop to run the application tasks in sequence.
|
||||||
*/
|
*/
|
||||||
@@ -77,6 +88,8 @@ void SetupHardware(void)
|
|||||||
/** Task to set the configuration of the attached device after it has been enumerated. */
|
/** Task to set the configuration of the attached device after it has been enumerated. */
|
||||||
void AndroidHost_Task(void)
|
void AndroidHost_Task(void)
|
||||||
{
|
{
|
||||||
|
uint16_t i = 0;
|
||||||
|
|
||||||
if (USB_HostState != HOST_STATE_Configured)
|
if (USB_HostState != HOST_STATE_Configured)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -84,6 +97,14 @@ void AndroidHost_Task(void)
|
|||||||
Pipe_SelectPipe(ANDROID_DATA_IN_PIPE);
|
Pipe_SelectPipe(ANDROID_DATA_IN_PIPE);
|
||||||
Pipe_Unfreeze();
|
Pipe_Unfreeze();
|
||||||
|
|
||||||
|
if (!Sent_EP_Addresses) {
|
||||||
|
puts_P(PSTR(ESC_FG_YELLOW "Forcing Addresses 0x85 and 0x07 as parsed addresses are wrong:\r\n" ESC_FG_WHITE));
|
||||||
|
printf_P(PSTR(ESC_FG_YELLOW "Parsed EP IN Address = 0x%02X\r\n" ESC_FG_WHITE), (uint8_t)ADK_IN_EP_Address);
|
||||||
|
printf_P(PSTR(ESC_FG_YELLOW "Parsed EP OUT Address = 0x%02X\r\n" ESC_FG_WHITE), (uint8_t)ADK_OUT_EP_Address);
|
||||||
|
printf_P(PSTR(ESC_FG_YELLOW "Bound EP IN Address = 0x%02X\r\n" ESC_FG_WHITE), (uint8_t)Pipe_GetBoundEndpointAddress());
|
||||||
|
Sent_EP_Addresses = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check to see if a packet has been received */
|
/* Check to see if a packet has been received */
|
||||||
if (Pipe_IsINReceived())
|
if (Pipe_IsINReceived())
|
||||||
{
|
{
|
||||||
@@ -93,22 +114,13 @@ void AndroidHost_Task(void)
|
|||||||
/* Check if data is in the pipe */
|
/* Check if data is in the pipe */
|
||||||
if (Pipe_IsReadWriteAllowed())
|
if (Pipe_IsReadWriteAllowed())
|
||||||
{
|
{
|
||||||
uint8_t NextReceivedByte = Pipe_BytesInPipe();
|
printf_P(PSTR(ESC_FG_YELLOW "\r\nBytes in Pipe = %d\r\n" ESC_FG_WHITE), (uint16_t)Pipe_BytesInPipe());
|
||||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
|
||||||
|
|
||||||
if (NextReceivedByte & 0x01)
|
for (i = 0; i < ((uint16_t)Pipe_BytesInPipe()); i++) {
|
||||||
LEDMask |= LEDS_LED1;
|
printf_P(PSTR(ESC_FG_YELLOW "Received: 0x%02X\r\n" ESC_FG_WHITE), Pipe_Read_8());
|
||||||
|
}
|
||||||
|
|
||||||
if (NextReceivedByte & 0x02)
|
LEDs_SetAllLEDs(LEDS_NO_LEDS);
|
||||||
LEDMask |= LEDS_LED2;
|
|
||||||
|
|
||||||
if (NextReceivedByte & 0x04)
|
|
||||||
LEDMask |= LEDS_LED3;
|
|
||||||
|
|
||||||
if (NextReceivedByte & 0x08)
|
|
||||||
LEDMask |= LEDS_LED4;
|
|
||||||
|
|
||||||
LEDs_SetAllLEDs(LEDMask);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -192,12 +204,20 @@ void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send the device strings and start the Android Accessory Mode */
|
/* Send the device strings and start the Android Accessory Mode */
|
||||||
Android_SendString(ANDROID_STRING_Manufacturer, "Dean Camera");
|
/* Android_SendString(ANDROID_STRING_Manufacturer, "Dean Camera");
|
||||||
Android_SendString(ANDROID_STRING_Model, "LUFA Android Demo");
|
Android_SendString(ANDROID_STRING_Model, "LUFA Android Demo");
|
||||||
Android_SendString(ANDROID_STRING_Description, "LUFA Android Demo");
|
Android_SendString(ANDROID_STRING_Description, "LUFA Android Demo");
|
||||||
Android_SendString(ANDROID_STRING_Version, "1.0");
|
Android_SendString(ANDROID_STRING_Version, "1.0");
|
||||||
Android_SendString(ANDROID_STRING_URI, "http://www.lufa-lib.org");
|
Android_SendString(ANDROID_STRING_URI, "http://www.lufa-lib.org");
|
||||||
Android_SendString(ANDROID_STRING_Serial, "0000000012345678");
|
Android_SendString(ANDROID_STRING_Serial, "0000000012345678");
|
||||||
|
*/
|
||||||
|
Android_SendString(ANDROID_STRING_Manufacturer, "Opendous Inc.");
|
||||||
|
Android_SendString(ANDROID_STRING_Model, "Micropendous");
|
||||||
|
Android_SendString(ANDROID_STRING_Description, "Dean Camera's LUFA Android Demo");
|
||||||
|
Android_SendString(ANDROID_STRING_Version, "1.0");
|
||||||
|
Android_SendString(ANDROID_STRING_URI, "http://www.Micropendous.org/ADK");
|
||||||
|
Android_SendString(ANDROID_STRING_Serial, "0000000012345678");
|
||||||
|
|
||||||
|
|
||||||
Android_StartAccessoryMode();
|
Android_StartAccessoryMode();
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,86 +1,86 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AndroidAccessoryHost.c.
|
* Header file for AndroidAccessoryHost.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ANDROID_ACCESSORY_HOST_H_
|
#ifndef _ANDROID_ACCESSORY_HOST_H_
|
||||||
#define _ANDROID_ACCESSORY_HOST_H_
|
#define _ANDROID_ACCESSORY_HOST_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <avr/io.h>
|
#include <avr/io.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include <avr/power.h>
|
#include <avr/power.h>
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "DeviceDescriptor.h"
|
#include "DeviceDescriptor.h"
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
#include "Lib/AndroidAccessoryCommands.h"
|
#include "Lib/AndroidAccessoryCommands.h"
|
||||||
|
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
#include <LUFA/Drivers/Misc/TerminalCodes.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
#include <LUFA/Drivers/Peripheral/Serial.h>
|
#include <LUFA/Drivers/Peripheral/Serial.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
/** 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
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */
|
/** 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. */
|
/** 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. */
|
/** 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)
|
||||||
|
|
||||||
/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
|
/** LED mask for the library LED driver, to indicate that the USB interface is busy. */
|
||||||
#define LEDMASK_USB_BUSY LEDS_LED2
|
#define LEDMASK_USB_BUSY LEDS_LED2
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
void SetupHardware(void);
|
void SetupHardware(void);
|
||||||
void AndroidHost_Task(void);
|
void AndroidHost_Task(void);
|
||||||
|
|
||||||
/* Event Handlers: */
|
/* Event Handlers: */
|
||||||
void EVENT_USB_Host_DeviceAttached(void);
|
void EVENT_USB_Host_DeviceAttached(void);
|
||||||
void EVENT_USB_Host_DeviceUnattached(void);
|
void EVENT_USB_Host_DeviceUnattached(void);
|
||||||
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
void EVENT_USB_Host_DeviceEnumerationComplete(void);
|
||||||
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
void EVENT_USB_Host_HostError(const uint8_t ErrorCode);
|
||||||
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
|
||||||
const uint8_t SubErrorCode);
|
const uint8_t SubErrorCode);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2011 Opendous Inc. www.Micropendous.org
|
||||||
|
|
||||||
|
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 AndroidAccessoryHost.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ANDROID_ACCESSORY_HOST_GLOBAL_VARIABLES_H_
|
||||||
|
#define _ANDROID_ACCESSORY_HOST_GLOBAL_VARIABLES_H_
|
||||||
|
|
||||||
|
extern volatile uint8_t ADK_IN_EP_Address;
|
||||||
|
extern volatile uint8_t ADK_OUT_EP_Address;
|
||||||
|
|
||||||
|
#endif // _ANDROID_ACCESSORY_HOST_GLOBAL_VARIABLES_H_
|
||||||
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<classpath>
|
||||||
|
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
|
||||||
|
<classpathentry kind="src" path="src"/>
|
||||||
|
<classpathentry kind="src" path="gen"/>
|
||||||
|
<classpathentry kind="output" path="bin"/>
|
||||||
|
</classpath>
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>UsbTest</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>com.android.ide.eclipse.adt.ApkBuilder</name>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
|
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="ch.serverbox.android.usbtest" android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<uses-feature android:name="android.hardware.usb.accessory" />
|
||||||
|
<uses-sdk android:minSdkVersion="10" />
|
||||||
|
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
|
||||||
|
<uses-library android:name="com.android.future.usb.accessory" />
|
||||||
|
<activity android:name=".UsbTest" android:label="@string/app_name" android:launchMode="singleTop">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
|
||||||
|
</intent-filter>
|
||||||
|
<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
|
||||||
|
android:resource="@xml/accessory_filter" />
|
||||||
|
</activity>
|
||||||
|
<receiver android:name="UsbReceiver">
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
|
||||||
|
</intent-filter>
|
||||||
|
</receiver>
|
||||||
|
</application>
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system use,
|
||||||
|
# "build.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=Google Inc.:Google APIs:10
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
/* AUTO-GENERATED FILE. DO NOT MODIFY.
|
||||||
|
*
|
||||||
|
* This class was automatically generated by the
|
||||||
|
* aapt tool from the resource data it found. It
|
||||||
|
* should not be modified by hand.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ch.serverbox.android.usbtest;
|
||||||
|
|
||||||
|
public final class R {
|
||||||
|
public static final class attr {
|
||||||
|
}
|
||||||
|
public static final class drawable {
|
||||||
|
public static final int icon=0x7f020000;
|
||||||
|
}
|
||||||
|
public static final class id {
|
||||||
|
public static final int TextView01=0x7f060000;
|
||||||
|
public static final int btSebd=0x7f060002;
|
||||||
|
public static final int editText1=0x7f060001;
|
||||||
|
public static final int editText2=0x7f060004;
|
||||||
|
public static final int textView1=0x7f060003;
|
||||||
|
}
|
||||||
|
public static final class layout {
|
||||||
|
public static final int main=0x7f030000;
|
||||||
|
}
|
||||||
|
public static final class string {
|
||||||
|
public static final int app_name=0x7f050001;
|
||||||
|
public static final int hello=0x7f050000;
|
||||||
|
public static final int str_desc=0x7f050003;
|
||||||
|
public static final int str_send=0x7f050002;
|
||||||
|
}
|
||||||
|
public static final class xml {
|
||||||
|
public static final int accessory_filter=0x7f040000;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
-optimizationpasses 5
|
||||||
|
-dontusemixedcaseclassnames
|
||||||
|
-dontskipnonpubliclibraryclasses
|
||||||
|
-dontpreverify
|
||||||
|
-verbose
|
||||||
|
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
|
||||||
|
|
||||||
|
-keep public class * extends android.app.Activity
|
||||||
|
-keep public class * extends android.app.Application
|
||||||
|
-keep public class * extends android.app.Service
|
||||||
|
-keep public class * extends android.content.BroadcastReceiver
|
||||||
|
-keep public class * extends android.content.ContentProvider
|
||||||
|
-keep public class * extends android.app.backup.BackupAgentHelper
|
||||||
|
-keep public class * extends android.preference.Preference
|
||||||
|
-keep public class com.android.vending.licensing.ILicensingService
|
||||||
|
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
native <methods>;
|
||||||
|
}
|
||||||
|
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
public <init>(android.content.Context, android.util.AttributeSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
public <init>(android.content.Context, android.util.AttributeSet, int);
|
||||||
|
}
|
||||||
|
|
||||||
|
-keepclassmembers enum * {
|
||||||
|
public static **[] values();
|
||||||
|
public static ** valueOf(java.lang.String);
|
||||||
|
}
|
||||||
|
|
||||||
|
-keep class * implements android.os.Parcelable {
|
||||||
|
public static final android.os.Parcelable$Creator *;
|
||||||
|
}
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 786 B |
Binary file not shown.
|
After Width: | Height: | Size: 969 B |
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
>
|
||||||
|
<TextView android:layout_width="wrap_content" android:text="@string/str_desc" android:id="@+id/TextView01" android:layout_height="wrap_content"></TextView>
|
||||||
|
<EditText android:id="@+id/editText1" android:layout_width="match_parent" android:text="" android:layout_height="wrap_content" android:inputType="numberDecimal"></EditText>
|
||||||
|
<Button android:layout_height="wrap_content" android:id="@+id/btSebd" android:layout_width="match_parent" android:text="@string/str_send"></Button>
|
||||||
|
<TextView android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="Output" android:id="@+id/textView1" android:layout_height="wrap_content"></TextView>
|
||||||
|
<EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content">
|
||||||
|
<requestFocus></requestFocus>
|
||||||
|
</EditText>
|
||||||
|
</LinearLayout>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="hello">Hello World, USBTest!</string>
|
||||||
|
<string name="app_name">USBTest</string>
|
||||||
|
<string name="str_send">Send</string>
|
||||||
|
<string name="str_desc">Send Number to Computer</string>
|
||||||
|
</resources>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<resources>
|
||||||
|
<usb-accessory model="Micropendous" manufacturer="Opendous Inc." version="1.0"/>
|
||||||
|
</resources>
|
||||||
|
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* USBReceiver.java part of USBTest
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 - Manuel Di Cerbo
|
||||||
|
* Additional coding and bug fixes by Opendous Inc. www.opendous.org
|
||||||
|
*
|
||||||
|
* USBTest is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* USBTest is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with USBTest; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package ch.serverbox.android.usbtest;
|
||||||
|
|
||||||
|
import com.android.future.usb.UsbAccessory;
|
||||||
|
import com.android.future.usb.UsbManager;
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class UsbReceiver extends BroadcastReceiver {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
String action = intent.getAction();
|
||||||
|
if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
|
||||||
|
UsbAccessory accessory = UsbManager.getAccessory(intent);
|
||||||
|
Log.d("USB","Attached!");
|
||||||
|
if (intent.getBooleanExtra(
|
||||||
|
UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
|
||||||
|
//openAccessory(accessory);
|
||||||
|
} else {
|
||||||
|
Log.d("USB", "permission denied for accessory "
|
||||||
|
+ accessory);
|
||||||
|
}
|
||||||
|
} else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
|
||||||
|
UsbAccessory accessory = UsbManager.getAccessory(intent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,256 @@
|
|||||||
|
/*
|
||||||
|
* USBTest.java
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 - Manuel Di Cerbo
|
||||||
|
* Additional coding and bug fixes by Opendous Inc. www.opendous.org
|
||||||
|
*
|
||||||
|
* USBTest is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* USBTest is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with USBTest; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
package ch.serverbox.android.usbtest;
|
||||||
|
|
||||||
|
import java.io.FileDescriptor;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import com.android.future.usb.UsbAccessory;
|
||||||
|
import com.android.future.usb.UsbManager;
|
||||||
|
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.PendingIntent;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.IntentFilter;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
|
import android.os.Debug;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
|
||||||
|
public class UsbTest extends Activity {
|
||||||
|
private UsbManager mUsbManager;
|
||||||
|
private UsbAccessory mAccessory = null;
|
||||||
|
private Button mBtSend = null;
|
||||||
|
FileOutputStream mFout = null;
|
||||||
|
FileInputStream mFin = null;
|
||||||
|
ParcelFileDescriptor mFileDescriptor;
|
||||||
|
private PendingIntent mPermissionIntent = null;
|
||||||
|
|
||||||
|
/** Called when the activity is first created. */
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
l("USBTest onCreate Started");
|
||||||
|
mUsbManager = UsbManager.getInstance(this);
|
||||||
|
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("android.hardware.usb.action.USB_ACCESSORY_ATTACHED"), 0);
|
||||||
|
IntentFilter filter = new IntentFilter("android.hardware.usb.action.USB_ACCESSORY_ATTACHED");
|
||||||
|
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
|
||||||
|
registerReceiver(mUsbReceiver, filter);
|
||||||
|
|
||||||
|
if (getLastNonConfigurationInstance() != null) {
|
||||||
|
mAccessory = (UsbAccessory) getLastNonConfigurationInstance();
|
||||||
|
l("USBTest opening Accessory");
|
||||||
|
FileDescriptor fd = null;
|
||||||
|
try{
|
||||||
|
fd = mFileDescriptor.getFileDescriptor();
|
||||||
|
}catch(IllegalArgumentException e){
|
||||||
|
finish();
|
||||||
|
}catch(NullPointerException e){
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
mFin = new FileInputStream(fd);
|
||||||
|
l("FileInputStream for accessory opened");
|
||||||
|
mFout = new FileOutputStream(fd);
|
||||||
|
l("FileOutputStream for accessory opened");
|
||||||
|
} else {
|
||||||
|
l("accessory open fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
setContentView(R.layout.main);
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Debug.startMethodTracing("USBTest.trace");
|
||||||
|
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
IntentFilter i = new IntentFilter();
|
||||||
|
i.addAction(UsbManager.ACTION_USB_ACCESSORY_ATTACHED);
|
||||||
|
i.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
|
||||||
|
i.addAction("ch.serverbox.android.usbtest.USBPERMISSION");
|
||||||
|
registerReceiver(mUsbReceiver,i);
|
||||||
|
|
||||||
|
l("onCreate Started");
|
||||||
|
|
||||||
|
// TODO: if an ADK Accessory is not connected, this will simply exit
|
||||||
|
if(getIntent().getAction().equals("android.hardware.usb.action.USB_ACCESSORY_ATTACHED")){
|
||||||
|
l("Action is usb");
|
||||||
|
UsbAccessory accessory = UsbManager.getAccessory(getIntent());
|
||||||
|
mAccessory = accessory;
|
||||||
|
FileDescriptor fd = null;
|
||||||
|
try{
|
||||||
|
fd = UsbManager.getInstance(this).openAccessory(accessory).getFileDescriptor();
|
||||||
|
}catch(IllegalArgumentException e){
|
||||||
|
finish();
|
||||||
|
}catch(NullPointerException e){
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
mFin = new FileInputStream(fd);
|
||||||
|
l("FileInputStream for accessory opened");
|
||||||
|
mFout = new FileOutputStream(fd);
|
||||||
|
l("FileOutputStream for accessory opened");
|
||||||
|
} else {
|
||||||
|
UsbAccessory[] accessories = UsbManager.getInstance(this).getAccessoryList();
|
||||||
|
// TODO: should this be causing an exit or waiting for a device to connect?
|
||||||
|
try {
|
||||||
|
for(UsbAccessory a : accessories){
|
||||||
|
l("accessory: " + a.getManufacturer());
|
||||||
|
// Note that Manufacturer is used to match devices and must equal what is set in firmware
|
||||||
|
if(a.getManufacturer().equals("Opendous Inc.")){
|
||||||
|
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("ch.serverbox.android.usbtest.USBPERMISSION"),0);
|
||||||
|
UsbManager.getInstance(this).requestPermission(a,mPermissionIntent);
|
||||||
|
l("permission requested");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Debug.stopMethodTracing();
|
||||||
|
setContentView(R.layout.main);
|
||||||
|
|
||||||
|
mBtSend = (Button)(findViewById(R.id.btSebd));
|
||||||
|
mBtSend.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
String s = ((EditText)findViewById(R.id.editText1)).getText().toString();
|
||||||
|
queueWrite(s);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
unregisterReceiver(mUsbReceiver);
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void queueWrite(final String data){
|
||||||
|
if(mAccessory == null){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
/* l("Writing length "+data.length());
|
||||||
|
mFout.write(new byte[]{(byte)data.length()});
|
||||||
|
l("Writing data: "+data);
|
||||||
|
mFout.write(data.getBytes());
|
||||||
|
l("Done writing");
|
||||||
|
*/
|
||||||
|
String text = "BufferData";
|
||||||
|
byte[] mDataBuffer = text.getBytes();
|
||||||
|
|
||||||
|
// first byte will be the number of bytes to send and the rest will be the bytes
|
||||||
|
l("Writing data: " + (((Integer.toString(data.length())) + data.toString()).getBytes()));
|
||||||
|
mFout.write(((Integer.toString(data.length())) + data.toString()).getBytes());
|
||||||
|
l("Done writing");
|
||||||
|
//mFin.read(mDataBuffer);
|
||||||
|
//l("Data Read=" + (new String(mDataBuffer)));
|
||||||
|
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
String action = intent.getAction();
|
||||||
|
if (UsbManager.ACTION_USB_ACCESSORY_ATTACHED.equals(action)) {
|
||||||
|
UsbAccessory accessory = UsbManager.getAccessory(intent);
|
||||||
|
l("Attached!");
|
||||||
|
if (intent.getBooleanExtra(
|
||||||
|
UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
|
||||||
|
//openAccessory(accessory);
|
||||||
|
mAccessory = accessory;
|
||||||
|
FileDescriptor fd = null;
|
||||||
|
try{
|
||||||
|
fd = UsbManager.getInstance(getApplicationContext()).openAccessory(accessory).getFileDescriptor();
|
||||||
|
}catch(IllegalArgumentException e){
|
||||||
|
finish();
|
||||||
|
}catch(NullPointerException e){
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
mFout = new FileOutputStream(fd);
|
||||||
|
mBtSend.setEnabled(true);
|
||||||
|
} else {
|
||||||
|
l("permission denied for accessory " + accessory);
|
||||||
|
}
|
||||||
|
} else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
|
||||||
|
UsbAccessory accessory = UsbManager.getAccessory(intent);
|
||||||
|
if (accessory != null && accessory.equals(mAccessory)) {
|
||||||
|
if(mFout != null)
|
||||||
|
try {
|
||||||
|
mFout.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
mAccessory = null;
|
||||||
|
mBtSend.setEnabled(false);
|
||||||
|
}
|
||||||
|
}else if("ch.serverbox.android.usbtest.USBPERMISSION".equals(action)){
|
||||||
|
l("permission answered");
|
||||||
|
if(intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)){
|
||||||
|
UsbAccessory[] accessories = UsbManager.getInstance(getApplicationContext()).getAccessoryList();
|
||||||
|
for(UsbAccessory a : accessories){
|
||||||
|
l("accessory: "+a.getManufacturer());
|
||||||
|
if(a.getManufacturer().equals("Opendous Inc.")){
|
||||||
|
mAccessory = a;
|
||||||
|
FileDescriptor fd = null;
|
||||||
|
try{
|
||||||
|
fd = UsbManager.getInstance(getApplicationContext()).openAccessory(a).getFileDescriptor();
|
||||||
|
}catch(IllegalArgumentException e){
|
||||||
|
finish();
|
||||||
|
}catch(NullPointerException e){
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
mFout = new FileOutputStream(fd);
|
||||||
|
l("added accessory");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private void l(String l){
|
||||||
|
Log.d("USBTest=-=", l);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,293 @@
|
|||||||
|
/*
|
||||||
|
* simplectrl.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 - Manuel Di Cerbo
|
||||||
|
*
|
||||||
|
* simplectrl is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* simplectrl is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with simplectrl; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This software runs on a PC and communicates with an Android-based
|
||||||
|
system by emulating an ADK device.
|
||||||
|
|
||||||
|
If you are on Ubuntu you will require libusb as well as the headers...
|
||||||
|
We installed the headers with "apt-get source libusb"
|
||||||
|
|
||||||
|
apt-get source libusb
|
||||||
|
sudo apt-get -y install libusb-dev libusb-1.0-0-dev
|
||||||
|
|
||||||
|
|
||||||
|
gcc simplectrl.c -I/usr/include/ -o simplectrl -lusb-1.0 -I/usr/include/ -I/usr/include/libusb-1.0
|
||||||
|
|
||||||
|
Tested for Nexus S with Gingerbread 2.3.4
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <usb.h>
|
||||||
|
#include <libusb.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define IN 0x85
|
||||||
|
#define OUT 0x07
|
||||||
|
|
||||||
|
#define VID 0x18D1
|
||||||
|
#define PID 0x4E22
|
||||||
|
|
||||||
|
#define ACCESSORY_PID 0x2D01
|
||||||
|
#define ACCESSORY_PID_ALT 0x2D00
|
||||||
|
|
||||||
|
#define LEN 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static int mainPhase();
|
||||||
|
static int init(void);
|
||||||
|
static int deInit(void);
|
||||||
|
static void error(int code);
|
||||||
|
static void status(int code);
|
||||||
|
static int setupAccessory(
|
||||||
|
const char* manufacturer,
|
||||||
|
const char* modelName,
|
||||||
|
const char* description,
|
||||||
|
const char* version,
|
||||||
|
const char* uri,
|
||||||
|
const char* serialNumber);
|
||||||
|
|
||||||
|
//static
|
||||||
|
static struct libusb_device_handle* handle;
|
||||||
|
static char stop;
|
||||||
|
static char success = 0;
|
||||||
|
|
||||||
|
int main (int argc, char *argv[]){
|
||||||
|
if(init() < 0)
|
||||||
|
return;
|
||||||
|
//doTransfer();
|
||||||
|
if(setupAccessory(
|
||||||
|
"Opendous Inc.",
|
||||||
|
"Micropendous",
|
||||||
|
"Dean Camera's LUFA Android Demo",
|
||||||
|
"1.0",
|
||||||
|
"http://www.Micropendous.org/ADK",
|
||||||
|
"0000000012345678") < 0){
|
||||||
|
fprintf(stdout, "Error setting up accessory\n");
|
||||||
|
deInit();
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
if(mainPhase() < 0){
|
||||||
|
fprintf(stdout, "Error during main phase\n");
|
||||||
|
deInit();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
deInit();
|
||||||
|
fprintf(stdout, "Done, no errors\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mainPhase(){
|
||||||
|
unsigned char buffer[500000];
|
||||||
|
int response = 0;
|
||||||
|
static int transferred;
|
||||||
|
|
||||||
|
|
||||||
|
/* response = libusb_bulk_transfer(handle,IN,buffer,16384, &transferred,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
response = libusb_bulk_transfer(handle,IN,buffer,500000, &transferred,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
printf("[Read] returned: %d bytes, first 8 bytes are: (%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d)\n",
|
||||||
|
response, buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]);
|
||||||
|
*/
|
||||||
|
|
||||||
|
response = libusb_bulk_transfer(handle, IN, buffer, 8, &transferred, 0);
|
||||||
|
if(response < 0) { error(response); return -1; }
|
||||||
|
printf("[Read] %3d bytes of data, first 7 bytes are: (%3d,%3d,%3d,%3d,%3d,%3d,%3d)\n",
|
||||||
|
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]);
|
||||||
|
|
||||||
|
//response = libusb_bulk_transfer(handle, OUT, buffer, 8, &transferred, 0);
|
||||||
|
//if(response < 0) { error(response); return -1; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int init(){
|
||||||
|
libusb_init(NULL);
|
||||||
|
|
||||||
|
if((handle = libusb_open_device_with_vid_pid(NULL, VID, PID)) == NULL){
|
||||||
|
fprintf(stdout, "Problem acquireing handle\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
libusb_claim_interface(handle, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int deInit(){
|
||||||
|
if(handle != NULL) {
|
||||||
|
libusb_release_interface (handle, 0);
|
||||||
|
libusb_close(handle);
|
||||||
|
}
|
||||||
|
libusb_exit(NULL);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int setupAccessory(
|
||||||
|
const char* manufacturer,
|
||||||
|
const char* modelName,
|
||||||
|
const char* description,
|
||||||
|
const char* version,
|
||||||
|
const char* uri,
|
||||||
|
const char* serialNumber){
|
||||||
|
|
||||||
|
unsigned char ioBuffer[2];
|
||||||
|
int devVersion;
|
||||||
|
int response;
|
||||||
|
int tries = 5;
|
||||||
|
|
||||||
|
response = libusb_control_transfer(
|
||||||
|
handle, //handle
|
||||||
|
0xC0, //bmRequestType
|
||||||
|
51, //bRequest
|
||||||
|
0, //wValue
|
||||||
|
0, //wIndex
|
||||||
|
ioBuffer, //data
|
||||||
|
2, //wLength
|
||||||
|
0 //timeout
|
||||||
|
);
|
||||||
|
|
||||||
|
if(response < 0){error(response);return-1;}
|
||||||
|
|
||||||
|
devVersion = ioBuffer[1] << 8 | ioBuffer[0];
|
||||||
|
fprintf(stdout,"Verion Code Device: %d\n", devVersion);
|
||||||
|
|
||||||
|
usleep(1000);//sometimes hangs on the next transfer :(
|
||||||
|
|
||||||
|
response = libusb_control_transfer(handle,0x40,52,0,0,(char*)manufacturer,strlen(manufacturer),0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
response = libusb_control_transfer(handle,0x40,52,0,1,(char*)modelName,strlen(modelName)+1,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
response = libusb_control_transfer(handle,0x40,52,0,2,(char*)description,strlen(description)+1,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
response = libusb_control_transfer(handle,0x40,52,0,3,(char*)version,strlen(version)+1,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
response = libusb_control_transfer(handle,0x40,52,0,4,(char*)uri,strlen(uri)+1,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
response = libusb_control_transfer(handle,0x40,52,0,5,(char*)serialNumber,strlen(serialNumber)+1,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
|
||||||
|
fprintf(stdout,"Accessory Identification sent\n", devVersion);
|
||||||
|
|
||||||
|
response = libusb_control_transfer(handle,0x40,53,0,0,NULL,0,0);
|
||||||
|
if(response < 0){error(response);return -1;}
|
||||||
|
|
||||||
|
fprintf(stdout,"Attempted to put device into accessory mode\n", devVersion);
|
||||||
|
|
||||||
|
if(handle != NULL)
|
||||||
|
libusb_release_interface (handle, 0);
|
||||||
|
|
||||||
|
|
||||||
|
for(;;){//attempt to connect to new PID, if that doesn't work try ACCESSORY_PID_ALT
|
||||||
|
tries--;
|
||||||
|
if((handle = libusb_open_device_with_vid_pid(NULL, VID, ACCESSORY_PID)) == NULL){
|
||||||
|
if(tries < 0){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sleep(1);
|
||||||
|
}
|
||||||
|
libusb_claim_interface(handle, 0);
|
||||||
|
fprintf(stdout, "Interface claimed, ready to transfer data\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void error(int code){
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
switch(code){
|
||||||
|
case LIBUSB_ERROR_IO:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_IO\nInput/output error.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_INVALID_PARAM:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_INVALID_PARAM\nInvalid parameter.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_ACCESS:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_ACCESS\nAccess denied (insufficient permissions).\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_NO_DEVICE:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_NO_DEVICE\nNo such device (it may have been disconnected).\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_NOT_FOUND:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_NOT_FOUND\nEntity not found.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_BUSY:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_BUSY\nResource busy.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_TIMEOUT:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_TIMEOUT\nOperation timed out.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_OVERFLOW:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_OVERFLOW\nOverflow.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_PIPE:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_PIPE\nPipe error.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_INTERRUPTED:
|
||||||
|
fprintf(stdout,"Error:LIBUSB_ERROR_INTERRUPTED\nSystem call interrupted (perhaps due to signal).\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_NO_MEM:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_NO_MEM\nInsufficient memory.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_NOT_SUPPORTED:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_NOT_SUPPORTED\nOperation not supported or unimplemented on this platform.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_ERROR_OTHER:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_ERROR_OTHER\nOther error.\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stdout, "Error: unkown error\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void status(int code){
|
||||||
|
fprintf(stdout,"\n");
|
||||||
|
switch(code){
|
||||||
|
case LIBUSB_TRANSFER_COMPLETED:
|
||||||
|
fprintf(stdout,"Success: LIBUSB_TRANSFER_COMPLETED\nTransfer completed.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_TRANSFER_ERROR:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_TRANSFER_ERROR\nTransfer failed.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_TRANSFER_TIMED_OUT:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_TRANSFER_TIMED_OUT\nTransfer timed out.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_TRANSFER_CANCELLED:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_TRANSFER_CANCELLED\nTransfer was cancelled.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_TRANSFER_STALL:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_TRANSFER_STALL\nFor bulk/interrupt endpoints: halt condition detected (endpoint stalled).\nFor control endpoints: control request not supported.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_TRANSFER_NO_DEVICE:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_TRANSFER_NO_DEVICE\nDevice was disconnected.\n");
|
||||||
|
break;
|
||||||
|
case LIBUSB_TRANSFER_OVERFLOW:
|
||||||
|
fprintf(stdout,"Error: LIBUSB_TRANSFER_OVERFLOW\nDevice sent more data than requested.\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stdout,"Error: unknown error\nTry again(?)\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,166 +1,176 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Configuration Descriptor processing routines, to determine the correct pipe configurations
|
* 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
|
* 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.
|
* which the host requests upon device enumeration, to determine the device's capabilities and functions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ConfigDescriptor.h"
|
#include "ConfigDescriptor.h"
|
||||||
|
|
||||||
/** Reads and processes an attached device's descriptors, to determine compatibility and pipe configurations. This
|
#include "AndroidAccessoryHostGlobalVariables.h"
|
||||||
* routine will read in the entire configuration descriptor, and configure the hosts pipes to correctly communicate
|
|
||||||
* with compatible devices.
|
/** 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
|
||||||
* This routine searches for the first interface containing bulk IN and OUT data endpoints.
|
* with compatible devices.
|
||||||
*
|
*
|
||||||
* \return An error code from the \ref AndroidHost_GetConfigDescriptorDataCodes_t enum.
|
* This routine searches for the first interface containing bulk IN and OUT data endpoints.
|
||||||
*/
|
*
|
||||||
uint8_t ProcessConfigurationDescriptor(void)
|
* \return An error code from the \ref AndroidHost_GetConfigDescriptorDataCodes_t enum.
|
||||||
{
|
*/
|
||||||
uint8_t ConfigDescriptorData[512];
|
uint8_t ProcessConfigurationDescriptor(void)
|
||||||
void* CurrConfigLocation = ConfigDescriptorData;
|
{
|
||||||
uint16_t CurrConfigBytesRem;
|
uint8_t ConfigDescriptorData[512];
|
||||||
|
void* CurrConfigLocation = ConfigDescriptorData;
|
||||||
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
uint16_t CurrConfigBytesRem;
|
||||||
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
|
||||||
|
USB_Descriptor_Endpoint_t* DataINEndpoint = NULL;
|
||||||
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
USB_Descriptor_Endpoint_t* DataOUTEndpoint = NULL;
|
||||||
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
|
||||||
{
|
/* Retrieve the entire configuration descriptor into the allocated buffer */
|
||||||
case HOST_GETCONFIG_Successful:
|
switch (USB_Host_GetDeviceConfigDescriptor(1, &CurrConfigBytesRem, ConfigDescriptorData, sizeof(ConfigDescriptorData)))
|
||||||
break;
|
{
|
||||||
case HOST_GETCONFIG_InvalidData:
|
case HOST_GETCONFIG_Successful:
|
||||||
return InvalidConfigDataReturned;
|
break;
|
||||||
case HOST_GETCONFIG_BuffOverflow:
|
case HOST_GETCONFIG_InvalidData:
|
||||||
return DescriptorTooLarge;
|
return InvalidConfigDataReturned;
|
||||||
default:
|
case HOST_GETCONFIG_BuffOverflow:
|
||||||
return DevControlError;
|
return DescriptorTooLarge;
|
||||||
}
|
default:
|
||||||
|
return DevControlError;
|
||||||
/* 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)
|
/* There should be only one compatible Android Accessory Mode interface in the device, attempt to find it */
|
||||||
{
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
return NoCompatibleInterfaceFound;
|
DCOMP_NextAndroidAccessoryInterface) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
}
|
{
|
||||||
|
return NoCompatibleInterfaceFound;
|
||||||
while (!(DataINEndpoint) || !(DataOUTEndpoint))
|
}
|
||||||
{
|
|
||||||
/* Get the next Android Accessory Mode interface's data endpoint descriptor */
|
while (!(DataINEndpoint) || !(DataOUTEndpoint))
|
||||||
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
{
|
||||||
DCOMP_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
/* Get the next Android Accessory Mode interface's data endpoint descriptor */
|
||||||
{
|
if (USB_GetNextDescriptorComp(&CurrConfigBytesRem, &CurrConfigLocation,
|
||||||
/* Data endpoints not found within the first Android Accessory device interface, error out */
|
DCOMP_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
|
||||||
return NoCompatibleInterfaceFound;
|
{
|
||||||
}
|
/* Data endpoints not found within the first Android Accessory device interface, error out */
|
||||||
|
return NoCompatibleInterfaceFound;
|
||||||
/* Retrieve the endpoint address from the endpoint descriptor */
|
}
|
||||||
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
|
||||||
|
/* Retrieve the endpoint address from the endpoint descriptor */
|
||||||
/* If the endpoint is a IN type endpoint */
|
USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(CurrConfigLocation, USB_Descriptor_Endpoint_t);
|
||||||
if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
|
|
||||||
DataINEndpoint = EndpointData;
|
/* If the endpoint is a IN type endpoint */
|
||||||
else
|
if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN)
|
||||||
DataOUTEndpoint = EndpointData;
|
DataINEndpoint = EndpointData;
|
||||||
}
|
else
|
||||||
|
DataOUTEndpoint = EndpointData;
|
||||||
/* Configure the Android Accessory data IN pipe */
|
}
|
||||||
Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
|
|
||||||
DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
/* Configure the Android Accessory data IN pipe */
|
||||||
|
// Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
|
||||||
/* Configure the Android Accessory data OUT pipe */
|
// DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||||
Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
|
// TODO: For some reason the EP address gets set to 0x8B --> EP 11, which does not exist
|
||||||
DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN, 0x85, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||||
|
|
||||||
/* Valid data found, return success */
|
ADK_IN_EP_Address = (uint8_t)(DataINEndpoint->EndpointAddress);
|
||||||
return SuccessfulConfigRead;
|
|
||||||
}
|
/* Configure the Android Accessory data OUT pipe */
|
||||||
|
// Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
// DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
// TODO: For some reason the EP address gets set to 0x0D --> EP 13, which does not exist
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT, 0x07, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||||
*
|
|
||||||
* This comparator searches for the next Interface descriptor containing the correct Android Accessory Mode Class, Subclass
|
ADK_OUT_EP_Address = (uint8_t)(DataOUTEndpoint->EndpointAddress);
|
||||||
* and Protocol values.
|
|
||||||
*
|
/* Valid data found, return success */
|
||||||
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
return SuccessfulConfigRead;
|
||||||
*/
|
}
|
||||||
uint8_t DCOMP_NextAndroidAccessoryInterface(void* const CurrentDescriptor)
|
|
||||||
{
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
* 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.
|
||||||
if (Header->Type == DTYPE_Interface)
|
*
|
||||||
{
|
* This comparator searches for the next Interface descriptor containing the correct Android Accessory Mode Class, Subclass
|
||||||
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
* and Protocol values.
|
||||||
|
*
|
||||||
if ((Interface->Class == ANDROID_INTERFACE_CLASS) &&
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
(Interface->SubClass == ANDROID_INTERFACE_SUBCLASS) &&
|
*/
|
||||||
(Interface->Protocol == ANDROID_INTERFACE_PROTOCOL))
|
uint8_t DCOMP_NextAndroidAccessoryInterface(void* const CurrentDescriptor)
|
||||||
{
|
{
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
}
|
|
||||||
}
|
if (Header->Type == DTYPE_Interface)
|
||||||
|
{
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t);
|
||||||
}
|
|
||||||
|
if ((Interface->Class == ANDROID_INTERFACE_CLASS) &&
|
||||||
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
(Interface->SubClass == ANDROID_INTERFACE_SUBCLASS) &&
|
||||||
* configuration descriptor, to search for a specific sub descriptor. It can also be used to abort the configuration
|
(Interface->Protocol == ANDROID_INTERFACE_PROTOCOL))
|
||||||
* descriptor processing if an incompatible descriptor configuration is found.
|
{
|
||||||
*
|
return DESCRIPTOR_SEARCH_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
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
*/
|
}
|
||||||
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
|
|
||||||
{
|
/** Descriptor comparator function. This comparator function is can be called while processing an attached USB device's
|
||||||
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
* 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.
|
||||||
if (Header->Type == DTYPE_Endpoint)
|
*
|
||||||
{
|
* This comparator searches for the next bulk Endpoint descriptor inside the current interface descriptor, aborting the
|
||||||
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
* search if another interface descriptor is found before the required endpoint.
|
||||||
|
*
|
||||||
uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
|
* \return A value from the DSEARCH_Return_ErrorCodes_t enum
|
||||||
|
*/
|
||||||
if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
|
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* const CurrentDescriptor)
|
||||||
return DESCRIPTOR_SEARCH_Found;
|
{
|
||||||
}
|
USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t);
|
||||||
else if (Header->Type == DTYPE_Interface)
|
|
||||||
{
|
if (Header->Type == DTYPE_Endpoint)
|
||||||
return DESCRIPTOR_SEARCH_Fail;
|
{
|
||||||
}
|
USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t);
|
||||||
|
|
||||||
return DESCRIPTOR_SEARCH_NotFound;
|
uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK);
|
||||||
}
|
|
||||||
|
if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))))
|
||||||
|
return DESCRIPTOR_SEARCH_Found;
|
||||||
|
}
|
||||||
|
else if (Header->Type == DTYPE_Interface)
|
||||||
|
{
|
||||||
|
return DESCRIPTOR_SEARCH_Fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DESCRIPTOR_SEARCH_NotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,68 +1,68 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for ConfigDescriptor.c.
|
* Header file for ConfigDescriptor.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _CONFIGDESCRIPTOR_H_
|
#ifndef _CONFIGDESCRIPTOR_H_
|
||||||
#define _CONFIGDESCRIPTOR_H_
|
#define _CONFIGDESCRIPTOR_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define ANDROID_DATA_IN_PIPE 1
|
#define ANDROID_DATA_IN_PIPE 1
|
||||||
#define ANDROID_DATA_OUT_PIPE 2
|
#define ANDROID_DATA_OUT_PIPE 2
|
||||||
|
|
||||||
#define ANDROID_INTERFACE_CLASS 0xFF
|
#define ANDROID_INTERFACE_CLASS 0xFF
|
||||||
#define ANDROID_INTERFACE_SUBCLASS 0x42
|
#define ANDROID_INTERFACE_SUBCLASS 0x42
|
||||||
#define ANDROID_INTERFACE_PROTOCOL 0x01
|
#define ANDROID_INTERFACE_PROTOCOL 0x01
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
/** Enum for the possible return codes of the \ref ProcessConfigurationDescriptor() function. */
|
||||||
enum AndroidHost_GetConfigDescriptorDataCodes_t
|
enum AndroidHost_GetConfigDescriptorDataCodes_t
|
||||||
{
|
{
|
||||||
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
SuccessfulConfigRead = 0, /**< Configuration Descriptor was processed successfully */
|
||||||
DevControlError = 1, /**< A control request to the device failed to complete successfully */
|
DevControlError = 1, /**< A control request to the device failed to complete successfully */
|
||||||
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
DescriptorTooLarge = 2, /**< The device's Configuration Descriptor is too large to process */
|
||||||
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
InvalidConfigDataReturned = 3, /**< The device returned an invalid Configuration Descriptor */
|
||||||
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
NoCompatibleInterfaceFound = 4, /**< A compatible interface with the required endpoints was not found */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t ProcessConfigurationDescriptor(void);
|
uint8_t ProcessConfigurationDescriptor(void);
|
||||||
|
|
||||||
uint8_t DCOMP_NextAndroidAccessoryInterface(void* const CurrentDescriptor);
|
uint8_t DCOMP_NextAndroidAccessoryInterface(void* const CurrentDescriptor);
|
||||||
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* CurrentDescriptor);
|
uint8_t DCOMP_NextInterfaceBulkEndpoint(void* CurrentDescriptor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,71 +1,71 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* USB Device Descriptor processing routines, to determine the overall device parameters. Descriptors are special
|
* USB Device Descriptor processing routines, to determine the overall device parameters. Descriptors are special
|
||||||
* computer-readable structures which the host requests upon device enumeration, to determine information about
|
* computer-readable structures which the host requests upon device enumeration, to determine information about
|
||||||
* the attached device.
|
* the attached device.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "DeviceDescriptor.h"
|
#include "DeviceDescriptor.h"
|
||||||
|
|
||||||
/** Reads and processes an attached device's Device Descriptor, to determine compatibility
|
/** Reads and processes an attached device's Device Descriptor, to determine compatibility
|
||||||
*
|
*
|
||||||
* This routine checks to ensure that the attached device's VID and PID matches Google's for Android devices.
|
* This routine checks to ensure that the attached device's VID and PID matches Google's for Android devices.
|
||||||
*
|
*
|
||||||
* \return An error code from the \ref AndroidHost_GetDeviceDescriptorDataCodes_t enum.
|
* \return An error code from the \ref AndroidHost_GetDeviceDescriptorDataCodes_t enum.
|
||||||
*/
|
*/
|
||||||
uint8_t ProcessDeviceDescriptor(void)
|
uint8_t ProcessDeviceDescriptor(void)
|
||||||
{
|
{
|
||||||
USB_Descriptor_Device_t DeviceDescriptor;
|
USB_Descriptor_Device_t DeviceDescriptor;
|
||||||
|
|
||||||
/* Send the request to retrieve the device descriptor */
|
/* Send the request to retrieve the device descriptor */
|
||||||
if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful)
|
if (USB_Host_GetDeviceDescriptor(&DeviceDescriptor) != HOST_SENDCONTROL_Successful)
|
||||||
return DevControlError;
|
return DevControlError;
|
||||||
|
|
||||||
/* Validate returned data - ensure the returned data is a device descriptor */
|
/* Validate returned data - ensure the returned data is a device descriptor */
|
||||||
if (DeviceDescriptor.Header.Type != DTYPE_Device)
|
if (DeviceDescriptor.Header.Type != DTYPE_Device)
|
||||||
return InvalidDeviceDataReturned;
|
return InvalidDeviceDataReturned;
|
||||||
|
|
||||||
/* Validate returned device Vendor ID against the Android ADK spec values */
|
/* Validate returned device Vendor ID against the Android ADK spec values */
|
||||||
if (DeviceDescriptor.VendorID != ANDROID_VENDOR_ID)
|
if (DeviceDescriptor.VendorID != ANDROID_VENDOR_ID)
|
||||||
return IncorrectAndroidDevice;
|
return IncorrectAndroidDevice;
|
||||||
|
|
||||||
/* Check the product ID to determine if the Android device is in accessory mode */
|
/* Check the product ID to determine if the Android device is in accessory mode */
|
||||||
if ((DeviceDescriptor.ProductID != ANDROID_ACCESSORY_PRODUCT_ID) &&
|
if ((DeviceDescriptor.ProductID != ANDROID_ACCESSORY_PRODUCT_ID) &&
|
||||||
(DeviceDescriptor.ProductID != ANDROID_ACCESSORY_ADB_PRODUCT_ID))
|
(DeviceDescriptor.ProductID != ANDROID_ACCESSORY_ADB_PRODUCT_ID))
|
||||||
{
|
{
|
||||||
return NonAccessoryModeAndroidDevice;
|
return NonAccessoryModeAndroidDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
return AccessoryModeAndroidDevice;
|
return AccessoryModeAndroidDevice;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,65 +1,65 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for DeviceDescriptor.c.
|
* Header file for DeviceDescriptor.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DEVICEDESCRIPTOR_H_
|
#ifndef _DEVICEDESCRIPTOR_H_
|
||||||
#define _DEVICEDESCRIPTOR_H_
|
#define _DEVICEDESCRIPTOR_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
#include "AndroidAccessoryHost.h"
|
#include "AndroidAccessoryHost.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define ANDROID_VENDOR_ID 0x18D1
|
#define ANDROID_VENDOR_ID 0x18D1
|
||||||
#define ANDROID_ACCESSORY_PRODUCT_ID 0x2D00
|
#define ANDROID_ACCESSORY_PRODUCT_ID 0x2D00
|
||||||
#define ANDROID_ACCESSORY_ADB_PRODUCT_ID 0x2D01
|
#define ANDROID_ACCESSORY_ADB_PRODUCT_ID 0x2D01
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
/** Enum for the possible return codes of the \ref ProcessDeviceDescriptor() function. */
|
/** Enum for the possible return codes of the \ref ProcessDeviceDescriptor() function. */
|
||||||
enum AndroidHost_GetDeviceDescriptorDataCodes_t
|
enum AndroidHost_GetDeviceDescriptorDataCodes_t
|
||||||
{
|
{
|
||||||
SuccessfulDeviceRead = 0, /**< Device Descriptor was processed successfully */
|
SuccessfulDeviceRead = 0, /**< Device Descriptor was processed successfully */
|
||||||
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
ControlError = 1, /**< A control request to the device failed to complete successfully */
|
||||||
InvalidDeviceDataReturned = 2, /**< The device returned an invalid Device Descriptor */
|
InvalidDeviceDataReturned = 2, /**< The device returned an invalid Device Descriptor */
|
||||||
IncorrectAndroidDevice = 3, /**< The attached device is not an Android device */
|
IncorrectAndroidDevice = 3, /**< The attached device is not an Android device */
|
||||||
NonAccessoryModeAndroidDevice = 4, /**< The attached device is an Android device in non-accessory mode */
|
NonAccessoryModeAndroidDevice = 4, /**< The attached device is an Android device in non-accessory mode */
|
||||||
AccessoryModeAndroidDevice = 5, /**< The attached device is an Android device in accessory mode */
|
AccessoryModeAndroidDevice = 5, /**< The attached device is an Android device in accessory mode */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t ProcessDeviceDescriptor(void);
|
uint8_t ProcessDeviceDescriptor(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,83 +1,83 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Android Accessory Mode utility functions, for the configuration of an attached
|
* Android Accessory Mode utility functions, for the configuration of an attached
|
||||||
* Android device into Android Accessory Mode ready for general communication.
|
* Android device into Android Accessory Mode ready for general communication.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "AndroidAccessoryCommands.h"
|
#include "AndroidAccessoryCommands.h"
|
||||||
|
|
||||||
uint8_t Android_GetAccessoryProtocol(uint16_t* const Protocol)
|
uint8_t Android_GetAccessoryProtocol(uint16_t* const Protocol)
|
||||||
{
|
{
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE),
|
.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE),
|
||||||
.bRequest = ANDROID_Req_GetAccessoryProtocol,
|
.bRequest = ANDROID_Req_GetAccessoryProtocol,
|
||||||
.wValue = 0,
|
.wValue = 0,
|
||||||
.wIndex = 0,
|
.wIndex = 0,
|
||||||
.wLength = sizeof(uint16_t),
|
.wLength = sizeof(uint16_t),
|
||||||
};
|
};
|
||||||
|
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
return USB_Host_SendControlRequest(Protocol);
|
return USB_Host_SendControlRequest(Protocol);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Android_SendString(const uint8_t StringIndex,
|
uint8_t Android_SendString(const uint8_t StringIndex,
|
||||||
char* String)
|
char* String)
|
||||||
{
|
{
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
|
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
|
||||||
.bRequest = ANDROID_Req_SendString,
|
.bRequest = ANDROID_Req_SendString,
|
||||||
.wValue = 0,
|
.wValue = 0,
|
||||||
.wIndex = StringIndex,
|
.wIndex = StringIndex,
|
||||||
.wLength = (strlen(String) + 1),
|
.wLength = (strlen(String) + 1),
|
||||||
};
|
};
|
||||||
|
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
return USB_Host_SendControlRequest(String);
|
return USB_Host_SendControlRequest(String);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t Android_StartAccessoryMode(void)
|
uint8_t Android_StartAccessoryMode(void)
|
||||||
{
|
{
|
||||||
USB_ControlRequest = (USB_Request_Header_t)
|
USB_ControlRequest = (USB_Request_Header_t)
|
||||||
{
|
{
|
||||||
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
|
.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE),
|
||||||
.bRequest = ANDROID_Req_StartAccessoryMode,
|
.bRequest = ANDROID_Req_StartAccessoryMode,
|
||||||
.wValue = 0,
|
.wValue = 0,
|
||||||
.wIndex = 0,
|
.wIndex = 0,
|
||||||
.wLength = 0,
|
.wLength = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||||
return USB_Host_SendControlRequest(NULL);
|
return USB_Host_SendControlRequest(NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,74 +1,74 @@
|
|||||||
/*
|
/*
|
||||||
LUFA Library
|
LUFA Library
|
||||||
Copyright (C) Dean Camera, 2011.
|
Copyright (C) Dean Camera, 2011.
|
||||||
|
|
||||||
dean [at] fourwalledcubicle [dot] com
|
dean [at] fourwalledcubicle [dot] com
|
||||||
www.lufa-lib.org
|
www.lufa-lib.org
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
Permission to use, copy, modify, distribute, and sell this
|
||||||
software and its documentation for any purpose is hereby granted
|
software and its documentation for any purpose is hereby granted
|
||||||
without fee, provided that the above copyright notice appear in
|
without fee, provided that the above copyright notice appear in
|
||||||
all copies and that both that the copyright notice and this
|
all copies and that both that the copyright notice and this
|
||||||
permission notice and warranty disclaimer appear in supporting
|
permission notice and warranty disclaimer appear in supporting
|
||||||
documentation, and that the name of the author not be used in
|
documentation, and that the name of the author not be used in
|
||||||
advertising or publicity pertaining to distribution of the
|
advertising or publicity pertaining to distribution of the
|
||||||
software without specific, written prior permission.
|
software without specific, written prior permission.
|
||||||
|
|
||||||
The author disclaim all warranties with regard to this
|
The author disclaim all warranties with regard to this
|
||||||
software, including all implied warranties of merchantability
|
software, including all implied warranties of merchantability
|
||||||
and fitness. In no event shall the author be liable for any
|
and fitness. In no event shall the author be liable for any
|
||||||
special, indirect or consequential damages or any damages
|
special, indirect or consequential damages or any damages
|
||||||
whatsoever resulting from loss of use, data or profits, whether
|
whatsoever resulting from loss of use, data or profits, whether
|
||||||
in an action of contract, negligence or other tortious action,
|
in an action of contract, negligence or other tortious action,
|
||||||
arising out of or in connection with the use or performance of
|
arising out of or in connection with the use or performance of
|
||||||
this software.
|
this software.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
*
|
*
|
||||||
* Header file for AndroidAccessoryCommands.c.
|
* Header file for AndroidAccessoryCommands.c.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _ANDROID_ACCESSORY_COMMANDS_H_
|
#ifndef _ANDROID_ACCESSORY_COMMANDS_H_
|
||||||
#define _ANDROID_ACCESSORY_COMMANDS_H_
|
#define _ANDROID_ACCESSORY_COMMANDS_H_
|
||||||
|
|
||||||
/* Includes: */
|
/* Includes: */
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
|
|
||||||
/* Enums: */
|
/* Enums: */
|
||||||
enum Android_Requests_t
|
enum Android_Requests_t
|
||||||
{
|
{
|
||||||
ANDROID_Req_GetAccessoryProtocol = 51,
|
ANDROID_Req_GetAccessoryProtocol = 51,
|
||||||
ANDROID_Req_SendString = 52,
|
ANDROID_Req_SendString = 52,
|
||||||
ANDROID_Req_StartAccessoryMode = 53,
|
ANDROID_Req_StartAccessoryMode = 53,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Android_Strings_t
|
enum Android_Strings_t
|
||||||
{
|
{
|
||||||
ANDROID_STRING_Manufacturer = 0,
|
ANDROID_STRING_Manufacturer = 0,
|
||||||
ANDROID_STRING_Model = 1,
|
ANDROID_STRING_Model = 1,
|
||||||
ANDROID_STRING_Description = 2,
|
ANDROID_STRING_Description = 2,
|
||||||
ANDROID_STRING_Version = 3,
|
ANDROID_STRING_Version = 3,
|
||||||
ANDROID_STRING_URI = 4,
|
ANDROID_STRING_URI = 4,
|
||||||
ANDROID_STRING_Serial = 5,
|
ANDROID_STRING_Serial = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Android_Protocols_t
|
enum Android_Protocols_t
|
||||||
{
|
{
|
||||||
ANDROID_PROTOCOL_Accessory = 0x0001,
|
ANDROID_PROTOCOL_Accessory = 0x0001,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Function Prototypes: */
|
/* Function Prototypes: */
|
||||||
uint8_t Android_GetAccessoryProtocol(uint16_t* const Protocol);
|
uint8_t Android_GetAccessoryProtocol(uint16_t* const Protocol);
|
||||||
uint8_t Android_SendString(const uint8_t StringIndex,
|
uint8_t Android_SendString(const uint8_t StringIndex,
|
||||||
char* String);
|
char* String);
|
||||||
uint8_t Android_StartAccessoryMode(void);
|
uint8_t Android_StartAccessoryMode(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -59,32 +59,40 @@
|
|||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
# MCU name
|
# MCU name - uncomment _ONE_ of the following
|
||||||
|
#MCU = at90usb647
|
||||||
MCU = at90usb1287
|
MCU = at90usb1287
|
||||||
|
|
||||||
|
|
||||||
# Target architecture (see library "Board Types" documentation).
|
|
||||||
ARCH = AVR8
|
|
||||||
|
|
||||||
|
|
||||||
# Target board (see library "Board Types" documentation, NONE for projects not requiring
|
|
||||||
# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
|
|
||||||
# "Board" inside the application directory.
|
|
||||||
BOARD = USBKEY
|
|
||||||
|
|
||||||
|
|
||||||
# Processor frequency.
|
# Processor frequency.
|
||||||
# This will define a symbol, F_CPU, in all source code files equal to the
|
# This will define a symbol, F_CPU, in all source code files equal to the
|
||||||
# processor frequency in Hz. You can then use this symbol in your source code to
|
# processor frequency. You can then use this symbol in your source code to
|
||||||
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
|
||||||
# automatically to create a 32-bit value in your source code.
|
# automatically to create a 32-bit value in your source code.
|
||||||
#
|
# Typical values are:
|
||||||
# This will be an integer division of F_USB below, as it is sourced by
|
# F_CPU = 8000000
|
||||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
# F_CPU = 16000000
|
||||||
# does not *change* the processor frequency - it should merely be updated to
|
F_CPU = 16000000
|
||||||
# reflect the processor speed set externally so that the code can use accurate
|
|
||||||
# software delays.
|
|
||||||
F_CPU = 8000000
|
# Target board:
|
||||||
|
# - USER for custom board drivers in LUFA/LUFA/Drivers/Board/Board/*
|
||||||
|
# - NONE for projects not requiring LUFA board drivers such as boards
|
||||||
|
# with no LEDs and just an HWB button such as: Micropendous1,
|
||||||
|
# Micropendous2, Micropendous3, or Micropendous4, Micropendous-32U2
|
||||||
|
# - MICROPENDOUS_REV1 for the Micropendous Arduino-like board with
|
||||||
|
# CY7C1019D external SRAM IC or its DIP variant:
|
||||||
|
# http://www.Micropendous.org/Micropendous-OTG
|
||||||
|
# http://www.Micropendous.org/Micropendous-DIP
|
||||||
|
# - MICROPENDOUS_REV2 for the Micropendous Arduino-like board with
|
||||||
|
# IS61C1024AL external SRAM IC:
|
||||||
|
# http://www.Micropendous.org/Micropendous
|
||||||
|
# Typical values are:
|
||||||
|
# BOARD = NONE
|
||||||
|
# BOARD = USER
|
||||||
|
# BOARD = MICROPENDOUS_REV1
|
||||||
|
# BOARD = MICROPENDOUS_REV2
|
||||||
|
BOARD = NONE
|
||||||
|
|
||||||
|
|
||||||
# Input clock frequency.
|
# Input clock frequency.
|
||||||
@@ -116,7 +124,7 @@ OBJDIR = .
|
|||||||
|
|
||||||
|
|
||||||
# Path to the LUFA library
|
# Path to the LUFA library
|
||||||
LUFA_PATH = ../../../..
|
LUFA_PATH = ../../libs/LUFA
|
||||||
|
|
||||||
|
|
||||||
# LUFA library compile-time options and predefined tokens
|
# LUFA library compile-time options and predefined tokens
|
||||||
|
|||||||
Reference in New Issue
Block a user