Android usb流程分析Word下载.docx
《Android usb流程分析Word下载.docx》由会员分享,可在线阅读,更多相关《Android usb流程分析Word下载.docx(22页珍藏版)》请在冰点文库上搜索。
二层:
USB设备层(usbcore)。
这一层是Linux内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。
浏览参考关注此层时,会发现“gadget”是此层的关键字,此层的关键数据结构是:
usb_gadget_driver,usb_composite_dev。
这层主要的一个驱动文件为:
driver/usb/gadget/
三层:
USB设备控制器驱动层。
这一层主要是与CPU、CPUUSB控制器有关,与硬件紧密相关,主要它和USB控制器牵扯在一起,涉及有寄存器、时钟、DMA等等。
但是这一层往往是由芯片厂商去实现。
我们一般仅需在板级文件中处理好所需要的USB接口即可。
这层的关键字就是“UDC”,主要驱动文件命名含“udc”关键字,一般与CPU或芯片厂商有关,如MTKUDC驱动在kernel/mediatek/platform/mt6592/kernel/drivers/usb20/目录下。
USBGadget的三层架构的关系
可以用一句简单的话去概括三层的关系:
USBGadget功能层调用USB设备层的接口,USB设备层调用USB设备控制器驱动层的接口,然后USB设备控制器驱动层回调USB设备层,USB设备层回调USBGadget功能层。
USB设备驱动层:
USBDEVICE注册
Driver:
(doov6592kk\kernel\mediatek\platform\mt6592\kernel\drivers\usb20):
Probe:
重新注册了一个"
musb-hdrc"
设备,
然后在kernel/drivers/usb/musb/加载musb-hdrc驱动,
执行PROBE,这里才是真正的加载驱动,内存,中断,DMA等资源申请,并初始化USB.
musb_probemusb_init_controllermusb_gadget_setupusb_add_gadget_udc加入了LINUXUSB框架了。
注册的android_usb_function:
在SYS下创建一系列文件,对应接口XX_show/store
充电器插入中断检测电路
USB插入中断流程:
USB插入中断
WAKEUPPMICTHERAD
if((((int_status_val_0)&
(0x0400))>
>
10)==1){chrdet_int_handler();
}
do_chrdet_int_task
mt_battery_charger_detect_check
mt_usb_connect
musb_start(mtk_musb);
*ProgramtheHDRCtostart(enableinterrupts,dma,etc.).
开始USB枚举
android_setup
android_work
kobject_uevent_env
USBserviceueventobserver收到UEVENT事件。
。
PMIC中断,检测到充电器中断
Battery里判断chargertype,然后会使能USB,等待主机发枚举包。
收到主机发来的枚举包,会调用到android_setup完成枚举,android_setup会调用android_work发uevent事件。
相关
/**
*UsbServicemanagesallUSBrelatedstate,includingbothhostanddevicesupport.
*HostrelatedeventsandcallsaredelegatedtoUsbHostManager,anddevicerelated
*supportisdelegatedtoUsbDeviceManager.
*/
在systemserver中启动
并调用,
在USBDEVICEMANAGER里,得到NOTIFICATION_SERVICE,后面显示通知时用到。
上面newusbdevicemanager,在其构造函数中,newusbhandler
在usbhandler构造函数中,
上面那个文件是有kernel里的设备,
当KERNELandroid_work发UEVENT时,UeventObserver会收到,执行onUEvent
Updatestate,给HANDLER发消息
Handler处理消息:
updateUsbNotification,STATUSBAR显示通知,,
updateAdbNotification提示ADB,。
LOG:
3.应用相关
Statusbar:
Onresume中调用下面方法加载preferencescreen,
并获得USBMANAGER,在后面设置改变时会用到。
UsbManagerOverview
当设置改变时调用usbmanager的setCurrentFunction方法来设置USBFUNCTION。
往下的流程:
(function,makeDefault);
(function,makeDefault);
(function,makeDefault);
(MSG_SET_CURRENT_FUNCTIONS,functions,makeDefault);
setEnabledFunctions
setUsbConfig
("
"
config);
initproperty_service
内核SYS文件show/store完成KERNELUSBFUNCTIONbind.
kernelusbfunctionbind
UsbStorageActivity
*Thisactivityisshowntotheuserforhim/hertoenableUSBmassstorage
*on-demand(thatis,whentheUSBcableisconnected).Itusesthealert
*dialogstyle.Itwillbelaunchedfromanotification.
*/
USBDEVICEMANAGER的handler处理中还会发送ACTION_USB_STATE的广播。
Sendboardcast,上面的LOG:
广播会被mountservice收到
因为如上图中通过storagemanager注册了listener,会huidaoStorageNotification(SYSTEMUI中)的onUsbMassStorageConnectionChangedAsync
onUsbMassStorageConnectionChangedAsync中会调到updateUsbMassStorageNotification
updateUsbMassStorageNotification,
提示UMS。
UsbStorageActivity中如果使能UMS,则会通过storagemanagerenableUsbMassStorage方法设置UMS。
往下流程分析:
();
(true);
往handler发H_UNMOUNT_PM_UPDATE消息,
处理消息,(ucb);
doUnmountVolume(path,true,removeEncryption);
回调UmsEnableCallBack.handleFinished
doShareUnshareVolume
("
volume"
enable"
share"
:
"
unshare"
path,method);
VOLD下面就是VOLD的处理流程了。
storagemanager
*MountServiceimplementsback-endservicesforplatformstorage
*management.
*@hide-Applicationsshoulduse*toaccesstheMountService.
mountservice启动也在systemserver中,如下图,构造函数中newNativeDaemonConnector,连接到VOLD.
(volumedaemon)
入口:
/system/vold/
:
接上面的流程,mountservice发下来share的命令后(之前发了umount),会到中VolumeCmd的runCommand。
VolumeManager:
:
shareVolume会将设备名
写入到sys下的一个文件,这个文件是由kernel的mass_storage_functioninit函数创建的,写入要分享的设备名就直接将这个设备share出去了。
问题:
1.只大概梳理了UMS,其他项MTP,PTP等都没分析。
2.内核USBCORE的功能比较复杂,没涉及,KERNELUSB功能绑定功能没有深入涉及。
3.本文档不涉及到USBHOST(特指KERNEL不原生支持的设备)。