yes1111 (yes1111) wrote,
yes1111
yes1111

Categories:

Записки пингвиновода-любителя. BiDiPro, Linux, DOS-приложения, LPT-порт и все-все-все



Возникла тут у меня на днях задачка: перешить “запоротый” BIOS материнской платы (стартовать после обновления она отказывалась). По такому случаю из пыльного чулана был извлечен программатор BiDiPro. А уж если решено его завести и вернуть к активной жизни — то почему бы не сделать это под Linux? Тем более, что вещь объективно хорошая и в хозяйстве всегда пригодится.



Нативного софта под Linux мне пока не попадалось, поэтому решено было поднимать программатор с тем, который есть.

Изначально программное обеспечение для BiDiPro писалось под DOS.


Впоследствии энтузиасты написали также кое-что также и под Win 95/98/NT4.0/2000/XP (здесь и здесь), но DOS'овский софт на сегодня все равно остается наиболее полным, документированным и отработанным.

Для запуска DOS-программ под Linux'ом существуют, как минимум, два широко распространенных эмулятора: DOSBox и DOSEMU.

DOSBox, при всех своих многочисленных достоинствах, имеет весьма существенный недостаток: отсутствие эмуляции LPT-порта (с возможностью «отображения» на «живое железо»), что в нашем случае абсолютно неприемлемо. Так что единственным вариантом остается DOSEMU.

Итак, начнем по порядку.

1. Для работы программатора LPT-порт должен обеспечивать режим двунаправленной передачи данных (EPP). Если порт интегрирован в материнскую плату, то перед загрузкой компьютера заходим в BIOS Setup и убеждаемся, что для LPT-порта включен режим EPP или ECP+EPP (только не SPP!). 1.7 или 1.9 — в нашем случае не имеет значения.

2. Установить DOSEMU в Ubuntu можно прямо из репозитория, выполнив команду:

sudo apt-get install dosemu

При работе с другими дистрибутивами Linux синтаксис команды может быть иным, но суть от этого не меняется. Вообще, все нижеизложенное проверялось с дистрибутивом Ubuntu 10.04 LTS – 64-bit (архитектура amd64). Впрочем, к 32-битной версии (архитектура i386) это применимо в той же степени.

3. Итак, DOSEMU установлен. Сразу после запуска появляется «ужасное» сообщение об ошибке:

LOWRAM mmap: Операция не позволяется
Cannot map low DOS memory (the first 640k).
You can most likely avoid this problem by running
sysctl -w vm.mmap_min_addr=0
as root, or by changing the vm.mmap_min_addr setting in
/etc/sysctl.conf or a file in /etc/sysctl.d/ to 0.

Открываем файл /etc/sysctl.conf и исправляем значение vm.mmap_min_addr = 65536 на vm.mmap_min_addr = 0.

4. После первого успешного запуска DOSEMU в домашней папке текущего пользователя /home/<имя_пользователя> появится «невидимая» папка .dosemu

Увидеть ее можно, включив в Nautilus'е опцию «Вид — Показывать скрытые файлы»

Внутри этой папки находится также папка drive_c, которую эмулятор DOSEMU воспринимает как диск c:

5. Для удобства работы в DOS настоятельно рекомендую установить какой-либо файловый менеджер, например, Volkov Commander. Сделать это можно, к примеру, отсюда. Скачиваем, раззиповываем и копируем содержимое архива в папку:
/home/<имя_пользователя>/.dosemu/drive_c/vc


Для удобства запуска можем добавить в файл autoexec.bat, находящийся также в папке .dosemu, строку: vc\vc. Теперь при каждом запуске DOSEMU будет автоматически запускаться Volkov Commander:



6. Скачиваем отсюда софт для работы с BiDiPro. Раззиповываем в папку BIDIPRO, созданную на диске c: эмулятора (/home/<имя_пользователя>/.dosemu/drive_c).

7. Далее, нашей программе нужен прямой доступ к LPT-порту. Без этого никак. Например, в моем случае при попытке обращения к микросхеме, вставленной в программатор, на принтере начинает печататься всякая белиберда. И это при том, что принтер сетевой и физически подключен к совсем другому компьютеру!

Открываем файл /etc/dosemu/dosemu.conf, находим в нем раздел «Direct hardware access» и дописываем строку:

$_ports = "fast range 0x378 0x37f"

(подразумевается, что надо открыть прямой доступ к порту LPT1, занимающему диапазон адресов 0x378 — 0x37f).

Если порт расположен по другим адресам, то пишем туда их. Так, для порта LPT2 (если таковой имеется и расположен по базовому адресу 278h) следует записать:

$_ports = "fast range 0x278 0x27f"

а для системы с двумя портами -

$_ports = "fast range 0x378 0x37f"
$_ports = $_ports, " fast range 0x278 0x27f"

Вообще, для получения детальной информации об LPT-портах, установленных в Вашем компьютере, можно воспользоваться командой:

dmesg | grep -i parport

Вывод:

[ 29.592550] parport_pc 00:0a: reported by Plug and Play ACPI
[ 29.592602] parport0: PC-style at 0x378 (0x778), irq 7, dma 3 [PCSPP,TRISTATE,COMPAT,EPP,ECP,DMA]
[ 29.673052] lp0: using parport0 (interrupt-driven)

означает, что в системе присутствует один LPT-порт, который расположен по базовому адресу 378h, использует прерывание IRQ 7 и канал ПДП DMA 3 и может работать в режимах SPP, EPP и ECP.

8. Подключаем программатор кабелем, включаем его питание и запускаем DOSEMU обязательно с правами суперпользователя и с ключом -s. В случае Ubuntu это будет:

sudo dosemu -s

Теперь запускаем из DOSEMU файл bidipro.exe. Настраиваем параметры программатора, вставляем микросхему, наслаждаемся результатом:



«Тонкую» настройку ПО программатора выполняем в полном соответствии с инструкцией, содержащейся в том же архиве, где и собственно софт. Успехов!

Приложение. В некоторых случаях одного LPT-порта бывает недостаточно. Всеобъемлющих рекомендаций на этот счет дать не могу, но личным опытом охотно поделюсь. Так, на работе мы подключили к одному компьютеру 2 спектрофотометра через LPT-порты. Софт для этих спектрофотометров написан тоже под DOS, поэтому все вышеизложенное справедливо и для этого случая. Поскольку материнская плата (выпуска примерно 2001 г.) еще имеет слот ISA, решено было попробовать простой и дешевый выход из положения: установить старую «ISA'шную» карту с LPT-портом — благо, на сегодня они в изобилии валяются в хламе и стоят сущие копейки. При этом дополнительная карта конфигурировалась джамперами как LPT1 (базовый адрес 378h, IRQ7), а интегрированный порт на материнской плате — через BIOS Setup как LPT2 (базовый адрес 278h, IRQ5).

Неприятным сюрпризом оказалось то, что почти на всех «ISA'шных» картах LPT-порт поддерживает только режим SPP, что для нас неприемлемо. Так, популярный в свое время чип GoldStar Prime 2C (как и его модификации) именно по этой причине оказался непригодным:





После многочисленных экспериментов была найдена плата, на которой есть именно EPP LPT-порт:





Обратите внимание на маркировку чипа: STARTECH ST16C552CJ. Это — РАБОТАЕТ!

На сегодняшний день все это хозяйство вот уже около года успешно работает под управлением Ubuntu 10.04 LTS i386. В файл /etc/dosemu/dosemu.conf прописано:

$_ports = "fast range 0x378 0x37f"
$_ports = $_ports, " fast range 0x278 0x27f"

Естественно, работоспособные материнские платы со слотом ISA на сегодня уже раритет. Поэтому хотелось бы знать, будут ли работать в наших целях более современные устройства — платы PCI-LPT и USB-LPT. Честно скажу: пока не пробовал, выдумывать не буду. По идее, насчет первых прогноз скорее оптимистический. Надо только посмотреть на вывод команды:

dmesg | grep -i parport

Если система видит и правильно опознает порт, то попробовать указать в файле /etc/dosemu/dosemu.conf диапазон его адресов относительно базового (последний в этом случае будет нестандартным). Что касается переходников USB—LPT, то здесь все кажется грустнее: по некоторым (не проверенным пока лично) сведениям, такой порт непригоден для низкоуровневого программирования. Впрочем, подвернется возможность — проверю. А то ведь как, к примеру, с теперешними ноутбуками бороться?



[upd]: Продолжение (применительно к RHEL-подобным дистрибутивам) смотрим здесь.
Tags: linux, записки сумасшедшего
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 7 comments