1、Android usb 流程分析文档以 UMS(usb mass storage)为例来分析流程,主要按照图中红线来分析(即从插入 USB 开始到状态栏弹框,然后又从选择 UMS 功能开始往下的流程) 。 以前没有看过USB 相关代码,网上也很少有分析 usb FRAMEWORK 相关的东西,文档中可能存在错误,如果发现欢迎指正。总体框图1. Kernel USB 流程LINUX KERNEL GADGET 架构Linux USB Gadget 分三层架构,层次关系从上到下一层:USB Gadget 功能层。BSP/Driver 开发者通常是要实现这一层,从而实现一个具体的设备驱动,如 And
2、droid 在此层实现了 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 内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。浏览参考关注此层时,会发
3、现“gadget”是此层的关键字,此层的关键数据结构是:usb_gadget_driver,usb_composite_dev。这层主要的一个驱动文件为:driver/usb/gadget/composite.c三层:USB 设备控制器驱动层。这一层主要是与 CPU、CPU USB 控制器有关,与硬件紧密相关,主要它和 USB 控制器牵扯在一起,涉及有寄存器、时钟、DMA 等等。但是这一层往往是由芯片厂商去实现。我们一般仅需在板级文件中处理好所需要的 USB 接口即可。这层的关键字就是“UDC” ,主要驱动文件命名含“udc”关键字,一般与 CPU 或芯片厂商有关,如 MTK UDC 驱动在k
4、ernel/mediatek/platform/mt6592/kernel/drivers/usb20/目录下。USB Gadget 的三层架构的关系可以用一句简单的话去概括三层的关系:USB Gadget 功能层调用 USB 设备层的接口,USB 设备层调用 USB 设备控制器驱动层的接口,然后 USB 设备控制器驱动层回调 USB设备层,USB 设备层回调 USB Gadget 功能层。USB 设备驱动层:USB DEVICE 注册Mt_devs.cDriver:Usb20.c (doov6592kkkernelmediatekplatformmt6592kerneldriversusb2
5、0):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充电器插入中断检测
6、电路USB 插入中断流程:USB 插入中断 WAKEUP PMIC THERAD if( (int_status_val_0) do_chrdet_int_task mt_battery_charger_detect_check mt_usb_connect musb_start(mtk_musb); * Program the HDRC to start (enable interrupts, dma, etc.). 开始 USB 枚举 android.c android_setup android_work kobject_uevent_env USBservice ueventobser
7、ver 收到 UEVENT 事件。 。 。 。PMIC 中断,检测到充电器中断Battery 里判断 charger type, 然后会使能 USB, 等待主机发枚举包。收到主机发来的枚举包,会调用到 android_setup 完成枚举,android_setup 会调用 android_work 发 uevent 事件。 2.UsbService 相关/* UsbService manages all USB related state, including both host and device support.* Host related events and calls are d
8、elegated 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
9、时, UeventObserver 会收到,执行 onUEvent Updatestate, 给 HANDLER 发消息Handler 处理消息:updateUsbNotification , STATUS BAR 显示通知, com.android.settings.UsbSettings , updateAdbNotification 提示 ADB , com.android.settings.DevelopmentSettings 。LOG:3.应用相关 3.1 Status bar: On resume 中调用下面方法加载 preferencescreen,并获得 USBMANAGER
10、, 在后面设置改变时会用到。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 方法来设置 US
11、B FUNCTION。往下的流程:mUsbManager.setCurrentFunction(function, makeDefault); mService.setCurrentFunction(function, makeDefault); mDeviceManager.setCurrentFunctions(function, makeDefault); mHandler.sendMessage( MSG_SET_CURRENT_FUNCTIONS, functions, makeDefault); setEnabledFunctions setUsbConfig SystemProp
12、erties.set(“sys.usb.config“, config); init property_service init.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 us
13、es 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 中) 的onUsbMassStorageConnect
14、ionChangedAsync onUsbMassStorageConnectionChangedAsync 中会调到 updateUsbMassStorageNotificationupdateUsbMassStorageNotification, 提示 UMS。UsbStorageActivity 中如果使能 UMS, 则会通过 storagemanager enableUsbMassStorage 方法设置 UMS。往下流程分析:mStorageManager.enableUsbMassStorage();mMountService.setUsbMassStorageEnabled(tr
15、ue); 往 handler 发 H_UNMOUNT_PM_UPDATE 消息, 处理消息,mForceUnmounts.add(ucb); doUnmountVolume(path, true, removeEncryption); 回调 UmsEnableCallBack. handleFinished doShareUnshareVolume mConnector.execute(“volume“, enable ? “share“ : “unshare“, path, method);VOLD 下面就是 VOLD 的处理流程了。4.Mountservice, storagemanage
16、r/* MountService implements back-end services for platform storage* management.* hide - Applications should use android.os.storage.StorageManager* to access the MountService.*/和 vold 等合作起作用,主要负责监听并广播 device 的 mount/unmount/bad removal 等等事件。M o u n t S e r v i c eV O L DS t o r a g e M a n a g e rk e
17、 r n e lb i n d e rs o c k e tu e v e n tmountservice 启动也在 systemserver 中, 如下图,构造函数中 new NativeDaemonConnector, 连接到 VOLD .5.Vold ( volume daemon)vold 启动在 init.rc 中: 入口: /system/vold/main.cpp流程图:接上面的流程,mountservice 发下来 share 的命令后(之前发了 umount), 会到CommandListener.cpp 中 VolumeCmd 的 runCommand。VolumeManager:shareVolume 会将设备名 写入到 sys 下的一个文件, 这个文件是由 kernel 的 mass_storage_function init 函数创建的,写入要分享的设备名就直接将这个设备 share 出去了。问题:1. 只大概梳理了 UMS, 其他项 MTP,PTP 等都没分析。2. 内核 USB CORE 的功能比较复杂,没涉及,KERNEL USB 功能绑定功能没有深入涉及。3. 本文档不涉及到 USB HOST(特指 KERNEL 不原生支持的设备)。