Компонент hal_parport — это драйвер традиционного параллельного порта ПК. Порт имеет в общей сложности 17 физических контактов. Исходный параллельный порт делил эти контакты на три группы: данные, управление и состояние. Группа данных состоит из 8 выходных контактов, группа управления состоит из 4 контактов, а группа состояния состоит из 5 входных контактов.
В начале 1990-х годов был представлен двунаправленный параллельный порт, который позволяет использовать группу данных для вывода или ввода. Драйвер HAL поддерживает двунаправленный порт и позволяет пользователю устанавливать группу данных как входную или выходную. Если порт настроен как выход, порт обеспечивает в общей сложности 12 выходов и 5 входов. Если он настроен как вход, он обеспечивает 4 выхода и 13 входов.
В некоторых параллельных портах контакты группы управления представляют собой открытые коллекторы, которые также могут быть переведены на низкий уровень с помощью внешнего затвора. На плате с управляющими контактами с открытым коллектором. Если настроено как x, он обеспечивает 8 выходов и 9 входов.
В некоторых параллельных портах группа управления имеет двухтактные драйверы и не может использоваться в качестве входа.
Note
|
HAL и открытые коллекторы
HAL не может автоматически определить, являются ли двунаправленные контакты режима x на самом деле открытыми коллекторами (ОК). В противном случае их нельзя использовать в качестве входов, и попытка перевести их на НИЗКИЙ уровень от внешнего источника может привести к повреждению оборудования. Чтобы определить, имеет ли ваш порт контакты «открытый коллектор», загрузите hal_parport в режиме x. Если устройство не подключено, HAL должен прочитать вывод как TRUE. Затем вставьте резистор сопротивлением 470 Ом от одного из управляющих контактов к GND. Если результирующее напряжение на выводе управления близко к 0 В, и HAL теперь считывает вывод как ЛОЖЬ, то у вас есть порт OК. Если результирующее напряжение далеко от 0,0 В или HAL не считывает вывод как FALSE, то ваш порт нельзя использовать в режиме x. Внешнее оборудование, которое управляет выводами управления, также должно использовать затворы с открытым коллектором, например 74LS05 (555ЛН2). На некоторых компьютерах настройки 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
, который взаимодействует с драйвером parport_pc в Linux, если он загружен. Порт 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. 9 явно указаными как выходы. Обратите внимание: для правильной настройки драйверов необходимо знать базовый адрес параллельных портов. Для портов шины ISA это обычно не является проблемой, поскольку порты почти всегда имеют хорошо известный адрес, например 0x278 или 0x378, которые обычно настраиваются в BIOS. Адреса карт шины PCI обычно находятся с помощью lspci -v
в строке I/Oports или в сообщении ядра после запуска sudo modprobe -a parport_pc
. Адреса по умолчанию нет, поэтому, если <config-string>
не содержит хотя бы одного адреса, это ошибка.
Для каждого параллельного порта, обслуживаемого драйвером hal_parport, опционально можно указать тип. Типом может быть вход, выход, 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 сделана на чипсете Netmos 9815. Он имеет хорошие сигналы +5 В и может подключаться к одному или двум портам.
Чтобы найти адреса ввода-вывода для карт PCI, откройте окно терминала и используйте команду list pci:
lspci -v
Найдите запись с надписью «Netmos». Пример 2-портовой карты:
0000:01:0a.0 Communication controller: \
Netmos Technology PCI 9815 Multi-I/O Controller (rev 01)
Subsystem: LSI Logic / Symbios Logic 2POS (2 port parallel adapter)
Flags: medium devsel, 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` (bit) Отслеживает физический входной контакт. -
parport.<p>.pin-`__<n>__
-in-not` (bit) Отслеживает физический входной контакт, но инвертирован.
Для каждого контакта <p> — это номер порта, а <n> — это физический номер контакта в 25-контактном разъеме D-Sub.
Для каждого физического выходного контакта драйвер создает один контакт HAL, например: parport.0.pin-14-out
.
Для каждого физического входного контакта драйвер создает два контакта HAL, например: parport.0.pin-12-in
и parport.0.pin-12-in-not
.
Контакт -in
HAL имеет значение TRUE, если физический контакт имеет высокий уровень, и FALSE, если физический контакт имеет низкий уровень. Контакт -in-not
HAL инвертирован и имеет значение FALSE, если на физическом контакте высокий уровень.
4. Параметры
-
parport.`__<p>__
.pin-__<n>__
-out-invert` (bit) Инвертирует выходной контакт. -
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` (funct) Ожидает, пока не истечетreset-time
с момента соответствующейwrite
, затем сбрасывает контакты на значения, указанные настройками-out-invert
и`-out-invert`.reset
должен быть позже в том же потоке, что иwrite
. Если-reset
в TRUE, то функцияreset
установит для контакта значение-out-invert
. Это можно использовать в сочетании с Stepgen doublefreq для создания одного импульса шага за период. Для включения двойной частоты параметр stepgen Stepspace для этого конаткта должен быть установлен в 0.
Отдельные функции предусмотрены для ситуаций, когда один порт необходимо обновить в очень быстром потоке, а другие порты можно обновить в более медленном потоке для экономии времени процессора. Вероятно, не очень хорошая идея использовать одновременно функцию -all
и отдельную функцию.
6. Распространенные проблемы
Если при загрузке модуль сообщает
insmod: error inserting '/home/jepler/emc2/rtlib/hal_parport.ko':
-1 Device or resource busy
затем убедитесь, что стандартный модуль ядра «parport_pc» не загружен, footnote: [В пакетах 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 можно найти на странице wiki.
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 выводит сообщение, подобное:
parport: PnPBIOS parport detected.
Вероятно, использование этого модуля будет необходимым.
Наконец, должны быть загружены компоненты HAL parport:
loadrt probe_parport loadrt hal_parport ...