Библиотека сайта rus-linux.net
9. Последовательные порты /dev/ttyS4 (или /dev/ttys/4) и др.
9.1 Названия последовательных портов: ttyS4, tts/2 и т.д.
Раньше последовательные порты за исключением нескольких многопортовых карт назывались просто: /dev/ttyS0, /dev/ttyS1 и т.д. С появлением в 2000-м году шины USB добавились названия вроде /dev/ttyUSB0 и /dev/ttyACM1 (для модемов ACM, подключаемых к шине USB).
9.2 Шина PCI
Поскольку DOS предусматривала 4 последовательных порта на старой шине ISA: COM1-COM4, ttyS0-ttyS3, в обозначениях последовательных портов более новой шины PCI использовались числа, начиная с 4-го (ttyS4) или 14-го (ttyS14, до ядра версии 2.6.13). Но т.к. большое количество ПК поставляется только с одним или двумя последовательными портами, ttyS0 и возможно ttyS1 (второй порт), то с версии ядра 2.6.15 шине PCI позволили использовать ttyS2. Все это позволяет иметь на одном ПК последовательные порты и шины ISA, и шины PCI без противоречий в наименованиях: 0-1 (или 0-3) предназначены для старой шины ISA (или более новой шины LPC), а числа от 2-х (4-х или 14-ти) и выше -- для шины PCI. В редких случаях из этого правила могут быть исключения. Последовательные порты материнских плат в основном либо по-прежнему остаются ISA-портами (может использоваться внутренняя шина ISA), либо подключаются к шине LPC, специально предназначенной для существующих медленных устройств ввода/вывода: последовательных/параллельных портов и флоппи-дисководов.
9.3 Наименования и номера последовательных портов
Устройства в Linux имеют старшие и младшие (major и minor) номера. У последовательного порта ttySx (x=0,1,2 и т.д.) старший номер равняется 4. Убедиться в этом (а также увидеть младшие номера) можно, выполнив команду "ls -l ttyS*" в каталоге /dev. Наименования для различных устройств можно найти в документации ядра, в файле "devices".
Раньше для каждого последовательного порта существовали устройства с названием "cua", работающие немного иначе. Так, cua2 соответствовало ttyS2. Старшим номером устройств cua была 5, а младшие номера начинались с 64. Файлы устройств cua и сейчас могут присутствовать в каталоге /dev. В настоящее время они исключены из употребления. См. ниже раздел "Устройство cua, устаревшее".
Создание файлов в каталоге устройств рассмотрено в разделе Serial-HOWTO "Creating Devices In the /dev directory" ("Создание устройств в каталоге /dev").
9.4 Подробнее о названиях последовательных портов
В Dos/Windows названия последовательных портов начинаются с COM, драйвер последовательного порта Linux использует ttyS00, ttyS01 и т.д. Более ранние версии драйвера (2001 ?) использовали просто tty00, tty01 и т.д.
В приведенной таблице показаны примеры названий последовательных устройств. Адреса IO -- значения по умолчанию для старой шины ISA (для более новых шин PCI и USB значения другие).
название название номера адреса || USB-шина ( ACM => модем ACM )
DOS Linux старший младший IO ||
COM1 /dev/ttyS0 4, 64; 3F8 || /dev/ttyUSB0 | /dev/ttyACM0
COM2 /dev/ttyS1 4, 65; 2F8 || /dev/ttyUSB1 | /dev/ttyACM1
COM3 /dev/ttyS2 4, 66; 3E8 || /dev/ttyUSB2 | /dev/ttyACM2
COM4 /dev/ttyS3 4, 67; 2E8 || /dev/ttyUSB3 | /dev/ttyACM3
- /dev/ttyS4 4, 68; различные
9.5 Последовательные порты USB
См. файлы usb-serial, acm и т.д. в подкаталоге usb каталога с документацией ядра.
9.6 Ссылка /dev/modem на ttySN
При установке некоторых дистрибутивов создается два дополнительных устройства: /dev/modem
для Вашего модема и /dev/mouse
для мышки. Оба представляют собой символические ссылки на соответствующие устройства в /dev
.
Историческая справка: ранее (в 1990-х) использование /dev/modem
(как ссылки на последовательный порт модема) вызывало проблемы,
поскольку система блокировки файлов не могла распознать за ним /dev/ttyS2
,
к примеру. Новая система блокировки с этим справляется, поэтому на
сегодняшний день ничто не мешает использованию таких ссылок.
9.7 Devfs (улучшенная, но тем не менее устаревшая файловая система устройств)
Одним из нововведений, пришедших с ядром 2.4, стала теперь уже устаревшая "файловая система устройств" (devfs) с целым набором новых названий для всего. В 2003-4 было заявлено, что devfs имеет неразрешимые проблемы, и с выходом ядра 2.6.12 она была заменена "udev" (ядра до версии 2.6.12 также могли работать с udev, но имелись некоторые проблемы).Хотя udev не предоставляет всей функциональности devfs, горячее подключение он поддерживает. Linux может работать и без udev, поэтому некоторые пользователи обходятся без нее. Тем не менее, она входит в состав большого числа дистрибутивов.
Devfs представляла собой хорошую идею и по заявлениям являлась более эффективной, нежели udev. К сожалению, автор ее не поддерживал длительное время, забросил, и к настоящему -- хорошо это или плохо -- ее место заняла udev. Но дискуссии вокруг devfs и udev продолжаются. Подробное описание devfs представлено на странице: http://www.atnf.csiro.au/~rgooch/linux/docs/devfs.html. Информация о ней есть и в документации ядра: filesystems/devfs.
Названия devfs для устройств могут использоваться и в udev, но настройка этой возможности может показаться непростой, поэтому обычно ею не пользуются. Примеры названий devfs для последовательных устройств: ttyS1 соответствует tts/1, ttyUSB1 -- /usb/tts/1, а ttyACM1 -- /usb/acm/1. Цифра 1 в указанных примерах может быть заменена на 0, 2, 3, 4 и т.д. В udev названия следующие: ttyS2 соответствует tts/2 (последовательный порт), tty3 -- vc/3 (Virtual Console -- виртуальная консоль), ttyp1 -- pty/m1 (PTY master -- псевдотерминал, ведущий), ttyp2 -- pty/s2 (PTY slave -- псевдотерминал, ведомый). "tts" выглядит как каталог, содержащий "файлы" устройств: 0, 1, 2 и т.д. Все эти каталоги с новыми именами тоже располагаются в каталоге /dev, но по желанию их можно перенести куда-нибудь.
В devfs устройства в каталоге /dev создаются автоматически драйверами. Т.е., если поддержка последовательных устройств осуществляется модулем ядра и он еще не загружен, то в каталоге /dev не будет ни одного последовательного устройства. Это может показаться странным: последовательные порты физически есть, а в каталоге /dev их не видно. Так и задумано: если программа обращается по заданному ей названию к устройству, а модуль его поддержки не загружен, то предполагается, что ядро попытается найти драйвер для него и создать в каталоге /dev его "файл".
Если драйвер находится, то все работает замечательно. А если нет... К примеру, если Вы захотите настроить через setserial порт, который драйвер не смог обнаружить, то система сообщит, что такого порта нет. Как в этом случае создать в devfs порт?
Что касается многопортовых устройств, то /dev/ttyF9, к примеру, соответствует /dev/ttf/9, в более поздних версиях /dev/tts/F9. Вместо F (или f) могут быть другие буквы в зависимости от того, какая у Вас карта. Драйвер многопортовой карты должен создать в каталоге /dev "файлы" с названиями devfs, подобными приведенному.
9.8 Устройства cua (устаревшие)
Для каждого устройства ttyS есть соответствующее устройство cua. Но использовать cua надо только в случае необходимости (поскольку в настоящее время они исключены из использования). Между cua и ttyS есть различие, но смышленный (savvy) программист может заставить порт ttyS работать как порт cua, так что надобность в cua вообще отпадает. За исключением некоторых старых программ, которым требуется именно cua-устройство.
Основное различие между cua и ttyS проявляется при открытии порта обычной командой "open" Си-программы: порт cua откроется независимо от состояния сигнала CD. Добавлением нескольких строк в программу можно и ttyS-порт заставить открываться без оглядки на CD. Из-за того, что открытие порта cua программируется проще, то cua использовались раньшедля передачи данных через модем, а ttyS -- для приема данных.
Начиная с версии ядра 2.2, при обращении к cua в лог ядра пишется предупреждение. Это свидетельствует о том, что устройства cua считаются "вымершими".
Следующий Предыдущий Содержание