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)
|
||||
|
||||
Updated for compatibility with USBTest by Opendous Inc. 2011-10-26
|
||||
|
||||
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
|
||||
@@ -36,6 +38,15 @@
|
||||
|
||||
#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
|
||||
* 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. */
|
||||
void AndroidHost_Task(void)
|
||||
{
|
||||
uint16_t i = 0;
|
||||
|
||||
if (USB_HostState != HOST_STATE_Configured)
|
||||
return;
|
||||
|
||||
@@ -84,6 +97,14 @@ void AndroidHost_Task(void)
|
||||
Pipe_SelectPipe(ANDROID_DATA_IN_PIPE);
|
||||
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 */
|
||||
if (Pipe_IsINReceived())
|
||||
{
|
||||
@@ -93,22 +114,13 @@ void AndroidHost_Task(void)
|
||||
/* Check if data is in the pipe */
|
||||
if (Pipe_IsReadWriteAllowed())
|
||||
{
|
||||
uint8_t NextReceivedByte = Pipe_BytesInPipe();
|
||||
uint8_t LEDMask = LEDS_NO_LEDS;
|
||||
printf_P(PSTR(ESC_FG_YELLOW "\r\nBytes in Pipe = %d\r\n" ESC_FG_WHITE), (uint16_t)Pipe_BytesInPipe());
|
||||
|
||||
if (NextReceivedByte & 0x01)
|
||||
LEDMask |= LEDS_LED1;
|
||||
for (i = 0; i < ((uint16_t)Pipe_BytesInPipe()); i++) {
|
||||
printf_P(PSTR(ESC_FG_YELLOW "Received: 0x%02X\r\n" ESC_FG_WHITE), Pipe_Read_8());
|
||||
}
|
||||
|
||||
if (NextReceivedByte & 0x02)
|
||||
LEDMask |= LEDS_LED2;
|
||||
|
||||
if (NextReceivedByte & 0x04)
|
||||
LEDMask |= LEDS_LED3;
|
||||
|
||||
if (NextReceivedByte & 0x08)
|
||||
LEDMask |= LEDS_LED4;
|
||||
|
||||
LEDs_SetAllLEDs(LEDMask);
|
||||
LEDs_SetAllLEDs(LEDS_NO_LEDS);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -192,12 +204,20 @@ void EVENT_USB_Host_DeviceEnumerationComplete(void)
|
||||
}
|
||||
|
||||
/* 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_Description, "LUFA Android Demo");
|
||||
Android_SendString(ANDROID_STRING_Version, "1.0");
|
||||
Android_SendString(ANDROID_STRING_URI, "http://www.lufa-lib.org");
|
||||
Android_SendString(ANDROID_STRING_Serial, "0000000012345678");
|
||||
*/
|
||||
Android_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();
|
||||
return;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -37,6 +37,8 @@
|
||||
|
||||
#include "ConfigDescriptor.h"
|
||||
|
||||
#include "AndroidAccessoryHostGlobalVariables.h"
|
||||
|
||||
/** 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
|
||||
* with compatible devices.
|
||||
@@ -95,12 +97,20 @@ uint8_t ProcessConfigurationDescriptor(void)
|
||||
}
|
||||
|
||||
/* 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);
|
||||
// Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN,
|
||||
// DataINEndpoint->EndpointAddress, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||
// TODO: For some reason the EP address gets set to 0x8B --> EP 11, which does not exist
|
||||
Pipe_ConfigurePipe(ANDROID_DATA_IN_PIPE, EP_TYPE_BULK, PIPE_TOKEN_IN, 0x85, DataINEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||
|
||||
ADK_IN_EP_Address = (uint8_t)(DataINEndpoint->EndpointAddress);
|
||||
|
||||
/* Configure the Android Accessory data OUT pipe */
|
||||
Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
|
||||
DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||
// Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT,
|
||||
// DataOUTEndpoint->EndpointAddress, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||
// TODO: For some reason the EP address gets set to 0x0D --> EP 13, which does not exist
|
||||
Pipe_ConfigurePipe(ANDROID_DATA_OUT_PIPE, EP_TYPE_BULK, PIPE_TOKEN_OUT, 0x07, DataOUTEndpoint->EndpointSize, PIPE_BANK_SINGLE);
|
||||
|
||||
ADK_OUT_EP_Address = (uint8_t)(DataOUTEndpoint->EndpointAddress);
|
||||
|
||||
/* Valid data found, return success */
|
||||
return SuccessfulConfigRead;
|
||||
|
||||
@@ -59,32 +59,40 @@
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
|
||||
# MCU name
|
||||
# MCU name - uncomment _ONE_ of the following
|
||||
#MCU = at90usb647
|
||||
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.
|
||||
# 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
|
||||
# automatically to create a 32-bit value in your source code.
|
||||
#
|
||||
# This will be an integer division of F_USB below, as it is sourced by
|
||||
# F_USB after it has run through any CPU prescalers. Note that this value
|
||||
# does not *change* the processor frequency - it should merely be updated to
|
||||
# reflect the processor speed set externally so that the code can use accurate
|
||||
# software delays.
|
||||
F_CPU = 8000000
|
||||
# Typical values are:
|
||||
# F_CPU = 8000000
|
||||
# F_CPU = 16000000
|
||||
F_CPU = 16000000
|
||||
|
||||
|
||||
# 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.
|
||||
@@ -116,7 +124,7 @@ OBJDIR = .
|
||||
|
||||
|
||||
# Path to the LUFA library
|
||||
LUFA_PATH = ../../../..
|
||||
LUFA_PATH = ../../libs/LUFA
|
||||
|
||||
|
||||
# LUFA library compile-time options and predefined tokens
|
||||
|
||||
Reference in New Issue
Block a user