|
Bog BOS: hardware: Использование USB сканера в Linux |
Последнее изменение файла: 2009.02.17
Скопировано с www.bog.pp.ru: 2024.11.21
Компьютер с современной версией Linux можно использовать не только в качестве интернет-сервера, но и как рабочую станцию для графических работ (например, с использованием Gimp). Для этого, в частности, необходима возможность получать изображения с помощью сканера (вы же не будете покупать отдельный компьютер и ставить на него MS Windows только для сканирования?).
Теперь вы поняли, как я мучился выбирая сканер? К счастью, все гораздо проще - посмотрите список сканеров с интерфейсом USB и сравните со списком современных сканеров, продаваемых в местном магазине. В пересечении списков окажется всего несколько моделей. Дальнейший выбор можно провести исходя из личных пристрастий и обзоров в журналах.
Seiko Epson Perfection 1650 Photo (GT-8200UF):
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 достаточны для пользователя, который будет сканировать.
Если сканер долго не использовать, то он отключается, а модуль выгружается из памяти. В результате автоматический поиск устройства не работает. Можно или передернуть устройство, перезагрузить драйвер вручную или указывать имя устройства явно.
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
Убедившись, что при подсоединении сканера автоматически загружается модуль 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 распознать не удалось.
scanimage позволяет отсканировать изображение с нужными параметрами и сохранить его в формате TIFF или PNM. Но пользоваться им можно разве что для тестирования. Поможет нам xsane - графическая оболочка к SANE. Также используется как plugin для GIMP, что позволяет сканировать изображения прямо из графического редактора.
Получить xsane можно
Вот и все: запускаем командой xsane (предоставляется возможность выбрать сканер) или xsane epson:libusb:004:003 или xsane epson (если у нас всего один сканер фирмы Epson), если не срабатывает автоматическое распознавание. После этого надо обязательно включить отображение всех окон и погулять по конфигурации. Тут есть всё, включая пакетное сканирование, кроме цветокоррекции заданием кривых. И типов негативных плёнок маловато.
Заменяет 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 - библиотека драйверов сотни сканеров и графическая оболочка в одной программе. Нет исходных текстов. 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 0.6.1 предоставляет (с помощью SANE) библиотеку для работы со сканером и утилиту сканирования в файл flegita. Падает, сканер попал в список дважды, а кнопок повернуть налево в окне предпросмотра - 3 штуки.
|
Bog BOS: hardware: Использование USB сканера в Linux |