1、二层:USB设备层(usb core)。这一层是Linux内核开发维护者实现的,与我们没太大关系,不用我们操心,我们只关心其的一些接口就行。浏览参考关注此层时,会发现“gadget”是此层的关键字,此层的关键数据结构是:usb_gadget_driver,usb_composite_dev。这层主要的一个驱动文件为:driver/usb/gadget/三层:USB设备控制器驱动层。这一层主要是与CPU、CPU USB控制器有关,与硬件紧密相关,主要它和USB控制器牵扯在一起,涉及有寄存器、时钟、DMA等等。但是这一层往往是由芯片厂商去实现。我们一般仅需在板级文件中处理好所需要的USB接口即可。
2、这层的关键字就是“UDC”,主要驱动文件命名含“udc”关键字,一般与CPU或芯片厂商有关,如MTK UDC 驱动在kernel/mediatek/platform/mt6592/kernel/drivers/usb20/目录下。USB Gadget的三层架构的关系可以用一句简单的话去概括三层的关系:USB Gadget功能层调用USB设备层的接口,USB设备层调用USB设备控制器驱动层的接口,然后USB设备控制器驱动层回调USB设备层,USB设备层回调USB Gadget功能层。USB 设备驱动层:USB DEVICE注册 Driver: (doov6592kkkernelmediatekp
3、latformmt6592kerneldriversusb20):Probe: 重新注册了一个musb-hdrc 设备,然后在kernel/drivers/usb/musb/ 加载musb-hdrc 驱动,执行PROBE, 这里才是真正的加载驱动,内存,中断,DMA等资源申请,并初始化USB.musb_probe musb_init_controller musb_gadget_setup usb_add_gadget_udc 加入了LINUX USB框架了。 注册的android_usb_function:在SYS下创建一系列文件, 对应接口 XX_show/store充电器插入中断检测电路
4、USB插入中断流程:USB 插入中断 WAKEUP PMIC THERAD 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); * Program the HDRC to start (enable interrupts, dma, etc.). 开始USB 枚举 android_setup android_work kobject_uevent_
5、env USBservice ueventobserver 收到UEVENT事件。PMIC中断,检测到充电器中断Battery 里判断 charger type, 然后会使能USB, 等待主机发枚举包。收到主机发来的枚举包,会调用到android_setup 完成枚举,android_setup会调用 android_work 发uevent 事件。相关/* * UsbService manages all USB related state, including both host and device support. * Host related events and calls are
6、 delegated to UsbHostManager, and device related * support is delegated to UsbDeviceManager. */在 systemserver 中启动并调用, 在USBDEVICEMANAGER 里 , 得到NOTIFICATION_SERVICE, 后面显示通知时用到。上面new usbdevicemanager, 在其构造函数中,new usbhandler在usbhandler构造函数中,上面那个文件是有kernel 里的设备,当KERNEL android_work 发UEVENT 时, UeventObser
7、ver 会收到,执行onUEvent Updatestate, 给HANDLER发消息Handler 处理消息: updateUsbNotification , STATUS BAR 显示通知, , updateAdbNotification 提示ADB , 。LOG:3.应用相关 Status bar:On resume中调用下面方法加载preferencescreen,并获得USBMANAGER, 在后面设置改变时会用到。UsbManager Overview 当设置改变时调用usbmanager 的setCurrentFunction方法来设置USB FUNCTION。往下的流程: (f
8、unction, makeDefault); (function, makeDefault); (function, makeDefault); ( MSG_SET_CURRENT_FUNCTIONS, functions, makeDefault); setEnabledFunctions setUsbConfig (, config); init property_service 内核SYS 文件 show/store 完成KERNEL USB FUNCTION bind. kernel usb function bind UsbStorageActivity * This activit
9、y is shown to the user for him/her to enable USB mass storage * on-demand (that is, when the USB cable is connected). It uses the alert * dialog style. It will be launched from a notification. */USBDEVICEMANAGER 的handler 处理中还会发送 ACTION_USB_STATE 的广播。Send boardcast , 上面的LOG:广播会被 mountservice 收到因为如上图
10、中通过storagemanager 注册了listener, 会huidao StorageNotification(SYSTEMUI 中) 的onUsbMassStorageConnectionChangedAsync onUsbMassStorageConnectionChangedAsync中会调到updateUsbMassStorageNotificationupdateUsbMassStorageNotification, 提示UMS。UsbStorageActivity 中如果使能 UMS, 则会通过storagemanager enableUsbMassStorage 方法设置U
11、MS。往下流程分析: (); (true); 往handler 发H_UNMOUNT_PM_UPDATE 消息, 处理消息,(ucb); doUnmountVolume(path, true, removeEncryption); 回调UmsEnableCallBack. handleFinished doShareUnshareVolume (volume, enable share : unshare, path, method); VOLD 下面就是VOLD的处理流程了。, storagemanager * MountService implements back-end service
12、s for platform storage * management. * hide - Applications should use * to access the MountService.mountservice启动也在 systemserver 中, 如下图,构造函数中 new NativeDaemonConnector, 连接到VOLD . ( volume daemon)入口: /system/vold/:接上面的流程,mountservice 发下来share 的命令后(之前发了umount), 会到 中VolumeCmd的runCommand。VolumeManager:shareVolume 会将设备名 写入到 sys 下的一个文件, 这个文件是由 kernel 的mass_storage_function init函数创建的,写入要分享的设备名就直接将这个设备share 出去了。问题:1.只大概梳理了UMS, 其他项MTP,PTP 等都没分析。2.内核USB CORE的功能比较复杂,没涉及,KERNEL USB 功能绑定功能没有深入涉及。3.本文档不涉及到USB HOST(特指KERNEL不原生支持的设备)。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2