Компонент 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. Если направление не указано, группа данных по умолчанию будет настроена как выходные данные. Например:

Команда для загрузки модуля реального времени hal_parport с дополнительным <config-string>, чтобы указать порт, на котором ожидается карта параллельного порта.
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> не содержит хотя бы одного адреса, это ошибка.

Блок-схема Parport
Figure 1. Блок-схема Parport
Type

Для каждого параллельного порта, обслуживаемого драйвером hal_parport, опционально можно указать тип. Типом может быть вход, выход, epp или x.

Table 1. Направление параллельного порта
Контакт 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"
Parport функции Чтения/Записи (R/W)

Вы также должны указать 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 ...