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

把init.rc了解的差不多之后 , 我看到目录下有init.usb.configfs.rc和init.usb.rc文件 , 引起了我的好奇 接下来我们开始了解新的内容。

Android初始化脚本文件是一种用于配置和控制Android系统启动过程的文件,它们使用一种类似于shell脚本的语法,但有一些特定的命令和变量。初始化脚本文件位于system/core/rootdir目录下,以init开头,以.rc结尾。

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

1. init.usb.configfs.rc文件详解

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

configfs是一种特殊的虚拟文件系统,它允许用户通过创建和修改文件和目录来配置内核对象,如USB功能和配置。 configfs通常挂载在/config目录下,它提供了一个名为usb_gadget的子目录,用于管理USB设备的属性和行为。

rk3568_r:/config/usb_gadget/g1 $ ls -ll
total 0
-rw-r--r--  1 root root 4096 2023-08-25 10:16:56.268741574 +0800 UDC
-rw-r--r--  1 root root 4096 2023-08-25 10:20:15.795428288 +0800 bDeviceClass
-rw-r--r--  1 root root 4096 2023-08-25 10:20:15.795428288 +0800 bDeviceProtocol
-rw-r--r--  1 root root 4096 2023-08-25 10:20:15.795428288 +0800 bDeviceSubClass
-rw-r--r--  1 root root 4096 2023-08-25 10:20:15.795428288 +0800 bMaxPacketSize0
-rw-r--r--  1 root root 4096 2023-08-24 19:19:58.803334167 +0800 bcdDevice
-rw-r--r--  1 root root 4096 2023-08-24 19:19:58.803334167 +0800 bcdUSB
drwxr-xr-x  3 root root    0 2023-08-24 19:19:58.856667506 +0800 configs
drwxr-xr-x 10 root root    0 2023-08-24 19:19:58.816667502 +0800 functions
-rw-r--r--  1 root root 4096 2023-08-24 19:19:59.033334190 +0800 idProduct
-rw-r--r--  1 root root 4096 2023-08-24 19:19:58.803334167 +0800 idVendor
drwxr-xr-x  2 root root    0 2023-08-24 19:19:59.033334190 +0800 os_desc
drwxr-xr-x  3 root root    0 2023-08-24 19:19:58.803334167 +0800 strings

rk3568_r:/config/usb_gadget/g1 # cat UDC
fcc00000.dwc3
rk3568_r:/config/usb_gadget/g1 # cat bDeviceClass
0x00
rk3568_r:/config/usb_gadget/g1 # cat bDeviceProtocol
0x00
rk3568_r:/config/usb_gadget/g1 # cat bDeviceSubClass
0x00
rk3568_r:/config/usb_gadget/g1 # cat bMaxPacketSize0
0x40
rk3568_r:/config/usb_gadget/g1 # cat bcdDevice
0x0310
rk3568_r:/config/usb_gadget/g1 # cat bcdUSB
0x0200
rk3568_r:/config/usb_gadget/g1 # cat functions
cat: functions: Is a directory
1|rk3568_r:/config/usb_gadget/g1 # cat idProduct
0x0006
rk3568_r:/config/usb_gadget/g1 # cat idProduct
0x0006
rk3568_r:/config/usb_gadget/g1 # cat idVendor
0x2207
rk3568_r:/config/usb_gadget/g1 # cd configs/
rk3568_r:/config/usb_gadget/g1/configs # ls
b.1
rk3568_r:/config/usb_gadget/g1/configs # cd b.1/
rk3568_r:/config/usb_gadget/g1/configs/b.1 # ls
MaxPower  bmAttributes  f1  strings
rk3568_r:/config/usb_gadget/g1/configs/b.1 # cat MaxPower
500
rk3568_r:/config/usb_gadget/g1/configs/b.1 # cat bmAttributes
0x80
rk3568_r:/config/usb_gadget/g1/configs/b.1 # cat strings/0x409/configuration
MaxPower      bmAttributes  f1/           strings/
rk3568_r:/config/usb_gadget/g1/configs/b.1 # cat strings/0x409/configuration
adb
rk3568_r:/config/usb_gadget/g1/configs/b.1 #

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

  • 属性触发器:属性触发器是一种用于响应属性变化的机制,它使用on property:…语句来定义触发条件,如on property:sys.usb.config=adb表示当sys.usb.config属性的值变为adb时触发。
on property:sys.usb.config=adb && property:sys.usb.configfs=1
    start adbd
  • 写入操作:写入操作是一种用于修改文件内容的操作,它使用write语句来指定文件路径和写入内容,如write /config/usb_gadget/g1/UDC ${sys.usb.controller}表示将sys.usb.controller属性的值写入/config/usb_gadget/g1/UDC文件中。
on property:sys.usb.config=ptp && property:sys.usb.configfs=1
........
    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
........
  • 删除操作:删除操作是一种用于删除文件或目录的操作,它使用rm或rmdir语句来指定文件或目录路径,如rm /config/usb_gadget/g1/configs/b.1/f1表示删除/config/usb_gadget/g1/configs/b.1/f1文件。
on property:sys.usb.config=none && property:sys.usb.configfs=1
........
    rm /config/usb_gadget/g1/configs/b.1/f1
    rm /config/usb_gadget/g1/configs/b.1/f2
    rm /config/usb_gadget/g1/configs/b.1/f3
........
  • 创建操作:创建操作是一种用于创建文件或目录的操作,它使用mkdir语句来指定目录路径,如mkdir /config/usb_gadget/g1/functions/rndis.gs4表示创建/config/usb_gadget/g1/functions/rndis.gs4目录。
on property:sys.usb.config=rndis && property:sys.usb.configfs=1
........
    mkdir /config/usb_gadget/g1/functions/rndis.gs4
........
  • 链接操作:链接操作是一种用于创建符号链接的操作,它使用symlink语句来指定源文件和目标文件路径,如symlink /config/usb_gadget/g1/functions/rndis.gs4 /config/usb_gadget/g1/configs/b.1/f1表示将/config/usb_gadget/g1/functions/rndis.gs4链接到/config/usb_gadget/g1/configs/b.1/f1。
on property:sys.usb.config=rndis && property:sys.usb.configfs=1
........
    symlink /config/usb_gadget/g1/functions/rndis.gs4 
........
  • 启动操作:启动操作是一种用于启动服务的操作,它使用start语句来指定服务名称,如start adbd表示启动adbd服务。
on property:sys.usb.config=adb && property:sys.usb.configfs=1
    start adbd
  • 停止操作:停止操作是一种用于停止服务的操作,它使用stop语句来指定服务名称,如stop adbd表示停止adbd服务。
........
on property:sys.usb.config=none && property:sys.usb.configfs=1
    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=1
........
    setprop sys.usb.state ${sys.usb.config}
........

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

2. init.usb.configfs.rc文件概述

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

on property:sys.usb.config=none && property:sys.usb.configfs=1
    # 无USB配置时的操作
    ...

on property:sys.usb.config=adb && property:sys.usb.configfs=1
    # adb USB配置时的操作
    ...

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1
    # adb USB配置并且ffs服务准备好时的操作
    ...

on property:sys.usb.config=mtp && property:sys.usb.configfs=1
    # mtp USB配置时的操作
    ...

on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1
    # mtp,adb USB配置时的操作
    ...

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1
    # mtp,adb USB配置并且ffs服务准备好时的操作
    ...

on property:sys.usb.config=ptp && property:sys.usb.configfs=1
    # ptp USB配置时的操作
    ...

on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1
    # ptp,adb USB配置时的操作
    ...

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1
    # ptp,adb USB配置并且ffs服务准备好时的操作
    ...

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

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

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,adb && property:sys.usb.configfs=1
    # accessory,adb USB配置并且ffs服务准备好时的操作
    ...

on property:sys.usb.config=audio_source && property:sys.usb.configfs=1
    # audio_source USB配置时的操作
    ...

on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1
    # audio_source,adb USB配置时的操作
    ...

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=1
    # audio_source,adb USB配置并且ffs服务准备好时的操作
    ...

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

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

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=1
    # accessory,audio_source,adb USB配置并且ffs服务准备好时的操作
    ...

on property:sys.usb.config=midi && property:sys.usb.configfs=1
    # midi USB配置时的操作
    ...

on property:sys.usb.config=midi,adb && property:sys.usb.configfs=1
    # midi,adb USB配置时的操作
    ...

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=midi,adb && property:sys.usb.configfs=1
    # midi,adb USB配置并且ffs服务准备好时的操作
    ...

on property:sys.usb.config=rndis && property:sys.usb.configfs=1
    # rndis USB配置时的操作
    ...

on property:sys.usb.config=rndis,adb && property:sys.usb.configfs=1
    # rndis,adb USB配置时的操作
    ...

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=rndis,adb && property:sys.usb.configfs=1
    # rndis,adb USB配置并且ffs服务准备好时的操作
    ...

可以看出,这个文件中的每个属性触发器都是根据不同的USB配置来定义的,而且每个USB配置都有两种情况:一种是只有USB配置变化时的操作,另一种是USB配置变化并且ffs服务(即adb功能所需的服务)准备好时的操作。这是因为adb功能需要等待ffs服务启动后才能正常工作,所以需要单独处理。

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

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

3.1 adb USB配置时的操作

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

on property:sys.usb.config=adb && property:sys.usb.configfs=1
    start adbd

这里只有一条命令,就是启动adbd服务。adbd服务是负责实现adb功能的服务,它会创建一个名为ffs.adb的文件,并将其挂载到/data/adb目录下。这个文件是用于与PC端的adb客户端通信的接口,它会被configfs文件系统识别为一个USB功能。

rk3568_r:/data/adb # ls -ll
total 0

3.2 adb USB配置并且ffs服务准备好时的操作

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

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1
    write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb"
    symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1
    write /config/usb_gadget/g1/UDC ${sys.usb.controller}
    setprop sys.usb.state ${sys.usb.config}

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

  • write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration “adb”:这条命令是将"adb"字符串写入/config/usb_gadget/g1/configs/b.1/strings/0x409/configuration文件中。这个文件是用于设置USB配置的名称的,0x409表示英语语言代码,"adb"表示这个USB配置只包含一个功能,即adb功能。

  • symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1:这条命令是将/config/usb_gadget/g1/functions/ffs.adb文件链接到/config/usb_gadget/g1/configs/b.1/f1文件中。这个命令是用于将USB功能与USB配置关联起来的,ffs.adb文件是由adbd服务创建的USB功能文件,f1文件是表示USB配置中第一个功能的文件。

  • write /config/usb_gadget/g1/UDC ${sys.usb.controller}:这条命令是将sys.usb.controller属性的值写入/config/usb_gadget/g1/UDC文件中。这个命令是用于激活USB设备的,UDC文件是表示USB设备控制器(Universal Device Controller)的文件,${sys.usb.controller}表示当前使用的USB
    控制器的名称,如dwc3.0或ehci.0等。

  • 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服务进行通信。

小节

以上就是init.usb.configfs.rc文件的不分详细解释,可以参考这个文件中的其他USB配置来理解它们的作用和语法。

猜你喜欢

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