Как предотвратить сброс 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 и ускорить процесс возобновления, когда подключены два устройства с одинаковыми VID и PID, можно рассмотреть несколько шагов.

1. Изменение параметров конфигурации USB

Первое, что стоит проверить — это параметры конфигурации USB в ядре Linux. Вы можете попробовать изменить настройки управления питанием для USB, чтобы они не сбрасывали устройства после выхода из режима сна. Для этого выполните следующие действия:

  • Откройте файл конфигурации загрузчика (например, U-Boot) и попробуйте установить параметры:

    USB_SUSPEND_NO_RESET=y
  • Проверьте, есть ли параметр управления питанием USB в вашем ядре. Если доступно, отключите его:

    cat /sys/module/usbcore/parameters/autosuspend

    Должно быть значение 0 или -1, которое отключает авто-приостановку.

2. Настройка udev-правил

Если изменения в конфигурации ядра не принесли результатов, можете попробовать настроить правила udev для управления устройствами USB. Включите правила, которые заставляют ядро не сбрасывать устройства:

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

Сохраните эти изменения в файл /etc/udev/rules.d/99-usb.rules и перезагрузите систему.

3. Обновление драйвера USB-хаба

Поскольку ваш USB-хаб — это USB2514, убедитесь, что вы используете последнюю версию драйвера. Возможные обновления драйвера могут включать улучшения, связанные с управлением питанием. Если вы используете старую версию ядра, может быть целесообразно обновить ядро системы.

4. Оптимизация конфигурации USB-хаба

Настройте USB-хаб на уровень, при котором он будет работать как постоянное устройство (non-removable). Для этого согласно вашему описанию вы уже пробовали выставить пины NON_REM. Убедитесь, что настройка была применена правильно и включена в конфигурации:

echo 0 > /sys/bus/usb/devices/2-1.1/removable

5. Отключение модулей управления хранилищем

Если вышеуказанные меры не помогли, попробуйте повторно проанализировать действия андероведения, касающиеся модуля usb-storage. Возможно, потребуется удалить его полностью, если другие варианты не были успешными. Это может выглядеть следующим образом:

echo "blacklist usb-storage" >> /etc/modprobe.d/blacklist.conf

Затем перезагрузите систему, чтобы изменения вступили в силу.

6. Обратитесь к документации и сообществу

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

Заключение

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

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

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