НАЗВА

setserial - отримати або встановити параметри послідовного порту Linux

СТИСЛИЙ ОГЛЯД

setserial [ -abqvVWz ] пристрій [ параметр [ аргумент ] ] ...

setserial -g [ -abGv ] пристрій ...

ОПИС

setserial являється програмою встановлення або звітування конфігурації послідовного порту. До конфігурації входять порт вводу-виводу (I/O, input/output), переривання (IRQ, interrupt request), яке використовується окремим послідовним портом і чи розглядати клавішу переривання як безпечний сигнал уваги (Secure Attention Key) і.т.д.

Під час звичайного завантаження, тільки порти COM від 1 до 4 будуть ініційовані, використовуючи стандартні порти вводу-виводу і значення IRQ, перечислені нижче. Для ініціалізації будь-яких додаткових послідовних портів або поміняти стандартні параметри COM-портів 1-4, вам слід використати setserial. Типово він викликається скриптом rc.serial, який в свою чергу запускається з /etc/rc.local.

Аргумент пристрою вказує який саме саме послідовний пристрій налагодити або запитати інформацію. Пристрій вказується у формі /dev/cua[0-3].

Якщо не вказано додаткових параметрів, setserial виведе інформацію про тип UART (Universal Asynchronous Receiver Transmitter) послідовного порту (тобто 8250, 16450, 16550, 16550A і.т.д), апаратний порт вводу-виводу і лінію переривання (IRQ), швидкість передавання у бодах і деякі додаткові прапорці оперування.

Якщо вказано опцію -g, аргументи setserial розглядаються як список пристроїв для видруку їхньої характеристики.

Без опції -g, перший аргумент setserial розглядається як пристрій для зміни налаштувань або виводу виводу інформації, і будь-які додаткові аргументи програми вважаються параметрами, призначеними для цього пристрою.

В більшості випадків для зміни налаштувань послідовного пристрою необхідно привілеї користувача root. Деякі параметри послідовного порту можуть бути встановлені звичайними користувачами, тим не менш, ми звернемо на них увагу.

ОПЦІЇ

setserial розуміє наступні опції:

-a : Під час доповіді про конфігурацію послідовного пристрою, вивести всю доступну інформацію.

-b : Під час доповіді про конфігурацію послідовного пристрою, вивести лише підсумок здобутої інформації. Це може бути використаним для виводу повідомлень під час завантаження системи, при виконанню скрипта(ів) /etc/rc.

-G : Виводить інформацію про конфігурацію послідовного порту у формі, придатній для вживання як аргумент на командному рядку для setserial.

-q : Малослівний режим. setserial виведе менше рядків.

-v : Багатослівний режим. setserial виведе додаткову інформацію статусу.

-V : Вивід версії програми.

-W : Здійснює загальну ініціалізацію переривань. Ця опція не є дійсною після ядер Linux 2.1 і вище.

-z : Обнулить будь-які послідовні прапорці перед встановленням нових. Ця опція пов'язана з опцією автоматичного збереження послідовних прапорців, використовуючи опцію -G.

ПАРАМЕТРИ

Наступні параметри можна призначити послідовному порту.

Всі значення аргументів вважаються десятковими, хіба були вжиті з передуючим "0x".

port номер_порту : Опція port встановлює порт вводу-виводу.

irq IRQ_номер : Встановлює номер апаратного переривання.

uart uart_тип : Ця опція використовується для встановлення типу UART. Дозволеними типами є none, 8250, 16450, 16550, 16550A, 16650, 16650V2, 16654, 16750, 16850, 16950 і 16954. Використання none внеможливлює порт.
Деякі внутрішні модеми стверджують, що мають тип "16550A UART з 1к буфером". Це не відповідає істині, вони в дійсності не сумісні з 16550A UART, натомість мають 16450 UART з 1k приймальним буфером для запобігання переповнювання приймача. Це важливо, оскільки вони не володіють передавальним FIFO. Автоматична конфігурація, ак правило, правильно визначає такі пристрої як 16450. Якщо ви спробуєте обійти цей параметр за допомогою uart, ви можете зіткнутися з відкинутими знаками під час передачі даних. Ці UART, часом мають додаткові вади, в таких випадках варто вживати skip_test.

autoconfig : Коли надано цей параметр, setserial попросить ядро спробувати автоматично конфігурувати послідовний порт. Порт вводу-виводу повинен бути наставлений правильно; ядро спробує визначити тип UART і, якщо додатково надано опцію auto_irq, Linux спробує автоматично визначити IRQ. Опція autoconfig повинна вживатись після того як було вказано port, auto_irq і skip_test.

auto_irq : Під час автоматично конфігурації, спробувати визначити IRQ. Ця можливість не гарантує завжди вірних результатів; деякі налагодження пристроїв можуть здурити ядро Linux. Як правило, безпечніше не вживати auto_irq можливість, натомість явно вказувати IRQ через опцію irg.

^auto_irq : Під час автоматичної конфігурації не намагатися автоматично визначити IRQ.

skip_test : Під час автоматичної конфігурації пропустити тестування UART. Деякі внутрішні модеми не включають сумісні з National Semiconductor типи UART, лише дешеві імітації передавача. Деякі з цих кумедних імітацій UART не мають цілковитої підтримки виявлення кільцевого режиму (loopback detection mode), використованого ядром для підтвердження, що дійсно існує передавач UART, прив'язаний до певної адреси, перед тим як конфігурувати прилад. Тож для деяких внутрішніх модемів вам необхідно буде використати цю опцію, щоб Linux зміг правильно ініціювати UART.

^skip_test : Під час автоматичної конфігурації не намагатися пропустити тестування UART.

baud_base бод-база : Ця опція встановлює базу частоти бод, що відповідає частоті годинника машини, поділеної на 16. Як правило, це значення дорівнює 115200, що одночасно являється найшвидшою частотою бод, яку передавачі UART підтримують.

spd_hi : Використовувати 57.6kb коли додаток вимагає 38.4kb. Ця опція може бути вказана звичайним користувачем.

spd_vhi : Використовувати 115kb коли додаток вимагає 38.4kb. Ця опція може бути вказана звичайним користувачем.

spd_shi : Використовувати 230kb коли додаток вимагає 38.4kb. Ця опція може бути вказана звичайним користувачем.

spd_warp : Використовувати 460kb коли додаток вимагає 38.4kb. Ця опція може бути вказана звичайним користувачем.

spd_cust : Використати власний дільник, вказаний як параметр опції divisor для встановлення швидкості, коли додаток вимагає 38.4kb. У цьому випадку, частота бод буде bod_base поділене на divisor. Ця опція може бути вказана звичайним користувачем.

spd_normal : Використовувати 38.4kb коли додаток вимагає 38.4kb. Ця опція може бути вказана звичайним користувачем.

divisor дільник : Ця опція вказує власний дільник, що використовується, якщо було вибрано опцію spd_cust і послідовний порт було встановлено до 38.4kb додатком. Ця опція може бути вказана звичайним користувачем.

sak : Встановити клавішу переривання для безпечного сигналу уваги (Secure Attention Key).

^sak : Внеможливлює безпечний сигнал уваги (Secure Attention Key).

fourport : Конфігурує порт як для картки AST Fourport.

^fourport : Внеможливлює AST Fourport конфігурацію.

close_delay пауза : Вказує проміжок часу у сотих долях секунди під час якого DTR (Data Terminal Ready) повинен залишатись опущеним на послідовній лінії після того як викликаючий пристрій завершив роботу і до того як блокований пристрій-відповідач підніме DTR знову. Значенням за замовчуванням для цієї опції є 50, тобто пів-секунди.

closing_wait пауза : Вкаже проміжок часу у сотих долях секунди, який ядро повинне зачекати для передачі даних через послідовний порт, до того як закрити його. Якщо вказано "none", не буде жодної затримки перед закриттям. Якщо вказано "infinite", ядро очікуватиме необмежену кількість часу на те, щоб дані, що знаходяться у буфері, були передані. Значенням за замовчуванням є 3000, або 30-секундна затримка. Це значення, як правило, є прийнятним для більшості пристроїв. Якщо встановити занадто велику перерву, послідовний порт може зависнути на довгий період у випадку обриву під'єднання і наявності даних у буфері. І навпаки, якщо занадто коротку - існує ризик втрати частини переданих даних. У випадку надзвичайно повільних пристроїв, варто збільшити значення closing_wait.

session_lockout : Заблокує від доступу порт (/dev/cuaXX) для різних сесій. Іншими словами, як тільки процес відкрив порт, не дозволяє іншим процесам, з відмінним ідентифікатором ID відкривати цей порт доти, доки його не замкнуто першим процесом.

^session_lockout : Не блокувати доступ до викликаючого порту для різних сесій.

pgrp_lockout : Заблокує доступ до викликаючого порту (/dev/cuaXX) для різних груп процесів. Іншими словами, як тільки процес відкрив порт, не дозволяє іншим процесам з відмінної групи процесів відкривати цей порт доти, доки його не замкнуто першим процесом.

^pgrp_lockout : Не блокувати доступ до викликаючого порту для різних груп процесів.

hup_notify : Сповістить процес, блокований на відкритті лінії відповідача, про завершення вживання іншим процесом лінії виклику (або через її закриття, або через сигнал відбою), повертаючи EAGAIN функції open.
Цей параметр застосовується з процесами getty, заблокованими на лінії відповідача послідовного порту. Це дозволяє getty перезаладувати модем (який може мати змінену конфігурацію іншими програмами, що використовують пристрій виклику) перед тим як заблокувати лінію для open знову.

^hup_notify : Не сповіщати процес, заблокований під час відкриття лінії відповідача, що пристрій виклику здійснив відбій.

split_termios : Розглядати окремо налаштування termios, використовувані пристроєм виклику і налаштування termios пристроїв-відповідачів.

^split_termios : Використовувати ту саму структуру termios для обох, портів виклику і потрів-відповідачів. Ця опція використовується за замовчуванням.

callout_nohup : Якщо саме цей послідовний порт відкрито як пристрій виклику, не здійснювати відбій для tty, коли виявлення носія скасовано (відкинуто).

^callout_nohup : Не нехтувати відбоєм для tty, коли послідовний порт відкрито як пристрій виклику. Звичайно, HUPCL прапорець для termios повинен бути включеним для можливості відбою.

low_latency : Зменшити затримку приймання даних на послідовному порті за рахунок збільшення вживання процесору. (Як правило існує 5-10 мілісекунд затримки перед тим як символи посилаються до лінійного алгоритму, щоб зменшити навантаження). Цю опцію вимкнено за замовчуванням, але деякі додатки реального часу можуть вимагати цього.

^low_latency : Оптимізувати ефективність обробки процесором знаків послідовного порту за рахунок затримки на 5-10 мілісекунд до обробки. Цю опцію включено за замовчуванням.

КОНФІГУРАЦІЯ ПОСЛІДОВНОГО ПОРТУ

Важливо зауважити, що setserial лише підказує ядру, де воно повинно шукати порти вводу-виводу і лінії IRQ певного послідовного порту. Ця програма не налагоджує прилад, саму послідовну картку, вказуючи певний порт вводу-виводу. Для того, щоб здійснити це, вам необхідно фізично запрограмувати картку, як правило через переключення перемичок або перемикача DIP.

Цей розділ надасть вам невелику допомогу у вирішенню того як би вам хотілось налагодити послідовні порти.

Ось відповідність портів Лінукса зі "стандартними DOS":

/dev/ttys0 (COM1), port 0x3f8, irq 4 /dev/ttys1 (COM2), port 0x2f8, irq 3 /dev/ttys2 (COM3), port 0x3e8, irq 4 /dev/ttys3 (COM4), port 0x2e8, irq 3

З-за обмежень архітектури шини AT/ISA, як правило, лінія IRQ не може поділятися між двома або більше послідовними портами. Якщо ви спробуєте здійснити це, порти можуть виявитись ненадійними, у випадку одночасного використання обох. Це обмеження обійшли, так називаємі, багатопортні послідовні картки, яких спроектовано, щоб вони могли поділяти той самий IRQ між багатьма портами. Серед підтримуваних Лінуксом карток можна назвати AST FourPort, Accent Async, Usenet Serial II, Bocaboard BB-1004, BB-1008, BB-2016 і HUB-6.

Вибір альтернативного IRQ дещо ускладнено тим що більшість з них вже використано. Наступне є переліком вибору IRQ у DOS:

IRQ 3: COM2 IRQ 4: COM1 IRQ 5: LPT2 IRQ 7: LPT1

Більшість користувачів можуть вибрати IRQ 5 за умови, що активним є лише один паралельний порт у комп'ютері. Також можна вибрати IRQ 2 (те саме що IRQ 9), хоча цей переривач часом використовується сітьовими картками і зрідка картками VGA. Якщо ваша карка VGA використовує цей IRQ, спробуйте внеможливити його для неї, тож переривач можна буде вживати з іншими пристроями.

Іншими можливими лініями IRQ можуть бути 3, 4 і 7, хоча навіть вони можуть вже бути зайнятими іншими послідовними або паралельними портами. Якщо ваша карка має 16-бітне сполучення, і підтримує вищі IRQ, тоді можна використати IRQ 10, 11, 12 і 15.

На машинах класу AT, IRQ 2 сприймається як IRQ 9, і Лінукс саме так і інтерпретує його.

Решта IRQ, крім 2 (9), 3, 4, 5, 7, 10, 11, 12 і 15 не повинні використовуватись, оскільки ці переривання належать іншим пристроям і не можуть, як правило, бути поміняними. Ось стандартні призначення номерів IRQ:

IRQ 0 Канал датчика часу 0 IRQ 1 Клавіатура IRQ 2 Каскад для контролера 2 IRQ 3 Послідовний порт 2 IRQ 4 Послідовний порт 1 IRQ 5 Паралельний порт 2 (Резервний у випадку PS/2) IRQ 6 Дисковод гнучкого диску IRQ 7 Паралельний порт 1 IRQ 8 Годинник реального часу IRQ 9 Перенаправлене до IRQ 2 IRQ 10 Вільний IRQ 11 Вільний IRQ 12 Вільний (Допоміжний пристрій у випадку PS/2) IRQ 13 Математичний сопроцесор IRQ 14 Контролер жорсткого диску IRQ 15 Вільний

КОНФІГУРАЦІЯ БАГАТОПОРТОВИХ КАРТОК

Деякі послідовні багатопортові картки, що поділяють багато портів на одному IRQ, використовують один або більше портів для вказівки, чи очікують певні порти обробки. Якщо ваша картка є однією з таких, вам потрібно використати цю рису, щоб запобігти можливого блокування, при западанні IRQ.

Щоб уможливити такі порти, надайте опцію set_mutiport з додатковими параметрами для багатопортових карток. Ці параметри повинні вказувати який саме з портів є контрольним, маску, що визначає, які з бітів у регістрі є значущими, і накінець параметр match, який визначає, з чим значущі біти у регістрі співпадатимуть, коли вся робота зроблена і жодні порти не знаходяться у стані очікування.

Можна вказувати до чотирьох таких порт/маска/match комбінацій. Перша з цих комбінацій повинна бути задана як port1, mask1 і match1. Друга - port2, mask2 і match2 і.т.д. Щоб вимкнути цю багатопортову перевірку, встановіть port1 до нуля.

Для того, щоб бути в змозі побачити поточні налаштування багатопортових карток, задайте get_multiport на командному рядку.

Ось типові параметри для деяких послідовних багатопортових карток:

   
AST FourPort port1 0x1BF mask1 0xf match1 0xf
Boca BB-1004/8 port1 0x107 mask1 0xff match1 0
Boca BB-2016 port1 0x107 mask1 0xff match1 0
port2 0x147 mask2 0xff match2 0

Конфігурація Hayes ESP

Знаряддям setserial може також налагодити порти на послідовній картці Hayes ESP (Enhanced Serial Port).

Наступні параметри чинні для портів ESP:

rx_trigger : Це випускна межа (у байтах) приймального FIFO. Більші значення означатимуть менше процесорних переривань і отже покращену ефективність; тим не менш, завищене значення може призвести до втрати даних. Чинними значеннями є 1 до 1023.

tx_trigger : Це випускна межа (у байтах) передавального FIFO. Більші значення означатимуть менше процесорних переривань і отже покращену ефективність; тим не менш, завищене значення може призвести до погіршення ефективності передачі. Чинними значеннями є 1 до 1023.

flow_off : Це межа (у байтах), при якій порт ESP повідомить віддаленого передавача припинити відправку. Чинними значеннями є 1 до 1023. Це значення повинне бути більшим за rx_trigger і tx_trigger.

flow_on : Це рівень (у байтах), при якій порт ESP повідомить віддаленого передавача відновити відправку після зупинки. Чинними значеннями є 1 до 1023. Це значення повинне бути меншим за rx_trigger і tx_trigger.

rx_timeout : Час, який порт ESP зачекає після отримання останнього знаку перед тим як сигналізувати через переривач. Чинними значеннями є 0 до 255. Завищене значення призведе до сповільнення, тоді як занадто низьке викличе зайві переривання.

ВАДИ

ПОПЕРЕДЖЕННЯ: Конфігурація послідовного порту з неправильним портом вводу-виводу може завісити вашу машину.

ФАЙЛИ

/etc/rc.local /etc/rc.serial

ДИВІТЬСЯ ТАКОЖ

?tty(4), ?ttys(4), kernel/chr_drv/serial.c

АВТОРИ

Оригінальна версія setserial була написана Rick Sladkey (jrs@world.std.com), і модифікована Michael K. Johnson (johnsonm@stolaf.edu). Ця версія була переписана наново Theodore Ts'o (tytso@mit.edu) у 1993 році.

Переклад: Віталій Цибуляк (vi@uatech.atspace.com)
(Текст може вимагати серйозного технічного перегляду, окрім всього іншого.)