
Некоторое время назад я уже касался темы прямого доступа к LPT-портам из DOS-приложений, запускаемых в эмуляторе DOSEMU, работающего под управлением ОС Linux. Но в этом посте речь шла преимущественно об Ubuntu. А на днях довелось мне 2 спектрофотометра связывать через LPT-порты с компьютером, работающим под управлением Scientific Linux 6.3 (клон RHEL6). Возникших в процессе работы особенностей не так уж и много, но их незнание вполне способно убить заметное количество времени и нервных клеток. Изложенные ниже рекомендации с высокой вероятностью будут справедливы и для других клонов RHEL6 - например, CentOS 6.
Итак, имеем:
- 2 периферийных устройства (спектрофотометры) с интерфейсными платами, рассчитанными на подключение к LPT-порту;
- ПО, реализующее обмен данными. Написано в начале 90-х годов на Borland C 3.1 под MS-DOS;
- компьютер под управлением Scientific Linux 6.3, оснащенный двумя 2-направленными LPT-портами. При этом один порт расположен на дополнительной карте ISA и сконфигурирован с помощью джамперов как LPT1 (базовый адрес 378h, IRQ7), а интегрированный порт на материнской плате — через BIOS Setup как LPT2 (базовый адрес 278h, IRQ5). Фотографии карты и подробности можно посмотреть здесь.
Используемое интерфейсное ПО требует прямого доступа к "железу" портов, поэтому, как и в случае с программатором (см. вышеупомянутый пост), DOSEMU должен его обеспечить. Для этого:
1. Устанавливаем пакет dosemu-1.4.0-1.i386.rpm отсюда. С другими версиями (в т.ч. из репозиториев) ПРЯМОЙ ДОСТУП К ПОРТАМ ПОЛУЧИТЬ НЕ УДАСТСЯ! В частности, версия из пакета dosemu-1.4.0-12.2058svn.el6.i686.rpm (репозиторий rpmfusion-free-release) при запуске просто игнорирует файл /etc/dosemu.conf - вместе со всем, что в нем написано! Почему именно - не знаю, глубоко копать времени не было.
2. Запрещаем SELinux (иначе значение переменной vm.mmap_min_addr=0 установить не удастся).
Т.е. вроде бы оно и присвоится, но dosemu все равно будет упорно ругаться на vm.mmap_min_addr > 0. Для этого:
- Открываем файл /etc/selinux/config:
- Меняем в нем:
SELINUX=disabled
- Перезагружаемся.
3. Открываем /etc/sysctl.conf. Дописываем:
vm.mmap_min_addr=0
Перезагружаемся.
4. Чтобы при запуске dosemu с ключом -s рабочая папка не менялась на /root, редактируем файл /etc/sudoers:
- строку
Defaults always_set_home - закомментировать;
-строку
Defaults env_keep += "HOME" - раскомментировать.
5. Открываем /etc/dosemu/dosemu.conf. Пишем в разделе ## Direct hardware access (не обязательно именно там, но чтобы легче было ориентироваться самому):
$_ports = "fast range 0x378 0x37f"
$_ports = $_ports, " fast range 0x278 0x27f"
Если в системе присутствует только порт LPT1, то нужна только верхняя строка.
6. Запускаем dosemu командой:
dosemu -s
(Можно создать кнопку запуска в терминале с той же командой)