Future Technology Devices International Ltd. Accessing Android Open Accessory Mode with Vinculum-II Application Note AN_181 Document Reference No.: FT_000502 Version 1.0 Issue Date: 2011-08-22 This application note demonstrates how the VNC2 device can enable the Open Accessory Mode in compatible Android devices and transfer data to and from the Android device over USB. Future Technology Devices International Ltd (FTDI) Unit 1, 2 Seaward Place, Centurion Business Park, Glasgow, G41 1HH, United Kingdom Tel.: +44 (0) 141 429 2777 Fax: + 44 (0) 141 429 2758 E-Mail (Support): [email protected] Neither the whole nor any part of the information contained in, or the product described in this manual, may be adapted or reproduced in any material or electronic form without the prior written consent of the copyright holder. This product and its documentation are supplied on an as-is basis and no warranty as to their suitability for any particular purpose is either made or implied. Future Technology Devices International Ltd will not accept any claim for damages howsoever arising as a result of use or failure of this product. Your statutory rights are not affected. This product or any variant of it is not intended for use in any medical appliance, device or system in which the failure of the product might reasonably be expected to result in personal injury. This document provides preliminar y information that may be subject to change without notice. No freedom to use patents or other intellectual property rights is implied by the publication of this document. Future Technology Devices International Ltd, Unit 1, 2 Seaward Place, Centurion Business Park, Glasgow, G41 1HH, United Kingdom. Scotland Registered Number: SC136640 Copyright © 2011 Future Technology Devices International Limited ` 1 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Introduction Android Open Accessory Mode is a new feature in Android 3.1 (back-ported to 2.3.4) whereby a USB host device can connect to the Android device to allow data transfer to and from the Android device over USB. This application note demonstrates how the VNC2 device can enable the Open Accessory Mode in compatible Android devices and transfer data to and from the Android device over USB. The application note will demonstrate how the VNC2 drivers for Open Accessory Mode (available as of IDE version 1.4.2) are loaded onto the VNC2 and how a simple application accesses them. There will also be a small Android platform app to complete the demonstration. For development puposes a V2EVAL development board with V2EVAL-64 daughter card was used. http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_V2EVAL_Rev2.pdf for the VNC2 development. A Motorola Xoom running Android OS version 3.1 was used as the Android target. The demonstration shows the ability of the VNC2 to enumerate the Xoom device, interrogate the device to determine if it supports Open Accessory Mode, then enable the Open Accessory Mode and reenumerate the Xoom. When the USB link has been established the application running on the Xoom tablet will be able to control the LEDs on the V2EVAL platform, while the V2EVAL buttons will be able to control “LEDS” on the Android application GUI. Full source code and precompiled ROM files are provided on an as is basis. Figure 1.1 – V2-EVAL with daughter card 1.1 VNC2 Devices VNC2 is the second of FTDI’s Vinculum family of embedded dual USB host controller devices. The VNC2 device provides USB Host interfacing capability for a variety of different USB device classes including support for BOMS (bulk only mass storage), Printer and HID (human interface devices). For mass storage devices such as USB Flash drives, VNC2 transparently handles the FAT file structure. Communication with non USB devices, such as a low cost microcontroller, is accomplished via either UART, SPI or parallel FIFO interfaces. VNC2 provides a new, cost effective solution for providing USB Host capability into products that previously did not have the hardware resources available. VNC2 allows customers to develop their own firmware using the Vinculum II software development tool suite. These development tools provide compiler, assembler, linker and debugger tools complete within an integrated development environment (IDE). The Vinculum-II VNC2 family of devices are available in Pb-free (RoHS compliant) 32-lead LQFP, 32-lead QFN, 48-lead LQFP, 48-lead QFN, 64-Lead LQFP and 64-lead QFN packages For more information on the ICs refer to http://www.ftdichip.com/Products/ICs/VNC2.htm Copyright © 2011 Future Technology Devices International Limited 1 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 1.2 Motorola Xoom This application example uses a Motorola Xoom as the Android target. It was chosen for no other reason than it was readily available and already had Android OS 3.1 installed which is required for the Open Accessory Mode. Other Android platforms could be used instead. See: http://www.motorola.com/Consumers/GB-EN/Consumer-Products-and-Services/ANDROIDTABLETS/MOTOROLA-XOOM-with-Wi-Fi-GB-EN?WT.srch=1&WT.mc_id=EMEA_GB-EN_XOOM_Aug2011&WT.mc_ev=click For more information on the Motorola Xoom. Figure 1.2 – Motorola Xoom Tablet Copyright © 2011 Future Technology Devices International Limited 2 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Table of Contents 1 Introduction .................................................................... 1 1.1 VNC2 Devices ............................................................................ 1 1.2 Motorola Xoom .......................................................................... 2 2 Block Diagram ................................................................. 4 3 Demo .............................................................................. 5 4 3.1 Demo Setup .............................................................................. 5 3.2 Demo Description...................................................................... 5 Source code for the VNC2 Application ............................. 6 4.1 Android_ACC.C .......................................................................... 6 4.1.1 main() ..................................................................................................... 6 4.1.2 Iomux_setup() .......................................................................................... 6 4.1.3 Open drivers/close drivers .......................................................................... 7 4.1.4 USB_Host_Connect_state ........................................................................... 7 4.1.5 Android_attach/Android_detach .................................................................. 7 4.1.6 Firmware .................................................................................................. 7 4.1.7 Usb_host_processing ................................................................................. 7 4.1.8 PWM_Processing ....................................................................................... 7 5 Building and Loading the Firmware into the VNC2 .......... 8 6 The Android Application .................................................. 9 7 Running the Demo......................................................... 10 8 Contact Information ...................................................... 12 Appendix A – VNC2 Application Code ................................ 13 Android_Acc.c contents ................................................................... 13 Android_Acc_IOMUX.c Contents ...................................................... 23 Appendix B......................................................................... 26 Android JAVA Application ................................................................ 26 Appendix C – References ................................................... 35 Appendix D – List of Figures and Tables............................. 36 List of Figures ................................................................................. 36 Appendix E – Revision History ........................................... 37 Copyright © 2011 Future Technology Devices International Limited 3 ` 2 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Block Diagram This block diagram, Figure 2.1, shows the interconnect required for the demonstration. After the project ROM file is loaded onto the V2EVAL platform the development PC (red block) is not required. PC RUNNING IDE FOR DEVELOPMENT & DEBUG USB V2EVAL CN12 FT4232H DEBUGGER I/F PWM LEDS VNC2 USB PORT 1 CN1 USB MOTOROLA XOOM (ANDROID OS 3.1) GPIO BUTTONS Figure 2.1 – VNC2 open Accessory Mode Demo Block Diagram The ROM file (and source code) for this project can be viewed in appendix A and is available to download on an as is basis from: http://www.ftdichip.com/Support/SoftwareExamples/Android/vinco_android_acc.zip The .rom file can be found inside the “debug” directory of the .zip file Copyright © 2011 Future Technology Devices International Limited 4 ` 3 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Demo This section describe the demo setup. 3.1 Demo Setup CN12 of the V2EVAL platform allows the IDE on the developement PC to communicate with the VNC2 debugger port. This is also used to load the Rom file created by the IDE into the VNC2 chip. CN1 is the VNC2 USB port 1 which must be connected to the Android target (XOOM tablet). 3.2 Demo Description This demo uses LED1:LED5 LEDs, SW1:SW4 push buttons on VNC2. 4 LEDs and 4 push buttons are created on Android Tablet to duplicate the setup. LED1:LED4 and 4 LEDs on Android target are controlled by SW1:SW4 as well as 4 Buttons placed on Android Application. A button press, SW1:SW4 or on Android tablets, toggles the corresponding LED on VNC2 board as well as the Android Application. LED5 is controlled by Volume control bar on the Android Tablet. LED5 demonstrates volume up/down characteristic with varying brightness. LEDs, LED1:LED4 and push buttons SW1:SW4 are mapped to VNC2 GPIOs. PWM is implemented on LED5. As all the GPIO wiring is part of the V2EVAL platform the user only needs to provide a USB cable to connect to the developemtn PC and the XOOM tablet. Copyright © 2011 Future Technology Devices International Limited 5 ` 4 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Source code for the VNC2 Application All VNC2 application firmware follows a similar format and most of the code can be “written” using the IDE application wizard. The basic steps are: Initialise device drivers Define pinouts Open ports to be used Configure ports to be used Read/write data Close ports The VNC2 source code for this project can be viewed in appendix A and is available to download on an as is basis from: http://www.ftdichip.com/Support/SoftwareExamples/Android/vinco_android_acc.zip Note: A Precompiled ROM file is also downloadable at the same address for users not wishing to rebuild the project. The .rom file can be found inside the “debug” directory of the .zip file. 4.1 Android_ACC.C Android_ACC.c is the main firmware file. This file is split into multiple functions. void main(); void iomux_setup(void); void open_drivers(void); void close_drivers(void); unsigned char usbhost_connect_state(VOS_HANDLE hUSB) VOS_HANDLE android_attach(VOS_HANDLE hUSB, unsigned char devANDACC, char *manufacturer, char *model, char *description, char *version, char *uri, char *serial) void android_detach(VOS_HANDLE hANDACC) void usb_host_processing(); void firmware(); void pwm_processing(); 4.1.1 main() Main is where the application starts. It defines the VNC2 core clock speed, loads the drivers to be used and creates the threads to be used in the application. At the very end of main is the call vos_start_scheduler(); After this call there can be no further configuration of the device. 4.1.2 Iomux_setup() Iomux_setup actually refers to the other file in the project, andropid_acc_iomux.c and is used to define the VNC2 pinout. Most functions can be programmed to appear on different pins. The notable exceptions are power, GND and the USB ports. Copyright © 2011 Future Technology Devices International Limited 6 ` 4.1.3 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Open drivers/close drivers The open drivers function call will provide a handle to each hardware block used in the project and this handle can be used by subsequent commands to control the hardware. Close drivers closes the handle at the end of the project. 4.1.4 USB_Host_Connect_state USB_Host_Connect_State is a function to check if anything is connected to the USB host. 4.1.5 Android_attach/Android_detach As the VNC2 uses a layered architecture to control the drivers it is important to attach, detach the correct USB class driver to the USB host port. In this case the android class driver is beibg attached and detached. 4.1.6 Firmware The firmware function is monitoring/controlling the VNC2 GPIO. 4.1.7 Usb_host_processing USB_host_Processing is the section that interrogates the Android device as to whether it is capable of supporting open Accessory Mode and if it is, will enable it. 4.1.8 PWM_Processing As an extra feature the 5th LED can be made to show variable brightness by using the PWM interface of the VNC2. Copyright © 2011 Future Technology Devices International Limited 7 ` 5 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Building and Loading the Firmware into the VNC2 To build the application you simply press the Build button on the IDE ribbon bar under the build tab. Figure 5.1 – Vinculum II IDE Build Button Loading the code is equally simple. Just click on the “Flash” button on the ribbon bar under the debug tab. Figure 5.2 – Vinculum II IDE Flash Button Note the Debugger Interface is listed as V2EVAL Board C. It is important that this box shows a device is connected before attempting to flash a device. Note your debugger may have a different label. Copyright © 2011 Future Technology Devices International Limited 8 ` 6 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 The Android Application To complete the demonstration an application to run on the Android platform is also required. Source code for this can be viewed in Appendix B or downloaded on an as is basis from: http://www.ftdichip.com/Support/SoftwareExamples/Android/android_acc_appl.zip The source code is developed in JAVA as this is the standard for Android GUI applications. The project “.\android_acc_appl\LED” may be built using Eclipse tools (http://www.eclipse.org/jdt/ ) a free compiler from the web. The resultant ledactivity.apk may then be loaded onto the Android platform (XOOM). To load the application onto the Xoom tablet ensure the following settings are applied on the XOOM tablet. Settings-> Applications -> unknown sources is selected. Settings-> Applications ->Development -> USB Debug is selected to allow the application to be loaded over USB. Further help on using Eclipse to build Android applications can be found at: http://developer.android.com/guide/developing/projects/projects-eclipse.html Copyright © 2011 Future Technology Devices International Limited 9 ` 7 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Running the Demo Power up the V2EVAL board with the code loaded. Power up the XOOM tablet. Connect USB port 1 of the VNC2 (V2EVAL CN1) to the XOOM tablet. The application on the tablet will start automatically. Pressing SW1 on the V2EVAlL will illuminate/extinguish the left hand LED on the XOOM application. SW2, 3, 4 correspond to the next LED along. Pressing the left most button on the XOOM application will illuminate/extinguish LED1 on the V2EVAL PCB. The other buttons correspond to LED2, 3, 4. The volume control slider will control the brightness of LED 5 on the PCB. Figure 7.1 – Running the demo Note the slider does not have any code associated with it at this time. Copyright © 2011 Future Technology Devices International Limited 10 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Figure 7.2 – Running the demo 2 Copyright © 2011 Future Technology Devices International Limited 11 ` 8 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Contact Information Head Office – Glasgow, UK Future Technology Devices International Limited Unit 1, 2 Seaward Place, Centurion Business Park Glasgow, G41 1HH United Kingdom Tel: +44 (0) 141 429 2777 Fax: +44 (0) 141 429 2758 E-mail (Sales) [email protected] E-mail (Support) [email protected] E-mail (General Enquiries) [email protected] Web Site URL http://www.ftdichip.com Web Shop URL http://www.ftdichip.com Branch Office – Taipei, Taiwan Future Technology Devices International Limited (Taiwan) 2F, No 516, Sec. 1 NeiHu Road Taipei 114 Taiwan, R.O.C. Tel: +886 (0) 2 8791 3570 Fax: +886 (0) 2 8791 3576 E-mail (Sales) [email protected] E-mail (Support) [email protected] E-mail (General Enquiries) [email protected] Web Site URL http://www.ftdichip.com Branch Office – Hillsboro, Oregon, USA Future Technology Devices International Limited (USA) 7235 NW Evergreen Parkway, Suite 600 Hillsboro, OR 97123-5803 USA Tel: +1 (503) 547 0988 Fax: +1 (503) 547 0987 E-Mail (Sales) [email protected] E-Mail (Support) [email protected] E-Mail (General Enquiries) [email protected] Web Site URL http://www.ftdichip.com Branch Office – Shanghai, China Future Technology Devices International Limited (China) Room 408, 317 Xianxia Road, ChangNing District, ShangHai, China Tel: +86 (21) 62351596 Fax: +86(21) 62351595 E-Mail (Sales): [email protected] E-Mail (Support): [email protected] E-Mail (General Enquiries): [email protected] Web Site URL http://www.ftdichip.com Distributor and Sales Representatives Please visit the Sales Network page of the FTDI Web site for the contact details of our distributor(s) and sales representative(s) in your country. Copyright © 2011 Future Technology Devices International Limited 12 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Appendix A – VNC2 Application Code Source code for this project is provided on an “as is” basis and functionality is neither guaranteed or supported. The code has been verified as running on a Motorola Xoom platform, with Android OS 3.1. Also available from http://www.ftdichip.com/Support/SoftwareExamples/Android/vinco_android_acc.zip Android_Acc.c contents /* ** Filename: android_acc.c ** ** Automatically created by Application Wizard 1.4.2 ** ** Part of solution android_acc in project android_acc ** ** Comments: ** ** Important: Sections between markers "FTDI:S*" and "FTDI:E*" will be overwritten by ** the Application Wizard */ #include "android_acc.h" /* FTDI:STP Thread Prototypes */ vos_tcb_t *tcbusbFIRMWARE; vos_tcb_t *tcbpwmFIRMWARE; vos_tcb_t *tcbgpioFIRMWARE; void void void void firmware(); open_drivers(void); usb_host_processing(); pwm_processing(); /* FTDI:SDH Driver Handles */ VOS_HANDLE hUSBHOST_1; // USB Host Port 1 VOS_HANDLE hANDROID_ACCESSORY; // Android Open Accessory Class Driver VOS_HANDLE hGPIO_PORT_A; // GPIO Port A Driver VOS_HANDLE hGPIO_PORT_B; // GPIO Port B Driver VOS_HANDLE hPWM; // PWM Driver /* FTDI:EDH */ /*global variables*/ #define PWM_MAX_DUTY_CYCLE #define PWM_MIN_DUTY_CYCLE #define PWM_MAX_DUTY_COUNT 45 3 50 unsigned char u8PwmDutyCycle = 0; unsigned char u8Changed = 0; unsigned char u8AccesoryConnected = 0; /*accessory packet*/ android_accessory_packet gstAccPacketWrite; android_accessory_packet gstAccPacketRead; /* Declaration for IOMUx setup function */ void iomux_setup(void); /* Main code - entry point to firmware */ void main(void) Copyright © 2011 Future Technology Devices International Limited 13 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 { /* FTDI:SDD Driver Declarations */ // GPIO Port A configuration context gpio_context_t gpioContextA; // GPIO Port B configuration context gpio_context_t gpioContextB; // USB Host configuration context usbhost_context_t usbhostContext; /* FTDI:EDD */ /* FTDI:SKI Kernel Initialisation */ vos_init(50, VOS_TICK_INTERVAL, VOS_NUMBER_DEVICES); vos_set_clock_frequency(VOS_48MHZ_CLOCK_FREQUENCY); vos_set_idle_thread_tcb_size(512); /* FTDI:EKI */ iomux_setup(); /* FTDI:SDI Driver Initialisation */ // Initialise GPIO A gpioContextA.port_identifier = GPIO_PORT_A; gpio_init(VOS_DEV_GPIO_PORT_A,&gpioContextA); // Initialise GPIO B gpioContextB.port_identifier = GPIO_PORT_B; gpio_init(VOS_DEV_GPIO_PORT_B,&gpioContextB); // Initialise PWM pwm_init(VOS_DEV_PWM); // Initialise USB Host usbhostContext.if_count = 8; usbhostContext.ep_count = 16; usbhostContext.xfer_count = 2; usbhostContext.iso_xfer_count = 2; usbhost_init(VOS_DEV_USBHOST_1, -1, &usbhostContext); /* FTDI:EDI */ // init Android Accessory usbHostAndroidAccessory_init(VOS_DEV_ANDROID_ACCESSORY); /* FTDI:SCT Thread Creation */ tcbusbFIRMWARE = vos_create_thread_ex(20, 2048, usb_host_processing, "usbApplication", 0); tcbgpioFIRMWARE = vos_create_thread_ex(20, 1024, firmware, "gpioApplication", 0); tcbpwmFIRMWARE = vos_create_thread_ex(20, 1024, pwm_processing, "pwmApplication", 0); /* FTDI:ECT */ /*open the drivers*/ open_drivers(); /*enable the PWM interrupts*/ vos_enable_interrupts(VOS_PWM_TOP_INT_IEN); vos_start_scheduler(); main_loop: goto main_loop; } /* FTDI:SSP Support Functions */ Copyright © 2011 Future Technology Devices International Limited 14 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 unsigned char usbhost_connect_state(VOS_HANDLE hUSB) { unsigned char connectstate = PORT_STATE_DISCONNECTED; usbhost_ioctl_cb_t hc_iocb; if (hUSB) { hc_iocb.ioctl_code = VOS_IOCTL_USBHOST_GET_CONNECT_STATE; hc_iocb.get = &connectstate; vos_dev_ioctl(hUSB, &hc_iocb); } return connectstate; } VOS_HANDLE android_attach(VOS_HANDLE hUSB, unsigned char devANDACC, char *manufacturer, char *model, char *description, char *version, char *uri, char *serial) { common_ioctl_cb_t androidAccessory_cb; usbHostAndroidAccessory_ioctl_cb_attach_t atInfo; VOS_HANDLE hANDACC; hANDACC = vos_dev_open(devANDACC); atInfo.hc_handle = hUSB; atInfo.manufacturer = manufacturer; atInfo.model = model; atInfo.description = description; atInfo.version = version; atInfo.uri = uri; atInfo.serial = serial; androidAccessory_cb.ioctl_code = VOS_IOCTL_USBHOSTANDROIDACCESSORY_ATTACH; androidAccessory_cb.set.data = &atInfo; if (vos_dev_ioctl(hANDACC, &androidAccessory_cb) != USBHOSTANDROIDACCESSORY_OK) { vos_dev_close(hANDACC); hANDACC = NULL; } return hANDACC; } void android_detach(VOS_HANDLE hANDACC) { common_ioctl_cb_t androidAccessory_cb; if (hANDACC) { androidAccessory_cb.ioctl_code = VOS_IOCTL_USBHOSTANDROIDACCESSORY_DETACH; vos_dev_ioctl(hANDACC, &androidAccessory_cb); vos_dev_close(hANDACC); } } /* FTDI:ESP */ void open_drivers(void) { Copyright © 2011 Future Technology Devices International Limited 15 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 /* Code for opening and closing drivers - move to required places in Application Threads */ /* FTDI:SDA Driver Open */ hUSBHOST_1 = vos_dev_open(VOS_DEV_USBHOST_1); hGPIO_PORT_A = vos_dev_open(VOS_DEV_GPIO_PORT_A); hGPIO_PORT_B = vos_dev_open(VOS_DEV_GPIO_PORT_B); hPWM = vos_dev_open(VOS_DEV_PWM); //hANDROID_ACCESSORY = vos_dev_open(VOS_DEV_ANDROID_ACCESSORY); } void attach_drivers(void) { /* FTDI:SUA Layered Driver Attach Function Calls */ // Android Accessory Driver attach must specify various strings // Suggested values provided //char *manufacturer = "FTDI\0"; //char *model = "VNC2\0"; //char *description = "Vinculum Accessory Test\0"; //char *version = "0.1.0\0"; //char *uri = "http://www.ftdichip.com\0"; //char *serial = "VinculumAccessory1\0"; //hANDROID_ACCESSORY = android_attach(hUSBHOST_1, VOS_DEV_ANDROID_ACCESSORY, // manufacturer, model, description, version, uri, serial); /* FTDI:EUA */ } void close_drivers(void) { /* FTDI:SDB Driver Close */ vos_dev_close(hUSBHOST_1); vos_dev_close(hGPIO_PORT_A); vos_dev_close(hGPIO_PORT_B); vos_dev_close(hPWM); //vos_dev_close(hANDROID_ACCESSORY); /* FTDI:EDB */ } /* Application Threads */ #define #define #define #define #define PUSH_BUTTON1_MAP PUSH_BUTTON2_MAP PUSH_BUTTON3_MAP PUSH_BUTTON4_MAP PUSH_BUTTON5_MAP #define LED_BUTTON_MAP #define PUSH_BUTTON_MAP (0x02) //A1 (0x04) //A2 (0x08) //A3 (0x10) //A4 (0x08) //Not Connected (0x78) (0x1E) /*FIXME, this fix si done to clear the issue of wrong port read */ unsigned char u8PrevLedMap = 0x78; /*to handle the long press*/ unsigned char u8PrevKeyMap = 0x1E; /*temporary variable*/ unsigned char u8KeyMap = 0x1E; /*since there is only one timer, I dont know how its going to workout */ void usb_host_processing() Copyright © 2011 Future Technology Devices International Limited 16 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 { unsigned char i; unsigned char numRead = 0; usbhost_ioctl_cb_t common_ioctl_cb_t usbHostAndroidAccessory_ioctl_cb_attach_t unsigned char usbhost_iocb; androidAccessory_cb; atInfo; status; // setup strings for the accessory // the manufacturer, model and version strings should match those in the // application's accessory_filter.xml file! // This will allow the application to auto-launch when the accessory is // connected char *manufacturer = "FTDI\0"; char *model = "FTDIDemoKit\0"; char *description = "Vinculum Accessory Test\0"; char *version = "1.0\0"; char *uri = "http://www.ftdichip.com\0"; char *serial = "VinculumAccessory1\0"; uint8 u8Data; unsigned char ledState = 0; //gpio_ioctl_cb_t gpio_iocb; unsigned char portData = 0xFF; // LEDs on when low, off when high unsigned short protocolRevision = 0; while (1) { if(usbhost_connect_state(hUSBHOST_1)== PORT_STATE_ENUMERATED) { hANDROID_ACCESSORY = android_attach(hUSBHOST_1, VOS_DEV_ANDROID_ACCESSORY, manufacturer, model, description, version, uri, serial); if (hANDROID_ACCESSORY) { // successfully found and attached to an Android Accessory device // Write data to the GPIO port - bit 3 to toggle LED1 on V2EVAL board. vos_dev_write(hGPIO_PORT_B,&u8PrevLedMap, 1, NULL); // get the protocol revision - should be 0x0100 for now androidAccessory_cb.ioctl_code = VOS_IOCTL_USBHOSTANDROIDACCESSORY_GET_PROTOCOL_REVISION; androidAccessory_cb.get.data = &protocolRevision; status = vos_dev_ioctl(hANDROID_ACCESSORY, &androidAccessory_cb); if (protocolRevision != 0x100) { vos_halt_cpu(); } while (status == USBHOSTANDROIDACCESSORY_OK) { /*we are connected*/ u8AccesoryConnected = 1; // read a message from the Android device Copyright © 2011 Future Technology Devices International Limited 17 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 // wrap this in the accessory driver read function // NOTE: this call may return with less data than was requested // In this case, we are requesting 64 bytes to fill our buffer, // but our Android app will only send 1 byte! status = vos_dev_read(hANDROID_ACCESSORY,(uint8 *)&gstAccPacketRead, sizeof(gstAccPacketRead) , &numRead); if(numRead == sizeof(gstAccPacketRead)) { // process the message from the Android device if(gstAccPacketRead.u8Type == DATA_TYPE_KEYPAD) { /*update the led bitmap*/ u8Data = (gstAccPacketRead.u8Data << 3); u8Data &= LED_BUTTON_MAP; u8PrevLedMap ^= u8Data; vos_dev_write(hGPIO_PORT_B,&u8PrevLedMap, 1, NULL); } else if(gstAccPacketRead.u8Type == DATA_TYPE_SLIDER) { u8Changed = 1; u8PwmDutyCycle = gstAccPacketRead.u8Data; } } }/*while(status == USBHOSTANDROIDACCESSORY_OK)*/ /*we are disconnected*/ u8AccesoryConnected = 0; /*detach accessory*/ android_detach(hANDROID_ACCESSORY); u8PrevLedMap = LED_BUTTON_MAP; vos_dev_write(hGPIO_PORT_B, &u8PrevLedMap, 1, NULL); /*off the pwm led*/ u8Changed = 1; u8PwmDutyCycle = 0x00; /*wait unitl its uninstalled*/ while(usbhost_connect_state(hUSBHOST_1)== PORT_STATE_ENUMERATED) { vos_delay_msecs(10); } } /*if (hANDROID_ACCESSORY)*/ }/*if(usbhost_connect_state(VOS_HANDLE hUSB)== PORT_STATE_ENUMERATED)*/ } /*end of while 1*/ /*wait for sometime*/ vos_delay_msecs(10); Copyright © 2011 Future Technology Devices International Limited 18 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 } /* Application Threads */ void firmware() { /* Thread code to be added here */ unsigned char u8PortA = 0xF0; unsigned char u8PortB; unsigned char u8Temp; gpio_ioctl_cb_t gpio_ioca; // Set all pins to output using an ioctl. gpio_ioca.ioctl_code = VOS_IOCTL_GPIO_SET_MASK; gpio_ioca.value = 0x78; // Send the ioctl to the device manager. vos_dev_ioctl(hGPIO_PORT_B, &gpio_ioca); /*clear the LEDs*/ vos_dev_write(hGPIO_PORT_B,&u8PrevLedMap, 1, NULL); /*initialize the accessory, packet, for now it supports only leds*/ gstAccPacketWrite.u8Type = DATA_TYPE_KEYPAD; while(1) { //svos_dev_write(hGPIO_PORT_A, &u8PortA, 1, NULL); /*check the key press*/ vos_dev_read(hGPIO_PORT_A,&u8PortA, 1, NULL); /*take the one's cmplement*/ u8PortA = ~u8PortA; /*the high ones are pressed*/ u8PortA &= PUSH_BUTTON_MAP; /*check whether the key has been held*/ if(u8PortA == u8PrevKeyMap) continue; else u8PrevKeyMap = u8PortA; /*if any button pressed??*/ if(u8PortA) { /*look for new key*/ //u8PrevKeyMap = u8PortA; //u8ValidKey = 1; /*start the debounce of 200 msess, too much though*/ //wait_debounce(100); vos_delay_msecs(100); vos_dev_read(hGPIO_PORT_A, &u8Temp, 1, NULL); u8Temp = ~u8Temp; u8Temp &= PUSH_BUTTON_MAP; u8PortA &= u8Temp; /*check if any of the keys are presseed*/ Copyright © 2011 Future Technology Devices International Limited 19 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 if(u8PortA){ /* u8Changed = 1; if(u8PortA & PUSH_BUTTON1_MAP){ u8PwmDutyCycle++; }else if(u8PortA & PUSH_BUTTON2_MAP){ if(u8PwmDutyCycle !=0){ u8PwmDutyCycle--; } }else if(u8PortA & PUSH_BUTTON3_MAP){ u8PwmDutyCycle = 50; } */ /*led on positions*/ u8PortA <<= 2; /*read the port A again to check which leds are high*/ //vos_dev_read(hGPIO_PORT_A, &u8Temp, 1, NULL); //u8Temp1 &= 0xE0; /*just take the map of LEDs only*/ /*FIXME, this fix si done to clear the issue of wrong port read */ u8PrevLedMap ^= u8PortA; vos_dev_write(hGPIO_PORT_B,&u8PrevLedMap, 1, NULL); /*prepare the packet*/ gstAccPacketWrite.u8Data = (u8PortA >> 3); if(u8AccesoryConnected == 1){ /*send the usb data accross*/ vos_dev_write(hANDROID_ACCESSORY,(uint8 *)&gstAccPacketWrite, sizeof(gstAccPacketWrite), NULL); } } } } /*end of while */ }/*end of firmware*/ void pwm_processing() { pwm_ioctl_cb_t pwm_iocb; uint16 u16OnTime = 500; // set counter prescaler value pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_PRESCALER_VALUE; pwm_iocb.count.prescaler = 0x01; vos_dev_ioctl(hPWM, &pwm_iocb); /*FIXME, keep it like this, till I find a better way to enable/disable pwm */ while(1) { /*max is 50*/ if(u8PwmDutyCycle > PWM_MAX_DUTY_COUNT){ pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_INITIAL_STATE; Copyright © 2011 Future Technology Devices International Limited 20 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 pwm_iocb.output.init_state_mask = 0x00; vos_dev_ioctl(hPWM, &pwm_iocb); vos_delay_msecs(10); continue; } /*take care of minimum duty cycle*/ //if(u8PwmDutyCycle < PWM_MIN_DUTY_CYCLE){ // u8PwmDutyCycle = PWM_MIN_DUTY_CYCLE; //} /*calculate the ON time*/ /*take care of the overflow*/ if(u8PwmDutyCycle < PWM_MIN_DUTY_CYCLE){ pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_INITIAL_STATE; pwm_iocb.output.init_state_mask = 0xff; vos_dev_ioctl(hPWM, &pwm_iocb); vos_delay_msecs(10); continue; }else{ u16OnTime = (1000*u8PwmDutyCycle)/PWM_MAX_DUTY_COUNT; u16OnTime = (u16OnTime*48); } // ******************************************************************* // Setting a count value of 0x00A0 with toggles at 0x0010 and 0x0060 // will give a 50% duty cycle // ******************************************************************* // set counter value - cycle complete when internal counter reaches this value pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_COUNTER_VALUE; pwm_iocb.count.value = 0xbb80;/*for 1 khz*/ vos_dev_ioctl(hPWM, &pwm_iocb); // set comparator 0 value - toggle output at a value of 0x0010 pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_COMPARATOR_VALUE; pwm_iocb.identifier.comparator_number = COMPARATOR_0; pwm_iocb.comparator.value = u16OnTime;//0x0960; /*50 % duty cycle*/ vos_dev_ioctl(hPWM, &pwm_iocb); // set comparator 1 value - toggle output at a value of 0x0060 pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_COMPARATOR_VALUE; pwm_iocb.identifier.comparator_number = COMPARATOR_1; pwm_iocb.comparator.value = 0xbb80;// vos_dev_ioctl(hPWM, &pwm_iocb); // enable comparators 0 and 1 for PWM 3 // this will cause PWM output 1 to toggle on comparators 0 and 1 Copyright © 2011 Future Technology Devices International Limited 21 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_OUTPUT_TOGGLE_ENABLES; pwm_iocb.identifier.pwm_number = PWM_3; pwm_iocb.output.enable_mask = (MASK_COMPARATOR_0 | MASK_COMPARATOR_1); vos_dev_ioctl(hPWM, &pwm_iocb); // set initial state - all PWM outputs will be low (0) initially pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_INITIAL_STATE; if(u8PwmDutyCycle < PWM_MIN_DUTY_CYCLE){ pwm_iocb.output.init_state_mask = 0xff; }else{ pwm_iocb.output.init_state_mask = 0x00; } vos_dev_ioctl(hPWM, &pwm_iocb); // set restore state - PWM output 3 will return to low state (0) // at end of cycle pwm_iocb.ioctl_code = VOS_IOCTL_PWM_RESTORE_INITIAL_STATE; pwm_iocb.output.restore_state_mask = (MASK_PWM_0); vos_dev_ioctl(hPWM, &pwm_iocb); // set mode to 25 cycles pwm_iocb.ioctl_code = VOS_IOCTL_PWM_SET_NUMBER_OF_CYCLES; pwm_iocb.output.mode = 0x50; vos_dev_ioctl(hPWM, &pwm_iocb); while(1) { // enable interrupt - this will fire when the specified number of // cycles is complete pwm_iocb.ioctl_code = VOS_IOCTL_PWM_ENABLE_INTERRUPT; vos_dev_ioctl(hPWM, &pwm_iocb); // enable output // if(u8PwmDutyCycle > PWM_MIN_DUTY_CYCLE){ pwm_iocb.ioctl_code = VOS_IOCTL_PWM_ENABLE_OUTPUT; vos_dev_ioctl(hPWM, &pwm_iocb); // } // wait on interrupt pwm_iocb.ioctl_code = VOS_IOCTL_PWM_WAIT_ON_COMPLETE; vos_dev_ioctl(hPWM, &pwm_iocb); // disable output pwm_iocb.ioctl_code = VOS_IOCTL_PWM_DISABLE_OUTPUT; vos_dev_ioctl(hPWM, &pwm_iocb); if(u8Changed == 1){ u8Changed = 0; // /*goto the external loop*/ break; } Copyright © 2011 Future Technology Devices International Limited 22 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 } } } Android_Acc_IOMUX.c Contents /* ** Filename: android_acc_iomux.c ** ** Automatically created by Application Wizard 1.4.2 ** ** Part of solution android_acc in project android_acc ** ** Comments: ** ** Important: Sections between markers "FTDI:S*" and "FTDI:E*" will be overwritten by ** the Application Wizard */ #include "vos.h" void iomux_setup(void) { /* FTDI:SIO IOMux Functions */ unsigned char packageType; packageType = vos_get_package_type(); if (packageType == VINCULUM_II_64_PIN) { // Debugger to pin 11 as Bi-Directional. vos_iomux_define_bidi(199, IOMUX_IN_DEBUGGER, IOMUX_OUT_DEBUGGER); /*input switched*/ // GPIO_Port_A_1 to pin 12 as Input. vos_iomux_define_input(12, IOMUX_IN_GPIO_PORT_A_1); vos_iocell_set_config(12,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_ TRIGGER_NORMAL,VOS_IOCELL_SLEW_RATE_SLOW, VOS_IOCELL_PULL_UP_75K); // GPIO_Port_A_2 to pin 13 as Input. vos_iomux_define_input(13, IOMUX_IN_GPIO_PORT_A_2); vos_iocell_set_config(13,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ NORMAL,VOS_IOCELL_SLEW_RATE_SLOW, VOS_IOCELL_PULL_UP_75K); // GPIO_Port_A_3 to pin 14 as Input. vos_iomux_define_input(14, IOMUX_IN_GPIO_PORT_A_3); vos_iocell_set_config(14,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ NORMAL,VOS_IOCELL_SLEW_RATE_SLOW, VOS_IOCELL_PULL_UP_75K); // GPIO_Port_B_3 to pin 32 as Input. //vos_iomux_define_input(32, IOMUX_IN_GPIO_PORT_B_3); //vos_iocell_set_config(32,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER _NORMAL, //VOS_IOCELL_SLEW_RATE_SLOW, VOS_IOCELL_PULL_UP_75K); // GPIO_Port_B_4 to pin 51 as Input. vos_iomux_define_input(51, IOMUX_IN_GPIO_PORT_A_4); vos_iocell_set_config(51,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ Copyright © 2011 Future Technology Devices International Limited 23 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 NORMAL,VOS_IOCELL_SLEW_RATE_SLOW, VOS_IOCELL_PULL_UP_75K); // FIFO_Data_0 to pin 15 as Bi-Directional. vos_iomux_define_bidi(15, IOMUX_IN_FIFO_DATA_0, IOMUX_OUT_FIFO_DATA_0); // FIFO_Data_1 to pin 16 as Bi-Directional. vos_iomux_define_bidi(16, IOMUX_IN_FIFO_DATA_1, IOMUX_OUT_FIFO_DATA_1); // FIFO_Data_2 to pin 17 as Bi-Directional. vos_iomux_define_bidi(17, IOMUX_IN_FIFO_DATA_2, IOMUX_OUT_FIFO_DATA_2); // FIFO_Data_3 to pin 18 as Bi-Directional. vos_iomux_define_bidi(18, IOMUX_IN_FIFO_DATA_3, IOMUX_OUT_FIFO_DATA_3); // FIFO_Data_4 to pin 19 as Bi-Directional. vos_iomux_define_bidi(19, IOMUX_IN_FIFO_DATA_4, IOMUX_OUT_FIFO_DATA_4); // FIFO_Data_5 to pin 20 as Bi-Directional. vos_iomux_define_bidi(20, IOMUX_IN_FIFO_DATA_5, IOMUX_OUT_FIFO_DATA_5); // FIFO_Data_6 to pin 22 as Bi-Directional. vos_iomux_define_bidi(22, IOMUX_IN_FIFO_DATA_6, IOMUX_OUT_FIFO_DATA_6); // FIFO_Data_7 to pin 23 as Bi-Directional. vos_iomux_define_bidi(23, IOMUX_IN_FIFO_DATA_7, IOMUX_OUT_FIFO_DATA_7); // GPIO_Port_B_0 to pin 24 as Output. vos_iomux_define_output(24, IOMUX_OUT_GPIO_PORT_B_0); // FIFO_TXE_N to pin 25 as Output. vos_iomux_define_output(25, IOMUX_OUT_FIFO_TXE_N); // FIFO_RD_N to pin 26 as Input. vos_iomux_define_input(26, IOMUX_IN_FIFO_RD_N); // FIFO_WR_N to pin 27 as Input. vos_iomux_define_input(27, IOMUX_IN_FIFO_WR_N); // FIFO_OE_N to pin 28 as Input. vos_iomux_define_input(28, IOMUX_IN_FIFO_OE_N); // UART_DSR_N to pin 29 as Input. vos_iomux_define_input(29, IOMUX_IN_UART_DSR_N); // UART_DCD to pin 31 as Input. vos_iomux_define_input(31, IOMUX_IN_UART_DCD); // UART_TXD to pin 39 as Output. vos_iomux_define_output(39, IOMUX_OUT_UART_TXD); // UART_RXD to pin 40 as Input. vos_iomux_define_input(40, IOMUX_IN_UART_RXD); // UART_RTS_N to pin 41 as Output. vos_iomux_define_output(41, IOMUX_OUT_UART_RTS_N); // UART_CTS_N to pin 42 as Input. vos_iomux_define_input(42, IOMUX_IN_UART_CTS_N); // UART_DTR_N to pin 43 as Output. vos_iomux_define_output(43, IOMUX_OUT_UART_DTR_N); // UART_DSR_N to pin 44 as Input. vos_iomux_define_input(44, IOMUX_IN_UART_DSR_N); // UART_DCD to pin 45 as Input. vos_iomux_define_input(45, IOMUX_IN_UART_DCD); // UART_RI to pin 46 as Input. vos_iomux_define_input(46, IOMUX_IN_UART_RI); // UART_TX_Active to pin 47 as Output. vos_iomux_define_output(47, IOMUX_OUT_UART_TX_ACTIVE); // SPI_Slave_0_MOSI to pin 52 as Input. vos_iomux_define_input(52, IOMUX_IN_SPI_SLAVE_0_MOSI); // SPI_Slave_0_MISO to pin 55 as Output. vos_iomux_define_output(55, IOMUX_OUT_SPI_SLAVE_0_MISO); // SPI_Slave_1_CLK to pin 57 as Input. vos_iomux_define_input(57, IOMUX_IN_SPI_SLAVE_1_CLK); // SPI_Slave_1_MOSI to pin 58 as Input. vos_iomux_define_input(58, IOMUX_IN_SPI_SLAVE_1_MOSI); // SPI_Slave_1_MISO to pin 59 as Output. vos_iomux_define_output(59, IOMUX_OUT_SPI_SLAVE_1_MISO); // SPI_Slave_1_CS to pin 60 as Input. Copyright © 2011 Future Technology Devices International Limited 24 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 vos_iomux_define_input(60, IOMUX_IN_SPI_SLAVE_1_CS); // PWM_3 to pin 56 as Output. vos_iomux_define_output(64, IOMUX_OUT_PWM_3); // PWM_0 to pin 61 as Output. vos_iomux_define_output(56, IOMUX_OUT_GPIO_PORT_B_3); vos_iocell_set_config(56,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ NORMAL,VOS_IOCELL_SLEW_RATE_FAST, VOS_IOCELL_PULL_NONE); // GPIO_Port_A_5 to pin 62 as Output. vos_iomux_define_output(61, IOMUX_OUT_GPIO_PORT_B_4); vos_iocell_set_config(61,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ NORMAL,VOS_IOCELL_SLEW_RATE_FAST, VOS_IOCELL_PULL_NONE); // GPIO_Port_A_6 to pin 63 as Output. vos_iomux_define_output(62, IOMUX_OUT_GPIO_PORT_B_5); vos_iocell_set_config(62,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ NORMAL,VOS_IOCELL_SLEW_RATE_FAST, VOS_IOCELL_PULL_NONE); // GPIO_Port_A_7 to pin 64 as Output. vos_iomux_define_output(63, IOMUX_OUT_GPIO_PORT_B_6); vos_iocell_set_config(63,VOS_IOCELL_DRIVE_CURRENT_4MA,VOS_IOCELL_TRIGGER_ NORMAL,VOS_IOCELL_SLEW_RATE_FAST, VOS_IOCELL_PULL_NONE); } /* FTDI:EIO */ } Copyright © 2011 Future Technology Devices International Limited 25 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Appendix B Android JAVA Application Also available from http://www.ftdichip.com/Support/SoftwareExamples/Android/android_acc_appl.zip package FTDI.LED; import import import import java.io.FileDescriptor; java.io.FileInputStream; java.io.FileOutputStream; java.io.IOException; import import import import import import import import import import import import import import import import import import import import import FTDI.LED.R.drawable; android.app.Activity; android.app.AlertDialog; android.app.PendingIntent; android.content.BroadcastReceiver; android.content.Context; android.content.DialogInterface; android.content.Intent; android.content.IntentFilter; android.hardware.usb.UsbAccessory; android.hardware.usb.UsbManager; android.os.Bundle; android.os.Handler; android.os.Message; android.os.ParcelFileDescriptor; android.util.Log; android.view.View; android.widget.ImageButton; android.widget.ImageView; android.widget.ProgressBar; android.widget.SeekBar; public class LEDActivity extends Activity{ private static final String ACTION_USB_PERMISSION = "FTDI.LED.USB_PERMISSION"; public UsbManager usbmanager; public UsbAccessory usbaccessory; public PendingIntent mPermissionIntent; public ParcelFileDescriptor filedescriptor; public FileInputStream inputstream; public FileOutputStream outputstream; public boolean mPermissionRequestPending = true; //public Handler usbhandler; public byte[] usbdata; public byte[] writeusbdata; public byte ledPrevMap = 0x00; //public byte[] usbdataIN; public SeekBar volumecontrol; public ProgressBar slider; public public public public ImageButton ImageButton ImageButton ImageButton button1; button2; button3; button4; //Button //Button //Button //Button led1; led2; led3; led4; Copyright © 2011 Future Technology Devices International Limited 26 ` public public public public public ImageView ImageView ImageView ImageView ImageView Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 led1; led2; led3; led4; ledvolume; public int readcount; /*thread to listen USB data*/ public handler_thread handlerThread; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); usbdata = new byte[4]; writeusbdata = new byte[4]; usbmanager = (UsbManager) getSystemService(Context.USB_SERVICE); Log.d("LED", "usbmanager" +usbmanager); mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED); Log.d("LED", "filter" +filter); registerReceiver(mUsbReceiver, filter); led1 = (ImageView) findViewById(R.id.LED1); led2 = (ImageView) findViewById(R.id.LED2); led3 = (ImageView) findViewById(R.id.LED3); led4 = (ImageView) findViewById(R.id.LED4); button1 = (ImageButton) findViewById(R.id.Button1); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { byte ibutton = 0x01; Log.d("LED", "Button 1 pressed"); ledPrevMap ^= 0x01; if((ledPrevMap & 0x01) == 0x01){ led1.setImageResource(drawable.image100); } else{ led1.setImageResource(drawable.image0); } //v.bringToFront(); WriteUsbData(ibutton); } }); button2 = (ImageButton) findViewById(R.id.Button2); button2.setOnClickListener(new View.OnClickListener() { Copyright © 2011 Future Technology Devices International Limited 27 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 public void onClick(View v) { byte ibutton = 0x02; //v.bringToFront(); ledPrevMap ^= 0x02; if((ledPrevMap & 0x02) == 0x02){ led2.setImageResource(drawable.image100); } else{ led2.setImageResource(drawable.image0); } WriteUsbData(ibutton); } }); button3 = (ImageButton) findViewById(R.id.Button3); button3.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { byte ibutton = 0x04; //v.bringToFront(); ledPrevMap ^= 0x04; if((ledPrevMap & 0x04) == 0x04){ led3.setImageResource(drawable.image100); } else{ led3.setImageResource(drawable.image0); } WriteUsbData(ibutton); } }); button4 = (ImageButton) findViewById(R.id.Button4); button4.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { byte ibutton = 0x08; //v.bringToFront(); ledPrevMap ^= 0x08; if((ledPrevMap & 0x08) == 0x08){ led4.setImageResource(drawable.image100); } else{ led4.setImageResource(drawable.image0); } WriteUsbData(ibutton); } }); volumecontrol = (SeekBar)findViewById(R.id.seekBar1); //set the max value to 50 volumecontrol.setMax(50); Copyright © 2011 Future Technology Devices International Limited 28 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 volumecontrol.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { writeusbdata[0] = 1; writeusbdata[1] = 1; writeusbdata[2] = 2; writeusbdata[3] = (byte) progress; try { if(outputstream != null) { outputstream.write(writeusbdata,0,4); } } catch (IOException e) { } ledvolume = (ImageView) findViewById(R.id.LEDvolume); if(progress == 0) { ledvolume.setImageResource(drawable.image0); } else if(progress > 0 && (int)progress < 11) { ledvolume.setImageResource(drawable.image10); } else if (progress > 10 && progress < 21) { ledvolume.setImageResource(drawable.image20); } else if (progress > 20 && progress < 36) { ledvolume.setImageResource(drawable.image35); } else if (progress > 35 && progress < 51) { ledvolume.setImageResource(drawable.image50); } else if (progress > 50 && progress < 66) { ledvolume.setImageResource(drawable.image65); } else if (progress > 65 && progress < 76) { ledvolume.setImageResource(drawable.image75); } else if (progress > 75 && progress < 91) Copyright © 2011 Future Technology Devices International Limited 29 Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 ` { ledvolume.setImageResource(drawable.image90); } else { ledvolume.setImageResource(drawable.image100); } } }); } @Override public void onResume() { super.onResume(); Intent intent = getIntent(); if (inputstream != null && outputstream != null) { return; } UsbAccessory[] accessories = usbmanager.getAccessoryList(); UsbAccessory accessory = (accessories == null ? null : accessories[0]); if (accessory != null) { if (usbmanager.hasPermission(accessory)) { OpenAccessory(accessory); } else { synchronized (mUsbReceiver) { if (!mPermissionRequestPending) { usbmanager.requestPermission(accessory, mPermissionIntent); mPermissionRequestPending = true; } } } } else {} } @Override public void onDestroy() { unregisterReceiver(mUsbReceiver); //CloseAccessory(); super.onDestroy(); } /*open the accessory*/ private void OpenAccessory(UsbAccessory accessory) { filedescriptor = usbmanager.openAccessory(accessory); if(filedescriptor != null){ usbaccessory = accessory; FileDescriptor fd = filedescriptor.getFileDescriptor(); inputstream = new FileInputStream(fd); outputstream = new FileOutputStream(fd); /*check if any of them are null*/ if(inputstream == null || outputstream==null){ return; } Copyright © 2011 Future Technology Devices International Limited 30 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 } handlerThread = new handler_thread(handler, inputstream); handlerThread.start(); } /*end OpenAccessory*/ public void ReadUsbData() { if(usbdata[0] == 0) { /* led1 = (ImageView) findViewById(R.id.LED1); led2 = (ImageView) findViewById(R.id.LED2); led3 = (ImageView) findViewById(R.id.LED3); led4 = (ImageView) findViewById(R.id.LED4); */ ledPrevMap ^= usbdata[3]; usbdata[3] = ledPrevMap; if((usbdata[3]& 0x01) == 0x01) { led1.setImageResource(drawable.image100); } else{ led1.setImageResource(drawable.image0); } if((usbdata[3]& 0x02) == 0x02){ led2.setImageResource(drawable.image100); }else{ led2.setImageResource(drawable.image0); } if((usbdata[3]& 0x04) == 0x04){ led3.setImageResource(drawable.image100); }else{ led3.setImageResource(drawable.image0); } if((usbdata[3]& 0x08) == 0x08){ led4.setImageResource(drawable.image100); }else{ led4.setImageResource(drawable.image0); } } else if (usbdata[0] == 1) { ledvolume = (ImageView) findViewById(R.id.LEDvolume); if((int)usbdata[3] == 0) { ledvolume.setImageResource(drawable.image0); } else if((int)usbdata[3] > 0 && (int)usbdata[3] < 11) { ledvolume.setImageResource(drawable.image10); } else if ((int)usbdata[3] > 10 && (int)usbdata[3] < 21) { ledvolume.setImageResource(drawable.image20); } else if ((int)usbdata[3] > 20 && (int)usbdata[3] < 36) { Copyright © 2011 Future Technology Devices International Limited 31 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 ledvolume.setImageResource(drawable.image35); } else if ((int)usbdata[3] > 35 && (int)usbdata[3] < 51) { ledvolume.setImageResource(drawable.image50); } else if ((int)usbdata[3] > 50 && (int)usbdata[3] < 66) { ledvolume.setImageResource(drawable.image65); } else if ((int)usbdata[3] > 65 && (int)usbdata[3] < 76) { ledvolume.setImageResource(drawable.image75); } else if ((int)usbdata[3] > 75 && (int)usbdata[3] < 91) { ledvolume.setImageResource(drawable.image90); } else { ledvolume.setImageResource(drawable.image100); } } } private void CloseAccessory() { try{ filedescriptor.close(); }catch (IOException e){} try { inputstream.close(); } catch(IOException e){} try { outputstream.close(); }catch(IOException e){} /*FIXME, add the notfication also to close the application*/ //unregisterReceiver(mUsbReceiver); //CloseAccessory(); //super.onDestroy(); filedescriptor = null; inputstream = null; outputstream = null; System.exit(0); } final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { ReadUsbData(); } }; Copyright © 2011 Future Technology Devices International Limited 32 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 private class handler_thread extends Thread { Handler mHandler; FileInputStream instream; handler_thread(Handler h,FileInputStream stream ){ mHandler = h; instream = stream; } public void run() { while(true) { Message msg = mHandler.obtainMessage(); try{ if(instream != null) { readcount = instream.read(usbdata,0,4); if(readcount > 0) { msg.arg1 = usbdata[0]; msg.arg2 = usbdata[3]; } mHandler.sendMessage(msg); } }catch (IOException e){} } } } public void WriteUsbData(byte iButton){ writeusbdata[0] = 0; writeusbdata[1] = 1; writeusbdata[2] = 2; writeusbdata[3] = iButton; Log.d("LED", "pressed " +iButton); try{ if(outputstream != null){ outputstream.write(writeusbdata,0,4); } } catch (IOException e) {} } private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { OpenAccessory(accessory); Copyright © 2011 Future Technology Devices International Limited 33 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 } else { Log.d("LED", "permission denied for accessory "+ accessory); } mPermissionRequestPending = false; } } else if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) { UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); if (accessory != null )//&& accessory.equals(usbaccessory)) { CloseAccessory(); } }else { Log.d("LED", "...."); } } }; }; Copyright © 2011 Future Technology Devices International Limited 34 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Appendix C – References Application and Technical Notes available at http://www.ftdichip.com/Support/Documents/AppNotes.htm VNC2 Datasheet http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_Vinculum-II.pdf V2-EVAL datasheet http://www.ftdichip.com/Support/Documents/DataSheets/Modules/DS_V2EVAL_Rev2.pdf Vinculum II Toolchain http://www.ftdichip.com/Firmware/vnc2toolchain/Vinculum%20II%20Installer%20V1.4.2.exe AN_139 IO_Mux explained http://www.ftdichip.com/Support/Documents/AppNotes/AN_139_VinculumII%20IO_Mux%20Explained.pdf AN_140 PWM Example http://www.ftdichip.com/Support/Documents/AppNotes/AN_140_Vinculum-II_PWM_Example.pdf AN_151 Vinculum II User Guide http://www.ftdichip.com/Support/Documents/AppNotes/AN_151%20Vinculum%20II%20User%20Gui de.pdf TN_133_ Vimculum II toolchain Release Notes http://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_133_Vinculum_II_Toolchain_Releas e_Notes.pdf Eclipse JAVA Development tools http://www.eclipse.org/jdt/ Managing Android Apps from Eclipse http://developer.android.com/guide/developing/projects/projects-eclipse.html XOOM Tablets http://www.motorola.com/Consumers/GB-EN/Consumer-Products-and-Services/ANDROIDTABLETS/MOTOROLA-XOOM-with-Wi-Fi-GB-EN?WT.srch=1&WT.mc_id=EMEA_GB-EN_XOOM_Aug2011&WT.mc_ev=click Copyright © 2011 Future Technology Devices International Limited 35 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Appendix D – List of Figures and Tables List of Figures Figure 1.1 – V2-EVAL with daughter card ......................................................................................... 1 Figure 1.2 – Motorola Xoom Tablet ................................................................................................. 2 Figure 2.1 – VNC2 open Accessory Mode Demo Block Diagram ........................................................... 4 Figure 5.1 – Vinculum II IDE Build Button ........................................................................................ 8 Figure 5.2 – Vinculum II IDE Flash Button ....................................................................................... 8 Figure 7.1 – Running the demo .................................................................................................... 10 Figure 7.2 – Running the demo 2 .................................................................................................. 11 Copyright © 2011 Future Technology Devices International Limited 36 ` Document Reference No.: FT_000502 AN_181 Accessing Android Open Accessory Mode with Vinculum-II Version 1.0 Clearance No.: FTDI# 218 Appendix E – Revision History Version 1.0 First release Copyright © 2011 Future Technology Devices International Limited 22nd Aug 2011 37