Компонент hal_parport є драйвером для традиційного паралельного порту ПК. Порт має загалом 17 фізичних контактів. Оригінальний паралельний порт поділяв ці контакти на три групи: дані, керування та стан. Група даних складається з 8 вихідних контактів, група керування — з 4 контактів, а група стану — з 5 вхідних контактів.
На початку 1990-х років був представлений двонаправлений паралельний порт, який дозволяє використовувати групу даних для виводу або вводу. Драйвер HAL підтримує двонаправлений порт і дозволяє користувачеві налаштувати групу даних як ввід або вивід. Якщо порт налаштований як «вивід», він забезпечує в цілому 12 виводів і 5 вводів. Якщо порт налаштований як «ввід», він забезпечує 4 виводи і 13 вводів.
У деяких паралельних портах контакти групи управління є відкритими колекторами, які також можуть бути переведені в низький стан зовнішнім затвором. На платі з відкритими колекторними контактами управління. Якщо налаштований як «x», він забезпечує 8 виходів і 9 входів.
У деяких паралельних портах група керування має двотактні драйвери та не може використовуватися як вхід.
|
Note
|
HAL та відкриті колектори
HAL не може автоматично визначити, чи є двонаправлені контакти режиму «x» відкритими колекторами (OC). Якщо це не так, їх не можна використовувати як входи, а спроба перевести їх у стан LOW із зовнішнього джерела може пошкодити апаратне забезпечення. Щоб визначити, чи має ваш порт виводи «відкритого колектора», завантажте hal_parport у режимі «x». Якщо пристрій не підключено, HAL повинен зчитати вивід як TRUE. Далі підключіть резистор 470 Ом від одного з виводів керування до GND. Якщо отримана напруга на контакті управління близька до 0 В, і HAL тепер зчитує контакт як FALSE, то у вас є порт OC. Якщо отримана напруга далека від 0 В, або HAL не зчитує контакт як FALSE, то ваш порт не може бути використаний в режимі «x». Зовнішнє обладнання, яке керує керуючими контактами, також повинно використовувати логічні елементи з відкритим колектором, наприклад, 74LS05. На деяких комп’ютерах налаштування BIOS можуть впливати на можливість використання режиму «x». Найімовірніше, працюватиме режим «SPP». |
Жодні інші комбінації не підтримуються, і порт не можна змінити з вхідного на вихідний після встановлення драйвера.
Драйвер parport може керувати до 8 портів (визначено параметром MAX_PORTS у hal_parport.c). Порти нумеруються, починаючи з нуля.
1. Завантаження
Драйвер hal_parport є компонентом реального часу, тому його необхідно завантажити в потік реального часу за допомогою команди «loadrt». Конфігураційний рядок описує паралельні порти, які будуть використовуватися, та (опціонально) їх типи. Якщо конфігураційний рядок не описує хоча б один порт, це є помилкою.
loadrt hal_parport cfg="port [type] [port [type] ...]"
Числа нижче 16 відносяться до паралельних портів, виявлених системою. Це найпростіший спосіб налаштування драйвера hal_parport, який співпрацює з драйвером Linux parport_pc, якщо він завантажений. Порт 0 — це перший паралельний порт, виявлений у системі, 1 — наступний і так далі.
Це використовуватиме перший паралельний порт, який виявить Linux:
loadrt hal_parport cfg="0"
Натомість адресу порту можна вказати у шістнадцятковому форматі з префіксом 0x.
Конфігураційний рядок представляє шістнадцяткову адресу порту, за якою опціонально може слідувати напрямок, і все це повторюється для кожного порту. Напрямки можуть бути in, out або x і визначають напрямок фізичних контактів 2–9 роз’єму D-Sub 25. Якщо напрямок не вказано, група даних за замовчуванням буде налаштована як виходи. Наприклад:
loadrt hal_parport cfg="0x278 0x378 in 0x20A0 out"
У цьому прикладі встановлюються драйвери для порту 0x0278, з виводами 2–9 як виходи (за замовчуванням, оскільки не вказано ні in, ні out), порту 0x0378, з виводами 2–9 як входи, та порту 0x20A0, з виводами 2–9, явно вказаними як виходи. Зверніть увагу, що для правильної конфігурації драйверів необхідно знати базову адресу паралельних портів. Для портів шини ISA це зазвичай не є проблемою, оскільки порти майже завжди мають відому адресу, наприклад 0x278 або 0x378, яка зазвичай конфігурується в BIOS. Адреси карт шини PCI зазвичай можна знайти за допомогою команди lspci -v у рядку I/O ports або в повідомленні ядра після виконання команди sudo modprobe -a parport_pc. За замовчуванням адреса не встановлюється, тому якщо <config-string> не містить хоча б одну адресу, це вважається помилкою.
Для кожного паралельного порту, що обробляється драйвером hal_parport, можна додатково вказати «тип». Тип може бути одним із «in», «out», «epp» або «x».
| Закріпити | in | out/epp | x |
|---|---|---|---|
1 |
out |
out |
in |
2 |
in |
out |
out |
3 |
in |
out |
out |
4 |
in |
out |
out |
5 |
in |
out |
out |
6 |
in |
out |
out |
7 |
in |
out |
out |
8 |
in |
out |
out |
9 |
in |
out |
out |
10 |
in |
in |
in |
11 |
in |
in |
in |
12 |
in |
in |
in |
13 |
in |
in |
in |
14 |
out |
out |
in |
15 |
in |
in |
in |
16 |
out |
out |
in |
17 |
out |
out |
in |
Якщо тип не вказано, значення за замовчуванням — «out».
Тип «epp» є таким самим, як «out», але драйвер hal_parport вимагає, щоб порт перейшов у режим EPP. Драйвер hal_parport не використовує протокол шини EPP, але в деяких системах режим EPP змінює електричні характеристики порту таким чином, що деяке периферійне обладнання може працювати краще. Відомо, що зарядний насос Gecko G540 вимагає цього на деяких паралельних портах.
Див. примітку вище щодо режиму x.
Це ввімкне два паралельні порти, виявлені системою, перший у режимі виводу, а другий у режимі вводу:
loadrt hal_parport cfg="0 out 1 in"
Ви також повинні направити LinuxCNC на виконання функцій «читання» та «запису».
addf parport.0.read base-thread addf parport.0.write base-thread
2. Адреса порту PCI
Одна хороша PCI-карта parport виготовлена на базі чіпсета Netmos 9815. Вона має хороші сигнали +5⁻¹ В і може постачатися з одним або двома портами.
Щоб знайти адреси вводу/виводу для PCI-карт, відкрийте вікно терміналу та скористайтеся командою list pci:
lspci -v
Знайдіть запис із написом «Netmos». Приклад 2-портової карти:
0000:01:0a.0 Communication controller: \
Контролер багатоканального вводу/виводу Netmos Technology PCI 9815 (версія 01)
Підсистема: LSI Logic / Symbios Logic 2POS (2-портовий паралельний адаптер)
Прапорці: середній рівень розробки, IRQ 5
I/O ports at b800 [size=8]
I/O ports at bc00 [size=8]
I/O ports at c000 [size=8]
I/O ports at c400 [size=8]
I/O ports at c800 [size=8]
I/O ports at cc00 [size=16]
В результаті експериментів я виявив, що перший порт (вбудований порт) використовує третю адресу зі списку (c000), а другий порт (той, що підключається за допомогою плоского кабелю) використовує першу адресу зі списку (b800). Наступний приклад показує вбудований паралельний порт і паралельний порт PCI, що використовують напрямок виходу за замовчуванням.
loadrt hal_parport cfg="0x378 0xc000"
Зверніть увагу, що ваші значення будуть відрізнятися. Карти Netmos є Plug-N-Play і можуть змінювати свої налаштування залежно від того, в який слот ви їх вставляєте, тому якщо ви любите «заглядати під капот» і переставляти речі, обов’язково перевірте ці значення перед запуском LinuxCNC.
3. Піни
-
parport.<p>.pin-`__<n>__-out` (bit) Керує фізичним вихідним контактом. -
parport.<p>.pin-`__<n>__-in` (біт) Відстежує фізичний вхідний контакт. -
parport.<p>.pin-`__<n>__-in-not` (bit) Відстежує фізичний вхідний контакт, але інвертований.
Для кожного контакту <p> – це номер порту, а <n> – це фізичний номер контакту в 25-контактному D-подібному роз’ємі.
Для кожного фізичного вихідного контакту драйвер створює один контакт HAL, наприклад: parport.0.pin-14-out.
Для кожного фізичного вхідного контакту драйвер створює два контакти HAL, наприклад: parport.0.pin-12-in та parport.0.pin-12-in-not.
Вивід HAL -in має значення TRUE (ІСТИНА), якщо фізичний вивід має високий рівень, і FALSE (ХИБНІСТЬ), якщо фізичний вивід має низький рівень. Вивід HAL -in-not інвертований і має значення FALSE, якщо фізичний вивід має високий рівень.
4. Параметри
-
parport.`__<p>__.pin-__<n>__-out-invert` (біт) Інвертує вихідний контакт. -
parport.`__<p>__.pin-__<n>__-out-reset` (bit) ((лише для виводів-out) TRUE, якщо цей вивод має бути скинутий під час виконання функції-reset. -
parport.`__<p>__.reset-time` (U32) Час (у наносекундах) між виводами встановлюється опцією-writeта скидається функцією-reset, якщо вона ввімкнена.
Параметр -invert визначає, чи є вихідний контакт активним у високому або низькому стані. Якщо -invert має значення FALSE, то встановлення контакту HAL -out у стан TRUE призводить до переведення фізичного контакту у високий стан, а FALSE — у низький. Якщо -invert має значення TRUE, то встановлення контакту HAL -out у стан TRUE призведе до переведення фізичного контакту у низький стан.
5. Функції
-
parport.`__<p>__.read` (funct) Зчитує фізичні вхідні контакти порту номер <p> та оновлює контакти HAL-inта-in-not. -
parport.read-all(funct) Зчитує фізичні вхідні контакти всіх портів та оновлює контакти HAL-inта-in-not. -
parport.`__<p>__.write` (funct) Зчитує контакти HAL-outпорту номер <p> та оновлює фізичні вихідні контакти цього порту. -
parport.write-all(funct) Зчитує HAL-outконтакти всіх портів та оновлює всі фізичні вихідні контакти. -
parport.`__<p>__.reset` (функція) Чекає, поки не мине часreset-timeз моменту відповідногоwrite, а потім скидає виводи до значень, вказаних у налаштуваннях-out-invertта-out-invert.resetповинен бути пізніше в тому ж потоці, що йwrite. Якщо-resetмає значення TRUE, то функціяresetвстановить контакт на значення-out-invert. Це можна використовувати разом з doublefreq stepgen для створення одного кроку за період. stepgen stepspace для цього контакту має бути встановлено на 0, щоб увімкнути doublefreq.
Окремі функції передбачені для ситуацій, коли один порт потрібно оновлювати в дуже швидкому потоці, а інші порти можна оновлювати в повільнішому потоці, щоб заощадити час процесора. Ймовірно, не варто одночасно використовувати функцію -all та окрему функцію.
6. Поширені проблеми
Якщо завантаження звітів модуля
insmod: error inserting '/home/jepler/emc2/rtlib/hal_parport.ko':
-1 Пристрій або ресурс зайнятий
потім переконайтеся, що стандартний модуль ядра «parport_pc» не завантажений примітка:[У пакетах LinuxCNC для Ubuntu файл /etc/modprobe.d/emc2 зазвичай запобігає автоматичному завантаженню «parport_pc».] і що жоден інший пристрій у системі не зайняв порти вводу-виводу.
Якщо модуль завантажується, але, здається, не працює, значить, адреса порту неправильна.
7. Використання DoubleStep
Щоб налаштувати DoubleStep на паралельному порту, необхідно додати функцію parport.n.reset після parport.n.write і встановити stepspace на 0 та бажаний час скидання. Таким чином, крок може бути підтверджений у кожному періоді в HAL, а потім вимкнений parport після підтвердження протягом часу, зазначеного в parport.`__n__.reset-time`.
Наприклад:
loadrt hal_parport cfg="0x378 out" setp parport.0.reset-time 5000 loadrt stepgen step_type=0,0,0 addf parport.0.read base-thread addf stepgen.make-pulses base-thread addf parport.0.write base-thread addf parport.0.reset base-thread addf stepgen.capture-position servo-thread ... setp stepgen.0.steplen 1 setp stepgen.0.stepspace 0
Більше інформації про DoubleStep можна знайти на вікі.
8. probe_parport
У сучасних ПК паралельні порти можуть вимагати конфігурації plug and play (PNP) перед тим, як їх можна буде використовувати. Модуль ядра probe_parport конфігурує всі наявні порти PNP. Його необхідно завантажити перед hal_parport. На машинах без порту PNP його можна завантажити, але це не матиме ніякого ефекту.
8.1. Встановлення probe_parport
Якщо, коли модуль ядра parport_pc завантажується командою:
sudo modprobe -a parport_pc; sudo rmmod parport_pc
Ядро Linux виводить повідомлення, подібне до:
парпорт: виявлено парпорт PnPBIOS.
Тоді використання цього модуля, ймовірно, буде необхідним.
Нарешті, слід завантажити компоненти HAL parport:
loadrt probe_parport loadrt hal_parport ...