Chapter 15. Коммуникационные адаптеры

В этом разделе освещены вопросы о работе последовательных адаптеров во FreeBSD. Протоколы PPP и SLIP рассматриваются в разделе, посвящённом Chapter 12.

15.1. Как узнать, какие последовательные порты были обнаружены FreeBSD?
15.2. Как узнать, какие внутренние модемы были обнаружены FreeBSD?
15.3. Я только что поставил 2.0.5 и не нашёл устройств tty0X!
15.4. Как осуществляется доступ к последовательным портам во FreeBSD?
15.5. Как включить поддержку многопортовых последовательных адаптеров?
15.6. Может ли FreeBSD использовать несколько многопортовых адаптеров с одинаковым irq?
15.7. Можно ли установить режим работы по умолчанию для порта?
15.8. Как сделать вход через модем?
15.9. Как подключить терминал к FreeBSD?
15.10. Почему не удаётся запустить tip или cu?
15.11. Мой модем Hayes не поддерживается---что можно сделать?
15.12. Как я должен ввести эти AT-команды?
15.13. Знак <@> для описания характеристики pn не работает!
15.14. Как набрать телефонный номер из командной строки?
15.15. Нужно ли при этом каждый раз задавать скорость работы с портом?
15.16. Мне нужно иметь доступ к нескольких хостам через терминальный сервер.
15.17. Может ли tip использовать несколько телефонов для одного сайта?
15.18. Почему нужно нажимать CTRL+P дважды для посылки одного этого символа?
15.19. Неожиданно всё стало набираться ЗАГЛАВНЫМИ БУКВАМИ?
15.20. Как можно передавать файлы с помощью программы tip?
15.21. Как использовать zmodem вместе с tip?
15.22. FreeBSD не распознаёт последовательные порты на моей машине, хотя все настройки верны.

15.1. Как узнать, какие последовательные порты были обнаружены FreeBSD?

При загрузке ядра FreeBSD оно будет пытаться найти последовательные порты, с поддержкой которых было откомпилировано. Вы можете повнимательней присмотреться к выдаваемым сообщениям либо выполнить команду

    % dmesg | grep sio

после загрузки и запуска системы.

Вот пример вывода указанной команды:

    sio0 at 0x3f8-0x3ff irq 4 on isa
    sio0: type 16550A
    sio1 at 0x2f8-0x2ff irq 3 on isa
    sio1: type 16550A

Здесь присутствуют два последовательных порта. Первый использует irq 4, порт ввода/вывода 0x3f8 и построен на микросхеме UART типа 16550A. Второй использует тот же тип микросхемы, но использует irq 3 и адрес порта ввода/вывода 0x2f8. Внутренние модемы выглядят точно также, как последовательные порты, за исключением того, что к модем ним "подключен" всегда.

В ядро GENERIC встроена поддержка двух последовательных портов, с irq и адресами портов ввода/вывода, как в примере выше. Если эти настройки не соответствуют вашим, или если вы добавили внутренние модемы, или у вас больше последовательных портов, чем описано в ядре, просто переконфигурируйте ядро. За дополнительной информацией обратитесь к разделу о построении ядра.

15.2. Как узнать, какие внутренние модемы были обнаружены FreeBSD?

Посмотрите ответ на предыдущий вопрос.

15.3. Я только что поставил 2.0.5 и не нашёл устройств tty0X!

Не волнуйтесь, просто они были объединены с устройствами ttydX. Вам придётся подправить конфигурационные файлы, которые вы раньше использовали.

15.4. Как осуществляется доступ к последовательным портам во FreeBSD?

Третий последовательный порт, sio2 (посмотрите справку по sio(4)), который в DOS называется COM3), обозначается как /dev/cuaa2 для устройств, выполняющих исходящие звонки, и /dev/ttyd2 для устройств, принимающих входящие звонки. Какая разница между этими двумя классами устройств?

Вы должны использовать ttydX для входящих соединений. При открытии /dev/ttydX в блокирующем режиме, процесс будет ожидать неактивности соответствующего устройства cuaaX, а затем появления сигнала о наличии несущей. При открытии устройства cuaaX, он проверяет, что последовательный порт не используется уже устройством ttydX. Если порт доступен, он "похищает" его у устройства ttydX. Также устройство cuaXX не следит за наличием несущей. С такой схемой работы и модемом, находящимся в режиме автоответа, вы можете позволить пользователям входить в систему и в то же время можете осуществлять исходящие звонки, а система позаботится о возможных конфликтах.

15.5. Как включить поддержку многопортовых последовательных адаптеров?

Повторим ещё раз: информация о конфигурировании ядра содержится в разделе, посвящённом этому вопросу. Для многопортовых последовательных адаптеров в файле конфигурации ядра поместите ключевое слово sio(4) для каждого порта на адаптере. Но irq и вектор должен быть указан только у одного порта. Все порты на адаптере должны использовать одно и то же irq. Используйте последний последовательный порт для указания irq. Также включите опцию COM_MULTIPORT.

В следующем примере дано описание 4-портового адаптер AST на irq 7:

    options "COM_MULTIPORT"
    device sio4 at isa? port 0x2a0 tty flags 0x781
    device sio5 at isa? port 0x2a8 tty flags 0x781
    device sio6 at isa? port 0x2b0 tty flags 0x781
    device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr

Флаги указывают, что управляющий порт имеет младший номер устройства 7 (0x700), включена диагностика на время обнаружения (0x080), и все порты используют одно и то же irq (0x001).

15.6. Может ли FreeBSD использовать несколько многопортовых адаптеров с одинаковым irq?

Пока нет. Вы должны назначить уникальный irq для каждого адаптера.

15.7. Можно ли установить режим работы по умолчанию для порта?

Вашему приложению может понадобиться открыть устройства ttydX (или cuaaX). Когда процесс открывает устройство, оно имеет набор параметров ввода/вывода. Вы можете посмотреть их значения командой

    # stty -a -f /dev/ttyd1

Когда вы меняете настройки этого устройства, они действуют вплоть до закрытия устройства. При повторном открытии оно будут иметь режимы работы по умолчанию. Чтобы изменить значения режимов работы по умолчанию, вы можете открыть и изменить настройки в устройстве "начального состояния". Например, чтобы сделать режимом по умолчанию режим CLOCAL, 8 бит, и управление потоком XON/XOFF для устройства ttyd5, сделайте следующее:

    # stty -f /dev/ttyid5 clocal cs8 ixon ixoff

Для выполнения таких действий предназначен скрипт /etc/rc.serial. Теперь при открытии устройства ttyd5 приложение будет иметь именно такой режим работы с портом. Оно, однако. может изменить эти режимы по своему усмотрению.

Вы можете запретить изменение приложением некоторых режимов работы, выполнив настройки устройства "постоянного состояния". Например, чтобы сделать скорость работы ttyd5 постоянной и равной 57600 bps, выполните

    # stty -f /dev/ttyld5 57600

Теперь, если приложение откроет ttyd5 и попытается изменить скорость работы порта, она всё равно останется равной 57600 bps.

Естественно, вы должны сделать устройства начального и постоянного состояний доступными на запись только пользователю root. Скрипт MAKEDEV(8) при создании файлов устройств этого НЕ делает.

15.8. Как сделать вход через модем?

Похоже, что вы хотите стать Internet-провайдером, да? Сначала вам необходимо подключить к системе один или несколько модемов, которые могут работать в режиме автоответа. Модем должен держать сигнал наличия несущей, только когда она присутствует. Он должен вешать трубку и переинициализировать, когда сигнал готовности устройства DTE (DTR) меняет состояние из включенного на выключенный. Должно использоваться аппаратное (RTS/CTS) управление потоком или вовсе отсутствовать. Ещё он должен работать на постоянной скорости с портом компьютера, но (что удобно для звонящих) с согласованием скорости передачи с другим модемом.

Для большинства модемов, поддерживающих набор команд Hayes, следующая последовательность команд выполнит эти настройки и сохранит их в энергонезависимой памяти:

    AT &C1 &D3 &K3 &Q6 S0=1 &W

Информация о том, как сделать эти настройки без обращения к терминальным программам MS-DOS, содержится в разделе о посылке AT-команд.

Затем опишите модем в файле /etc/ttys (посмотрите справку по ttys(5)). В нём перечислены все порты, с которых операционная система ожидает входа пользователей. Добавьте строку, которая выглядит как эта:

    ttyd1 "/usr/libexec/getty std.57600" dialup on insecure

В этой строке указано, что ко второму последовательному порту (/dev/ttyd1) подключен модем на скорости 57600 bps без контроля по чётности (std.57600, что берётся из файла /etc/gettytab (посмотрите справку по gettytab(5)). Тип терминала для этого порта определён как dialup. Порт включен (on) и небезопасен (insecure), что означает, что попытки войти в систему пользователем root с этого порта будут отвергнуты. Для портов, обслуживающих входящие звонки, как этот, используйте устройства вида ttydX.

Использование слова dialup в качестве имени терминала является обычной практикой. Многие пользователи включают в свои файлы .profile или .login скрипты для задания реального типа терминала, если начальным является тип dialup. В примере порт описан небезопасным. Чтобы войти пользователем root на этом порту, вам нужно сначала войти обычным пользователем, а затем командой su(1) стать пользователем root. Если порт имеет атрибут secure, то пользователь root может входить с этого порта непосредственно.

После редактирования файла /etc/ttys вам нужно послать сигнал потери связи или HUP процессу init(8):

    # kill -HUP 1

Это заставит процесс init(8) снова прочитать файл /etc/ttys. Процесс init запустит процессы getty для всех портов с характеристикой on. Вы можете проверить, доступны ли входы с конкретного порта, выполнив команду

    % ps -ax | grep '[t]tyd1'

Вы должны увидеть нечто вроде следующего:

    747 ??  I      0:00.04 /usr/libexec/getty std.57600 ttyd1

15.9. Как подключить терминал к FreeBSD?

Если вы собираетесь использовать другой компьютер в качестве терминала для FreeBSD, соедините их последовательные порты нуль-модемным кабелем. Если у вас есть терминал, обратитесь к его документации.

Затем модифицируйте файл /etc/ttys (посмотрите справку по ttys(5)) описанным выше способом. Например, если вы подключаете терминал WYSE-50 к пятому последовательному порту, используйте такую строчку:

    ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure

В этом примере описан порт на /dev/ttyd4, имеющий терминал wyse50, подключенный на скорости 34800 bps без контроля по четности (std.38400 из файла /etc/gettytab, информацию о котором можно получить из справки по gettytab(5)) и разрешён непосредственный вход пользователя root (secure).

15.10. Почему не удаётся запустить tip или cu?

Скорее всего, в вашей системе запуск программ tip(1) и cu(1) разрешён только пользователю uucp и членам группы dialer. Вы можете использовать группу dialer для управления доступом к вашему модему или удалённым системам. Достаточно добавить пользователя в группу dialer.

Вы можете разрешить всем пользователям вашей системы запускать tip(1) и cu(1), выполнив команды:

    # chmod 4511 /usr/bin/cu
    # chmod 4511 /usr/bin/tip

15.11. Мой модем Hayes не поддерживается---что можно сделать?

На самом деле страница Справочника о программе tip(1) устарела. Модемы Hayes поддерживаются системой. Просто добавьте at=hayes в ваш файл /etc/remote (посмотрите справку по remote(5)).

Драйвер модемов Hayes не достаточно умён, чтобы поддерживать некоторые из новых возможностей современных модемов---сообщения типа BUSY, NO DIALTONE или CONNECT 115200 будут приводить его в замешательство. Вы должны выключить вывод таких сообщений при использовании программы tip(1) (командой ATX0&W).

Кроме того, значение таймаута по умолчанию для программы tip(1) равен 60 секундам. Ваш модем должен использовать меньшее значение, иначе tip будет думать, что у вас проблемы со связью. Попробуйте ATS7=45&W.

На самом деле tip в том виде, каком поставляется, не поддерживает модемы Hayes полностью. Решением является редактирование файла tipconf.h в каталоге /usr/src/usr.bin/tip/tip. Чтобы это сделать, вам нужен дистрибутив исходных текстов системы.

Замените строку #define HAYES 0 на #define HAYES 1. Затем выполните команды make и make install. После этих действий всё работает замечательно.

15.12. Как я должен ввести эти AT-команды?

Создайте так называемое "прямое" описание в вашем файле /etc/remote (посмотрите справку по remote(5)). Например, если ваш модем подключен к первому последовательному порту, /dev/cuaa0, сделайте такую строку:

    cuaa0:dv=/dev/cuaa0:br#19200:pa=none

Укажите максимальную скорость обмена с портом, поддерживаемую модемом в параметре br. Затем выполните команду tip cuaa0 (обратитесь к справке по tip(1)) и вы подключитесь к модему.

Если в вашей системе нет устройства /dev/cuaa0, сделайте следующее:

    # cd /dev
    # sh MAKEDEV cuaa0

Или используйте cu, войдя администратором, с такими параметрами:

    # cu -lline -sspeed

где line - это имя последовательного порта (например, /dev/cuaa0), а speed - скорость работы модема с портом (например, 57600). После ввода AT-команд, наберите ~. для завершения работы.

15.13. Знак <@> для описания характеристики pn не работает!

Знак <@> в характеристике, описывающей номер телефона, указывает программе tip обратиться к файлу /etc/phones для поиска телефонного номера. Однако знак <@> является также и специальным символом в файлах описания характеристик типа /etc/remote. Экранируйте его символом обратного слэша:

    pn=\@

15.14. Как набрать телефонный номер из командной строки?

Поместите так называемое "общее" описание в ваш файл /etc/remote (посмотрите справку по remote(5)). Например:

    tip115200|Dial any phone number at 115200 bps:\
           :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du:
    tip57600|Dial any phone number at 57600 bps:\
           :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:

Тогда вы сможете выполнять команды вроде tip -115200 5551234. Если предпочитаете программу cu(1), а не tip(1), используйте общее описание для cu:

    cu115200|Use cu to dial any number at 115200bps:\
            :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:

и выполняйте команду cu 5551234 -s 115200.

15.15. Нужно ли при этом каждый раз задавать скорость работы с портом?

Создайте описание для tip1200 или cu1200, но не останавливайтесь на этом и используйте подходящую скорость при задании характеристики br. tip(1) полагает, что хорошим значением по умолчанию является 1200 bps, поэтому он использует описание для tip1200. Однако вас никто не заставляет использовать именно эту скорость.

15.16. Мне нужно иметь доступ к нескольких хостам через терминальный сервер.

Вместо того, чтобы каждый раз ожидать подключения к терминальному серверу, а затем набирать команду CONNECT host, используйте характеристику cm программы tip. Например, вот такое описание в файле /etc/remote (обратитесь к справке по remote(5)):

    pain|pain.deep13.com|Forrester's machine:\
           :cm=CONNECT pain\n:tc=deep13:
    muffin|muffin.deep13.com|Frank's machine:\
           :cm=CONNECT muffin\n:tc=deep13:
    deep13:Gizmonics Institute terminal server:\
           :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234:

позволит вам просто набирать tip pain или tip muffin для подключения к хостам pain или muffin и tip deep13 для доступа к терминальному серверу.

15.17. Может ли tip использовать несколько телефонов для одного сайта?

Эта проблема возникает, когда в университете есть пара модемных входов и несколько тысяч студентов, пытающихся ими воспользоваться...

Создайте описание для вашего университета в файле /etc/remote (посмотрите справку по remote(5)) и используйте <\@> при задании характеристики pn:

    big-university:\
           :pn=\@:tc=dialout
    dialout:\
           :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:

После этого пропишите номера телефонов университета в файле /etc/phones (посмотрите справку по phones(5)):

    big-university 5551111
    big-university 5551112
    big-university 5551113
    big-university 5551114

tip(1) будет пытаться воспользоваться всеми телефонными номерами в указанном порядке, прежде чем завершить работу. Если вы хотите, чтобы попытки были продолжены, запустите tip(1) в цикле while.

15.18. Почему нужно нажимать CTRL+P дважды для посылки одного этого символа?

По умолчанию CTRL+P является специальным символом "принудительного ввода", используемым для указания программе tip(1), что следующий символ является байтом данных. Вы можете назначить функцию символа принудительного ввода любому другому символу с помощью команды ~s, которая предназначена для "установки значений переменных".

Наберите ~sforce=single-char'' с начала новой строки. Здесь под single-char имеется в виду любой одиночный символ. Если вы не зададите single-char, то символом принудительного ввода будет нулевой символ, который можно получить, набрав CTRL+2 или CTRL+SPACE. Подходящим значением для single-char может быть SHIFT+CTRL+6, который используется только некоторыми терминальными серверами.

Вы можете задать любое значение для символа принудительного ввода, указав его в вашем файле $HOME/.tiprc:

    force=single-char

15.19. Неожиданно всё стало набираться ЗАГЛАВНЫМИ БУКВАМИ?

Должно быть, вы нажали CTRL+A, символ "перехода в верхний регистр" программы tip(1), специально предназначенный для тех, у кого не работает клавиша caps-lock. Используйте команду ~s, как это было сделано выше, и установите значение переменной "raisechar" во что-нибудь подходящее. В действительности вы можете установить его равным символу принудительного ввода, если не собираетесь пользоваться этими особенностями.

Следующий пример файла .tiprc должен понравиться пользователям редактора Emacs, которым часто приходится нажимать CTRL+2 и CTRL+A:

    force=^^
    raisechar=^^

Здесь ^^ обозначает SHIFT+CTRL+6.

15.20. Как можно передавать файлы с помощью программы tip?

Если вы соединились с другой Unix-системой, вы можете посылать и принимать файлы командами ~p (передача) и ~t (приём). Эти команды запускают программы cat(1) и echo(1) на удалённой системе, чтобы принять и послать файлы. Синтаксис вызова имеет такой вид:

    ~p <local-file> [<remote-file>]
    ~t <remote-file> [<local-file>]

Контроль ошибок передачи при этом не осуществляется, так что вам может понадобиться другой протокол передачи, например, zmodem.

15.21. Как использовать zmodem вместе с tip?

Первым делом установите одну из программ, реализующих протокол zmodem из коллекции портов (там есть парочка в категории comms, lrzsz и rzsz).

Для приёма файлов запустите программу передачи на противоположной стороне. Затем нажмите enter и наберите ~C rz (или ~C lrz, если у вас установлен lrzsz) для начала приёма их на локальную машину.

Для посылки файлов, запустите программу приёма на противоположной стороне. Затем нажмите enter и наберите ~C sz files (или ~C lsz files) для посылки файлов на удалённую систему.

15.22. FreeBSD не распознаёт последовательные порты на моей машине, хотя все настройки верны.

Микросхемы UART производства Acer на материнских платах и адаптерах распознаются некорректно. Для решения этой проблемы попробуйте воспользоваться патчем с сервера www.lemis.com.