Библиотека сайта rus-linux.net
6. Настройка последовательного порта: адрес IO, IRQ
6.1 К какой шине подключен мой последовательный порт?
В поиске и настройке последовательного порта часто помогает знание типа шины, к которой он подключен. Если последовательный порт находится на отдельной карте, то Вам может быть известно, в слот какой шины вставлена карта (обычно PCI-слот). Но если последовательный порт поставляется вместе с материнской платой, то может быть не ясно, на какой шине он расположен. Для материнских плат, имеющих слоты ISA, с большой вероятностью это будет шина ISA, возможно без поддержки Plug-and-Play. Даже на платах, имеющих только слоты PCI, последовательный порт может быть подключен к шине ISA или к шине LPC. LPC встречается в основном на ноутбуках (лэптопах). Команда "lspci" показывает наличие шины LPC. К сожалению, шина LPC не имеет стандартного Plug-and-Play для низкоуровневой настройки устройств, находящихся на ней. Остается надеяться на то, что BIOS сможет настроить их, используя ACPI. Некоторые из разработчиков Linux знают об этой проблеме (на конец 2004 г.), и в будущем Linux будет поддерживать шину LPC лучше. Если в выводе "lspci" присутствует мост LPC (LPC bridge), то у Вас есть шина LPC.
6.2 IO и IRQ. Общие сведения
Для правильной работы последовательного порта надо в первую очередь назначить ему IRQ и адрес IO. Для старых устройств (середины 90-х годов XX века) это делается перемычками на карте или сохранением настроек в BIOS. В более поздних устройствах они устанавливаются BIOS или Linux во время загрузки, в новых же устройствах параметры устанавливаются сами(?) при включении питания. Без адреса IO у Вас не получится использовать последовательный порт. Без IRQ потребуются неэффективные методы опроса(?), для которых в драйвере последовательного порта IRQ должно быть установлено на 0. В былые времена номера IRQ и адреса IO устанавливались перемычками или переключателями на карте последовательного порта. Сегодня они устанавливаются цифровыми сигналами, посылаемыми BIOS или Linux устройству. Все должно настраиваться автоматически (при условии, что в BIOS не отключена эта возможность). Если у Вас возникают проблемы или Вы хотите узнать, как это работает, -- читайте дальше.
Драйверу, конечно, должны быть известны и адрес IO, и IRQ последовательного порта, чтобы он смог с ним общаться. Драйверы современных последовательных портов (ядро 2.4) пытаются определить их, используя PnP, поэтому обычно нет необходимости в самостоятельном указании этих настроек (посредством "setserial"). Драйвер может и сам устанавливать адрес IO или IRQ устройства. Увы, не всегда последовательный порт распознается драйвером, в частности это касается последовательных портов PCI. См. PCI: Подключение порта
На старой шине ISA драйвер также проверяет наличие последовательных портов на стандартных адресах. Это работает для карт с перемычками и иногда для ISA PnP, если драйвер не поддерживает ISA PnP (ядра версий до 2.4).
Назначение последовательному порту IRQ и адреса IO является низкоуровневой настройкой. Зачастую она производится автоматически драйвером последовательного порта, но иногда приходится делать ее самому. Итак...
Низкоуровневая настройка заключается в назначении адреса IO, IRQ и названия порта (вроде ttyS2 = tts/2). Пара IO-IRQ должна быть установлена как в самом последовательном порте, так и в настройках его драйвера. Драйверу же надо как-то назвать эту пару (например, ttyS2). Драйвер настраивается программой "setserial". Драйвер может и сам методами PnP обнаружить/установить IO/IRQ и запомнить их. У карт с перемычками нет PnP, но если перемычками установлены стандартные IO/IRQ, то драйвер найдет этот последовательный порт.
При загрузке Linux пытается определить и настроить (низкий уровень) имеющиеся последовательные порты. Результат зависит от BIOS, его настроек, от аппаратных средств, от дистрибутива Linux, от версии ядра и т.д. Если последовательные порты работают нормально, то в их низкоуровневой настройке нет необходимости (вполне логично -- перев. сам себе).
Низкоуровневая настройка может потребоваться при возникновении проблем с последовательными портами. Настройка также может потребоваться, если Вы имеете ядро версии 2.2 или ниже и:
- планируете использовать более 2-х последовательных портов ISA
- устанавливаете новый последовательный порт (например, вместе с внутренним модемом)
- какие-то из последовательных портов имеют нестандартные IRQ или адреса IO
Начиная с ядер версии 2.2, появилась возможность использовать более 2 последовательных портов без осуществления какой-либо низкоуровневой настройки благодаря разделению прерываний. PCI-порты все должны поддерживать его, чего не скажешь об ISA. Конечно, лучше всего каждому порту назначить свое прерывание, если есть свободные. См. Разделение прерываний и ядра версий 2.2+
Низкоуровневая настройка (установка IRQ и адреса IO), кажется, вызывает у людей бОльшие сложности по сравнению с высокоуровневой, хотя для многих она проходит полностью автоматически и не требуется никакого вмешательства. Если порт не заблокирован и последовательный драйвер знает правильные IRQ и адрес IO, то он в общем-то должен работать.
Порт может быть заблокирован (не доступен) или в BIOS, или из-за того, что Linux не смог найти и настроить его. PnP-утилиты, к коим относится lspci, должны определять современные порты (при условии, что BIOS не заблокировал их). Утилиты вроде "setserial" и "scanport" (только в Debian ??) проверяют только адреса IO, не используя PnP, и поэтому не могут обнаружить заблокированные порты.
Обнаруженный драйвером ISA-порт может работать чрезвычайно медленно, если используется неправильное IRQ. См. Чрезвычайно медленно: Текст появляется на экране медленно после долгих задержек. Вероятность получения PCI-портом неправильного IRQ намного меньше.
Адреса IO, номера IRQ и пр. называются "ресурсами", т.е. мы настраиваем определенные ресурсы. Существуют и другие "ресурсы" -- данный термин имеет много значений (чтоб Вы знали :) -- издевка перев.). Итак, низкоуровневая настройка состоит из включения порта (enabling the device), назначения ему названия (ttyS2, например) и указания двух значений (номер IRQ и адрес IO) в двух местах:
- в драйвере порта (осуществляется или PnP, или "
setserial
") - в регистрах конфигурации самого последовательного порта (выполняется программно PnP или перемычками на старых платах).
Информацию о "ресурсах" последовательных портов можно увидеть в сообщениях, выдаваемых системой при запуске (=загрузке). Обычно она верна, но при наличии проблем последовательный порт может быть не показан вовсе. Сообщение от "setserial" может не показывать истинную конфигурацию последовательного порта (оно и не предполагается). См. Адрес I/O и IRQ: сообщения при загрузке.
6.3 Поддержка шины PCI
Введение
PCI-модемы бывают 2-х видов: 1. "винмодемы", не имеющие драйвера для Linux и, соответственно, не работающие под Linux, и 2. нормально работающие под Linux. Для программного модема необходим драйвер, потому как поддержка "винмодемов" не встроена в драйвер последовательного порта. См. Линмодем HOWTO.
Начиная с версии 2.4, в ядре присутствует поддержка PnP для шин PCI и ISA (или встроенная (built-in), или в виде модулей). Последовательные порты на шине PCI могут быть автоматически опознаны и настроены драйвером, но не все.
Ядро 2.2 не поддерживало последовательные порты на шине PCI, хотя поддержка шины PCI как таковой имелась (у кого-то они все-таки работали). Начиная с ядра 2.4, драйвер последовательного порта считывает идентификационный номер (id number), хранящийся в подключаемом устройстве, чтобы определить способ работы с ним (если он известен драйверу). Драйвер должен сам назначить адрес I/O, установить IRQ и пр. Т.е. использовать "setserial" не надо.
Если у Вас не используется файловая система устройств (device
filesystem), то может возникнуть следующая проблема. Драйвер при
загрузке системы может для порта назначить имя "ttyS4" (можно узнать из
вывода команды dmesg
). А "файла" dev/ttyS4 может не оказаться -- порт работать не будет. Тогда придется самому создать этот "файл", применив
cd /dev
и ./MAKEDEV ttyS4
В случае файловой системы устройств драйвер должен создать устройство tts/1
Дополнительные сведения о PCI
PCI-порты стандартизованы не очень хорошо. Некоторые для связи с ПК используют основную память. Некоторые требуют особого назначения IRQ. Из вывода "lspci -vv" можно узнать 4-значное значение адреса порта IO (IO port) и, указав его и IRQ программе "setserial", настроить последовательный порт для работы. Таким образом некоторым пользователям удалось "завести" PCI-модем 3COM 3CP5610. Пример: если lspci показывает IRQ 10 и I/O по адресу 0xecb8, то для порта ttyS2 (можете назначить другой -- прим. перев.) надо набрать:
setserial /dev/ttyS2 irq 10 port 0xecb8 autoconfig
Сообщение "Probing PCI hardware" ("Проверка/просмотр PCI") при загрузке означает, что происходит чтение регистров конфигурации PnP в PCI-устройствах для получения информации обо всех PCI-картах и, вообще, всех PCI-устройствах. Это отличается от проверки адресов IO (probing of IO addresses), выполняемой драйвером последовательного порта, которая заключается в чтении содержимого только по определенным адресам IO с целью нахождения последовательных портов.
6.4 Наиболее часто совершаемые ошибки при низкоуровневой настройке
Вот несколько ошибок, совершаемых пользователями:
- команда setserial: Пользователи набирают ее (без опций "autoconfig" и "auto_irq") и думают, что она отобразит настоящие настройки последовательного порта (это не так).
- сообщения setserial: Пользователи видят их на экране при загрузке системы (или после ввода команды setserial) и ошибочно полагают, что в них всегда отображаются действительные настройки их последовательного порта.
- /proc/interrupts: Если последовательный порт не задействован, то его прерывание в /proc/inerrupts не показывается, и пользователи приходят к ошибочному выводу, что их последовательный порт не находится системой (или для него не установлено прерывание).
- /proc/ioports и /proc/tty/driver/serial: Пользователи полагают, что здесь они смогут найти информацию о настоящих настройках последовательных портов, в то время как там отображаются те же данные (возможно ошибочные), что выдает и setserial.
6.5 IRQ и адрес IO должны быть правильными
Значения IO и IRQ, установленные в драйвере последовательного порта (обычно с помощью утилиты setserial), должны совпадать с таковыми, содержащимися в самом последовательном порте. Если это не так, то возникают проблемы, т.к. драйвер имеет неправильную информацию о последовательном порте. У заблокированного порта адреса IO и IRQ нет.
Если драйверу задать неправильный адрес IO, он будет пытаться отсылать данные на несуществующий последовательный порт или, что еще хуже, на какое-другое устройство. Если драйверу задать неправильный номер IRQ, он не будет обрабатывать запрос на обслуживание последовательного порта, поступаемый в виде прерывания, что приведет либо к очень медленному отклику порта, либо к его отсутствию, вообще. См. Чрезвычайно медленно: Текст появляется на экране медленно после долгих задержек. Неправильная модель UART, указанная драйверу, также может стать источником проблемы. Чтобы определить идентичны ли пары IO-IRQ в драйвере и в последовательном порте, надо заглянуть в их настройки (куда проще -- очередное ехидство перев.).
6.6 Какие установки у драйвера?
ВВедение
Установки драйвера необязательно должны соотвествовать установкам порта. Если все работает, то, по всей видимости, настройка драйвера правильна (соответствует установка порта) и в дальнейшем "копании" необходимости нет (только если не мучает любопытство или отсутствует желание стать гуру). Есть следующие способы узнать "мысли" (в смысле настройки) драйвера: сообщения при загрузке, "файлы" каталога /proc и команда "setserial".
Адрес I/O и IRQ: сообщения при загрузке
В большинстве случаев низкоуровневая настройка портов происходит автоматически при загрузке системы (не всегда правильно). Отследить происходящее при запуске позволяет просмотр сообщений, появляющихся в это время на экране. Также стоит ознакомиться с информацией, выдаваемой BIOS еще до начала загрузки Linux (не показана здесь). Сообщения от BIOS можно приостановить, нажав клавишу Pause. Если не успеете ее нажать, то начнется загрузка Linux, прервать которую можно нажатием Ctrl-Alt-Del, вызывающим перезагрузку.
Сообщения, появляющиеся по ходу загрузки Linux, постепенно исчезают
с экрана. Для просмотра и поиска нужного сообщения среди промелькавших
используйте сочетания Shift-PageUp и Shift-PageDown. Для этих же целей
служит команда dmesg
. Журналы (логи) загрузки
находятся в /var/log. Вот пример сообщений при загрузке (ttyS00 - то же
самое, что и /dev/ttyS0, далее в соответствии):
Сперва показывается что обнаружено (значения irq только предположительные):
Serial driver version 4.27 with no serial options enabled
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A
ttyS02 at 0x03e8 (irq = 4) is a 16550A
ttyS04 at port 0xeff0 (irq = 10) is a 16550A
ttyS0-ttyS2 были обнаружены путем проверки стандартных адресов,
тогда как ttyS4 является PCI-портом, найденным из конфигурации шины PCI.
Позже setserial отобразит установки из своего файла настроек
(который можно править), но они также необязательно должны быть правильными:
Loading the saved-state of the serial devices...
/dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A
/dev/ttyS2 at 0x03e8 (irq = 5) is a 16550A
Файл настроек setserial содержит данные только о ttyS1-2, так что ttyS0 и ttyS4 им не управляются. В приведенном примере есть одно несоответствие: в первом сообщении показано, что ttyS2 имеет irq=4, а во втором -- irq=5. Как правило, второе сообщение содержит правильную информацию, но не всегда...
Второе сообщение выводится программой setserial
,
запускаемой при загрузке скриптом (=сценарием), расположенном в одном
из подкаталогов /etc. Оно показывает, какие настройки заданы драйверу
последовательного порта. Настройки эти могут быть неправильными. К
примеру, номер irq, установленный в самом порте, равен 8 (оба сообщения
не верны), а в файле настроек ошибочно записано irq=5.
Linux по умолчанию не выполняет проверку IRQ, поэтому для старых последовательных портов, настраиваемых перемычками, может назначить неверный IRQ. Он либо присвоит "стандартный" номер (первое сообщение), либо возьмет из файла настроек (второе сообщение). Необязательно, что оба правильны. Если драйверу задан ошибочный IRQ, то последовательный порт работает очень медленно или не работает.
Первое сообщение содержит результаты проверки Linux адресов
последовательных ISA-портов. Если порт показан в нем, то он есть, но
его IRQ может быть другим. Linux не выполняет проверку IRQ из-за ее
ненадежности. Он лишь предполагает "стандартные" значения IRQ, о чем и
сообщает. Вы можете сами проверить их по команде setserial
, заданной с опциями autoconfig
и auto_irq
, но и эта информация не является гарантированно достоверной (так перестаешь верить чему-либо -- заметка перев.).
В сообщениях BIOS (показываемых перед началом загрузки Linux) отображаются действительные настройки последовательных портов. Если порт поддерживает Plug-and-Play (PnP), то есть возможность запустить "isapnp" или "setpci" и поменять его настройки. Следите за сообщениями Linux при запуске. Последнее сообщение о последовательных портах в примере выше должно соответствовать сообщениям BIOS. При несоответствии надо изменить либо установки в самом последовательном порте, либо настройки setserial, чтобы она передала драйверу правильную информацию.
Следует отметить, что последовательные порты Plug-and-Play (PnP) могут распознаваться только соответствующим программным обеспечением PnP. Вот почему до ядер версии 2.4 в сообщениях при загрузке не показывались существующие последовательные порты. BIOS с PnP может автоматически производить их низкоуровневую настройку. Работа с PnP будет объяснена позже.
Каталог /proc и setserial
Чтобы узнать характеристики последовательных портов (известные драйверу), наберите "setserial -g /dev/ttyS*". Есть другой способ выудить эту информацию -- заглянуть в "файлы" каталога /proc. Не факт, что те же настройки записаны в регистрах последовательных портов (мы увидим настройки драйвера, а не порта -- пояснение перев.).
/proc/ioports
покажет адреса IO, используемые драйвером.
/proc/interrupts
покажет прерывания (IRQ), используемые
драйверами для текущих процессов (имеющих доступ к устройствам). Можно
будет увидеть, сколько прерываний задействовано в данный момент.
/proc/tty/driver/serial
дополнительно к этим данным
покажет количество полученных и переданных последовательным портом
данных (даже если в этот миг он не открыт).
Следует заметить, что адреса IO и номера IRQ, которые Вы увидите, представляют собой настройки драйвера -- настройки самих последовательных портов могут отличаться (а Рома умный! -- реплика перев., на к-ую не стоит обращать внимания :)). Меж тем, числа задействованных прерываний и прошедших байтов являются действительными. Если Вы видите, большое количество прерываний и/или байтов, то это может значить, что порт задействован (был задействован). Прерывания могут быть и от других устройств. Если ни одного байта не получено (rx:0), но сколько-то передано (tx:3749, к примеру), то задействовано (используется) только одно направление потока.
Если для интересующего Вас последовательного порта данные о прерываниях отсутствуют, то проверьте его "внутренние" настройки. Посмотреть в /proc/interrupts прерывания, используемые программой (например, minicom), можно только во время ее выполнения (при запущенном процессе).
6.7 Какие адрес IO и IRQ "зашиты" в мой последовательный порт?
ВВедение
Для портов с PnP, как PCI, так и ISA, все настройки выполняются методами PnP. PnP-порты могут отобраться в выводе "lspci -v" или "isapnp --dumpregs", даже если никаких настроек нет или порт заблокирован. Порты, заблокированные перемычками (или из-за отказа/-ов), полностью скрыты. См. ISA-порты PnP, PCI: Какие IO и IRQ установлены?, PCI: Подключение порта
PnP-порты не сохраняют свои настройки при отключении питания. Этим они отличаются от портов, регулируемых перемычками (не-PnP), чьи настройки остаются и в выключенном состоянии.
PCI: Какие IO и IRQ установлены?
Для PCI-устройств BIOS почти всегда устанавливает IRQ и также может установить адрес IO. Чтобы посмотреть, как это он сделал, воспользуйтесь "lspci -vv" (лучше всего) или посмотрите в /proc/bus/pci (или при ядре версии <2.2 в /proc/pci). Последовательный порт модема часто называется "Communication controller" ("коммуникационный контроллер"). Если lspci сообщит "I/O ports at ... [disabled]", то последовательный порт заблокирован и не имеет адреса IO, т.е. он не виден и не может быть использован. См. PCI: Подключение порта. Если указано более одного адреса IO, то таковым наиболее вероятно является первый из них.
Поменять IRQ Вы не можете (по крайней мере, с помощью setpci) -- он назначается и записывается в регистр порта BIOS. А вот адрес IO setpci изменяет -- за это отвечает BASE_ADDRESS_0 и т.д.
PCI: Подключение порта
Если порт доступен по какому-либо адресу IO, то "lspci -vv" отобразит строчку "Control: I/O+ ...", + (плюс) в которой означает, что данный адрес IO задействован. Если выводится "I/O-" ("I/O ports at ... [disabled]"), то порт заблокирован. Разблокировать и подключить порт можно программой setpci, к примеру так: "setpci -d 151f:000 command=101". Здесь 151f -- идентификатор производителя (vendor id), а 000 -- идентификатор устройства (device id), полученные от "lspci -n -v" или из /proc/bus/pci, или от "scanpci -v". "command=101" значит, что 101 кладется в регистр команд (command register), который в выводе lspci обозначен как "Control" (управляющий регистр). 101h устанавливает два бита: 1 устанавливает бит I/O в +, а 100 сохраняет + в бите SERR#. Бит SERR# управляющего регистра в этом случае изначально был установлен в +, об этом мы узнали от lspci. Поэтому, чтобы сохранить его, мы задали первую единичку в 101 (почему не 1001? -- вопрос перев. к знающим), повторно установив тем самым бит 8 в 1 (бит 0 -- бит I/O). Не все последовательные PCI-порты используют SERR#: если lspci выводит SERR#- (бит SERR# равен 0), то вместо "command=101" (или 1001? -- перев. терзается в сомнениях ;)) задайте "command=1". Теперь надо настроить setserial, чтобы сообщить драйверу IO и IRQ.
Бит 8 на самом деле 9-ый, т.к. отсчет битов ведется с нуля 0. Не пугайтесь, что lspci показывает много минусов -- это всего лишь означает, что многие функциональные возможности у данного порта отсутствуют (или не задействованы). Последовательные порты являются сравнительно медленными и не нуждаются в этих возможностях.
Другой путь подключить порт -- доверить сделать это BIOS при включении ПК, предварительно сказав ему, что у Вас нет операционной системы plug-and-play. Но на этом пути могут возникнуть проблемы с MS Windows9x (см. Plug-and-Play HOWTO).
ISA-порты PnP
Для ISA-портов Plug-and-Play (PnP) существует программа pnpdump
(входит в isapnptools
).
С опцией --dumpregs она выдает настоящие адреса IO и IRQ , взятые
прямо из регистров конфигурации портов. Также эта программа должна
находить заблокированные PnP ISA-порты. Адрес, сообщаемый pnpdump, на
самом деле не является адресом IO, это специальный адрес, используемый
для взаимодействия с PnP-картами.
Нахождение незаблокированных портов (ISA, PCI, PnP, non-PnP)
Возможно, сообщения BIOS предоставят Вам некоторую информацию о доступных последовательных портах. Чтобы вернуться к ним вверх по экрану, нажмите несколько раз сочетание Shift-PageUp. В них показаны настройки самих портов. Setserial не может поменять их, но isapnp или setpci могут. Начиная с ядра 2.4, драйвер также может производить изменения в настройках многих (но не всех) последовательных портов.
"scanport" (только в Debian ??) проверяет все порты ввода-вывода и указывает на те, которые по его мнению могут быть последовательными. После этого можно запустить setserial с опцией "autoconfig". Ей нужно задать предполагаемые адресы -- воспользуйтесь данными scanport. См. Setserial.
Для портов с перемычками адреса и прерывания устанавливаются ими (а иначе зачем они -- перев.). Настройка некоторых не Plug-and-Play (non-PnP) портов производится специальной DOS-программой.
Определение с помощью MS Windows (последний способ)
Конфигурация PnP-портов под Linux может быть (а может и не быть) такой же, как и под DOS/Windows. MS Windows хранит сведения о конфигурации в своем Реестре, коего Linux никоим образом не касается -- у него свое. Если подключение и настройка выполняется автоматически BIOS (для этого ему надо указать, что у Вас операционная система не-PnP), то Linux берет установки портов из энергнонезависимой памяти BIOS. Windows также использует эту память, но настройку может производить по-своему.
6.8 Выбор IRQ для последовательных портов
Выбор IRQ для портов Plug-and-Play не требуется, потому что настройка подключенных к ним устройств производится BIOS или драйвером. Программное обеспечение PnP само определяет и устанавливает наиболее подходящие, как оно считает, значения (не всегда лучшим образом). Выбирать IRQ приходится при использовании перемычек или isapnp (для шины ISA). Если Вы знаете, какие IRQ задействовать для последовательных портов, то оставшуюся часть данного раздела можете пропустить. Если Вы также знаете, для чего используется IRQ 0, то и следующий абзац можете не смотреть.
Назначение IRQ 0
Хотя IRQ 0 и закреплено за таймером, для setserial оно имеет особое значение. IRQ 0 сообщает драйверу, что для последовательного порта не установлено прерывание, поэтому ему (драйверу) надо использовать методы опроса (polling). Естественно, это приводит к дополнительной нагрузке ЦП, но опрос имеет смысл использовать при конфликте прерываний или неправильной их настройке. Вам не надо знать, какое прерывание установлено в регистрах порта, -- можно просто задать IRQ 0. Тем не менее, его стоит рассматривать только как временное средство, пока не будет найдено подходящее незанятое прерывание.
Разделение прерываний, ядра 2.2+
Разделение прерываний -- это использование двумя устройствами одного и того же IRQ. На шине ISA разделения прерываний не было. На шине PCI прерывания можно разделять, но нельзя использовать одно и то же IRQ на шинах ISA и PCI одновременно. Многие многопортовые платы позволяют разделять IRQ. Разделение прерываний не эффективно, т.к. для каждого разделяемого прерывания надо определять устройство-источник. Поэтому очень желательно каждому устройству назначать свое собственное прерывание.
До ядер 2.2 последовательные порты не могли использовать разделение прерываний, за исключением многопортовых плат. Начиная с ядра 2.2, IRQ могут разделяться между последовательными портами. Чтобы разделение прерываний заработало, надо при компиляции ядра включить опцию CONFIG_SERIAL_SHARE_IRQ. Помимо этого надо, чтобы сами последовательные порты поддерживали разделение (если два последовательных порта выдают различные напряжения на одну линию прерывания, то восприниматься будет только одно из них, означающее "это прерывание"). Любая PCI-карта должна поддерживать разделение прерываний, т.к. это является требованием спецификации шины PCI.
Какие IRQ выбрать?
Выбор IRQ для последовательных портов небольшой. Обычно ttyS0
и ttyS2
находятся на IRQ 4, а
ttyS1
и ttyS3
-- на IRQ 3. В /proc/interrupts
показываются все IRQ, используемые в данный момент программами.
Возможно, Вы захотите использовать другие. Прежде, чем IRQ 5 стало
использоваться для звуковых карт, оно часто использовалось для
последовательных портов.
Ниже представлен файл /etc/rc.d/rc.serial с настройками Грега (первого автора Serial-HOWTO). rc.serial -- это файл (скрипт), выполняемый при загрузке (он может иметь другое имя и месторасположение). Для setserial версий после 2.15 он должен выглядеть по-другому. В данном случае он приведен как пример выбора IRQ.
/sbin/setserial /dev/ttyS0 irq 3 # моя мышь
/sbin/setserial /dev/ttyS1 irq 4 # мой терминал Wyse
/sbin/setserial /dev/ttyS2 irq 5 # мой модем Zoom
/sbin/setserial /dev/ttyS3 irq 9 # мой модем USR
Стандартные IRQ:
IRQ 0 Системный таймер (Может означать "без прерывания". См. выше.)
IRQ 1 Клавиатура
IRQ 2 Для 2-го контроллера (при каскадировании)
IRQ 3 Последовательный порт 2
IRQ 4 Последовательный порт 1
IRQ 5 Параллельный порт 2, звуковая карта
IRQ 6 Контроллер флоппи-дисковода
IRQ 7 Параллельный порт 1
IRQ 8 Часы реального времени
IRQ 9 Перенаправлено на IRQ2
IRQ 10 не назначено
IRQ 11 не назначено
IRQ 12 не назначено
IRQ 13 Математический сопроцессор
IRQ 14 Контроллер жесткого диска 1
IRQ 15 Контроллер жесткого диска 2
Единого на все случаи правила выбора прерываний не существует. Попытайтесь найти прерывание, не занятое материнской или какой-нибудь другой платой. Им может быть 2-е, 3-е, 4-е, 5-е, 7-е, 10-е, 11-е, 12-е или 15-е. IRQ 2 и IRQ 9 взаимозаменяемы: Вы можете вызвать или 2-е прерывание, или 9-е -- драйвер разберется. Очень старые платы последовательных портов не могут использовать IRQ 8 и выше.
Убедитесь, что Вы не используете IRQ 1, 6, 8, 13 или 14! Они
используются материнской платой, и она будет очень недовольна тем, что
забирают ее IRQ (материнская, все-таки :) -- добавл. перев.). Закончив,
перепроверьте в /proc/interrupts
, что прерывания, используемые запущенными программами, не конфликтуют.
6.9 Выбор адресов. Конфликт видеокарты и ttyS3
С некоторыми старыми картами последовательных портов
существует проблема. Адрес IO видеокарты IBM 8514 (и других ей
подобных) равен, как утверждается, 0x?2e8, где ? -- 2, 4, 8 или 9,
и он может конфликтовать с адресом IO ttyS3
, равным
0x02e8. Вроде бы этого не должно быть, т.к. адреса различаются старшим
разрядом (первый 0 в 02e8). Все так, но электроника старых карт
может игнорировать старший разряд и отвечать на любой адрес,
заканчивающийся на 2e8. Все это актуально для ttyS3
на шине ISA.
Для шины ISA по возможности следует использовать стандартные значения адресов, приведенные ниже. PCI-карты используют другие адреса во избежание конфликтования с адресами ISA. Адреса, показанные ниже, представляют собой первые адреса 8-байтовых диапазонов. Так, 3f8 представляет на самом деле диапазон 3f8-3ff. Каждому последовательному устройству (впрочем, как и любому другому устройству, использующему адреса IO) требуется свой уникальный адресный диапазон. Пересечений диапазонов (конфликтов) быть не должно. Стандартные адреса для используемых последовательных портов на шине ISA следующие:
адрес ttyS0 0x3f8
адрес ttyS1 0x2f8
адрес ttyS2 0x3e8
адрес ttyS3 0x2e8
На старых ядрах иногда случается конфликт адресов (узнать можно от setserial -g
/dev/ttyS*
)
между существующим и несуществующим (показывается как UART:
unknown) последовательными портами, который не должен приводить к
проблемам. Чтобы данного конфликта не возникало, удалите
/dev/ttySx несуществующего порта или поправьте его адрес.
6.10 Установка адреса IO и IRQ в последовательный порт (в основном для PnP)
После записи параметров в последовательный порт не забудьте проверить, что эти же параметры передаются через setserial
драйверу.
Для последовательных портов не-PnP адрес IO и IRQ устанавливаются либо
перемычками, либо с помощью DOS-программы. Оставшаяся часть данного
раздела касается только последовательных портов PnP. Возможные способы
настройки последовательных портов PnP следующие:
- через меню настроек CMOS PnP BIOS (обычно только для внешних модемов на ttyS0 (COM1) и ttyS1 (COM2))
- автоматическая настройка последовательных портов PnP BIOS. См. Настройка IO-IRQ, производимая PnP BIOS
- автоматическое распознавание Вашей карты драйвером
- настройка последовательных портов PnP, расположенных не на шине PCI, посредством
isapnp
- использование setpci (pciutils или pcitools) для настройки PCI-портов
Т.к. адрес IO и IRQ не сохраняются в PnP-портах при выключении питания, надо чтобы PnP каждый раз при включении ПК записывал их значения в конфигурационные регистры. Если задать в настройках BIOS, что у Вас нет ОС с PnP, то PnP BIOS будет автоматически устанавливать эти значения при загрузке. С Windows (являющейся ОС с PnP) в данном случае могут возникнуть проблемы, потому как BIOS будет считать, что Windows не является ОС с PnP. Подробнее см. в Plug-and-Play-HOWTO.
Plug-and-Play (PnP) был создан для облегчения выполнения низкоуровневых настроек io-irq, их автоматизации, но в Linux с ним поначалу возникало много сложностей. В современном Linux (ядра версий 2.4, частично в ядрах 2.2) у каждого драйвера есть свой собственный PnP. Увы, централизованного распределения адресов IO и номеров IRQ, как в MS Windows, в Linux нет, но тем не менее PnP в Linux справляется со своими задачами в большинстве случаев хорошо.
Настройка IO-IRQ, производимая PnP BIOS
Не все PnP BIOS могут производить настройку io-irq. Настройка первых двух последовательных портов осуществляется через меню CMOS BIOS. В "Award" BIOS она находится в разделе "chipset features setup" (настройка чипсета; а у меня в "integrated peripherals" -- прим. перев.). Число предлагаемых вариантов, как правило, небольшое. Первые два последовательных порта ISA получают обычно стандартные адреса IO и IRQ. См. Подробнее о названиях последовательных портов
Независимо от Вашего желания PnP BIOS при включении ПК выполняет настройку io-irq всех устройств. Он может выполнить ее частично, оставив ее завершение ОС с PnP (к которым в некоторой мере относится Linux), или полностью настроить все PnP-устройства, если ему сообщить, что ОС с PnP у Вас нет. Драйверы BIOS не настраивает!
Если сообщить BIOS, что у Вас нет ОС с PnP, то PnP BIOS должен выполнить настройку всех последовательных портов PnP, не только первых двух. Подправить настройки, произведенные BIOS, можно под Windows (если у Вас есть Windows на этом же ПК). Информация об этом есть в Plug-and-Play-HOWTO. В меню BIOS может быть пункт, позволяющий запретить такое вмешательство.
При добавлении нового PnP-устройства PnP BIOS должен его настроить. При этом он может изменить значения io-irq существующих устройств, если потребуется для избежания конфликтов. BIOS не меняет настроенные io-irq устройств, не поддерживающих PnP. С помощью DOS/Windows-программы ICU можно указать BIOS на такие устройства и настроить их.
Для настройки драйверов надо знать, какие установки сделал BIOS. BIOS сам предоставляет некоторую информацию: в своих меню или в сообщениях, выводимых на экран при включении компьютера. См. Какие адрес IO и IRQ "зашиты" в мой последовательный порт? Также можно запустить lspci, чтобы узнать об устройствах на шине PCI, или isapnp --dumpregs, чтобу узнать об ISA-устройствах. Для новичка результаты их выполнения могут показаться тайнописью (обращайтесь к Знатокам! ;) -- совет перев.).
6.11 Передача IRQ и адреса IO setserial
Установив IRQ и адрес IO в последовательный порт (или предоставив сделать это PnP), проверьте, правильно ли настроен "setserial" и настроен ли его запуск при загрузке Linux. См. Настройка во время загрузки
Следующий Предыдущий Содержание