![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)

Возникла тут у меня на днях задачка: перешить “запоротый” 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-подобным дистрибутивам) смотрим здесь.
(no subject)
Date: 01/03/2012 02:45 (UTC)(no subject)
Date: 01/03/2012 02:54 (UTC)А пингвин суть птица благородная, солидная, в хозяйстве однозначно полезная, а сверх того - отличается умом и сообразительностью. А чё накачала-то такого слезоточивого, если не секрет?
(no subject)
Date: 01/03/2012 02:58 (UTC)тёмная и сакральная
Date: 01/03/2012 03:07 (UTC)Re: тёмная и сакральная
Date: 01/03/2012 03:08 (UTC)Сорри, непонятка возникла насчет "темная..."
Date: 01/03/2012 09:42 (UTC)Re: Сорри, непонятка возникла насчет "темная..."
Date: 01/03/2012 11:45 (UTC)Я там всё потерянное после закачек ищу. И убей меня, всегда не знаю,откель её,саму папку, в прошлый раз я вытаскивала на свет божий. Что-то мне подсказывает,что не у меня одной так.