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
Android USB Host框架的更多相关文章
- Android USB Host与HID通讯
前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是: Android USB Host与HID通讯 Android Service创建US ...
- Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因
近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...
- Android USB Host 与 HID 之通讯方法
Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两个方法,要实现真正的通 ...
- Android USB Host与HID通讯 (二)
不好意思,从上一篇到现在确实比较忙,中间又外出了一段时间,虽然也上LOFTER,或者看到一些朋友QQ上加我,给我发信息询问,有些看到了有些可能没看到,偶尔回复了一两个,也不咋的详细,在此我想说,一方面 ...
- Android USB Host与HID通讯 (一)
去年9月份来到现在的公司,接到新公司的第一个项目就是Android USB Host与HID通讯,当时也什么都不懂,就拿着google的api 开发指南 (http://developer.andro ...
- 翻译Android USB HOST API
翻译Android USB HOST API 源代码地址:http://developer.android.com/guide/topics/connectivity/usb/host.html 译者 ...
- Android USB Host 与 HID 之通讯方法(bulkTransfer()与controlTransfer()方法使用)
转载地址:差满多乃几 Android USB Host与HID通讯,就目前Google Developer提供的方法有bulkTransfer()与controlTransfer(),看是简简单单的两 ...
- Android USB Host 通信程序
换到了一家新公司,于是就有了新的项目.这次的项目 要用Android SDK与USB HID设备进行通信.第一次接触Android SDK,以及USB,记录下源程序.开发过程以及一些心得. 首先,要感 ...
- android usb host 读写USB设备
自android3.1以后android增加了操作USB设备的API. 官网地址:http://developer.android.com/guide/topics/connectivity/usb/ ...
随机推荐
- RabbitMQ 设置队列的过期时间
设置队列的过期时间非常简单,在声明队列时,设置x-expires参数即可.当队列的生存周期超时后,RabbitMQ server会自动将该队列删除. 代码如下: channel.QueueDeclar ...
- Linux音频驱动学习之:(2)移植wm8976声卡驱动(linux-3.4.2)
1.wm8976驱动程序: /* * wm8976.h -- WM8976 Soc Audio driver * * This program is free software; you can re ...
- C++中的局部变量、全局变量、局部静态变量、全局静态变量的区别
局部变量(Local variables)与 全局变量: 在子程序或代码块中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量. 全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序 ...
- 18-10-16 IE 快捷键的组合方式
一般快捷键 F11打开/关闭全屏模式 TAB循环的选择地址栏,刷新键和当前标签页 CTRL+F在当前标签页查询字或短语 CTRL+N为当前标签页打开一个新窗口 CTRL+P打印当前标签页 CTRL+A ...
- wiki----为用户设置管理员权限
wiki页面的管理员权限设置方法: wiki的页面好像没办法修改,只能在数据库中进行操作: 1.进入到wiki的安装目录下: #cd /var/www/html/wiki 2.查看wiki的配置文件, ...
- winform 与百度搜索智能提示
private void textBox1_TextChanged(object sender, EventArgs e) { listBox1.Items.Clear(); if (string.I ...
- mmap 操作
mmap 功能描述: mmap将一个文件或者其它对象映射进内存.文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零.munmap执行相反的操作,删除特定地址区域 ...
- Kaggle:House Prices: Advanced Regression Techniques 数据预处理
本博客是博主在学习了两篇关于 "House Prices: Advanced Regression Techniques" 的教程 (House Prices EDA 和 Comp ...
- 无重复字符的最长子串-LeetCode-第3题-C++
题目:无重复字符的最长子串 题目描述:给定一个字符串,找出不含有重复字符的最长子串的长度. 最长不重复子串可能有很多个,但是其长度只有一种. 方法一:暴力搜索法 方法二:滑动窗口 哈希表:要查找一个元 ...
- spring事务管理-Spring 源码系列(6)
Spring事务抽象的是事务管理和事务策略.而实现则由各种资源方实现的.我们最常用的数据库实现:DataSourceTransactionManager 尝试阅读一下spring 的实现代码,由3个核 ...