Инициализация USB-системы Android init.usb.rc

Ранее мы закончили изучение файла init.usb.configfs.rc. Это файл сценария инициализации, используемый для настройки и управления USB-системой Android. Он использует метод, основанный на configfs (файловая система конфигурации), для установки конфигурации и режима USB. Затем продолжаем изучать еще один не менее важный файл сценария инициализации USB-системы init.usb.rc.

Инициализация USB-системы Android означает установку соответствующей конфигурации и режима USB в соответствии с типом и функцией USB-устройства, когда система Android запускается для идентификации и подключения USB-устройства. Инициализация USB-системы Android включает в себя два важных файла сценариев инициализации: init.usb.configfs.rc и init.usb.rc.

1. Подробное объяснение файла init.usb.rc.

Файл init.usb.rc — это еще один файл сценария инициализации, используемый для настройки и управления USB-системой Android. Он использует метод на основе sysfs (системной файловой системы) для установки конфигурации и режима USB.

Sysfs — это специальная виртуальная файловая система, которая позволяет пользователям получать доступ к свойствам объектов ядра, таким как идентификатор, функция, состояние и т. д. USB-устройств, путем чтения и изменения файлов. 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

  • Определение службы: Определение службы — это операция, используемая для определения службы. В ней используется оператор службы для указания имени службы, пути, параметров, категории, сокета, статуса, метки и т. д., например служба adbd /system/bin/adbd -- root_seclabel=u:r:su:s0 означает определение службы с именем adbd, ее путь — /system/bin/adbd, параметр —root_seclabel=u:r:su:s0, категория — core, сокет — — adbd, статус отключен, метка — 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}
  • Операция записи: операция записи — это операция, используемая для изменения содержимого файла. Она использует оператор записи для указания пути к файлу и содержимого записи, например запись /sys/class/android_usb/android0/enable 1 означает запись 1 в /sys/class/android_usb/android0/enable file.
# USB accessory configuration
on property:sys.usb.config=accessory && property:sys.usb.configfs=0
........
    write /sys/class/android_usb/android0/enable 1
........
  • Операция запуска: Операция запуска — это операция запуска службы. Она использует оператор start для указания имени службы. Например, запуск adbd означает запуск службы adbd.
on property:sys.usb.config=adb && property:sys.usb.configfs=0
........
    start adbd
........
  • Операция остановки: операция остановки — это операция, используемая для остановки службы. Она использует оператор остановки для указания имени службы. Например, остановка 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, а также запустить или остановить соответствующие службы. Каждый триггер атрибута в этом файле соответствует конфигурации USB, такой как adb, mtp, ptp, аксессуар и т. д. При изменении значения атрибута 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-устройств здесь в первую очередь необходимо во избежание несоответствий или конфликтов при настройке других свойств.
    – напишите /sys/class/android_usb/android0/idVendor 18d1: эта команда записывает 18d1 в файл /sys/class/android_usb/android0/idVendor. Этот файл используется для установки идентификатора поставщика USB-устройства. 18d1 — это идентификатор поставщика Google, указывающий, что USB-устройство предоставлено Google.
  • write /sys/class/android_usb/android0/idProduct 4EE7: эта команда записывает 4EE7 в файл /sys/class/android_usb/android0/idProduct. Этот файл используется для установки идентификатора продукта USB-устройства. 4EE7 — это идентификатор продукта функции adb, что означает, что 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. Этот файл представляет собой интерфейс, используемый для связи с клиентом 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-устройство будет распознано как USB-устройство только с функцией adb.Клиент adb на ПК может взаимодействовать со службой adbd через файл ffs.adb.

4. Процесс инициализации USB-системы Android.

Процесс инициализации USB-системы Android подразумевает выбор соответствующей конфигурации и режима USB в соответствии с различными условиями и потребностями при запуске системы Android, а также выполнение соответствующего файла сценария инициализации для реализации идентификации и подключения USB-устройств.

Процесс инициализации USB-системы Android примерно следующий:

  • При запуске системы будет выполнен файл 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-устройств. и статусы и т. д., а также обновить соответствующие значения атрибутов, например sys.usb.state, sys.usb.typec.state и т. д.
  • В конечном итоге USB-устройство будет распознано и подключено, и пользователи смогут использовать USB-устройство для передачи данных, совместного использования сети, инструментов отладки, вывода аудио и видео, управления MIDI, расширения аксессуаров и других функций.

Выше представлен обзор процесса инициализации USB-системы Android. Вы можете обратиться к конкретному содержимому файлов init.rc, init.xxx.rc, init.usb.rc и init.usb.configfs.rc, чтобы понять их подробности.

Guess you like

Origin blog.csdn.net/SHH_1064994894/article/details/132352233