Вопрос или проблема
У меня есть очень старый принтер/копир/сканер Samsung SCX-3205. Он сканирует нормально и работает хорошо. ОДНАКО, когда я печатаю с помощью CUPS, сканирование перестает работать. “scanimage -L” сообщает при первом запуске после печати, что устройство все еще там, но при следующем запуске оно его больше не находит.
Я сделал strace, проверьте различия:
Не работающий случай:
ppoll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLOUT}], 3, {tv_sec=60, tv_nsec=0}, NULL, 8) = 1 ([{fd=6, revents=POLLIN}], left {tv_sec=59, tv_nsec=4341630})
ioctl(8, USBDEVFS_DISCARDURB, 0x55933dbfb0) = 0
timerfd_settime(6, 0, {it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=0}}, NULL) = 0
ppoll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLOUT}], 3, {tv_sec=60, tv_nsec=0}, NULL, 8) = 1 ([{fd=8, revents=POLLOUT}], left {tv_sec=59, tv_nsec=999980518})
ioctl(8, USBDEVFS_REAPURBNDELAY, 0x7fc9c97a50) = 0
timerfd_settime(6, 0, {it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=0}}, NULL) = 0
ioctl(8, USBDEVFS_REAPURBNDELAY, 0x7fc9c97a50) = -1 EAGAIN (Resource temporarily unavailable)
ioctl(8, USBDEVFS_CLEAR_HALT, 0x7fc9c97cb4) = 0
ioctl(8, USBDEVFS_CLEAR_HALT, 0x7fc9c97eb4) = 0
ioctl(8, USBDEVFS_CLEAR_HALT, 0x7fc9c97eb4) = 0
ioctl(8, USBDEVFS_RELEASEINTERFACE, 0x7fc9c97e5c) = 0
Рабочий случай:
ppoll([{fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=8, events=POLLOUT}], 3, {tv_sec=60, tv_nsec=0}, NULL, 8) = 1 ([{fd=8, revents=POLLOUT}], left {tv_sec=59, tv_nsec=999981204})
ioctl(8, USBDEVFS_REAPURBNDELAY, 0x7ff3d45d80) = 0
timerfd_settime(6, 0, {it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=0}}, NULL) = 0
ioctl(8, USBDEVFS_REAPURBNDELAY, 0x7ff3d45d80) = -1 EAGAIN (Resource temporarily unavailable)
ioctl(8, USBDEVFS_CLEAR_HALT, 0x7ff3d461e4) = 0
ioctl(8, USBDEVFS_CLEAR_HALT, 0x7ff3d461e4) = 0
ioctl(8, USBDEVFS_RELEASEINTERFACE, 0x7ff3d4618c) = 0
Так что я вижу, что есть дополнительный ppoll (“fd=6, revents=POLLIN”) в процессе для неудачного случая. FD отсюда:
timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC|TFD_NONBLOCK) = 6
Я использую Alpine Linux 3.15.0 на Raspberry Pi 4 Model B Rev 1.1.
Я смог это обойти. Я выяснил путь /sys моего устройства, а затем
echo 0 > /sys/bus/usb/devices/1-1.4/bConfigurationValue
sleep 1
echo 1 > /sys/bus/usb/devices/1-1.4/bConfigurationValue
Это, кажется, снова делает сканирование возможным после печати.
Я все еще заинтересован в нахождении фактического решения.
Ответ или решение
Причина, по которой ваш многофункциональный устройство Samsung SCX-3205 перестает сканировать после печати через CUPS на Alpine Linux 3.15.0 с Raspberry Pi 4, связана с проблемой управления USB-интерфейсом устройства. Это довольно распространенная проблема при использовании USB-устройств на Linux, где взаимодействие с драйверами может привести к конфликтам состояния устройства.
Теоретическая часть
Одной из основных причин указанной проблемы может быть ошибка в управлении интерфейсами USB, что может вызвать нерегулярное поведение устройства после использования одного или нескольких интерфейсов. В контексте использования CUPS для печати это может заключаться в том, что система не полностью восстанавливает изначальное состояние устройства после завершения задачи печати, в результате чего функции сканирования блокируются.
Linux использует универсальную систему управления для USB-устройств, предполагающую, что каждое устройство представляет собой набор интерфейсов, каждый из которых может быть в активном или неактивном состоянии. После каждой операции (например, печати) интерфейсы могут не всегда возвращаться в состояние, в котором они были до начала операции, что и объясняет ваше поведение устройства.
Пример использования
Ваш strace показывает, что в неработоспособном состоянии наблюдается дополнительное событие ppoll с fd=6, что связано с созданием таймера (timerfd_create), который может потенциально блокировать состояние USB-устройства. Это может указывать на то, что система или программное обеспечение нанесли изменения тем или иным интерфейсам на уровне USB, что приводит к конфликтам и проблемам с повторным включением устройства в режим сканирования.
Ваш временный обходной путь с изменением параметра bConfigurationValue
в /sys/bus/usb/devices
служит для сброса конфигурации USB-устройства, позволяя ему снова идентифицировать себя системе как новое устройство. Это может работать, так как установка bConfigurationValue
в 0 и затем обратно в 1 деактивирует и повторно активирует устройство.
Повышение эффективности
-
Обновление системы и драйверов: Убедитесь, что ваше ядро и все драйверы системы USB обновлены. Это может устранить некоторые известные баги, связанные с управлением USB-интерфейсами.
-
Использование udev правил: Настройка udev правила может помочь в автоматизации процессов отключения и повторного подключения устройства по USB, что позволит вам избежать ручного вмешательства.
-
Проверка и смена SANE конфигурации: Вы можете проверить и изменить настройки в конфигурационных файлах SANE, чтобы убедиться, что сканер корректно инициализируется после печати:
/etc/sane.d/samsung.conf
Обратите внимание на указанные USB-устройства или привязки, которые могут влиять на порядок инициализации.
-
Проанализировать совместное использование ресурсов: Изучите, имеется ли возможность конфликтных ситуаций в делении ресурсов (например, интерфейсы прерываний, DMA-каналы и т.д.) Raspberry Pi, что может повлиять на многозадачность. Подумайте о перемещении использования CUPS и SANE на разные пути или часы.
-
Переход на альтернативные драйвера: Если возможно, попробуйте использовать другие драйвера или фреймворки для работы с вашим устройством (например, libusb, вместо стандартных драйверов ядра).
-
Создание скрипта для автоматизации обходного пути: Вы можете облегчить процесс перезагрузки USB конфигурации путем создания скрипта:
#!/bin/bash echo 0 > /sys/bus/usb/devices/1-1.4/bConfigurationValue sleep 1 echo 1 > /sys/bus/usb/devices/1-1.4/bConfigurationValue
Сохраните этот скрипт и сделайте его выполняемым — это позволит быстрее выполнять обходной путь.
Заключение, решение данной проблемы требует комплексного подхода с учетом влияния множества факторов на уровне системы и конфигурации USB. Оптимизация этих процессов может значительно улучшить стабильность и функциональность вашего устройства на данной платформе.