Вопрос или проблема
Я работаю с платой 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 после режима сна — это сложная задача, требующая сочетания правильных настроек и возможных модификаций программного обеспечения. Тестируйте каждый шаг и анализируйте его влияние на производительность возобновления системы, чтобы найти оптимальное решение.