GNU/Linux (Slackware)

Подключение сканера

Надо бы про подключение принтера рассказать, но, если честно, мне лень. А вот про работу со сканером под Линуксом -- пожалуйста ;).
Этот текст частично основан на материале с сайта Вячеслава Калошина: linuxnews.ru.

Наша задачи:

Для того, чтобы это все проделать воспользуемся комплексом программ (API) SANE. SANE состоит из двух частей: драйвера для сканнеров (и не только), и единый интерфейс для сканирования (в отличие от TWAIN).

Прежде всего не все сканнеры имеют драйвера под Линукс. Поэтому прежде чем покупать какую-нибудь разрекламированную модель советую взглянуть сюда. В момент написания этих строк наибольшая поддержка была для сканеров UMAX. Традиционно меньше всего проблем с устройствами со SCSI-интерфейсом. Для очень малого числа сканнеров с параллельным портом или USB вообще есть драйвера для Linux. SCSI-устройства правда стоят дороже.
Второе. Не попадайтесь на объявы, что сканнер идет со SCSI картой. Обычно это такое "барахло", что ... Чаще всего, это "кастрированные" SCSI (более одного устройства вы к ней не подключите) карточки, а Mustek/Umax'ские UDS-IS11 (DTC3181x чип, совместимый с NCR5380) к тому же не имеют IRQ/DMA. HP ScanJet-ы идут с такой же простейшей интерфейсной карточкой, собранной на основе чипа Symbios Logic 53c416.
Если нет желания садить на имеющийся в системе крутой SCSI-контроллер быстрый винт и медленный сканер, то купите все равно что-нибудь поприличнее (например, дешевую простейшие Adaptec, Advancys...). Однако для любителей поиздеваться над собой я расскажу как можно попробовать запустить "родные" карточки.

Подключение "сканерных" SCSI-карт

Так как карточки простейшие, чаще всего больше ни для чего не используемые (драйвера могут быть очень "сырыми"), то их надо подсоединять с наибольшей осторожностью. Почти наверняка надо будет пересобирать ядро для поддержки вашей карты. Причем в ядре Linux надо ставить поддержку этой карточки в виде модуля. И не забудьте пометить галочку ⌠Generic SCSI Support■. После перекомпиляции ядра и компиляции драйвера гляньте, в директорию /lib/modules/[версия вашего ядра]/scsi. Там должен появиться файл с расширением .o и именем чипсета выбранной вами SCSI-карты. Если вы еще не прочитали как компилировать ядро, то можете ознакомится с этим здесь.
Зачем модулем? Дело в том, что если вы забыли включить сканер к тому моменту, как загружается поддержка этого модуля, то вам придется сочинять команду для его включения (подробности смотрите в man sane-scsi). А так можно будут просто выгрузить и загрузить модуль и все будет в порядке.
Так как карточки чаще всего ISA (к тому же Plug'n'Pray), то возможно придется еще повозится с прерываниями. Не забудьте в BIOS'е зарезервировать IRQ для ISA, а то эти PCI карты жуть как любят садиться не туда, подключили и включили сканер. Что теперь. Приведу два примера подключения SCSI-ISA-карт.
UDS-IS11
Как я уже сказал, эта карточка совместима с NCR5380. В ядре надо ставить поддержку этого чипсета в виде модуля. Компилируем ядро и модули (make bzlilo && make modules && make modules_install). Проверьте, появился ли после этого у вас модуль g_NCR5380.o в каталоге /lib/modules/[версия вашего ядра]/scsi.
Модуль можно загрузить, например, при помощи команды
modprobe g_NCR5380 ncr_irq=255 ncr_addr=0x280 dtc_3181e=1
где
-ncr_irq=255: no IRQ, no DMA
-ncr_irq=254: autoprobe IRQ
-ncr_addr   : может быть: 0x220 0x240 0x280 0x2A0 0x2C0 0x300 0x320 0x340
Если сканнер у вас включается сразу же при включении компа, то можете вставить верхнюю команду в файл /etc/rc.d/rc.modules.
Symbios Logic 53c416
Вот как действовал Вячеслав со своей карточкой.
"Подсоединив прилагающуюся карточку необходимо выяснить какие ресурсы требует она? У меня не было документации, поэтому действовал методом научного тыка. Пошел в /usr/src/linux/drivers/scsi, нашел файл sym53c416.c и бегло посмотрел его. Оказалось, что карточка для портов ввода-вывода требует 32 байта, а базовый адрес у нее может быть 0x200, 0x220, 0x240. На 220 у меня сидит звуковая, поэтому, проверив по /proc/ioports, что у меня 0x200 не занято, решил посадить ее туда. С прерыванием вышло еще проще. Карточка может сесть на любое из нижних прерываний, причем драйвер берет номер прерывания уже от самой карточки. Итак, вооружившись этими знаниями, я командой pnpdump сгенерировал файл isapnp.conf
# ANSI string -->SYM 53C416       <--
(CONFIGURE SLI4161/-1 (LD 0
 (IO 0 (SIZE 32) (BASE 0x0200))
 (INT 0 (IRQ 7 (MODE +E)))
 (NAME "SLI4161/-1[0]{SYM 53C416          }")
 (ACT Y)
))
Проверив, что карточка спокойно садится на указанные ресурсы командой isapnp isapnp.conf, я пошел пересобирать ядро. Проверьте, появился ли после этого у вас модуль sym53c416.o в каталоге /lib/modules/[версия вашего ядра]/scsi. "

Проверим как воспринимает система вашу карточку. Перезагружаем компьютер, подключаем и включаем сканер. Что теперь.
Даем команду modprobe [имя модуля] [параметры]. Если машина не зависла, никакая программа не обругала вас на иностранном, то можете радоваться. Если же произошла ошибка - ищите, что не так.
Давайте посмотрим, что у нас там подключилось. Для этого есть простая команда

$ cat /proc/scsi/scsi
Ответ может быть, например, такой:
Attached devices: 
Host: scsi0 Channel: 00 Id: 02 Lun: 00
  Vendor: HP       Model: C5110A           Rev: 3701
  Type:   Processor                        ANSI SCSI revision: 02
Странно, сканер на процессор вроде не похож, да и модель как-то с ScanJet 5p не коррелирует. Ну да ладно, это же НР. Он у нас один такой. Если ничего нет - тогда опять ищите, почему карта сканер не нашла (обычно при всем исправном это означает, что не включили сканер перед загрузкой модуля). Все, основную часть работы мы закончили.

Компиляция программ работы со сканером

Теперь будем собирать программы, чтобы сканер заработал.
SANE
Заходим на ftp.mostang.com/pub/sane/, и скачиваем от туда последнюю версию sane-x.x.x.tar.gz (список всех сайтов). Затем делаем следующую последовательность команд:
tar xfvz sane-1.0.2.tar.gz
cd sane-1.0.2
./configure;make; make install
Все. Большего не надо. Теперь осмотрите свою машину и подсчитайте, сколько и как у вас к ней подключено SCSI устройств. Диски не считайте. Обычно сканер единственный. Значит, устройство для него будет /dev/sga (если сканер второй, то /dev/sgb и так далее)
Поставьте символический линк: ln -s /dev/sga /dev/scanner А команда chmod 777 /dev/sga даст всем доступ до него. Негоже одному root пользоваться сканером. В принципе никто не мешает создать группу scaner и дать права только ей.
Не забудьте глянуть на конфигурационный файл для вашего сканер. Он должен находится в директории /usr/local/etc/sane.d/[фирма_сканера].conf. Например, для UMAX это umax.conf. Этот файл содержит список имен, которые соответствуют вашему сканеру (их может быть и несколько). Вот пример такого файла (# - комментарий):
	# это комментарий
	#scsi Vendor Model Type Bus Channel ID LUN
	scsi UMAX * Scanner * * * * *
	/dev/scanner
	# можно указать его устройство и так
	/dev/sgа
Все, теперь можете смело набирать команду
$ scanimage -L
Ответ, например, может быть таким:
device `hp:/dev/sga' is a Hewlett-Packard C5110A flatbed scanner
Ну вроде оно. А что этот сканер умеет?
scanimage -d hp:/dev/sga -h 
Вот. scanimage - это консольная утилита для сканирования. Если охота написать скриптик, который сканирует и что-то делает с полученным - вам к ней.
Оболочки к SANE
Ленивые люди пользуются красивой, простой графической утилитой xscanimage, которая идет вместе с исходниками sane. Запустите ее в XWindow. Интерфейс простой, возможности тоже, сохраняет в pnm. Для проверки хватит.

Более навороченная оболочка (я ей пользуюсь) называется XSane. После компиляции (требует наличия и инсталляции, ее можно запустить при помощи команды xsane.

Но нам желательно бы из Gimp▓а. Нет ничего проще.

ln -s /usr/local/bin/xscanimage ~/.gimp/plug-ins
Правда, это у меня сработало со старым gimp. Свежий gimp отказался понимать это. Для нового Gimp-1.1.xx, лучше поставить линк на xsane:
ln -s /usr/local/bin/xsane ~/.gimp-1.1/plug-ins
. Чтобы не делать такое для каждого пользователя такой линк, лучше поставьте линк прямо в директорию процедур Gimp'a (plug-ins)
ln -s /usr/local/bin/xsane /usr/local/lib/gimp/1.1/plug-ins
В старых версиях Gimp'a (1.0.x, <1.1.9) ищите меню Xtns/Xsane, а в новых версиях Gimp'a (>1.1.9) вам надо зайти в меню File/Acquire. Оно будет содержать имена устройств с которых можно сканировать.
Если, у вас ничего не заработало, то в любом случае, можно просто сканированное сохранять в .pnm файл, а затем открывать любым графическим редактором.

Сетевой сканнер

Все, у вас обычная в принципе машина, которая умеет работать со сканером. Но мы решили отдать сканер в сеть. И более того, отдать его windows-машинам. Итак, сначала добавляем в /etc/services номер порта для sane
sane 6566/tcp
Затем добавляем в /etc/inetd.conf строчку
sane      stream     tcp     nowait     saned.saned /usr/local/sbin/saned saned
Вместо saned.saned поставьте пользователя и группу, от которой будет
работать демон. "root.root" - это очень плохое решение.
Я поставил "scanner.scanner".

Перезагружаем inetd
killall -HUP inetd

Теперь редактируем файл /usr/local/etc/sane.d/saned.conf

В нем мы должны прописать имена хостов, которые должны иметь доступ к
сканеру через сеть.
Если мы отдаем сканер всему миру (ну или всей сети), то просто поставьте
в персом символе
первой строки плюсик (+), этим вы отключите вcякий контроль со стороны sane. 

Теперь давайте проверим, доступен ли сканер из сети. Для этого в файл 
/usr/local/etc/sane.d/net.conf пропишем адрес машины, на которой
есть настроенный, как написано выше, демон. Если вам охота проверить свою
машину, то просто напишите туда localhost.
$ scanimage -L
device `hp:/dev/sga' is a Hewlett-Packard C5110A flatbed scanner
device `net:localhost:hp:/dev/sga' is a Hewlett-Packard C5110A flatbed scanner
Работает! Теперь любой другой Linux сможет отсканировать с вашего сканера что-нибудь. Но прежде удостоверьтесь, что обратное преобразование имен работает (цифры в имена). Если нет, то просто добавьте удаленные хосты в /etc/hosts.

О том как заставить компьютеры с M$ Windows работать с вашим сканером читайте в оригинальной статье Вячеслава Калошина.