@ Карта сайта News Автора!

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

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

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

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

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

Epson Perfection 1650 Photo

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

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

Настройка Linux 2.4

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 достаточны для пользователя, который будет сканировать.

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

Настройка Linux 2.6

Fedora Core 3 с ядром 2.6.10. USB-контроллер: UHCI (chipset Intel BX).

В новой версии ядра нет специального модуля для обслуживания сканеров, но есть общий механизм hotplug и usbdevfs, а пакет sane (см. ниже) добавляет в каталог /etc/hotplug файл usb/libsane.usermap с перечнем известных ему сканеров и вызовом скрипта usb/libusbscanner, который при подсоединении сканера создаёт в каталоге /dev ссылки вида /dev/scanner-usb-:proc:bus:usb:004:003 на /proc/bus/usb/004/003 и обеспечивает с помощью pam_console права доступа к нему пользователю, сидящему за консолью (/etc/security/console.perms). При этом в журнал выдаётся сообщение вида:

kernel: usb 4-1: new full speed USB device using uhci_hcd and address 3

А среди USB устройств (/proc/bus/usb/devices) появляется

P:  Vendor=04b8 ProdID=0110 Rev= 1.10
S:  Manufacturer=EPSON
S:  Product=EPSON Scanner

SANE 1.0.6 (1.0.8, 1.0.15, 1.0.19)

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

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

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

Пакет scanbuttond отслеживает нажатие кнопки сканирования на устройстве.

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

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

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

usb /dev/usb/scanner0

Для ядра 2.6 достаточно

usb
   или для незнакомого sane сканера
usb ID-продукта ID-устройства

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

scanimage -L -v

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

device `epson:/dev/usb/scanner0' is a Epson GT-8200 flatbed scanner
   или
device `epson:libusb:004:003' is a Epson GT-8200 flatbed scanner
   или
device `v4l:/dev/video0' is a Noname Avermedia AVerTV Studio 307 virtual device
device `epson2:libusb:008:002' is a Epson GT-8200 flatbed scanner
device `epson:libusb:008:002' is a Epson GT-8200 flatbed scanner

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

scanimage -T -v -d epson:/dev/usb/scanner0
  или
scanimage -T -v -d epson:libusb:004:003

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

scanimage --help -v --device epson:libusb:004:003

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

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

Установив переменную окружения 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
Focus position = 0x40
Enabling 'Set Focus' support
TPU detected
tpu tlx 0.000000 tly 0.000000 brx 48.259995 bry 231.139999 [mm]
scanner model : GT-8200
Setting focus to glass surface

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

XSANE 0.82 (0.84, 0.92, 0.996)

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

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

Вот и все: запускаем командой xsane (предоставляется возможность выбрать сканер) или xsane epson:libusb:004:003 или xsane epson (если у нас всего один сканер фирмы Epson), если не срабатывает автоматическое распознавание. После этого надо обязательно включить отображение всех окон и погулять по конфигурации. Тут есть всё, включая пакетное сканирование, кроме цветокоррекции заданием кривых. И типов негативных плёнок маловато.

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 ;).

gnome-scan

Пакет gnome-scan 0.6.1 предоставляет (с помощью SANE) библиотеку для работы со сканером и утилиту сканирования в файл flegita. Падает, сканер попал в список дважды, а кнопок повернуть налево в окне предпросмотра - 3 штуки.

Распознавание текста

Ссылки

@ Карта сайта News Автора!

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



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