前面学习完了 init.usb.configfs.rc文件 ,它是一种用于配置和控制Android USB系统的初始化脚本文件,它使用了一种基于configfs(配置文件系统)的方法来设置USB配置和模式 , 那我们继续学习另外一个同样重要的USB系统初始化脚本文件init.usb.rc。
系列文章
Android系统 init.rc 第一次开机创建文件节点实现和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 自定义动态修改init.custom.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文件中的具体内容来理解它们的细节。