Future Technology Devices International Ltd. Technical Note TN_132 Adding FTDI Devices VCP Driver Support to Android Document Reference No.: FT_000491 Version 1.1 Issue Date: 2011-08-25 This document describes the steps necessary to include the FTDI VCP driver for FTxxxx devices in an Android operating system build. Future Technology Devices International Limited (FTDI) Unit 1, 2 Seaward Place, Glasgow G41 1HH, United Kingdom Tel.: +44 (0) 141 429 2777 Fax: + 44 (0) 141 429 2758 E-Mail (Support): [email protected] Web: http://www.ftdichip.com Copyright © 2011 Future Technology Devices International Limited Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 Table of Contents 1 Introduction .................................................................... 2 2 Building A Kernel With FTDI VCP Driver Support Included 3 2.1 Prerequisites ............................................................................. 3 2.2 Configuring the Kernel .............................................................. 3 2.3 Building the Kernel ................................................................... 5 3 Modifying A Pre-Compiled Kernel To Include The FTDI VCP Driver Kernel Module .................................................... 6 3.1 Prerequisites ............................................................................. 6 3.2 Obtaining The Correct Kernel Source ........................................ 6 3.3 Configuring The Kernel ............................................................. 8 3.4 Building And Inserting The Kernel Module .............................. 10 4 Permissions................................................................... 12 5 Accessing The COM Port Via Java APIs .......................... 13 6 Contact Information ...................................................... 14 7 Appendix A – References............................................... 16 Document References ..................................................................... 16 Acronyms and Abbreviations ........................................................... 16 8 Appendix B – List of Tables & Figures ........................... 17 9 Appendix C – Revision History....................................... 18 Copyright © 2011 Future Technology Devices International Limited 1 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 1 Introduction The Android OS shares its kernel with the Linux OS. Linux supports serial ports, including USB serial ports, via kernel modules. Since the Linux kernel includes a kernel module to communicate with FTDI’s FTxxxx devices via a serial port interface it is possible to build that same support into a kernel for the Android OS. As the driver forms part of the kernel image for an embedded system, it is not a straightforward case of copying a driver file to a handset to enable this functionality. The developer needs to be in control of the OS at the source code level in order to include this functionality. This document presents two alternative methods of including VCP support for FTDI devices in the Android OS; the first considers building a complete kernel image including the FTDI VCP driver module, the second addresses building a compatible FTDI kernel module and inserting it in to a functional kernel. Customers wishing to support the FT232H device should note that support for this IC is included in kernel 2.6.39 and later. All other devices are supported from kernel 2.6.31. Copyright © 2011 Future Technology Devices International Limited 2 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 2 Building A Kernel With FTDI VCP Driver Support Included This section describes how to build FTDI VCP driver support in to a kernel image when building the entire OS from source. 2.1 Prerequisites In order to include the FTDI VCP driver in an Android image and use it successfully, the following are required: A hardware platform including a USB host device supported by the Android/Linux kernel. o FTDI testing was conducted using a BeagleBoard-xM Rev C. An FTDI based device for testing with o FTDI testing was conducted with an FT232R based US232R cable. A development system with the Android build tools installed and correctly configured. o FTDI development was conducted on a Linux machine running Ubuntu 10.04 with the default kernel (2.6.32). Android OS source code, including kernel source, which has been configured and known to build a working Android OS for the chosen development platform. o FTDI testing was based on Android 2.3 with a 2.6.32 kernel as provided in the TI Gingerbread development kit for OMAP devices, although some modifications were required to make it work with the BeagleBoard-xM Rev C platform. This kit also includes the required build tools. o The default kernel configuration was generated with the following command in the Android kernel source directory: make config omap3_beagle_defconfig 2.2 Configuring the Kernel First, the kernel source configuration file must be modified to include support for the appropriate modules. In particular, the modules required are USB Host support, USB Serial support and the FTDI SIO kernel module. The simplest and fastest way to add these is to modify the kernel config file using the menu to modify the default configuration via the following command (assuming that the current directory is the Android kernel source directory) make menuconfig ARCH=arm CROSS_COMPILE=arm-eabiThis will display a menu from which the appropriate modules can be selected. Select Device Drivers -> USB Support. Copyright © 2011 Future Technology Devices International Limited 3 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 Figure 1: USB support in the kernel configuration menu “Support for Host-side USB” should be marked as built-in; if it is not, it should be added. Select “USB Serial Converter Support” to display a new menu, then highlight “USB FTDI Single Port Serial Driver”. Figure 2: including FTDI VCP support in the kernel Copyright © 2011 Future Technology Devices International Limited 4 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 Press “Y” to include support for this module in the kernel build. Please note that although the menu lists the driver as only supporting FTDI’s single port devices, the driver included with the 2.6.32 kernel does in fact support all of the FTxxxx devices except the FT232H. To include support for the FT232H as well, kernel 2.6.39 or later should be used.. Exit the menu and select to save when prompted. At this point, the kernel can be rebuilt and the resulting file will include VCP support for FTxxxx devices. 2.3 Building the Kernel Now that the kernel has been configured to include support for the VCP driver, the kernel can be rebuilt to include the kernel modules. To rebuild the kernel as an image file, execute this command: make ARCH=arm CROSS_COMPILE=arm-eabi- uImage This process may take some time depending on the host build system. Once the build is complete, the resulting kernel will contain the modules necessary to communicate with an FTxxxx device over USB. Booting Android with the modified kernel and connecting an FTDI device to an available USB host port should now result in the VCP driver being loaded and the creation of an entry in the /dev directory of the format ttyUSB* where * is a number. Copyright © 2011 Future Technology Devices International Limited 5 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 3 Modifying A Pre-Compiled Kernel To Include The FTDI VCP Driver Kernel Module This section describes how to insert the FTDI VCP driver kernel module in to a working Android image. The directions provided here are based on directions provided on http://android.serverbox.ch/?p=285 which were originally provided by Manuel Di Cerbo. 3.1 Prerequisites In order to build the FTDI VCP driver kernel module and insert it in to an Android image, the following are required: A hardware platform including a USB host device supported by the Android/Linux kernel. o Note that root access must be available on the device to accomplish the insertion of the kernel module. Obtaining root access on a production Android device can be non-trivial and is outwith the scope of this document. An FTDI based device for testing with o FTDI testing was conducted with an FT232R based US232R cable. A development system with the Android build tools installed and correctly configured. o FTDI development was conducted on a Linux machine running Ubuntu 10.04 with the default kernel (2.6.32). o The Android SDK and NDK packages must be installed. 3.2 Obtaining The Correct Kernel Source First, determine the kernel version running on the Android device. This is important as a kernel module built for a different kernel version will most likely not work as intended. This can be done in two ways. The kernel version is displayed on the Android device Settings screen under About Tablet Copyright © 2011 Future Technology Devices International Limited 6 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 Figure 3: Android device Settings page showing the kernel version Alternatively, the kernel version can be determined from a command prompt (either via a terminal emulator program or via an ADB shell session) with the command: cat /proc/version For the tablet matching the above screen shot, the output from this command is Linux version 2.6.36.3-gb899528 ([email protected]) (gcc version 4.4.3 (GCC) ) #1 SMP PREEMPT Wed Jun 15 12:28:16 PDT 2011 It should be noted that the tablet used here does not have a USB host enabled and the information provided is for illustration only. The obtained kernel version number can then be used to obtain the correct kernel sources from http://android.git.kernel.org/. Note that the processor type must also be known to find the correct area of the site for the required kernel source. In the example provided here, the processor is an NVIDIA Tegra 2 and the corresponding URL for the 2.6.36 kernel source is http://android.git.kernel.org/?p=kernel/tegra.git;a=tree;h=refs/heads/android-tegra2.6.36;hb=refs/heads/android-tegra-2.6.36 From here, a snapshot of the kernel can be downloaded. Once downloaded, extract the files to a new directory at ~/android-kernel-source. At the time of writing this document the file available from here is tegra-android-tegra-2.6.36-9001adc.tar.gz Copyright © 2011 Future Technology Devices International Limited 7 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 3.3 Configuring The Kernel The existing kernel configuration can be extracted from the Android device via ADB with the command adb pull /proc/config.gz config.gz The existing Android kernel configuration can then be applied to the snapshot obtained above. In order to do this, execute the following command on the development machine (assuming that the kernel snapshot was extracted to the ~/android-kernel-source/ directory): cat config.gz > ~/android-kernel-source/tegra-android-tegra-2.6.369001adc/.config Once the existing configuration is applied, it can then be modified to include support for the FTDI VCP kernel module. To do this, use menuconfig from the Android NDK. Change to the Android kernel source directory: cd ~/android-kernel-source/tegra-android-tegra-2.6.36-9001adc Assuming that the Android NDK is installed in the /opt/ directory, add the NDK directory to the PATH as follows: export PATH=/opt/android-ndk-r5/toolchains/arm-eabi-4.4.0/prebuilt/linuxx86/bin/:$PATH This allows us to use the Android NDK build tools to build all or part of the Android kernel from the source directory. Execute the following command to display a kernel configuration menu: make menuconfig ARCH=arm CROSS_COMPILE=arm-eabiThis will display a menu from which the appropriate modules can be selected. Note that in order to be able to build the FTDI VCP driver as a module, loadable module support must be enabled: Copyright © 2011 Future Technology Devices International Limited 8 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 Figure 4: menuconfig showing Loadable Module Support Select Device Drivers -> USB Support. Select “USB Serial Converter Support”. Press “M” to include this support as a kernel module and enable a sub-menu, then highlight “USB FTDI Single Port Serial Driver”. Press “M” to select the FTDI VCP driver as a kernel module. Copyright © 2011 Future Technology Devices International Limited 9 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 Figure 5: enabling FTDI VCP driver support as a kernel module Select Exit and choose to save the configuration when exiting. To complete the kernel configuration, the Makefile should be edited to match the extraversion number of the extracted kernel with the sources downloaded from http://android.git.kernel.org; this is listed at the top of the Makefile. 3.4 Building And Inserting The Kernel Module Ensure that the Android NDK is on the PATH. Assuming that the Android NDK is installed in the /opt/ directory, add the NDK directory to the PATH as follows if this has not already been done: export PATH=/opt/android-ndk-r5/toolchains/arm-eabi-4.4.0/prebuilt/linuxx86/bin/:$PATH To build kernel modules, execute the following command in the Android kernel sources directory: make modules ARCH=arm CROSS_COMPILE=arm-eabiOnce complete, the ftdi_sio.ko kernel module will be present in the drivers/usb/serial directory. Next, copy the kernel module from the development machine to the Android device. This can be done via ADB with the following command: Copyright © 2011 Future Technology Devices International Limited 10 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 adb push drivers/usb/serial/ftdi_sio.ko /sdcard The module must then be inserted in to the kernel. This must be done via the adb shell and requires root permissions. If root permissions are not available, the operation will fail. Start an ADB session with this command on the development machine: adb shell Once the ADB shell session is running, execute the following commands to insert the kernel module: su cd sdcard insmod ftdi_sio.ko At this point the process is complete and the FTDI VCP driver is available on the Android device. Copyright © 2011 Future Technology Devices International Limited 11 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 4 Permissions Although the kernel module will now load for an FTxxxx device when it is enumerated and create a device in the /dev directory, the default permissions for the device will not allow the default Android user to access the port. To resolve this issue, a modification is required to the ueventd.rc file in the Android root file system (rootfs) to set the permissions appropriately. Appending the following line to the end of the ueventd.rc file should resolve the issue: /dev/ttyUSB* 0666 root root Once this line is included, the serial port permissions will allow read and write access for all users and native applications should be able to access the serial port at this point. For example, commands at the Android terminal emulator such as echo “Hello serial port” > /dev/ttyUSB0 and cat /dev/ttyUSB0 should work as expected. Copyright © 2011 Future Technology Devices International Limited 12 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 5 Accessing The COM Port Via Java APIs Despite native applications now having access to the serial port device, applications developed using the Android SDK will not be able to access the serial port since the Android platform does not include an API to access serial ports from Java applications. This is a serious limitation for Android application developers wishing to access FTxxxx devices via the VCP driver. An open source project has been created to provide the missing serial port Java APIs for Android (http://code.google.com/p/android-serialport-api/). This project allows access to serial ports, USB or otherwise, from a Java application on the Android platform. It has been tested on FTDI’s BeagleBoardxM Rev C development platform and has been shown to work after being recompiled from source to remove the O_DIRECT flag from line 96 of the SerialPort.c source file; the resulting library (libserial_port.so) should then be copied to /rootfs/system/lib and the application should be copied to /rootfs/system/app. After copying these files, the SerialPort application will appear on the main Android application screen and will communicate with the USB serial port. Please note however, that this is an open-source community project and is not maintained or supported by FTDI. Copyright © 2011 Future Technology Devices International Limited 13 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 6 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) E-mail (Support) E-mail (General Enquiries) Web Site URL Web Shop URL [email protected] [email protected] [email protected] http://www.ftdichip.com 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) E-mail (Support) E-mail (General Enquiries) Web Site URL [email protected] [email protected] [email protected] 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) E-Mail (Support) E-Mail (General Enquiries) Web Site URL [email protected] [email protected] [email protected] http://www.ftdichip.com Branch Office – Shanghai, China Future Technology Devices International Limited (China) Room 408, 317 Xianxia Road, Shanghai, 200051 China Tel: +86 21 62351596 Fax: +86 21 62351595 E-mail (Sales) E-mail (Support) E-mail (General Enquiries) Web Site URL [email protected] [email protected] [email protected] http://www.ftdichip.com Copyright © 2011 Future Technology Devices International Limited 14 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 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. System and equipment manufacturers and designers are responsible to ensure that their systems, and any Future Technology Devices International Ltd (FTDI) devices incorporated in their systems, meet all applicable safety, regulatory and system-level performance requirements. All application-related information in this document (including application descriptions, suggested FTDI devices and other materials) is provided for reference only. While FTDI has taken care to assure it is accurate, this information is subject to customer confirmation, and FTDI disclaims all liability for system designs and for any applications assistance provided by FTDI. Use of FTDI devices in life support and/or safety applications is entirely at the user’s risk, and the user agrees to defend, indemnify and hold harmless FTDI from any and all damages, claims, suits or expense resulting from such use. This document is subject to change without notice. No freedom to use patents or other intellectual property rights is implied by the publication of this document. Neither the whole nor any part of the information contained in, or the product described in this document, may be adapted or reproduced in any material or electronic form without the prior written consent of the copyright holder. Future Technology Devices International Ltd, Unit 1, 2 Seaward Place, Centurion Business Park, Glasgow G41 1HH, United Kingdom. Scotland Registered Company Number: SC136640 Copyright © 2011 Future Technology Devices International Limited 15 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 7 Appendix A – References Document References http://developer.android.com http://beagleboard.org/hardware-xM http://processors.wiki.ti.com/index.php/TI-Android-GingerBread-2.3-DevKit-1.0_ReleaseNotes http://www.ubuntu.com/ http://www.kernel.org/ http://code.google.com/p/android-serialport-api/ http://android.serverbox.ch/?p=285 Acronyms and Abbreviations Terms Description OS Operating System USB Universal Serial Bus VCP Virtual COM Port SDK Software Development Kit ADB Android Debug Bridge NDK Native Development Kit Copyright © 2011 Future Technology Devices International Limited 16 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 8 Appendix B – List of Tables & Figures List of Tables No table of figures entries found. List of Figures Figure 1: USB support in the kernel configuration menu ............................................ 4 Figure 2: including FTDI VCP support in the kernel .................................................... 4 Figure 3: Android device Settings page showing the kernel version ........................... 7 Figure 4: menuconfig showing Loadable Module Support ........................................... 9 Figure 5: enabling FTDI VCP driver support as a kernel module ............................... 10 Copyright © 2011 Future Technology Devices International Limited 17 Document Reference No.: FT_000491 TN_132 Adding FTDI Devices VCP Driver Support to Android Technical Note TN_132 Version 1.1 Clearance No.: FTDI# 213 9 Appendix C – Revision History Revision Changes Date 1.0 Initial Release for beta test 2011-06-20 1.0 Initial release to the FTDI web 2011-06-29 1.1 Added directions for building only the kernel module. Clarified details for SerialPort API. Copyright © 2011 Future Technology Devices International Limited 2011-08-25 18