Android usb流程分析Word文档格式.docx

上传人:b****4 文档编号:18168494 上传时间:2022-12-13 格式:DOCX 页数:21 大小:1.82MB
下载 相关 举报
Android usb流程分析Word文档格式.docx_第1页
第1页 / 共21页
Android usb流程分析Word文档格式.docx_第2页
第2页 / 共21页
Android usb流程分析Word文档格式.docx_第3页
第3页 / 共21页
Android usb流程分析Word文档格式.docx_第4页
第4页 / 共21页
Android usb流程分析Word文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

Android usb流程分析Word文档格式.docx

《Android usb流程分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《Android usb流程分析Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

Android usb流程分析Word文档格式.docx

driver/usb/gadget/android.c(android实现的)或driver/usb/gadget/serial.c(传统Linux实现的USB转串口)。

二层:

USB设备层(usbcore)。

这一层是Linux内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。

浏览参考关注此层时,会发现“gadget”是此层的关键字,此层的关键数据结构是:

usb_gadget_driver,usb_composite_dev。

这层主要的一个驱动文件为:

driver/usb/gadget/composite.c

三层:

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注册

Mt_devs.c

Driver:

Usb20.c(doov6592kk\kernel\mediatek\platform\mt6592\kernel\drivers\usb20):

Probe:

重新注册了一个"

musb-hdrc"

设备,

然后在kernel/drivers/usb/musb/musb_core.c加载musb-hdrc驱动,

执行PROBE,这里才是真正的加载驱动,内存,中断,DMA等资源申请,并初始化USB.

musb_probemusb_init_controllermusb_gadget_setupusb_add_gadget_udc加入了LINUXUSB框架了。

 

Android.c

注册的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.candroid_setup

android_work

kobject_uevent_env

USBserviceueventobserver收到UEVENT事件。

PMIC中断,检测到充电器中断

Battery里判断chargertype,然后会使能USB,等待主机发枚举包。

收到主机发来的枚举包,会调用到android_setup完成枚举,android_setup会调用android_work发uevent事件。

2.UsbService相关

/**

*UsbServicemanagesallUSBrelatedstate,includingbothhostanddevicesupport.

*HostrelatedeventsandcallsaredelegatedtoUsbHostManager,anddevicerelated

*supportisdelegatedtoUsbDeviceManager.

*/

在systemserver中启动

并调用,

在USBDEVICEMANAGER里,得到NOTIFICATION_SERVICE,后面显示通知时用到。

上面newusbdevicemanager,在其构造函数中,newusbhandler

在usbhandler构造函数中,

上面那个文件是有kernelandroid.c里的设备,

当KERNELandroid_work发UEVENT时,UeventObserver会收到,执行onUEvent

Updatestate,给HANDLER发消息

Handler处理消息:

updateUsbNotification,STATUSBAR显示通知,com.android.settings.UsbSettings,

updateAdbNotification提示ADB,com.android.settings.DevelopmentSettings。

LOG:

3.应用相关

3.1Statusbar:

Onresume中调用下面方法加载preferencescreen,

并获得USBMANAGER,在后面设置改变时会用到。

UsbManagerOverview

ThisclassallowsyoutoaccessthestateofUSBandcommunicatewithUSBdevices.CurrentlyonlyhostmodeissupportedinthepublicAPI.

Youcanobtainaninstanceofthisclassbycalling 

Context.getSystemService().

当设置改变时调用usbmanager的setCurrentFunction方法来设置USBFUNCTION。

往下的流程:

mUsbManager.setCurrentFunction(function,makeDefault);

mService.setCurrentFunction(function,makeDefault);

mDeviceManager.setCurrentFunctions(function,makeDefault);

mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS,functions,makeDefault);

setEnabledFunctions

setUsbConfig

SystemProperties.set("

sys.usb.config"

config);

initproperty_service

init.rc

内核SYS文件show/store完成KERNELUSBFUNCTIONbind.

kernelusbfunctionbind

3.2UsbStorageActivity

*Thisactivityisshowntotheuserforhim/hertoenableUSBmassstorage

*on-demand(thatis,whentheUSBcableisconnected).Itusesthealert

*dialogstyle.Itwillbelaunchedfromanotification.

*/

USBDEVICEMANAGER的handler处理中还会发送ACTION_USB_STATE的广播。

Sendboardcast,上面的LOG:

广播会被mountservice收到

因为如上图StorageNotification.start中通过storagemanager注册了listener,会huidaoStorageNotification(SYSTEMUI中)的onUsbMassStorageConnectionChangedAsync

onUsbMassStorageConnectionChangedAsync中会调到updateUsbMassStorageNotification

updateUsbMassStorageNotification,

提示UMS。

UsbStorageActivity中如果使能UMS,则会通过storagemanagerenableUsbMassStorage方法设置UMS。

往下流程分析:

mStorageManager.enableUsbMassStorage();

mMountService.setUsbMassStorageEnabled(true);

往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,storagemanager

*MountServiceimplementsback-endservicesforplatformstorage

*management.

*@hide-Applicationsshoulduseandroid.os.storage.StorageManager

*toaccesstheMountService.

和vold等合作起作用,主要负责监听并广播device的mount/unmount/badremoval等等事件。

mountservice启动也在systemserver中,如下图,构造函数中newNativeDaemonConnector,连接到VOLD.

5.Vold(volumedaemon)

vold启动在init.rc中:

入口:

/system/vold/main.cpp

流程图:

接上面的流程,mountservice发下来share的命令后(之前发了umount),会到CommandListener.cpp中VolumeCmd的runCommand。

VolumeManager:

:

shareVolume会将设备名

写入到sys下的一个文件,这个文件是由kernel的mass_storage_functioninit函数创建的,写入要分享的设备名就直接将这个设备share出去了。

问题:

1.只大概梳理了UMS,其他项MTP,PTP等都没分析。

2.内核USBCORE的功能比较复杂,没涉及,KERNELUSB功能绑定功能没有深入涉及。

3.本文档不涉及到USBHOST(特指KERNEL不原生支持的设备)。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1