Android USB系统初始化init.usb.rc

前面学习完了 init.usb.configfs.rc文件 ,它是一种用于配置和控制Android USB系统的初始化脚本文件,它使用了一种基于configfs(配置文件系统)的方法来设置USB配置和模式 , 那我们继续学习另外一个同样重要的USB系统初始化脚本文件init.usb.rc。

Android USB系统初始化是指在Android系统启动时,根据USB设备的类型和功能,设置相应的USB配置和模式,以实现USB设备的识别和连接。Android USB系统初始化涉及到两个重要的初始化脚本文件:init.usb.configfs.rc和init.usb.rc。

1. init.usb.rc文件详解

init.usb.rc文件是另一种用于配置和控制Android USB系统的初始化脚本文件,它使用了一种基于sysfs(系统文件系统)的方法来设置USB配置和模式。

sysfs是一种特殊的虚拟文件系统,它允许用户通过读取和修改文件来访问内核对象的属性,如USB设备的ID、功能、状态等。sysfs通常挂载在/sys目录下,它提供了一个名为class/android_usb/android0的子目录,用于管理USB设备的属性和行为。

2|rk3568_r:/sys/class/android_usb/android0 # ls -ll
total 0
drwxr-xr-x 3 root root    0 2023-08-24 19:19:58.813334168 +0800 f_audio_source
drwxr-xr-x 3 root root    0 2023-08-24 19:19:58.823334169 +0800 f_midi
drwxr-xr-x 2 root root    0 2023-08-24 19:19:58.803334167 +0800 power
-r--r--r-- 1 root root 4096 2023-08-24 19:19:58.812992001 +0800 state
lrwxrwxrwx 1 root root    0 2023-08-24 19:19:58.803334167 +0800 subsystem -> ../../../../class/android_usb
-rw-r--r-- 1 root root 4096 2023-08-24 19:19:58.807655959 +0800 uevent
rk3568_r:/sys/class/android_usb/android0 # cat state
DISCONNECTED #没接usb 调试
rk3568_r:/sys/class/android_usb/android0 # cat state
CONFIGURED #接了usb 调试

init.usb.rc文件主要包含以下几个部分:

  • 启动操作:启动操作是一种用于在文件系统准备好后执行的操作,它使用on post-fs-data语句来定义触发条件,如on post-fs-data表示在文件系统准备好后触发。
on post-fs-data
    chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file
    chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file
    chown system system /sys/class/android_usb/android0/f_rndis/ethaddr
    chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr
    mkdir /data/misc/adb 02750 system shell
    mkdir /data/adb 0700 root root encryption=Require

  • 服务定义:服务定义是一种用于定义服务的操作,它使用service语句来指定服务名称、路径、参数、类别、套接字、状态、标签等,如service adbd /system/bin/adbd --root_seclabel=u:r:su:s0表示定义一个名为adbd的服务,它的路径是/system/bin/adbd,参数是–root_seclabel=u:r:su:s0,类别是core,套接字是adbd,状态是disabled,标签是u:r:adbd:s0。
# adbd is controlled via property triggers in init.<platform>.usb.rc
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
    class core
    socket adbd seqpacket 660 system system
    disabled
    updatable
    seclabel u:r:adbd:s0
  • 初始化操作:初始化操作是一种用于在系统初始化时执行的操作,它使用on init语句来定义触发条件,如on init表示在系统初始化时触发。
on init
    setprop sys.usb.configfs 0
  • 属性触发器:属性触发器是一种用于响应属性变化的机制,它使用on property:…语句来定义触发条件,如on property:sys.usb.config=adb表示当sys.usb.config属性的值变为adb时触发。
# adb only USB configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct 4EE7
    write /sys/class/android_usb/android0/functions ${sys.usb.config}
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state ${sys.usb.config}
  • 写入操作:写入操作是一种用于修改文件内容的操作,它使用write语句来指定文件路径和写入内容,如write /sys/class/android_usb/android0/enable 1表示将1写入/sys/class/android_usb/android0/enable文件中。
# USB accessory configuration
on property:sys.usb.config=accessory && property:sys.usb.configfs=0
........
    write /sys/class/android_usb/android0/enable 1
........
  • 启动操作:启动操作是一种用于启动服务的操作,它使用start语句来指定服务名称,如start adbd表示启动adbd服务。
on property:sys.usb.config=adb && property:sys.usb.configfs=0
........
    start adbd
........
  • 停止操作:停止操作是一种用于停止服务的操作,它使用stop语句来指定服务名称,如stop adbd表示停止adbd服务。
on property:sys.usb.config=none && property:sys.usb.configfs=0
........
    stop adbd
........
  • 设置属性操作:设置属性操作是一种用于设置属性值的操作,它使用setprop语句来指定属性名称和属性值,如setprop sys.usb.state ${sys.usb.config}表示将sys.usb.state属性的值设置为sys.usb.config属性的值。
on property:sys.usb.config=none && property:sys.usb.configfs=0
........
    setprop sys.usb.state ${sys.usb.config}
........

init.usb.rc文件的主要作用是根据不同的USB配置,设置相应的USB设备ID、功能、状态等,并启动或停止相应的服务。这个文件中的每个属性触发器都对应了一种USB配置,如adb、mtp、ptp、accessory等,当sys.usb.config属性的值变化时,就会执行相应的操作,如写入、启动、停止、设置属性等。这些操作都是通过sysfs文件系统来实现的,它们会影响到USB设备的识别和连接。

2. init.usb.rc文件概述

init.usb.rc文件的结构大致如下:

on post-fs-data
    # 在文件系统准备好后执行的操作
    ...

service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
    # 定义adbd服务
    ...

on init
    # 在系统初始化时执行的操作
    ...

# Used to disable USB when switching states
on property:sys.usb.config=none && property:sys.usb.configfs=0
    # 无USB配置时的操作
    ...

# adb only USB configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb && property:sys.usb.configfs=0
    # adb USB配置时的操作
    ...

# USB accessory configuration
on property:sys.usb.config=accessory && property:sys.usb.configfs=0
    # accessory USB配置时的操作
    ...

# USB accessory configuration, with adb
on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=0
    # accessory,adb USB配置时的操作
    ...

# audio accessory configuration
on property:sys.usb.config=audio_source && property:sys.usb.configfs=0
    # audio_source USB配置时的操作
    ...

# audio accessory configuration, with adb
on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=0
    # audio_source,adb USB配置时的操作
    ...

# USB and audio accessory configuration
on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=0
    # accessory,audio_source USB配置时的操作
    ...

# USB and audio accessory configuration, with adb
on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=0
    # accessory,audio_source,adb USB配置时的操作
    ...

# Used to set USB configuration at boot and to switch the configuration
# when changing the default configuration
on boot && property:persist.sys.usb.config=*
    # 在系统启动或默认USB配置变化时执行的操作
    ...

#
# USB type C
#

# USB mode changes
on property:sys.usb.typec.mode=dfp
    # 当USB模式变为主机模式时执行的操作
    ...

on property:sys.usb.typec.mode=ufp
    # 当USB模式变为从机模式时执行的操作
    ...

# USB data role changes
on property:sys.usb.typec.data_role=device
    # 当USB数据角色变为从机角色时执行的操作
    ...

on property:sys.usb.typec.data_role=host
    # 当USB数据角色变为主机角色时执行的操作
    ...

# USB power role changes
on property:sys.usb.typec.power_role=source
    # 当USB电源角色变为供电角色时执行的操作
    ...

on property:sys.usb.typec.power_role=sink
    # 当USB电源角色变为接收角色时执行的操作
    ...

on userspace-reboot-requested
  setprop sys.usb.config ""
  setprop sys.usb.state ""

这个文件中的每个属性触发器都是根据不同的USB配置或模式或角色来定义的,当相应的属性值变化时,就会执行相应的操作,如写入、启动、停止、设置属性等。这些操作都是通过sysfs文件系统来实现的,它们会影响到USB设备的识别和连接。

3. init.usb.rc详细语法和命令

下面将以adb USB配置为例,详细学习下init.usb.rc文件中的语法和命令。

3.1 adb USB配置时的操作

当sys.usb.config属性的值变为adb时,会执行以下操作:

on property:sys.usb.config=adb && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct 4EE7
    write /sys/class/android_usb/android0/functions ${sys.usb.config}
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state ${sys.usb.config}

这里有七条命令,分别是:

  • write /sys/class/android_usb/android0/enable 0:这条命令是将0写入/sys/class/android_usb/android0/enable文件中。这个文件是用于控制USB设备是否启用的,0表示禁用,1表示启用。这里先禁用USB设备,是为了避免在设置其他属性时造成不一致或冲突。
    – write /sys/class/android_usb/android0/idVendor 18d1:这条命令是将18d1写入/sys/class/android_usb/android0/idVendor文件中。这个文件是用于设置USB设备的供应商ID的,18d1是Google的供应商ID,表示这个USB设备是由Google提供的。
  • write /sys/class/android_usb/android0/idProduct 4EE7:这条命令是将4EE7写入/sys/class/android_usb/android0/idProduct文件中。这个文件是用于设置USB设备的产品ID的,4EE7是adb功能的产品ID,表示这个USB设备只有adb功能。
  • write /sys/class/android_usb/android0/functions ${sys.usb.config}:这条命令是将sys.usb.config属性的值写入/sys/class/android_usb/android0/functions文件中。这个文件是用于设置USB设备的功能列表的,${sys.usb.config}表示当前的USB配置,如adb、mtp、ptp等。
  • write /sys/class/android_usb/android0/enable 1:这条命令是将1写入/sys/class/android_usb/android0/enable文件中。这个文件是用于控制USB设备是否启用的,0表示禁用,1表示启用。这里再次启用USB设备,是为了使之前设置的属性生效。
  • start adbd:这条命令是启动adbd服务。adbd服务是负责实现adb功能的服务,它会创建一个名为ffs.adb的文件,并将其挂载到/data/adb目录下。这个文件是用于与PC端的adb客户端通信的接口,它会被sysfs文件系统识别为一个USB功能。
  • setprop sys.usb.state ${sys.usb.config}:这条命令是将sys.usb.config属性的值设置为sys.usb.state属性的值。这个命令是用于更新USB状态的,sys.usb.state属性表示当前的USB状态,它应该与sys.usb.config属性保持一致。

这七条命令的执行结果是,USB设备会被识别为一个只有adb功能的USB设备,PC端的adb客户端可以通过ffs.adb文件与adbd服务进行通信。

4. Android USB系统初始化流程

Android USB系统初始化流程是指在Android系统启动时,根据不同的条件和需求,选择合适的USB配置和模式,并执行相应的初始化脚本文件来实现USB设备的识别和连接。

Android USB系统初始化流程大致如下:

  • 系统启动时,会执行init.rc文件,该文件会调用init.xxx.rc文件,其中xxx表示不同的硬件平台,如rk3568 可能是rk30board。
  • init.recovery.rk30board.rc等文件会根据不同的硬件平台,设置一些基本的属性和参数,如sys.usb.controller、persist.sys.usb.config等。
  • init.usb.rc文件会根据不同的硬件平台,选择使用configfs或sysfs方法来配置USB设备,并设置相应的属性值,如sys.usb.configfs、sys.usb.config等。
  • init.rc文件会调用init.usb.rc文件和init.usb.configfs.rc或init.usb.rc文件,其中init.usb.rc文件是针对不同的硬件平台定制的USB初始化脚本文件,init.usb.configfs.rc或init.usb.rc文件是通用的USB初始化脚本文件。
# init.rc的引用
import /init.environ.rc
import /system/etc/init/hw/init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.custom.rc
import /system/etc/init/hw/init.usb.configfs.rc
import /system/etc/init/hw/init.${ro.zygote}.rc
  • init.usb.rc文件会根据不同的硬件平台和需求,设置一些特定的属性和参数,如ro.sys.usb.storage.type、ro.sys.usb.mtp.whitelist等,并根据这些属性和参数来选择合适的USB配置,并设置相应的属性值,如persist.sys.usb.config、sys.usb.config等。
  • init.usb.configfs.rc或init.usb.rc文件会根据当前选择的USB配置和模式,执行相应的操作,如创建和删除USB功能和配置文件、启动和停止服务、修改USB设备ID和状态等,并更新相应的属性值,如sys.usb.state、sys.usb.typec.state等。
  • 最终,USB设备会被识别和连接,用户可以通过USB设备进行数据传输、网络共享、调试工具、音视频输出、MIDI控制、配件扩展等功能。

以上就是Android USB系统初始化流程的概述,可以参考init.rc、init.xxx.rc、init.usb.rc、init.usb.configfs.rc文件中的具体内容来理解它们的细节。

猜你喜欢

转载自blog.csdn.net/SHH_1064994894/article/details/132352233
今日推荐