Next Previous Contents

## 3. Устройства печати в ядре Linux

Существует два полностью отличающихся драйвера устройства для параллельного порта; что вы используете, зависит от версии ядра (которую вы можете узнать с помощью команды `uname -a`). Драйвер изменен в Linux версии 2.1.33.

Несколько деталей одинаковы для обоих типов драйвера. Скорее всего, много людей обнаружат, что Linux не обнаруживает параллельного порта, до тех пор пока они не запретят "Plug and Play" в их PC BIOS. (это не является сюрпризом; отслеживание данных о PnP не-PCI устройствах в Windows и где-нибудь еще могут быть чем-то вроде бедствия).

## 3.1 Устройство lp (ядра <=2.1.32)

Ядро Linux (<=2.1.32), предполагает, что вы вкомпилировали в ядро или загрузили модуль устройства lp (вывод команды `cat /proc/devices` должен включать устройство lp, если оно загружено), обеспечивая одно или больше устройств: /dev/lp0, /dev/lp1, и /dev/lp2. Они не присваиваются динамически, каждое соответствует специфическому адресу ввода/вывода вашего оборудования. Это означает, что ваш первый принтер может быть lp0 или lp1 в зависимости от вашего оборудования. Просто попробуйте оба.

Некоторые пользователи сообщили, что их двунаправленные lp порты не определяются, если они использовали старые однонаправленные кабеля. Проверьте, что вы используете нужный кабель.

Некоторые люди не могут запустить драйвера plip и lp в одно и тоже время на любом заданном порту (в любом случае под 2.0). Однако вы можете загрузить тот или иной драйвер вручную или с помощью kerneld для версий 2.x (и позже 1.3.x) в заданное время. При правильной установке прерываний и подобных вещей, вы по идее можете запустить plip на одном порту, а lp на другом. Некоторые люди делали это редактированием исходного текста драйверов; я с нетерпением ожидаю сообщение о том, что кто-то сделал это только с помощью правильной командной строки.

Существует маленькая утилита, названная `tunelp`, предназначенная для того, чтобы вы, как администратор, могли настроить для устройств lp Linux 2.0 используемые прерывания, скорость опроса и прочие опции.

Если драйвер встроен в ядро, то ядро может воспринимать опцию `lp=` для установки прерываний и адресов ввода/вывода:

> `

>     Когда драйвер lp встроен в ядро, вы можете использовать командную
>     строку LILO/LOADLIN для установки адресов портов и прерываний,
>     которые будет использовать драйвер.

>     Синтаксис:      lp=port0[,irq0[,port1[,irq1[,port2[,irq2]]]]]

>     Например:   lp=0x378,0   or   lp=0x278,5,0x378,7 **

>     Заметим, что если вы используете это свойство, вы должны указать
>     *все* порты, которые вы хотите учитывать, значений по умолчанию не
>     существует. Вы можете запретить встроенные драйвер с помощью опции
>     lp=0.

> `

Когда драйвер загружен как модуль, то возможно указать адреса ввода/вывода и прерывания в командной строке программы insmod (или в файле /etc/conf.modules, при использовании kerneld) используя обычный синтаксис. Параметры следующие: `io=port0,port1,port2` и `irq=irq0,irq1,irq2`. Прочитайте справочную страницу для команды insmod для более детальной информации об этом.

**Для тех из вас, кто (подобно мне) никогда не может найти номера стандартных портов когда это нужно, я привел два примера выше. Номер другого порта (для lp0) равен 0x3bc. У меня нет никаких идей о том какое прерывание обычно используется.

Исходный код для драйвера параллельного порта Linux 2.0 находится в файле /usr/src/linux/drivers/char/lp.c.

## 3.2 Устройство parport (ядра >= 2.1.33)

Начиная с ядра 2.1.33 (и доступно как заплатка к ядру 2.0.30), устройство lp является просто клиентом нового устройства parport. Добавление устройства parport исправляет некоторое количество проблем, которые были из-за старого устройства lp - оно может разделять порты с другими устройствами, оно динамически присваивает доступные параллельные порты номерам устройств, вместо использования фиксированных соотношений между адресами ввода/вывода и номером порта, и так далее.

Введение устройства parport позволило создать целую группу новых драйверов параллельного порта для устройств подобных дискам Zip, Backpack CD-ROM и дискам, и так далее. Некоторые из них доступны в ядрах версии 2.0; посмотрите в интернете.

Главное отличие, которое вы отметите, в том, что ядра, основанные на parport динамически присваивают устройства lp для параллельных портов. Так что, то что было lp1 в Linux 2.0 может оказаться lp0 в Linux 2.2. Убедитесь, что вы проверили это если вы делаете обновление с ядра, работающего с драйвером lp на ядро с драйвером parport.

Кажется, что основные проблемы с этим устройством проистекают от неправильной его настройки:

Дистрибутив

  Некоторые дистрибутивы Linux продаются с неправильно настроенными /etc/modules.conf (или /etc/conf.modules), так что драйвер не загружается когда вам это нужно. При использовании недавних версий modutils, правильные строки в modules.conf должны выглядеть так:

        alias /dev/printers lp             # only for devfs?
        alias /dev/lp*      lp             # only for devfs?
        alias parport_lowlevel parport_pc  # missing in Red Hat 6.0-6.1

BIOS

  Много BIOS для персональных компьютеров представляют параллельный порт как устройство Plug-and-Play. Это только добавляет ненужную сложность к великолепному простому устройству, которое почти всегда присутствует; отключите PnP настройки для вашего параллельного порта (который называется "LPT1" во многих BIOSах) в том случае если ваш параллельный порт не определяется драйвером Linux. Правильные настройки часто называются "legacy", "ISA", или "0x378", но скорее всего не "disabled".

Вы также можете прочитать файл Documentation/parport.txt в исходных текстах ядра, или посмотреть на сервере parport.

## 3.3 Последовательные устройства

Последовательные устройства под Linux называются подобно /dev/ttyS1. Утилита `stty` позволит вам интерактивно просмотреть или установить параметры последовательного порта `setserial` позволит вам контролировать некоторые расширенные атрибуты и настроить IRQ и адреса ввода/вывода для нестандартных портов. Дополнительные обсуждения последовательных портов в Linux вы можете найти в Serial-HOWTO.

При использовании медленных последовательных принтеров с контролем потока, вы можете обнаружить, что некоторые из ваших заданий оборваны. Это может быть из-за последовательного порта, чье действие по умолчанию -- удалить любые не переданные символы из своего буфера через 30 секунд после того как устройство закрыто. Буфер может содержать до 4096 символов, и если ваш принтер использует контроль потока и медлен настолько, что не может принять все данные из буфера за 30 секунд после того как программа печати закрыла последовательный порт, то конец содержимого буфера будет потерян. Если команда `cat file > /dev/ttyS2` делает полный печатный вывод для коротких файлов, но обрезает длинные файлы, то у вас может быть такая проблема.

30-ти секундный интервал может быть выровнен с помощью опции "closing_wait" командной строки программы setserial (версии 2.12 и поздних). Последовательные порты машины обычно инициализируются вызовом setserial в загрузочном файле rc.serial. Вызов для последовательного порта принтера может быть модифицирован для установки параметра closing_wait вместе с установкой других параметров.

Next Previous Contents