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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM