Как предотвратить сброс USB после перехода в режим ожидания на плате iMX6?

Вопрос или проблема

Я работаю с платой iMX6ULL на базе операционной системы Debian, обладающей функцией приостановки. К USB-шине подключен USB-хаб (USB2514). Когда к USB-хабу подключено одно устройство или два устройства с разными VID и PID, система возобновляется из режима приостановки почти мгновенно. Однако возобновление системы происходит гораздо медленнее, когда я подключаю два устройства к USB-хабу с одинаковыми VID и PID. После выяснения обстоятельств я обнаружил, что ОС сбрасывает USB-устройства после пробуждения из режима приостановки и перед возобновлением (см. блоки кода ниже).

Как я могу предотвратить сброс USB-устройств ОС при пробуждении, чтобы ускорить процесс возобновления, когда два устройства с одинаковыми VID и PID подключены к одной шине?


Журналы
  • Пробуждение одного устройства (нормально)
>>>>>>>>>>>>>> ЗАПРОС ПРОБУЖДЕНИЯ СИСТЕМЫ
[ 9217.484783] ieee80211 phy6: brcmf_fil_cmd_data: шина отключена. Нам нечего делать.
[ 9217.484817] ieee80211 phy6: brcmf_cfg80211_get_tx_power: ошибка (-5)
[ 9218.076812] PM: время ожидания устройств составило 1.640 секунд
[ 9218.082099] Отключение не загрузочных ЦП ...
[ 9218.330490] brcmfmac: brcmf_fw_alloc_request: используется brcm/brcmfmac43430-sdio для чипа BCM43430/1
[ 9218.399775] usb 2-1.1: сброс высокоскоростного USB-устройства номер 19 с использованием ci_hdrc
[ 9218.476006] brcmfmac: brcmf_c_preinit_dcmds: Прошивка: BCM43430/1 wl0: 13 июн 2018 23:24:39 версия 7.45.98.52 (r691997 CY) FWID 01-8b9f8ef5
[ 9218.552328] PM: возобновление устройств заняло 0.470 секунд
[ 9218.608394] OOM killer включен.
[ 9218.611611] Перезапуск задач ... завершено.
[ 9218.714350] random: crng повторно инициализирован при возобновлении системы
[ 9218.771424] PM: выход из режима приостановки
>>>>>>>>>>>>>> ВОЗОБНОВЛЕНИЕ СИСТЕМЫ
  • Пробуждение двух устройств с одинаковым VID и PID
>>>>>>>>>>>>>> ЗАПРОС ПРОБУЖДЕНИЯ СИСТЕМЫ
[ 8907.844493] ieee80211 phy0: brcmf_fil_cmd_data: шина отключена. Нам нечего делать.
[ 8907.844524] ieee80211 phy0: brcmf_cfg80211_get_tx_power: ошибка (-5)
[ 8908.436812] PM: время ожидания устройств составило 1.670 секунд
[ 8908.442572] Отключение не загрузочных ЦП ...
[ 8908.681128] brcmfmac: brcmf_fw_alloc_request: используется brcm/brcmfmac43430-sdio для чипа BCM43430/1
[ 8908.749956] usb 2-1.3: сброс высокоскоростного USB-устройства номер 13 с использованием ci_hdrc
[ 8908.826696] brcmfmac: brcmf_c_preinit_dcmds: Прошивка: BCM43430/1 wl0: 13 июн 2018 23:24:39 версия 7.45.98.52 (r691997 CY) FWID 01-8b9f8ef5
[ 8908.859973] usb 2-1.3: устройство не отвечает, чтение дескриптора устройства/64, ошибка -71
[ 8909.089935] usb 2-1.3: устройство не отвечает, чтение дескриптора устройства/64, ошибка -71
[ 8909.309918] usb 2-1.3: сброс высокоскоростного USB-устройства номер 13 с использованием ci_hdrc
[ 8909.419914] usb 2-1.3: устройство не отвечает, чтение дескриптора устройства/64, ошибка -71
[ 8909.649893] usb 2-1.3: устройство не отвечает, чтение дескриптора устройства/64, ошибка -71
[ 8909.869896] usb 2-1.3: сброс высокоскоростного USB-устройства номер 13 с использованием ci_hdrc
[ 8910.309878] usb 2-1.3: устройство не принимает адрес 13, ошибка -71
[ 8910.409859] usb 2-1.3: сброс высокоскоростного USB-устройства номер 13 с использованием ci_hdrc
[ 8910.849852] usb 2-1.3: устройство не принимает адрес 13, ошибка -71
[ 8910.949853] usb 2-1.1: сброс высокоскоростного USB-устройства номер 14 с использованием ci_hdrc
[ 8911.102358] PM: возобновление устройств заняло 2.660 секунд
[ 8911.227343] OOM killer включен.
[ 8911.230543] Перезапуск задач ...
[ 8911.281057] usb 2-1.3: USB отключен, устройство номер 13
[ 8911.292238] завершено.
[ 8911.294268] random: crng повторно инициализирован при возобновлении системы
[ 8911.351833] PM: выход из режима приостановки
>>>>>>>>>>>>>> ВОЗОБНОВЛЕНИЕ СИСТЕМЫ

На данный момент я пытался сделать следующее (безуспешно):

  • Применил правила udev, чтобы установить атрибут removable в fixed или 0.
  • Настроил контакты NON_REM USB-хаба, из-за чего /sys/bus/usb/devices/2-1.1/removable показывает как fixed.
  • Изменил /sys/bus/usb/devices/2-1.1:1.0/host0/target0:0:0/0:0:0:0/block/sda/removable, записав 0 или fixed, но это не решило проблему.
  • Загрузил модуль ядра SCSI Generic (sg), который открывает доступ к устройствам в /dev/sg*, но они также оставались в списке /dev/sd*.
  • Добавил в черный список модуль usb-storage, что привело к прекращению работы модуля SCSI Generic.

Ответ или решение

Для предотвращения сброса USB-устройств после выхода из режима ожидания на плате iMX6ULL, вам необходимо учесть несколько характеристик вашей системы, а также тонкости конфигурации USB. Проблема, которую вы описали, возникает, когда операционная система инициирует сброс устройств, подключенных через USB-магистраль, особенно в случае, когда у них одинаковые идентификаторы VID и PID. Это приводит к более длительному времени восстановления системы.

Вот несколько шагов, которые вы можете предпринять для решения данной проблемы:

  1. Проверка параметров USB-хаба: Убедитесь, что ваш USB-хаб (USB2514) настроен правильно. В некоторых случаях использование неправильных параметров could вызвать нежелательные сбросы. Проверьте, установлены ли физические параметры NON_REM на хабе, чтобы они соответствовали вашему назначению (т.е. устройства должны восприниматься как неподвижные).

  2. Настройка udev: Вы упомянули, что применяли правила udev. Попробуйте следующее правило, которое должно предотвратить сброс устройств при их определении:

    ACTION=="add", SUBSYSTEM=="usb", ATTR{removable}=="0", ENV{UDISKS_IGNORE}="1"

    Это правило должно игнорировать определенные устройства и обеспечивать их стабильное состояние после выхода из спящего режима.

  3. Конфигурация ядра: Убедитесь, что настройки вашего ядра не приводят к сбросам USB-устройств. Например, вы можете попробовать отключить определенные опции энергосбережения для USB в конфигурации ядра. Используйте следующие параметры ядра:

    usbcore.autosuspend=-1

    Это отключит автоматическую приостановку для всех USB-устройств.

  4. Изменение параметров устройства: Попробуйте использовать usbcore параметры, которые позволят вам более гибко настраивать поведение устройств, например:

    options usbcore noreset=1

    Это параметр может предотвратить сброс устройства, хотя его поддержка может варьироваться в зависимости от версии ядра и конкретного устройства.

  5. Проверка журналов: После внесения изменений внимательно следите за выводом dmesg и journalctl -k. Это поможет вам увидеть, какие изменения были внесены и какая информация о состоянии подключения устройств может указывать на проблемы.

  6. Обновление прошивки и программного обеспечения: Убедитесь, что у вас установлены последние версии прошивки для USB-хаба и драйверов для вашего устройства. Иногда производители выпускают обновления, которые могут помочь решить проблемы совместимости.

  7. Тестирование с различными устройствами: Если возможно, попробуйте подключить различные USB-устройства с уникальными VID и PID, чтобы проверить, сохраняется ли проблема. Это поможет понять, связана ли проблема с использованием идентичных устройств.

Если все вышеперечисленное не дает результата, возможно, стоит обратиться напрямую в поддержку производителя вашего устройства или к сообществу разработчиков, работающих с платформой iMX6ULL, так как специфические нюансы этой платы могут требовать индивидуального подхода.

Оцените материал
Добавить комментарий

Капча загружается...