Компьютер без принтера сегодня представляется каким-то полуфабрикатом. А резкое падение цен на матричные, струйные и лазерные принтеры в течение последних двух лет способствуют массовому распространению технологии “персональной печати”. Конечно, первая мысль, ассоциируемая с принтером сегодня — это MS Word. Однако, как я постараюсь показать, Linux предоставляет пользователю более широкие возможности по управлению ресурсами принтера, чем мы привыкли видеть в Windows.
Прежде всего нам необходимо убедиться, что Linux видит ваш принтер. Как правило, принтер подключается к единственному параллельному порту компьютера, который размещается либо на плате устройств ввода/вывода, либо непосредственно на материнской плате компьютера. Но “по теории” IBM PC может поддерживать до четырех параллельных портов, и в Linux им соответствуют символьные устройства /dev/lp0 — /dev/lp3.
Поэтому первый ваш шаг состоит в проверке — есть ли в вашей системе соответствующие устройства. Если нет, их придется создать самостоятельно. Для этого учтем, что во-первых, устройства в UNIX являются просто специальными файлами, которые можно создать с помощью программы mknod, а во-вторых, за параллельными портами зарезервированы номера устройств — старшее 61 и младшие с 0 до 3 и соответствуют номеру устройства.
Вот синтаксис команд mknod для всех параллельных портов, поддерживаемых Linux (в скобках приведены базовые адреса портов ввода/вывода):
mknod /dev/lp0 c 6 0 (0x3BC)
mknod /dev/lp1 c 6 1 (0x378)
mknod /dev/lp2 c 6 2 (0x278)
mknod /dev/lp3 c 6 3 (0x......)
Обратите внимание на адреса портов! Как правило, в составе IBM PC входит порт с адресом 0x378, который соответствует не /dev/lp0, а /dev/lp1. И если вы по привычке будете соотносить “первый” порт DOS с “нулевым” портом UNIX, то искать причину неисправности вам придется довольно долго. Как же избежать этой ошибки?
Наиболее простой путь состоит в экспериментальной проверке конфигурации. Во-первых, вы можете воспользоваться утилитами из DOS типа sysinfo или MSD, а во-вторых, можете просто попытаться “выбросить на печать” текущий каталог, например:
ls -l > /dev/lp0
Если порта lp0 на вашей машине нет вы получите сообщение:
? /dev/lp0 unknown device
после чего вы можете попробовать использовать другое устройство. Если же все в порядке, то на принтер будет выведена “лесенка” примерно следующего вида2 :
This is 1 line
This is 2 line
This is 3 line
Причина этого явления состоит в том, что ориентированные для работы в DOS принтеры требуют для завершения строки два символа — возврата каретки
Бороться с этим неприятным эффектом вы можете двумя способами — либо отключить режим раздельного управления <CR> и <LF> — в этом случае принтер будет распознавать приход любого из этих символов как команду перейти к новой строке. Этот режим поддерживает большинство современных моделей принтеров, но его целесообразно использовать лишь в том случае, если вы используете только Linux. Если же вам приходится время от времени обращаться к старушке DOS, целесообразно использовать специальные программы-фильтры, о которых речь пойдет ниже. А сейчас, после того, как мы убедились в работспособности принтера, мы организуем поддержку системных средств печати, общепринятых для UNIX.
Устанавливая систему вы наверняка позаботились о поддержке принтера. Если нет, то самое время перекомпилировать ядро системы. При этом вы должны позаботиться о следующем:
Собственно говоря, никакого специального драйвера принтера в системе нет, есть всего лишьдрайвер параллельного порта Centronics, который входит в состав практически любого параллельного принтера. При этом принтер может подключаться как к любому последовательному порту, так и к параллельному. Последовательный интерфейс, по большому счету, используется единый и принтер выступает в роли однонаправленного терминала, использующего линии /dev/ttys, и подчиняется всем правилам работы с этими портами. Мы же рассмотрим именно особенности реализации /dev/lp.
При определении любого драйвера внешнего устройства определяется по меньшей мере два параметра: область адресов, занимаемых устройством в пространстве ввода/вывода и вектор аппаратного прерывания. С адресами мы вроде бы разобрались... А вот что касается векторов прерываний, то здесь вас ждет сюрприз. Фирма IBM при разработке еще самой первой IBM PC зарезервировала за параллельным портом LPT1 вектор прерывания IRQ7. Но Microsoft, видимо и не предполагала об этом, поскольку драйвер устройства печати в DOS не использует этого
вектора, ограничиваясь периодическим опросом бита готовности принтера к приему следующего байта данных. Такой режим опроса, кстати, получил название polling mode и вы с ним можете столкнуться еще при анализе кода драйвера CD-ROM и не только там.
Увы, свято место пусто не бывает. И IRQ7 постепенно стал использоваться как один из основных векторов для звуковых плат. В результате и при разработке Linux пришлось отказаться от IRQ-ориентированного драйвера принтера, поскольку это могло бы привести к возникновению конфликта между устройствами4. Именно поэтому, в Linux реализована не
слишком эффективная схема построения драйвера, что впрочем, не слишком снижает производительность подсистемы печати в целом.
В операционной систме UNIX, которая изначально разрабатывалась как средство для подготовки текстовой документации, управление принтером носит поистине “системный” характер. Прежде всего, любой процесс вывода на печать под управлением системы использует
единый механизм, вне зависимости от количества и системы команд управления принтеров.
Для решения всех проблем печати используется несколько небольших программ:
lpd — демон печати, осуществляющий вывод данных из каталога спулинга на устройство печати в соответствии с настройками конфигурационного файла /etc/printcap;
lprm — программа удаления заданий на печать из очереди по их номеру;
lpq — программа просмотра содержимого очереди на печать;
lpc — диалоговая программа управления состоянием принтера и очереди заданий на печать;
lpr — программа постановки заданий в очередь на печать.
Впрочем, давайте рассмотрим процесс печати по порядку...
На рисунке приведена общая схема организации процесса печати в UNIX-системах вообще, и в Linux, в частности. Прежде всего, с помощью программы lpr файл (или поток с устройства стандартного вывода) помещается в очередь заданий. Очередь заданий представляет собой обычный каталог, который имеет название типа /var/spool/lp/lp1 . Программа lpd периодически просматривает содержимое очереди и в случае, если находит задание, пытается его напечатать. Осуществляется это следующим образом:
Демон печати анализирует содержимое файла /etc/printcap и выбирает одну из записей, соответствующую текущему режиму работы принтера, включающему среди всего прочего, имена фильтров входного и выходного преобразований.
Очевидно, что если вы устанавливаете Linux на компьютер, который уже несколько лет или месяцев стоит у вас на столе и уже оснащен принтерами, то выбирать не приходится — нужно запускать тот принтер, который у вас уже есть. Если же вы приобретаете или устанавливаете новый компьютер, целесообразно приобрести принтер, возможности которого будут использоваться системой в максимальной степени.
Поскольку одним из основных критериев при выборе принтера является его способность выводить на печать файлы в формате Postscript, то на первый взгляд предпочтительным кажется приобретение Postscript-принтера или хотя бы Postscript-карты. Но это все же необязательно. Достаточно использовать принтер, для которого реализована поддержка интерпретатора Postscript. В таблице приведен список устройств, которые поддерживаются интерпретатором Ghostscript, входяшим в состав большинства дистрибутивов Linux. Если ваш принтер совместим хотя бы с одной из перечисленных моделей — дело в шляпе!.
| Код драйвера | Тип принтера |
| appledmp | Матричный принтерр фирмы Apple (Imagewriter) |
| bj10e | Canon BubbleJet BJ10e |
| bj200 | Canon BubbleJet BJ200 |
| cdeskjet | H-P DeskJet 500C в режиме малоцветной печати (1 bit/pixel color) |
| cdjcolor | H-P DeskJet 500C в режиме TrueColor (24 bit/pixel color) и высококачественной закраски по Флойду-Штейнбергу |
| cdjmono | H-P DeskJet 500C с печатью только черным цветом |
| cdj500 | H-P DeskJet 500C (то же, что и cdjcolor) |
| cdj550 | H-P DeskJet 550C |
| declj250 | альтернативный драйвер для DEC LJ250 |
| deskjet | H-P DeskJet и DeskJet Plus |
| dfaxhigh | Программный формат DigiFAX фирмы DigiBoard, Inc. |
| dfaxlow | DigiFAX с низким (normal) разрешением |
| djet500 | H-P DeskJet 500 |
| djet500c | H-P DeskJet 500C |
| epson | Epson-совместимые матричные принтеры (9- or 24-игольные) |
| eps9high | Epson-совместимые 9-игольные, тройное разрешение с чередованием строк |
| epsonc | Цветные матричные принтеры Epson LQ-2550 и Fujitsu 3400/2400/1200 |
| escp2 | Принтеры Epson, оборудованные интерпретатором ESC/P 2, в том числе и Stylus 800 |
| ibmpro | IBM Proprinter, 9 иголок |
| jetp3852 | IBM Jetprinter струйный цветной принтер (Model #3852) |
| laserjet | H-P LaserJet |
| la50 | DEC LA50 |
| la75 | DEC LA75 |
| lbp8 | Лазерный принтер Canon LBP-8II |
| ln03 | DEC LN03 |
| lj250 | Цветной принтер DEC LJ250 |
| ljet2p | H-P LaserJet IId/IIp/III* с поддержкой TIFF-сжатия |
| ljet3 | H-P LaserJet III* со сжатием Delta Row |
| ljet4 | H-P LaserJet 4 (разрешение по умолчанию 600 dpi) |
| ljetplus | H-P LaserJet Plus |
| m8510 | C.Itoh M8510 |
| necp6 | NEC P6/P6+/P60 принтеры, разрешение 360 x 360 DPI |
| nwp533 | Лазерный принтер Sony Microsystems NWP533 [Sony only] |
| oki182 | Okidata MicroLine 182 |
| paintjet | Цветной принтер H-P PaintJet |
| pj | Альтернтивный драйвер для PaintJet XL |
| pjxl | Цветной принтер H-P PaintJet XL |
| pjxl300 | Цветной принтер H-P PaintJet XL300 |
| r4081 | Лазерный принтер Ricoh 4081 |
| sparc | SPARCprinter |
| t4693d2 | Цветной принтер Tektronix 4693d, 2 бита на R/G/B компонент |
| t4693d4 | Цветной принтер Tektronix 4693d, 4 бита на R/G/B компонент |
| t4693d8 | Цветной принтер Tektronix 4693d, 8 бит на R/G/B компонент |
| tek4696 | Струйный плоттер Tektronix 4695/4696 |
| Назад | Содержание | Вперед |