首页 > 其他分享 >Android USB 整条通知链分析

Android USB 整条通知链分析

时间:2024-09-25 14:25:57浏览次数:7  
标签:java usb 链分析 通知 内核 HAL Android USB

以Android13 为例:在Android 13中,USB插入拔出事件的通知链从硬件层到应用层,依次经过硬件、内核、HAL、Framework、以及应用广播等多个模块,整个流程涉及的具体文件和逻辑如下:

  1. 硬件层(USB PHY / 控制器)

文件:

/drivers/usb/phy/phy-generic.c (USB PHY驱动)

/drivers/usb/dwc3/dwc3-core.c(如果是 USB 3.x 控制器)

说明:

USB PHY 负责检测物理层面的USB插入或拔出,并触发相应的中断,通知内核USB状态发生变化。

  1. 内核处理层(USB子系统)

文件:

/drivers/usb/core/port.c

/drivers/usb/core/hub.c

/drivers/usb/gadget/(USB Gadget模式)

/drivers/usb/host/(USB Host模式)

说明:

USB控制器会通过中断机制通知内核,内核USB子系统根据中断进行处理,包括设备的初始化、枚举以及模式选择(Host/Gadget)。处理完成后,内核生成一个 uevent 事件发送到用户空间。

  1. 用户空间通知:uevent

文件:

/drivers/base/core.c (kobject_uevent_env函数负责生成 uevent)

/sys/class/usb_device/(用于管理USB设备的sysfs路径)

说明:

内核通过 uevent 将USB设备的插入或拔出事件发送到用户空间,通知 udev 或其他守护进程(如vold),以便进一步处理。

  1. HAL 层(Hardware Abstraction Layer)

文件:

hardware/interfaces/usb/1.0/IUsb.hal(HIDL定义接口)

hardware/interfaces/usb/1.0/default/Usb.cpp(HIDL实现)

hardware/interfaces/usb/aidl/android/hardware/usb/IUsb.aidl(AIDL定义接口)

hardware/interfaces/usb/aidl/default/Usb.cpp(AIDL实现)

说明:

HAL层负责将底层内核的USB状态提供给上层的 UsbService。通过 getPortStatus() 等接口,HAL可以报告当前USB设备的状态和角色(如Host/Gadget),并支持角色切换(通过 switchRole())。

  1. Framework层(系统服务)

文件:

frameworks/base/services/usb/java/com/android/server/usb/UsbService.java

frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

frameworks/base/services/usb/java/com/android/server/usb/UsbHostManager.java

说明:

UsbService 是Framework层的核心服务,负责从HAL获取USB设备的状态,并根据USB设备的插入或拔出执行不同的处理流程。UsbDeviceManager和UsbHostManager根据设备是否处于Gadget或Host模式,分别管理对应的设备行为。

Framework层还负责触发广播通知应用层,并根据需要切换设备模式(如充电模式、MTP、PTP等)。

  1. 应用层广播通知

文件:

frameworks/base/core/java/android/hardware/usb/UsbManager.java

frameworks/base/core/java/android/content/Intent.java

说明:

当USB设备插入或拔出时,系统会通过广播(Intent)将此事件通知应用层。应用程序可以监听这些广播,并执行相应的逻辑。

常见的广播事件:

UsbManager.ACTION_USB_DEVICE_ATTACHED(USB设备插入)

UsbManager.ACTION_USB_DEVICE_DETACHED(USB设备拔出)

总结整条通知链:

  1. 硬件层(USB PHY/控制器):检测到USB设备物理连接状态的变化,触发中断。

  2. 内核处理层:内核中的USB控制器驱动处理中断,执行设备初始化或移除,之后生成 uevent 事件。

  3. uevent 通知用户空间:内核通过 uevent 系统通知 vold 或 init 等守护进程处理设备(如存储挂载),并向 HAL 层传递相关事件。

  4. HAL层处理:HAL 层通过 HIDL/AIDL 接口与内核交互,获取USB状态或进行模式切换(如从Host切换到Device模式),并将状态通知 Framework 层的 UsbService。

  5. Framework层处理:UsbService 通过 HAL 获取USB设备的状态,并执行相应操作,如控制模式切换、处理存储挂载等,并发送广播通知应用层。

  6. 应用层响应:应用程序通过监听 UsbManager 的广播事件,获取USB插入拔出的通知,并作出相应的响应(如打开文件管理器、同步数据等)。

标签:java,usb,链分析,通知,内核,HAL,Android,USB
From: https://www.cnblogs.com/linhaostudy/p/18431268

相关文章

  • Android Studio制作简单登录界面
    实现目标应用线性布局设计登录界面,要求点击输入学号时弹出数字键盘界面,点击输入密码时弹出字母键盘,出现的文字、数字、尺寸等全部在values文件夹下相应.xml文件中设置好,使用时直接引用。当用户名或密码为空,显示一个提示信息“用户名与密码不能为空!”,当用户名和密码匹配,显示“登录......
  • Android启动过程深入解析
    Android启动过程深入解析A当按下Android设备电源键时究竟发生了什么?Android的启动过程是怎么样的?A什么是Linux内核?A桌面系统linux内核与Android系统linux内核有什么区别?A什么是引导装载程序?A什么是Zygote?A什么是X86以及ARMlinux?A什么是init.rc?A什么是系统服务?当我们想到......
  • Android Studio实例:绿豆通讯录
    步骤一:了解项目结构步骤二:首先是继承SQLiteOpenHelper的数据库自定义类创建Java文件MyHelper.javaimportandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;publicclassMyHelperextends......
  • Android线程使用总结
    Android线程使用总结1.ThreadingPerformance在程序开发的实践当中,为了让程序表现得更加流畅,我们肯定会需要使用到多线程来提升程序的并发执行性能。但是编写多线程并发的代码一直以来都是一个相对棘手的问题,所以想要获得更佳的程序性能,我们非常有必要掌握多线程并发编程......
  • 我是如何开发一款支持IDEA、PyCharm、Android Sutdio 等JB全家桶的摸鱼插件的
    公众号「古时的风筝」,专注于后端技术,尤其是Java及周边生态。个人博客:www.moonkite.cn大家好,我是风筝前些天做了一款支持Jetbrains大部分IDE的摸鱼插件-一款IDE摸鱼插件,没想到出乎意料的没什么人用,当初说VsCode里面的养宠物的插件时,一大堆人问IDEA里有没有、PyChar......
  • Android连接蓝牙自定义封装SDK(基于Cordova与ionic)
    今天给大家分享一款基于Cordova与ionic框架自定义封装的Android手机连接蓝牙的插件。自己公司遇到的业务需求是,与第三方公司合作,需要在项目现场打印项目物资与物料验收单,后期提供给财务核对报销等。第三方公司提供蓝牙打印机与手持机,我们需要自己结合业务开发相对应的功能。......
  • Android studio 新建项目gradle依赖下载超时
    版本信息:android-studio-2024.1.2.12gradle-8.7&使用groovy配置项目配置:修改settings.gradle文件,将阿里云镜像仓库添加到google{}和mavenCentral()上方,不要随意改变仓库位置,仓库列出顺序决定 Gradle在这些仓库中搜索各个项目依赖项的顺序。pluginManagement{......
  • [STM32]USB转NRF24L01
    分享一个简单的小设计,一个由STM32F103C8T6编写的USB转2.4g无线模块,有趣的是c8t6可以运行lvgl。整板成本只要17块左右(STM32F103C8T6+NRF24L01+ST7735)。整体十分小巧能够运行裁切后的lvgl6.0,但是加上lvgl后内存非常紧张  ......
  • Android获取Toolbar中Menu项的Menu
    在Android中,如果你想要获取Toolbar中Menu项的View,通常是在onCreateOptionsMenu方法中设置菜单项,并在onOptionsItemSelected方法中处理菜单项的选择事件。但是,如果你需要直接获取某个菜单项的视图(例如,为了修改它的外观或行为),你可以使用MenuItem对象的getActionView()方法。下面是一......
  • 科普向:USB设备的PID、VID和GUID分别代表什么
    USB设备的PID、VID和GUID分别代表什么在USB设备中,PID、VID和GUID是用于标识和管理设备的重要标识符。以下是它们的具体含义:1.VID(VendorID)VID代表供应商ID,它是由USB实现者论坛(USB-IF)分配给每个USB设备制造商的唯一标识符。每个制造商在制造USB设备时都......