Android下USB Accessory的实现分析

Android下USB Accessory的实现分析

 

摘要:本文介绍了USB Accessory的一些背景知识,并从Linux驱动到Android Framework层,阐述了USB accessory的整个实现过程。

关键词: Android,USB,Accessory, ADK

1.  背景介绍

自Android 3.1之后的版本,Google引入了USB Accessories的概念,并提供了相关的开发库。下面是developer.android.com上的一段相关说明:

Android 3.1 Platform Highlights

http://developer.android.com/sdk/android-3.1-highlights.html

●     Connectivity for USBaccessories

Android 3.1 addsbroad platform support for a variety of USB-connected peripherals andaccessories. Users can attach many types of input devices (keyboards, mice,game controllers) and digital cameras. Applications can build on the platform’sUSB support to extend connectivity to almost any type of USB device.

The platformalso adds new support for USB accessories — external hardware devices designedto attach to Android-powered devices as USB hosts. When an accessory isattached, the framework will look for a corresponding application and offer tolaunch it for the user. The accessory can also present a URL to the user, fordownloading an appropriate application if one is not already installed. Userscan interact with the application to control powered accessories such asrobotics controllers; docking stations; diagnostic and musical equipment;kiosks; card readers; and much more.

The platform’sUSB capabilities rely on components in device hardware, so support for USB onspecific devices may vary and is determined by device manufacturers.

 

上面一段文字说得比较清楚:Android3.1之后的版本不仅可以让Android设备作为USB Host的角色支持USB鼠标、键盘、游戏手柄等,还可以以USB Device的角色与一些具有USB Host功能,但却扮演着配件角色的设备相连,Google把这种设备称为“Accessory”(附件)。这类Accessory可能是如下设备:

机器人控制器、Dock(基座)、诊断设备、音响设备、配电设备、读卡器等等。

Google引入USB Accessory概念的原因应该主要有如下:

一、非常多的Android设备不具有USB Host的功能而只具有USB Device功能(例如绝大部分Android手机),或者即使具备USB Host的功能,也承担不起对USB外设供电的任务,因为便携式Android设备本身的电池容量就很有限。

二、原来的Android设备,作为USB Device所实现的功能相对比较简单,内置的功能只有U盘或ADB调试设备等,Google希望提供应用层的USB开发库,让更多的软硬件厂商来开发新的功能,比如说安装一个APK应用,然后通过USB连接到一个与电视机配套的Dock上,就可以让一台Android手机变身为一个电视机遥控器。

图1-1显示了USB Host和Accessory两种不同模式的区别。当Android设备作为Host模式时为USB总线供电;当Android设备连接到一个USB Accessory设备时,USB Accessory设备以Host身份为USB总线供电。


图1-1 USB Host和Accessory两种模式

 

如果要在Android 3.1之前的Android 2.3.4版本上支持USB Accessory功能,可以通过添加“com.android.future.usb”add-on library的方式来支持,详情可见:http://developer.android.com/guide/topics/connectivity/usb/accessory.html

另外Android 4.1后的版本还增加了对USB AudioAccessory设备的支持,可实现USB接口的音箱功能,并在Google I/O 2012开发者年会上作了产品展示,见如下链接:

http://www.engadget.com/2012/06/30/gear4-speaker-dock-supports-usb-audio-for-jelly-bean-at-google-i/


图1-2 USB Audio Accessory设备在Google I/O 2012上的展示

对于硬件开发者如何开发出USB Accessory设备,Google官方也给出了指导,并提供了ADK(The Accessory Development Kit)开发环境,详情见:

http://source.android.com/accessories/

http://developer.android.com/tools/adk/index.html

在Google官方文档的指导下,硬件设计爱好者可以很方便地在Arduino(一个开源硬件平台)等硬件平台上开发出自己感兴趣的Usb Accessory设备。

本文在此不准备深入探讨如何在其他硬件平台上开发Usb Accessory设备,而是旨在分析Android平台下对USB Accessory设备的支持具体是如何实现的。这里选择了比较主流的Android 4.1平台进行分析(事实上Android 4.1之后这部分代码变化不大)。

2.Android下Usb Accessory的设计实现

Android下对Usb Accessory设备的支持包括内核驱动层的支持和Android Framework层的支持,如下是设计架构图:


图2-1 USB Accessory设计架构图

下面就分别从Linux内核驱动,Android Framework层,以及相关的应用层代码来进行分析。

2.1 USB Accessory底层驱动的设计实现

2.1.1 什么是USB composite设备

因为目前的Android平台设备在与PC进行连接时,大都表现为USB Composite设备,因此这里有必要对USB Composite设备进行一下介绍。

什么是USB Composite设备呢?对于大部分USB Device设备来说,它仅仅只有一个功能,比如大部分U盘,单个的USB鼠标等;但是也有些USB设备不止实现一个功能,比如某些USB上网卡有无线上网的功能,同时还有U盘存储的功能;又比如有的鼠标和键盘二合一设备,它只有一个USB接口,却同时支持了鼠标和键盘两个功能。

这种一个USB接口扩展出多个设备功能的实现方法有两种,一种是在设备外部或内部加Hub扩展;另一种就是以Usb Composite Device方式实现(一般称为复合设备)。复合设备其实只是一个USB设备,只有一个USB设备地址,它实现多个功能的原因主要在于它扩展实现了多个USB接口,每个接口具有不同的设备类型。这里涉及到USB协议的一些知识,有兴趣的读者可以去找资料了解一下,这里我们重点是要知道Android下采用了USB Composite Device这种方式来实现一个USB口的情况下扩展出多个功能设备,这种情况下一个USB接口(Interface)便对应一种类型的功能设备,需要实现与之对应的功能驱动。

 

图2-2 USB Composite Device描述符结构

 

2.1.2 Android下USB Composite设备驱动实现

Android下的USBComposite驱动实现代码在Linux内核的drivers/usb/gadget/目录下,编译出来的驱动模块为g_android.ko,主要相关的代码有android.c和f_xxx.c一类的接口驱动文件,包括实现USB Accessory驱动的f_accessory.c,f_audio_source.c文件等。f_xxx.c以从属于android.c的USB Composite设备接口驱动的形式被include在android.c文件中,见android.c代码:

...

#include "f_audio_source.c"

#include "f_mass_storage.c"

#include "u_serial.c"

#include "f_acm.c"

#include "f_adb.c"

#include "f_mtp.c"

#include "f_accessory.c"

#include "f_rndis.c"

#include "rndis.c"

#include "u_ether.c"

...

代码组织架构如下:


图2-3 Android下USB Composite设备驱动代码架构

 

同时,在android.c中,定义了一个非常重要的数据结构的指针数组,见如下:

static struct android_usb_function *supported_functions[] = {

    &adb_function,

    &acm_function,

    &mtp_function,

    &ptp_function,

    &rndis_function,

    &mass_storage_function,

    &accessory_function,

    &audio_source_function,

    NULL

};

从上我们可以看到Android设备上每一个所支持的USB Device功能都可以在其中看到定义,包括如下功能:

●          adb(USB调试功能);

●          acm(USB串口功能);

●       

  • 16
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值