Последнее изменение файла: 2003.03.26
Скопировано с www.bog.pp.ru: 2003.09.22

Использование USB сканера в Linux

Компьютер с современной версией Linux можно использовать не только в качестве интернет-сервера, но и как рабочую станцию для графических работ (например, с использованием Gimp). Для этого, в частности, необходима возможность получать изображения с помощью сканера (вы же не будете покупать отдельный компьютер и ставить на него MS Windows только для сканирования?).

Критерии выбора модели сканера

Epson Perfection 1650 Photo

Теперь вы поняли, как я мучился выбирая сканер? К счастью, все гораздо проще - посмотрите список сканеров с интерфейсом USB и сравните со списком современных сканеров, продаваемых в местном магазине. В пересечении списков окажется всего несколько моделей. Дальнейший выбор можно провести исходя из личных пристрастий и обзоров в журналах.

Seiko Epson Perfection 1650 Photo (GT-8200UF):

Настройка Linux

Я использую Red Hat 7.2 с ядром 2.4.9-13. USB-контроллер: UHCI (chipset Intel BX).

Так как ядро 2.4.9 ничего не знает о Epson Perfection 1650 (в 2.4.18 всё в порядке), то надо добавить в /etc/modules.conf строку:

options scanner vendor=0x04b8 product=0x110 read_timeout=8000

Может возникнуть проблема со слишком маленьким временем ожидания подтверждения в драйвере. Стандартное время ожидания (в /usr/src/linux/drivers/usb/scanner.h) равно 10 секундам. Для Epson этого мало, особенно в режиме TPU и в больших разрешениях. В старом ядре приходилось менять scanner.h и пересобирать ядро. Затем у модуля scanner появился параметр read_timeout (только задавать его надо не в секундах, как написано в документации, а в тиках - 1/100 секунды). Сейчас драйвер сканера самостоятельно увеличивает этот параметр до 40 секунд для сканеров Epson. В новой версии драйвера также убран эффект "тормознутости" - приложение нельзя было снять в течении этих самых 40 секунд.

При подсоединении сканера в syslog приходят сообщения от ядра:

hub.c: USB new device connect on bus1/1, assigned device number 5
usb.c: USB device 5 (vend/prod 0x4b8/0x110) is not claimed by any active driver.
/etc/hotplug/usb.agent: ... no drivers for USB product 4b8/110/110

Oops! Ядро 2.4.9 (в 2.4.18 всё в порядке) ничего не знает об этом устройстве. Берем подходящую строчку из /etc/hotplug/usb.distmap от другого сканера Epson:

scanner              0x0003      0x04b8   0x0107    0x0000       0x0000       0x00         0x00            0x00            0x00            0x00               0x00               0x00000000

Копируем ее в /etc/hotplug/usb.handmap (не надо в /lib/modules/2.4.9-13/modules.usbmap, т.к. он формируется при каждой загрузке), заменив идентификатор устройства на 0x110. Переподсоединяем сканер - теперь hotplug счастлив (lsmod показывает загруженный модуль scanner):

usb.c: USB disconnect on device 5
hub.c: USB new device connect on bus1/1, assigned device number 6
usb.c: USB device 6 (vend/prod 0x4b8/0x110) is not claimed by any active driver.
usb.c: registered new driver usbscanner
scanner.c: probe_scanner: User specified USB scanner -- Vendor:Product - 4b8:110
scanner.c: USB Scanner support registered.

То же самое можно сделать вручную:

/sbin/modprobe usb-uhci
/sbin/modprobe scanner

Осталось убедиться, что права к устройству /dev/usb/scanner0 достаточны для пользователя, который будет сканировать.

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

SANE 1.0.6 (1.0.8)

Убедившись, что при подсоединении сканера автоматически загружается модуль scanner, переходим к следующему этапу. Дело в том, что USB драйвер Linux обеспечивает только транспортный уровень протокола, т.е. он умеет передавать/принимать байты, но не понимает их значения. Для работы с конкретной моделью сканера (или серией сканеров, если они используют общий командный язык) необходима программа, умеющая общаться именно с данной моделью сканера. Наиболее популярным комплектом таких программ является SANE.

SANE представляет собой API, который обеспечивает доступ к сканирующему оборудованию стандартизованным образом и библиотеку модулей для конкретных моделей сканеров. Поддерживаются не только USB сканеры, но SCSI-сканеры, устройства, подключаемые к параллельному порту, цифровые камеры из комплекта gphoto2 и другие устройства. Обеспечивается сетевая работа (я не пробовал).

В дополнение к библиотеке (backends), в состав пакета входят программы для сканирования (frontends): scanimage, xcam, xscanimage. scanimage - это консольная программа и пользоваться ею можно, но неудобно. xcam и xscanimage - убогие и глючные, так что лучше пользоваться xsane.

Получить SANE можно

Редактируем список устройств в файле /etc/sane.d/dll.conf (/usr/local/etc/sane.d/dll.conf, если собирали SANE самостоятельно): все лишние устройства надо закоментировать - автопроба неправильного драйвера может привести устройство или всю систему в неработоспособное состояние.

В /etc/sane.d/epson.conf добавить:

usb /dev/usb/scanner0

Тестируем список доступных устройств:

scanimage -L -v

Среди распознанных устройств должно быть:

device `epson:/dev/usb/scanner0' is a Epson GT-8200 flatbed scanner

Тестируем работоспособность получившейся системы (весьма поверхностно):

scanimage -T -v -d epson:/dev/usb/scanner0

Посмотрим какие возможности сканера доступны с помощью SANE:

scanimage --help -v --device epson:/dev/usb/scanner0

Похоже версия 1.0.6 извлекает из аппаратуры все, что только можно:

При попытке сканирования более 32 КБ на строку выдает ошибку "out of memory". Это не недостаток оперативной памяти (памяти я закупил достаточно по случаю снижения цен ;), а проблемы с адресацией командного языка (на самом деле ограничение равняется 64 КБ на строку - Epson Twain 5 позволяет такое, но sane-epson ошибается вдвое).

Установив переменную окружения SANE_DEBUG_EPSON (от 1 до 128) можно получить отладочную печать в случае затруднений. Вот что устройство сообщает о себе:

type    B
level   8
option equipment is installed
resolution (dpi): 50
...
resolution (dpi): 3200
maximum scan area: x 27200 y 37440
fbf tlx 0.000000 tly 0.000000 brx 215.899994 bry 297.179993 [mm]
Max. supported color depth = 16
TPU detected
tpu tlx 0.000000 tly 0.000000 brx 48.259995 bry 231.139999 [mm]
model : GT-8200

Кстати, в комплекте есть модуль для захвата изображений с video4linux (например, v4l:/dev/video0), который работает с моей AverMedia TVPhone98.

XSANE 0.82 (0.84)

scanimage позволяет отсканировать изображение с нужными параметрами и сохранить его в формате TIFF или PNM. Но пользоваться им можно разве что для тестирования. Поможет нам xsane - графическая оболочка к SANE. Также используется как plugin для GIMP, что позволяет сканировать изображения прямо из графического редактора.

Получить xsane можно

Вот и все: запускаем командой xsane или xsane epson:/dev/usb/scanner0, если не срабатывает автоматическое распознавание. После этого надо обязательно включить отображение всех окон и погулять по конфигурации.

Гаммакоррекция похоже в xsane-0.82 только программная.

Image Scan! от Epson Kowa 1.1.0

Заменяет libsane-epson.so в /usr/lib/sane на свою реализацию libsane-epsonkw.so (является модификацией одной из ранних версий libsane-epson). Единственное замеченное мной различие - появилась гаммакоррекция - 1.8. Устанавливается библиотека libesmod.so в /usr/lib и графический интерфейс к SANE - iscan. Его также можно использовать как plugin для gimp.

Интерфейс проще, чем xsane. Появились кривые гамма- и цветокоррекции, но нет возможности управлять аппаратными функциями, белой и черной точек, гистограммы, 16 битных цветов, как в xsane. В общем, я не понял зачем это нужно.

Ограничение на размер строки сканирования в 32 КБ осталось :(

VueScan

VueScan - библиотека драйверов сотни сканеров и графическая оболочка в одной программе. Нет исходных текстов. Shareware (изображения не сохраняются, пока не заплатишь автору). Ориентирована на слайдсканеры: поддержка инфракрасного канала, фокусировки, установки времени экспозиции, пакетной обработки, многократного сканирования (гм, Floating point exception); специальные фильтры обработки изображений для пленки: удаление зерна, восстановление "увядших" цветов (рекомендуется нажать кнопку "advanced options"). При попытке сканировать весь лист 1600x1600x16 получаем Segmentation fault (видимо та же проблема с ограничением размера изображения). Перед запуском надо установить переменные окружения, описывающие сканер:

export SCANNER0="/dev/usb/scanner0"
export SCANVID0="0x4b8"
export SCANPID0="0x110"

Первые впечатления

Сканирование 3200 dpi. Заметна явная полосатость изображения - либо кто-то путает четные и нечетные строки, либо CCD не успевает "отдохнуть" за полшага.

Попытка многократного сканирования одной фотографии (c идеей дальнейшего усреднения с помощью convert -depth 16 -average) и последующее сравнение их (composite -depth 16 -compose difference) наводит на мысль, что младшие 8 бит на цвет генерируются датчиком случайных чисел (а на границе светлого и темного - все 10 ;).

Ссылки


Copyright © 1996-2003 Sergey E. Bogomolov; www.bog.pp.ru