Android usb流程分析

合集下载

Android USB 驱动分析

Android USB 驱动分析

Android USB 驱动分析一、USB驱动代码架构和使用1、代码简介USB驱动代码在/drivers/usb/gadget下,有三个文件:android.c,f_adb.c,f_mass_storage.c;g_android.ko 是由这三个文件编译而来,其中android.c 依赖于f_adb.c 和 f_mass_storage.c(这两个文件之间无依赖关系)。

可在android.c中看到:static int __init android_bind_config(struct usb_configuration *c){struct android_dev *dev = _android_dev;int ret;printk(KERN_DEBUG "android_bind_config\n");ret = mass_storage_function_add(dev->cdev, c, dev->nluns); if (ret)return ret;return adb_function_add(dev->cdev, c);}2、驱动使用要使USB mass storage连接到主机:打开/sys/devices/platform/usb_mass_storage/lun0/file文件,向file文件写入一个存储设备的路径,例如/dev/block/vold/179:0 (major:minor)路径;这里的usb_mass_storage根据实际应用可以改的,由platform_device_register函数的参数决定。

例如:static struct platform_device fsg_platform_device ={.name = "usb_mass_storage",.id = -1,};static void __init tegra_machine_init(void){....(void) platform_device_register(&fsg_platform_device);....}能够连接的设备数,由驱动中的nluns变量来控制,最多支持8个。

AndroidStudio使用USB真机调试详解

AndroidStudio使用USB真机调试详解

AndroidStudio使⽤USB真机调试详解本⽂为⼤家分享了Android Studio使⽤USB真机调试的具体⽅法,供⼤家参考,具体内容如下
以⼩⽶4为例,先将⼿机通过USB连接电脑,在设备管理器中确保驱动安装正确。

对⼿机的设置
1.设置⼿机为开发者模式(设置->关于⼿机->连续点击MIUI版本——开启成功)
2.在更多设置中找到系统安全设置——允许安装未知来源的应⽤
3.在更多设置中选择开发者选项,在开发者选项中同时勾选USB调试和USB安装的开关
对Android Studio 的设置:
1.在⼯具栏中找到app,点开后选择“Edit configurations”
2.选择其中的Target为 USB Device
3.运⾏程序测试即可。

PS:
运⾏程序中若报错: No target device found.
点击下⽅的Android Monitor,Android Studio会帮你⾃动识别查找设备。

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

android真机USB调试设置(新手观看)

android真机USB调试设置(新手观看)

Android 真机USB调试的方式很多android开发者都是在模拟器上运行、调试程序,突然接触到真机反而不知道怎么使用真机调试,也许知道可以用USB连接进行调试,但不知道具体如何设置,也有的开发者完全不知道可以利用真机进行USB调试,这里指新手和首次想用真机进行调试的开发者,大牛可以跳过。

在网上看到的都只是简单的说在手机上勾上USB调试就可以了。

自己操作的时候还是不行,不过这其实很简单,操作一次就会了。

这个文档主要是写给新新新手看。

下面就来说说如何进行真机调试。

首先在真机里选择USB调试,具体的在:Setting (设置)--> Applications(应用程序) --> Development(开发) --> USB debugging(USB 调试) ,将这个勾上然后用USB数据线将真机与PC机连接,第一次连接时提示发现新硬件,这时就安装android手机驱动,选择从列表或指定位置安装(高级)点下一步选择在这些位置上搜索最佳驱动程序将“在搜索中包括这个位置”勾上,浏览只androidSDK中的usb_derver ,如我的是F:\android-sdk-windows\usb_driver ,大家选择自己的安装目录来搜索,然后下一步,会搜索驱动并进行安装。

可能会出现好几个需要安装驱动的程序,要一个不能少的全部安装成功。

在搜索的时候可能会提示需要某个文件,这不能跳过,可以搜索,浏览找到。

一般来说是在C:\WINDOWS\system32\drivers 里面会有。

每个驱动都如此安装,都安装完之后可以在设备管理里看到android手机设备名称,或者可以用adb命令查看是否已经识别,命令是:adb devices,也可以看到手机设备名称记得此命令需要进入androidSDK目录的tools再使用,我这里是开一个模拟器查看到的,今天没真机在手边,所以没法截真机连接后的图,用真机调试时需要将模拟器关闭,如果没有识别只有提示:List of devices attached如果无法识别,可以到设备管理器里看,是否有驱动没安装好,方法是:右击‘我的电脑’--> 管理-->设备管理器如果有问号存在,则更新驱动,将驱动安装好再查看,如果有感叹号,也可以更新驱动试试。

AndroidStudio真机无线连接USB设备调试运行详解流程

AndroidStudio真机无线连接USB设备调试运行详解流程

AndroidStudio真机⽆线连接USB设备调试运⾏详解流程前⾔⼀般情况下,多数移动开发者使⽤的是数据线连接电脑,进⾏各种移动设备的调试,更有胜者,⾮常迷恋模拟器,模拟器它好不好,答案是好,因为直接运⾏在电脑上,直接操作,调试,确实⽅便。

尤其是ios开发⼩伙伴,多数app通过模拟器基本上都能开发好,再⽤真机验证就可以了。

但对于android,就⽐较恼⽕了,模拟器⼀直不好⽤,卡、慢都是影响撸码的⼼情。

另外android设备随便弄个便宜的都是容易的,基本上是真机开发。

那么⾮⼀般情况呢,例如我们使⽤了NDK也就是C层的代码时,由于架构匹配⽅⾯,需要⽤真机开发和调试,效率会⾼许多;尤其需要⽤到设备硬件的功能,例如⾳视频采集、重⼒感应、nfc等情况下,⾮常建议使⽤真机。

试想数据线有问题或usb插⼝有问题的情况下,连接不稳定(都有遇到过);再就是当检验⼀个项⽬完整性的时候,桌⼦上摆了N个设备,且有期望连上电脑时候怎么办。

1、adb connect之前在调试电视盒⼦没有USB接⼝,⽆从使⽤数据线我们使⽤adb connect ip的⽅式进⾏连接,前提是开发机和电视盒⼦都连在同⼀个wifi中。

连上之后就可以调试、实时看⽇志、为所欲为了。

adb connect 172.21.82.14connected to 172.21.82.14:5555命令结果和android studio设备这⾥都表明连上了设备。

当然有时候要注意移动设备可能⾃⾏切换⽹络(有多个wifi的话),导致连接失效。

备注:有些盒⼦没有提供开发者功能,可能是连不上的。

2、Android Studio插件点击左上⾓的File,选中Settings,或者按快捷键Ctrl+Alt+S然后选择Plugins,在后⾯Plugins⾯板搜索栏中输⼊wifi,得到如下结果:有这么多个插件,⽼铁可以选择⼀个进⾏安装,安装完需要重启android studio。

Android设备如何使用USB的硬件接口

Android设备如何使用USB的硬件接口

Android设备如何使用USB的硬件接口你知道Android设备如何使用USB的硬件接口吗?下面将由店铺带大家来解答这个疑问吧,希望对大家有所收获!如何处理硬件接口问题最近业界的发展显示,智能手机/便携系统与自动化系统或机械系统之间存在巨大的市场潜力。

2011年春季谷歌引入的Android开放访问架构,开启了基于Android操作系统的设备的巨大可能——允许智能手机和平板电脑控制外部硬件。

这种开放的附件框架为便携设备能够推动商务,消费和工业环境的自动化进程提供了平台,利用已经广泛采用并为用户所熟悉的操作系统,连接从厨房电器到重型机械的一切设备。

目前获取微处理器和移动设备之间点对点通信电线的最流行的一种方式是使用通用串行总线(USB)接口。

由于广泛普及而受到工程师们的青睐(特别是在消费电子和计算机领域)。

下面的章节就如何在基于Android的平板和具备USB控制功能的微处理器之间建立这样的通讯介绍一个基本的方案。

USB主控的一个关键特点是能为USB装置(或从设备)供电,并提供了一个非常丰富的通信协议,支持传输相对大量的数据。

然而,就协议处理的复杂性来说对工程师来说总有一定的缺陷,尤其是在装置端。

主要的障碍是,如果工程师想要实现他们自己的固件,不同的半导体供应商提供的微处理器的应用程序接口(API) 会有些变化。

为解决这一问题主要有两个办法可以采用:1.在设备端使用有点像“硬件状态机”的微处理器。

但是这样做需要大量的工程资源。

2.使用USB-串行转换器,此方案可提供USB底层相关的协议,从而降低USB主控端和设备端的软件实现的复杂度。

这可能对工程师们更加可行,尤其是对那些在Android操作系统或Android USB应用程序接口经验少或者没有经验的工程师。

在本文中,提供了第二个方法使用USB串行转换器的例子。

例子中的参考代码,是针对使用FTDI Vinculum-II (VNC2) USB主控端IC 所设计,但是,它也可以用于其它控制器工作。

安卓手机如何通过USB连接电脑上网络

安卓手机如何通过USB连接电脑上网络

安卓手机如何通过USB连接电脑上网络
随着4G的发展,如今许多网友们对流量的需求也越来越大,对此有不少网友就将念头打向了USB连接电脑上网这一方面,今天店铺就为大家带来了有关解决办法,希望能够帮到大家。

安卓手机通过USB连接电脑上网络:
注:这个功能需安装Reverse Tether软件实现,并且需要手机支持USB绑定功能,有ROOT权限。

1、安装Reverse Tether,自行下载安装即可。

2、用USB绑定连接电脑
安装完成后我们把手机用USB连接电脑,设置成USB共享网络的模式。

如果之前没有使用过这个功能可能需要安装相关驱动。

连接成功能电脑会增加一个本地连接(如果没有,是因为驱动没装好)。

为与原来的区别,我们暂且取名为android。

打开原有的那个本地连接——属性——上面右边的“共享”——勾选第一个框“允许其他网络用户通过此计算机的Internet连接”,选择新的这个android连接——再点下面的设置,勾选HTTP等。

设置完毕,以后用的话就不用设置了。

3、设置Reverse Tether
打开刚安装的Reverse Tether,这是Google Play里的最新版,是英文版,不过是试用版。

设置很简单,直接下一步就可以了,到最后连接时会提示需要ROOT授权,授权后,点击reverse tether 软件的右上角的connect就可借用电脑网络了。

不过也许是试用版的原因,小编的手机没有成功,于是找了个较早的汉化版本(见上)。

然后就连接成功了,如下图:
如果大家有同样的问题,建议直接使用汉化版。

关键时刻这个会很有用的。

AndroidUSB外置声卡插入Audio系统没有正常识别问题梳理以及分析

AndroidUSB外置声卡插⼊Audio系统没有正常识别问题梳理以及分析背景:现在项⽬要求实现⼀个,要使⽤NDK接⼝从外接MIC设备(姑且这么称呼吧)上采集声⾳数据,然后内部进⾏⾳频数据格式转换,再进⾏⾳频数据输出;问题:插⼊客户指定设备,发现在JAVA AudioManager⽆法查询到新接⼊到的物理设备;(当使⽤NDK进⾏⾳频数据采集,需要进⾏deviceId参数;在JAVA侧可以通过audioManager获取指定类型设备的deviceId)NDK接⼝参照:使⽤NDK接⼝⾳频采集过程,可以参照:现象以及问题分析:在Java AudioManager层使⽤sdk api⽆法查询到指定类型设备ID,这就说明新插⼊的设备没有被andriod 系统audioManager进⾏正确识别或添加,于是从下到上进⾏问题分析;知识背景:在Android系统中整个audio⼀共分析如下⼏层:1、物理层(开发板以及外接MIC物理设备)2、设备驱动层(集成在kernal中)3、UsbSever服务(由于外接MIC是通过USB接⼝与开发板进⾏连接)4、android AudioManager等Audio服务问题排查顺序:1、当物理设备没有被android 的Audio系统识别,⾸先排查android系统有没有正确识别到USB声卡插⼊。

android Audio HAL⼀般都使⽤alsa。

是android内核中的驱动识别到了声卡物理设备接⼊之后,驱动程序会⾃动在/pro/asound ⽬录下创建⼀个⽬录,表明有新的物理声卡接⼊;ls /proc/asound/card0 cards devices hwdep modules oss PCH pcm seq timers version然后可以通过查询devices⽂件中的内容,来了解物理声卡的能⼒;cat /proc/asound/devices1: : sequencer2: [ 0] : control3: [ 0- 0]: digital audio playback4: [ 0- 0]: digital audio capture5: [ 0- 2]: digital audio capture6: [ 0- 3]: digital audio playback7: [ 0- 7]: digital audio playback8: [ 0- 8]: digital audio playback9: [ 0- 9]: digital audio playback10: [ 0-10]: digital audio playback11: [ 0- 0]: hardware dependent12: [ 0- 2]: hardware dependent33: : timer以上信息为card0的信息;2、根据devices中的信息了解物理设备的能⼒;(是声⾳采集设备?是声⾳播放设备?)126: [ 1] : control127: [ 1- 0]: digital audio capture这是我新插⼊的audio 设备信息(只有控制接⼝以及声⾳采集接⼝),这就证明我这只是⼀个⾳频采集设备并不具备⾳频播放功能;3、当/proc/asound/devices ⽬录下有新的⽂件夹创建之后。

android通过usb读取u盘的方法

android通过usb读取u盘的方法以android通过usb读取u盘的方法为题,我们首先需要明确的是,Android系统本身是支持通过USB接口读取外部存储设备的,包括U盘。

不过,由于不同的Android设备厂商可能会在系统中加入自己的定制化操作,因此具体的操作步骤可能会有所不同。

下面将结合一般情况下的Android系统,介绍通过USB读取U盘的方法。

第一步,确保你的Android设备支持OTG功能。

OTG是指On-The-Go的缩写,它是一种可以让手机或平板电脑作为USB主机的技术。

通过OTG功能,我们才能够将U盘或其他外部存储设备连接到Android设备上。

第二步,准备一个OTG线缆。

OTG线缆是连接手机和U盘的桥梁,它的一端是标准的USB接口,可以插入U盘,另一端是Micro USB接口,可以插入Android设备的Micro USB接口。

第三步,将OTG线缆的Micro USB接口插入Android设备的Micro USB接口。

这样,U盘就与Android设备连接起来了。

第四步,打开Android设备的文件管理器。

不同的Android设备可能会有不同的文件管理器,你可以根据自己的设备型号找到对应的文件管理器应用。

第五步,通过文件管理器浏览U盘中的文件。

你可以像在普通的文件管理器中一样,打开文件夹、复制、粘贴或删除文件。

另外,你还可以通过文件管理器对U盘中的文件进行重命名、分享或发送。

需要注意的是,在操作过程中可能会遇到一些问题。

首先,有些Android设备可能需要在连接U盘后进行设置才能够读取U盘,你可以在设备的设置中查找相关选项。

其次,由于U盘的电流要求较大,一些低端Android设备可能无法正常供电,导致无法读取U盘。

此外,一些厂商定制的系统可能会限制外部存储设备的读写权限,你可能需要在设置中进行相应的设置。

总结起来,通过USB读取U盘的方法主要包括准备OTG线缆、插入U盘、打开文件管理器、浏览U盘文件等步骤。

Androd USB绑定与便携式热点功能介绍

Tether服务流程:
Netd服务流程:
Netd socket命令流程
Netlink命令流程
AP(Access point)与STA(station)
USB绑定
通过USB将MID与计算机绑定,使计算机共识MID的移动网络
MID模拟成USB无线网卡
MID中USB绑定与便携式Wi-Fi热点框图
Tethering(绑定)的流程
Wi-Fi热点(soft-ap)的软件框架
从设置时打开soft-ap流程:
Android USB绑定与便携式热点功能介绍
Android中的设置界面:
具体位置在:无线网络设置->绑定与便携式热点
将MID的移动网络通过USB或作为便携式Wi-Fi热点分享.
USB绑定
便携式Wi-Fi热点
便携式Wi-Fi热点
将便携式设备(MID)作为Wi-Fi接入点,从而与其它便携式设备共享它的移动网络

Androidusb设备权限查询及自动获取详解流程

Androidusb设备权限查询及⾃动获取详解流程看到当上⾯的对话框弹出时,可以使⽤命令查看顶层的活动窗⼝adb shell dumpsys window | findstr mCurrentFocusmCurrentFocus=Window{41ab0ee0 u0 com.android.systemui/bPermissionActivity}这就是应⽤的位置,当然我们也可以是⽤grep命令来查找这个对话框的.xml⽂件,进⼊android源码然后输⼊命令:grep '默认情况下⽤于' ./ -Rn./SystemUI/res/values-zh-rCN/strings.xml:51: <string name="always_use_device" msgid="1450287437017315906">"默认情况下⽤于该 USB 设备"</string>./SystemUI/res/values-zh-rCN/strings.xml:52: <string name="always_use_accessory" msgid="1210954576979621596">"默认情况下⽤于该 USB 配件"</string>那么这个对话框的路径在/android/frameworks/base/packages/SystemUI/res/values-zh-rCN/strings.xml其相关的内容如下:<string name="always_use_device" msgid="1450287437017315906">"默认情况下⽤于该 USB 设备"</string><string name="usb_device_permission_prompt" msgid="834698001271562057">"允许应⽤“<xliff:g id="APPLICATION">%1$s</xliff:g>”访问该 USB 设备吗?"相关应⽤路径找到.java⽂件来修改,其位置在:/android/frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java这就是那个讨厌的对话框对应的java程序,那么来看看这个程序如下:/** Copyright (C) 2011 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** /licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package b;import android.app.AlertDialog;import android.app.PendingIntent;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.content.pm.ApplicationInfo;import android.content.pm.PackageManager;import b.IUsbManager;import bAccessory;import bDevice;import bManager;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.os.ServiceManager;import erHandle;import android.util.Log;import youtInflater;import android.view.View;import android.widget.CheckBox;import poundButton;import android.widget.TextView;import com.android.internal.app.AlertActivity;import com.android.internal.app.AlertController;import com.android.systemui.R;public class UsbPermissionActivity extends AlertActivityimplements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener {private static final String TAG = "UsbPermissionActivity";private CheckBox mAlwaysUse;private TextView mClearDefaultHint;private UsbDevice mDevice;private UsbAccessory mAccessory;private PendingIntent mPendingIntent;private String mPackageName;private int mUid;private boolean mPermissionGranted;private UsbDisconnectedReceiver mDisconnectedReceiver;@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);Intent intent = getIntent();mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); mPendingIntent = (PendingIntent)intent.getParcelableExtra(Intent.EXTRA_INTENT);mUid = intent.getIntExtra(Intent.EXTRA_UID, -1);mPackageName = intent.getStringExtra("package");Log.e(TAG, "mPackageName "+ mPackageName);Log.e(TAG, "mUid "+ mUid);PackageManager packageManager = getPackageManager();ApplicationInfo aInfo;try {aInfo = packageManager.getApplicationInfo(mPackageName, 0);} catch (NotFoundException e) {Log.e(TAG, "unable to look up package name", e);finish();return;}String appName = aInfo.loadLabel(packageManager).toString();Log.e(TAG, "appName "+ appName);final AlertController.AlertParams ap = mAlertParams;ap.mIcon = aInfo.loadIcon(packageManager);ap.mTitle = appName;if (mDevice == null) {ap.mMessage = getString(b_accessory_permission_prompt, appName);mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory);} else {ap.mMessage = getString(b_device_permission_prompt, appName);mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice);}ap.mPositiveButtonText = getString(android.R.string.ok);ap.mNegativeButtonText = getString(android.R.string.cancel);ap.mPositiveButtonListener = this;ap.mNegativeButtonListener = this;// add "always use" checkboxLayoutInflater inflater = (LayoutInflater)getSystemService(YOUT_INFLATER_SERVICE);ap.mView = inflater.inflate(yout.always_use_checkbox, null);mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse);if (mDevice == null) {mAlwaysUse.setText(R.string.always_use_accessory);} else {mAlwaysUse.setText(R.string.always_use_device);}mAlwaysUse.setOnCheckedChangeListener(this);mClearDefaultHint = (TextView)ap.mView.findViewById(com.android.internal.R.id.clearDefaultHint);mClearDefaultHint.setVisibility(View.GONE);if(!mPackageName.equals("bcamera"))setupAlert();else{mPermissionGranted = true;finish();}}@Overridepublic void onDestroy() {IBinder b = ServiceManager.getService(USB_SERVICE);IUsbManager service = IUsbManager.Stub.asInterface(b);// send response via pending intentIntent intent = new Intent();try {if (mDevice != null) {intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice);if (mPermissionGranted) {service.grantDevicePermission(mDevice, mUid);if (mAlwaysUse.isChecked()) {final int userId = UserHandle.getUserId(mUid);service.setDevicePackage(mDevice, mPackageName, userId);}}}if (mAccessory != null) {intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory);if (mPermissionGranted) {service.grantAccessoryPermission(mAccessory, mUid);if (mAlwaysUse.isChecked()) {final int userId = UserHandle.getUserId(mUid);service.setAccessoryPackage(mAccessory, mPackageName, userId);}}}intent.putExtra(UsbManager.EXTRA_PERMISSION_GRANTED, mPermissionGranted); mPendingIntent.send(this, 0, intent);} catch (PendingIntent.CanceledException e) {Log.w(TAG, "PendingIntent was cancelled");} catch (RemoteException e) {Log.e(TAG, "IUsbService connection failed", e);}if (mDisconnectedReceiver != null) {unregisterReceiver(mDisconnectedReceiver);}super.onDestroy();}public void onClick(DialogInterface dialog, int which) {if (which == AlertDialog.BUTTON_POSITIVE) {mPermissionGranted = true;}finish();}public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {if (mClearDefaultHint == null) return;if(isChecked) {mClearDefaultHint.setVisibility(View.VISIBLE);} else {mClearDefaultHint.setVisibility(View.GONE);}}}这段代码是获取应⽤的包名,我们可以通过包名对⽐来决定是否弹出对话框。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android usb流程分析文档以UMS(usb mass storage)为例来分析流程,主要按照图中红线来分析(即从插入USB 开始到状态栏弹框,然后又从选择UMS功能开始往下的流程)。

以前没有看过USB相关代码,网上也很少有分析usb FRAMEWORK相关的东西,文档中可能存在错误,如果发现欢迎指正。

总体框图1.Kernel USB 流程LINUX KERNEL GADGET 架构Linux USB Gadget分三层架构,层次关系从上到下一层:USB Gadget功能层。

BSP/Driver开发者通常是要实现这一层,从而实现一个具体的设备驱动,如Anddroid在此层实现了adb,mtp,mass_storage等。

浏览参考关注此层代码时,会发现“composite”是此层的关键字,此层中关键的数据结构是:struct usb_composite_driver。

这一层的驱动文件一般为:driver/usb/gadget/android.c(android实现的)或driver/usb/gadget/serial.c(传统Linux实现的USB转串口)。

二层:USB设备层(usb core)。

这一层是Linux内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。

浏览参考关注此层时,会发现“gadget”是此层的关键字,此层的关键数据结构是:usb_gadget_driver,usb_composite_dev。

这层主要的一个驱动文件为:driver/usb/gadget/composite.c三层:USB设备控制器驱动层。

这一层主要是与CPU、CPU USB控制器有关,与硬件紧密相关,主要它和USB控制器牵扯在一起,涉及有寄存器、时钟、DMA等等。

但是这一层往往是由芯片厂商去实现。

我们一般仅需在板级文件中处理好所需要的USB接口即可。

这层的关键字就是“UDC”,主要驱动文件命名含“udc”关键字,一般与CPU或芯片厂商有关,如MTK UDC 驱动在kernel/mediatek/platform/mt6592/kernel/drivers/usb20/目录下。

USB Gadget的三层架构的关系可以用一句简单的话去概括三层的关系:USB Gadget功能层调用USB设备层的接口,USB设备层调用USB设备控制器驱动层的接口,然后USB设备控制器驱动层回调USB设备层,USB设备层回调USB Gadget功能层。

USB 设备驱动层:USB DEVICE注册M t_devs.cDriver:U sb20.c (doov6592kk\kernel\mediatek\platform\mt6592\kernel\drivers\usb20):Probe: 重新注册了一个"musb-hdrc" 设备,然后在kernel/drivers/usb/musb/musb_core.c 加载musb-hdrc 驱动,执行PROBE, 这里才是真正的加载驱动,内存,中断,DMA等资源申请,并初始化USB.musb_probe musb_init_controller musb_gadget_setup usb_add_gadget_udc 加入了LINUX USB框架了。

Android.c注册的android_usb_function:在SYS下创建一系列文件, 对应接口 XX_show/store充电器插入中断检测电路USB插入中断流程:USB 插入中断WAKEUP PMIC THERADif( (((int_status_val_0)&(0x0400))>>10) == 1 ) { chrdet_int_handler(); } do_chrdet_int_taskmt_battery_charger_detect_checkmt_usb_connectmusb_start(mtk_musb); * Program the HDRC to start (enable interrupts, dma, etc.).开始USB 枚举android.c android_setupandroid_workkobject_uevent_envUSBservice ueventobserver 收到UEVENT事件。

PMIC中断,检测到充电器中断Battery 里判断 charger type, 然后会使能USB, 等待主机发枚举包。

收到主机发来的枚举包,会调用到android_setup 完成枚举,android_setup会调用android_work 发uevent 事件。

bService相关/*** UsbService manages all USB related state, including both host and device support.* Host related events and calls are delegated to UsbHostManager, and device related* support is delegated to UsbDeviceManager.*/在 systemserver 中启动并调用,在USBDEVICEMANAGER 里,得到NOTIFICATION_SERVICE, 后面显示通知时用到。

上面new usbdevicemanager, 在其构造函数中,new usbhandler在usbhandler构造函数中,上面那个文件是有kernel android.c 里的设备,当KERNEL android_work 发UEVENT 时, UeventObserver 会收到,执行onUEventUpdatestate, 给HANDLER发消息Handler 处理消息:updateUsbNotification , STATUS BAR 显示通知, bSettings ,updateAdbNotification 提示ADB , com.android.settings.DevelopmentSettings 。

LOG:3.应用相关3.1 Status bar:On resume中调用下面方法加载preferencescreen,并获得USBMANAGER, 在后面设置改变时会用到。

UsbManager OverviewThis class allows you to access the state of USB and communicate with USB devices. Currently only host mode is supported in the public API.You can obtain an instance of this class by calling Context.getSystemService().当设置改变时调用usbmanager 的setCurrentFunction方法来设置USB FUNCTION。

往下的流程:m UsbManager.setCurrentFunction(function, makeDefault);mService.setCurrentFunction(function, makeDefault);mDeviceManager.setCurrentFunctions(function, makeDefault);mHandler.sendMessage( MSG_SET_CURRENT_FUNCTIONS, functions,makeDefault);setEnabledFunctionssetUsbConfigSystemProperties.set("b.config", config);init property_serviceinit.rc内核SYS 文件 show/store 完成KERNEL USB FUNCTION bind.kernel usb function bind3.2 UsbStorageActivity/*** This activity is shown to the user for him/her to enable USB mass storage * on-demand (that is, when the USB cable is connected). It uses the alert * dialog style. It will be launched from a notification.*/USBDEVICEMANAGER 的handler 处理中还会发送 ACTION_USB_STATE 的广播。

Send boardcast , 上面的LOG:广播会被 mountservice 收到因为如上图StorageNotification.start 中通过storagemanager 注册了listener, 会huidao StorageNotification(SYSTEMUI 中)的onUsbMassStorageConnectionChangedAsynconUsbMassStorageConnectionChangedAsync中会调到updateUsbMassStorageNotificationupdateUsbMassStorageNotification,提示UMS。

UsbStorageActivity 中如果使能 UMS,则会通过storagemanager enableUsbMassStorage 方法设置UMS。

往下流程分析:m StorageManager.enableUsbMassStorage();mMountService.setUsbMassStorageEnabled(true);往handler 发H_UNMOUNT_PM_UPDATE 消息,处理消息,mForceUnmounts.add(ucb);doUnmountVolume(path, true, removeEncryption);回调UmsEnableCallBack. handleFinisheddoShareUnshareVolumemConnector.execute("volume", enable ? "share" : "unshare", path, method);VOLD 下面就是VOLD的处理流程了。

相关文档
最新文档