把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配置来理解它们的作用和语法。