Android USB Host框架

Android 下的usb框架及功能点:https://blog.csdn.net/tianruxishui/article/details/37902959
1.Android framework中****Manager.java是给用户提供的接口。
UsbDeviceManager.java:主要完成功能切换及状态的更新,需要向外广播状态,接收kernel发送过来的event信息。实质性的工作都在这里边完成。
UsbManager.java:
usbService.java:
用户会通过usbManager的调用来完成usb功能的设置。

2.Android O中关于USB的文件
[ubuntu @services]$ pwd
/media/ubuntu/work/service_mount/android_ti/mydroid/frameworks/base/services
[ubuntu @services]$ tree usb
usb
├── Android.mk
└── java
└── com
└── android
└── server
└── usb
├── UsbAudioManager.java
├── UsbDebuggingManager.java
├── UsbDeviceManager.java
├── UsbHostManager.java
├── UsbService.java
└── UsbSettingsManager.java

每个文件的作用:

UsbSettings.java:
packages/apps/Settings/src/com/android/settings/deviceinfo/UsbSettings.java下,
作用:这个是用户在setting中,选择不同的存储类型时的,进行的界面更新及状态切换的处理流程。

UsbSettingsManager.java:
frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java
作用:没有明白具体功能是干什么的,在UsbDeviceManager.java有用到一些。发送usb device attached

StorageNotification.java
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java
主要用来处理存储设备相关动作的状态更新、通知。主要涉及两个方面:一是插入usbcabel后的状态栏更新,主要针对ums功能。
二是storage状态发生改变时,会调用这个activity,如mount、unmount等。
所以入口主要有两个:onUsbMassStorageConnectionChanged 和 onStorageStateChanged 分别处理usb连接状态的改变和storage状态的改变。

UsbStorageActivity.java
frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbStorageActivity.java
启动u盘功能后的一些ui的处理,状态的监控等处理,做的工作不多。

UsbDevice.java
frameworks/base/core/java/android/hardware/usb/UsbDevice.java
主要是usb设备的一些接口,基本上是获取的设备描述符。

UsbDeviceConnection.java
frameworks/base/core/java/android/hardware/usb/UsbDeviceConnection.java
usb设备的打开,基本传输等动作,似乎是native层面的。

UsbDisconnectedReceiver.java
frameworks/base/core/java/android/hardware/usb/UsbDisconnectedReceiver.java
接收断开的信息,android.hardware.usb.action.USB_DEVICE_DETACHED

UsbHostManager.java
frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java
处理host情况下的事件流程:
UsbDeviceAdded函数: 报告有USB设备插入,通过getCurrentSettings().deviceAttached发送intent消息UsbManager.ACTION_USB_DEVICE_ATTACHED。
在这个函数中有更改if (vendorID == 1060 && productID == 18762){//nevs hub state
JNI 层的函数是被 UsbHostManager 调用的,UsbHostManager 中具体的监控进程在systemReady中创建的,标识为"UsbService host thread"

对应的JNI函数com_android_server_UsbHostManager.cpp //对应的JNI函数就写成文件,曰JNI文件
frameworks/base/services/core/jni/com_android_server_UsbHostManager.cpp

其中的monitorUsbHostBus会调用usb_host_run函数(system/core/libusbhost/usbhost.c,他是用inotify来监听USB设备的插拔)不停的读取bus总线,读
取到以后,调用注册的回调函数usb_device_added--àUsbDeviceAdded(method_usbDeviceAdded)

usbhost.c
system/core/libusbhost/usbhost.c libusb只有这一个文件
system/core/libutils 下面文件较多

onload.cpp
frameworks/base/services/core/jni/onload.cpp 下面包含很多JNI文件,应该绝大多数JNI文件的名字是以com_android_server_开头的。
在namespace android { }中注册了很多server。
这里面JNI_OnLoad()中调用的注册函数都是来源于这里面的JNI文件

Android USB 框架 —— UsbHostManager: https://simowce.github.io/2016/03/20/2016-03-20-android-usb-framework--usbhostmanager/ 这个博客很好

1. Android JNI 与 Java JNI 的区别
Android 中使用了一种不同于传统 Java JNI 的方法来定义其 native 函数。其中很重要的区别就是 Android 使用了一种 Java 和 C 函数的映射表数组,
并在其中表述了函数的参数和返回值。这个数组的类型就是 JNINativeMethod
2.在 UsbHostManager 中创建一个线程来监控(注意,这里用“监控”可是很有讲究的,因为当 Android 设备处于 Host 模式时,当有 USB 设备插拔时,首先相应的是 Linux 内核,
然后内核再将设备变动的信息传递给上层,而 Android 根据这些信息在进行相应的动作,所以这里使用了“监控”二字。这跟 Android 设备处于 Slave 模式下的 UsbDeviceManager 是完全不同的)
设备的连接状态。该线程执行的是 JNI 层的函数,而 JNI 层则是通过调用 libusb 库的函数,利用内核提供的 inotify 机制来监控 /dev/bus/usb 下文件的变动来判断是否有新的设备的插拔。
==>
UsbHostManager.java:是Android设备做host时用的
UsbDeviceManager.java:是Android设备做device时用的
Android中监控USB设备的插拔使用的还是libusb库。

3.USB 插入设备之后,内核会在 /dev/bus/usb 这个目录下建立代表该文件的设备文件入口(device file entry)(当然,个中细节还需要花时间深入理解,这里先假设其成立),然后 Android 上层
使用 libusb 这个库来监控这个目录下的文件变动,其中用到的技术就是 inotify 。
libusb 的源代码具体位置在 system/core/libusb/usbhost.c。

runnable进程 //frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java中创建的
monitorUsbHostBus
---JNI---
android_server_UsbHostManager_monitorUsbHostBus //com_android_server_UsbHostManager.cpp
usb_host_init //它定义在哪?
usb_host_run //usbhost.c
done = usb_host_load
inotify_add_watch

while(!done) done = usb_host_read_event(context);
if (event->mask == IN_CREATE) {
done = context->cb_added(path, context->data);
} else if (event->mask == IN_DELETE) {
done = context->cb_removed(path, context->data);
}

nativeOpenDevice
---JNI---
android_server_UsbHostManager_openDevice

Signature:
Java Signature native
String Ljava/lang/String; jstring
? Landroid/os/ParcelFileDescriptor; jobject

TODO:Android Usb在framework的相关源码分析:https://www.jianshu.com/p/51809085e9cc

原文地址:https://www.cnblogs.com/hellokitty2/p/10398004.html

时间: 2024-07-31 15:59:06

Android USB Host框架的相关文章

Android USB Host与HID通讯

前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是:      Android USB Host与HID通讯 Android Service创建USB HOST通信 其中代码之处有些地方需要注意的, 特此注明一下: /** * USB HOST 连接 HID * @author IVAN * */ public class MainActivity extends Activity { private static final String T

翻译Android USB HOST API

翻译Android USB HOST API 源码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者注:翻译的好不好不是太重要,重点是在翻译的过程中会把每句话都看认真看一遍,或者说是抱着翻译的思想来完成一个读懂的目的. USB Host通信 当你的可供电Android设备处理USB host模式时,它担任着为USB总线供电,枚举连接的USB从设备等等一个主设备应用的工作.Android 3.1及以后

Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

【转】Android实战技巧之四十九:Usb通信之USB Host

零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头,USB设备使用公头与PC连接. 目前USB硬件接口分三种,普通PC上使用的叫Type:原来诺基亚功能机时代的接口为Mini USB:目前Android手机使用的Micro USB. Host USB是由Host端控制整个总线的数据传输的.单个USB总线上,只能有一个Host. OTG On The

全志Android设备增加Usb host ADK 功能

全志Android设备增加Usb host ADK 功能 Usb Host ADK是指不采用USB驱动,直接用java与设备编程的 这样让Android 可以无需修改内核和驱动情况下方便与各种USB外设通讯.全志的CPU的资料都是公开的,因此我们在上面开发很多应用.但是发现无法使用usb host 接口. 一.测试 可以简单下载USB Device info 来测试 https://play.google.com/store/apps/details?id=aws.apps.usbDeviceE

简析Android 兼容性测试框架CTS使用

一.什么是兼容性测试? 1)为用户提供最好的用户体验,让更多高质量的APP可以顺利的运行在此平台上 2)让程序员能为此平台写更多的高质量的应用程序 3)可以更好的利用Android应用市场 二.CTS覆盖领域 1)签名测试:针对每个Android正式版,都将附带一系列XML文档对所有的公共API签名进行描述.CTS将检查这些签名是否适用于该设备,并保存其结果. 2)平台API测试:测试SDK中平台核心库和Android应用程序框架的API是否正确 3)Dalvik虚拟机测试:集中测试Dalvik

Android USB转串口通信开发基本流程

好久没有写文章了,年前公司新开了一个项目,是和usb转串口通信相关的,需求是用安卓平板通过usb转接后与好几个外设进行通信,一直忙到最近,才慢慢闲下来,趁着这个周末不忙,记录下usb转串口通信开发的基本流程. 我们开发使用的是usb主机模式,即:安卓平板作为主机,usb外设作为从机进行数据通信.整个开发流程可以总结为以下几点: 1.发现设备 UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERV

Android应用程序框架层和系统运行库层日志系统源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6598703 在开发Android应用程序时,少不了使用Log来监控和调试程序的执行.在上一篇文章Android日志系统驱动程序Logger源代码分析中,我们分析了驱动程序Logger的源代码,在前面的文章浅谈Android系统开发中Log的使用一文,我们也简单介绍在应用程序中使Log的方法,在这篇文章中,我们将详细介绍Android应用程序框架

Android插件化框架

1.   dynamic-load-apk/DL动态加载框架 是基于代理的方式实现插件框架,对 App 的表层做了处理,通过在 Manifest 中注册代理组件,当启动插件组件时,首先启动一个代理组件,然后通过这个代理组件来构建,启动插件组件. 需要按照一定的规则来开发插件 APK,插件中的组件需要实现经过改造后的 Activity.FragmentActivity.Service 等的子类. 优点如下: 动态升级, 高效并行开发(编译速度更快) 按需加载,内存占用更低等等DynamicLoad