Многофункциональное устройство Samsung SCX-3205 не сканирует (с использованием sane) после печати (с использованием cups).

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

У меня есть очень старый принтер/копир/сканер 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 деактивирует и повторно активирует устройство.

Повышение эффективности

  1. Обновление системы и драйверов: Убедитесь, что ваше ядро и все драйверы системы USB обновлены. Это может устранить некоторые известные баги, связанные с управлением USB-интерфейсами.

  2. Использование udev правил: Настройка udev правила может помочь в автоматизации процессов отключения и повторного подключения устройства по USB, что позволит вам избежать ручного вмешательства.

  3. Проверка и смена SANE конфигурации: Вы можете проверить и изменить настройки в конфигурационных файлах SANE, чтобы убедиться, что сканер корректно инициализируется после печати:

    /etc/sane.d/samsung.conf

    Обратите внимание на указанные USB-устройства или привязки, которые могут влиять на порядок инициализации.

  4. Проанализировать совместное использование ресурсов: Изучите, имеется ли возможность конфликтных ситуаций в делении ресурсов (например, интерфейсы прерываний, DMA-каналы и т.д.) Raspberry Pi, что может повлиять на многозадачность. Подумайте о перемещении использования CUPS и SANE на разные пути или часы.

  5. Переход на альтернативные драйвера: Если возможно, попробуйте использовать другие драйвера или фреймворки для работы с вашим устройством (например, libusb, вместо стандартных драйверов ядра).

  6. Создание скрипта для автоматизации обходного пути: Вы можете облегчить процесс перезагрузки 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. Оптимизация этих процессов может значительно улучшить стабильность и функциональность вашего устройства на данной платформе.

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

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