Как изменить адрес порта lpt

Сообщения без ответов | Активные темы

Форум РадиоКот • Просмотр темы — Как перевести LPT с нестандартным адресом на вход?

Сообщения без ответов | Активные темы

ПРЯМО СЕЙЧАС:

Автор Сообщение

Не в сети

Заголовок сообщения: Как перевести LPT с нестандартным адресом на вход?

СообщениеДобавлено: Пт авг 12, 2011 07:38:13 

Открыл глаза

Карма: 8

Рейтинг сообщений: 34

Зарегистрирован: Чт окт 15, 2009 20:40:16
Сообщений: 42

Рейтинг сообщения: 0

В общем, проблема такая: Из-за отсутствия LPT на материнке купил PSI-LPT на базе MosChip;
Адресное пространство получилось CD00-CD07 вместо 0378-037F; узнал, что переключение
порта с выхода на вход осуществляется установкой 5-го бита регистра control — попробовал — не
получилось; начал копать дальше — оказалась что возможно надо сменить режим порта в каком-то
регистре — вопрос как его найти???? (подобные темы видел — ответа для себя там не нашёл) или как
сменить адресное пространство на стандартное???

Вернуться наверх
 

ПрофильПрофиль

 

Реклама

YS

Не в сети

Заголовок сообщения: Re: Как перевести LPT с нестандартным адресом на вход?

СообщениеДобавлено: Пт авг 12, 2011 15:28:43 

Друг Кота
Аватар пользователя

Карма: 70

Рейтинг сообщений: 1226

Зарегистрирован: Вс мар 29, 2009 22:09:05
Сообщений: 7491

Рейтинг сообщения: 0

Регистры контроля имеют стандартное смещение от базового адреса. Control — base+1.


_________________
Разница между теорией и практикой на практике гораздо больше, чем в теории.

Вернуться наверх
Реклама

Mickle

Не в сети

Заголовок сообщения: Re: Как перевести LPT с нестандартным адресом на вход?

СообщениеДобавлено: Пн авг 15, 2011 08:54:45 

Поставщик валерьянки для Кота

Карма: 65

Рейтинг сообщений: 3027

Зарегистрирован: Чт сен 09, 2010 07:32:24
Сообщений: 1988
Откуда: г. Рыбинск

Рейтинг сообщения: 0

Сменить диапазон адресов можно, но делать это придётся после каждой перезагрузки ОС.

Вариант №1 (самый простой) — использовать утилиту NetMosLptRedir.exe безвестного автора. Эта утилита для доступа к PCI регистрирует и запускает драйвер giveio.sys. Ввиду кривизны этого драйвера при дальнейшей работе в ОС возможны различные недоразумения, как то, неработоспособность приложений, запускающихся под виртуальной машиной NTVDM и др.

Вариант №2 (самый трудоёмкий) — сделать вручную всё то, что выполняет вышеуказанная утилита. Для этого понадобится доступ к конфигурационному пространству PCI, который можно обеспечить, к примеру, популярной программой Wpcredit. Выбираем в списке «Select device» нашу карточку: тип «Other communications», VID:PID для чипа MCS9835 — 9710:9835. В конфигурационном пространстве переходим к базовому адресному регистру (BAR) стандартного LPT по смещению 18h и меняем его значение (типа word) на тот адрес, который нам нужен, например, 378h. При этом нужно иметь ввиду, что младший бит всегда = 1, т.е. я буду вводить по смещению 18h : 79h, и 19h: 03h. Далее перемещаемся к BAR расширенного LPT по смещению 1Ch и меняем значение на 378h+400h = 778h, не забывая про установленную единичку в младшем бите, т.е. 779h. Вот и всё!
В любом случае ОС об этих изменениях знать не будет, поэтому всё на свой страх и риск :)

Что касается двунаправленного режима, то прежде, чем устанавливать 5-й бит в регистре управления принтером, нужно установить соответствующий режим с помощью регистра ECP ECR, адрес которого равен базовому + 402h. Я делал это примерно так:

Код:

  asm
    mov     dx,BasePort
    add     dx,402h             {ECP ECR adress}
    in      al,dx               {load current value}
    and     al,00011111b        {clear mode bits}
    or      al,00100000b
    out     dx,al               {set bidirectional byte mode}
    mov     dx,BasePort
    add     dx,2
    mov     al,00100000b        {set read data mode and no interrupts}
    out     dx,al
  end;

Вернуться наверх

Medv95

Не в сети

Заголовок сообщения: Re: Как перевести LPT с нестандартным адресом на вход?

СообщениеДобавлено: Вт авг 16, 2011 15:31:02 

Карма: 8

Рейтинг сообщений: 34

Зарегистрирован: Чт окт 15, 2009 20:40:16
Сообщений: 42

Рейтинг сообщения: 0

Mickle, спасибо за подробный ответ, со стандартным портом 378h вместо BasePort -работает , а если вместо BasePort ставлю CD00 то не компилируется — если Вам не сложно, то как будет выглядеть этот кусок кода для BaseAdress=CD00 ??

Вернуться наверх
Реклама

Выгодные LED-драйверы для решения любых задач

КОМПЭЛ представляет со склада и под заказ широкий выбор LED-драйверов производства MEAN WELL, MOSO, Snappy, Inventronics, EagleRise. Линейки LED-драйверов этих компаний, выполненные по технологии Tunable White и имеющие возможность непосредственного встраивания в систему умного дома (димминг по шине KNX), перекрывают практически полный спектр применений: от простых световых указателей и декоративной подсветки до диммируемых по различным протоколам светильников внутреннего и наружного освещения.

Подобрать LED-драйвер>>

Mickle

Не в сети

Заголовок сообщения: Re: Как перевести LPT с нестандартным адресом на вход?

СообщениеДобавлено: Вт авг 16, 2011 17:19:41 

Поставщик валерьянки для Кота

Карма: 65

Рейтинг сообщений: 3027

Зарегистрирован: Чт сен 09, 2010 07:32:24
Сообщений: 1988
Откуда: г. Рыбинск

Рейтинг сообщения: 0

Medv95, наверное нолик пропустили перед CD00h:

Код:

  asm
    mov     dx,0CD00h
    add     dx,402h             {ECP ECR adress}
    in      al,dx               {load current value}
    and     al,00011111b        {clear mode bits}
    or      al,00100000b
    out     dx,al               {set bidirectional byte mode}
    mov     dx,0CD00h
    add     dx,2
    mov     al,00100000b        {set read data mode and no interrupts}
    out     dx,al
  end;

Я рад, что всё заработало, но хочу напомнить про два существенных момента:
1) нужно иметь ввиду, что инструкции ввода-вывода являются привилегированными, поэтому код под ОС защищённого режима просто так работать не будет, только под DOS;
2) привязываться к конкретным значениям BAR вашей PCI карточки — неправильно (я имею ввиду забивать в код адреса портов, типа 0CD00h). Ресурсы выделяются PCI устройству операционной системой. К примеру, на моём компьютере адрес базового порта будет совсем другой, и на Вашем он поменяется, если установите ещё одну карту PCI :(

Вернуться наверх
Реклама

Реклама

LIMF – источники питания High-End от MORNSUN со стандартным функционалом на DIN-рейку

На склад Компэл поступили ИП MORNSUN (крепление на DIN-рейку) с выходной мощностью 240 и 480 Вт. Данные источники питания обладают 150% перегрузочной способностью, активной схемой коррекции коэффициента мощности (ККМ; PFC), наличием сухого контакта реле для контроля работоспособности (DC OK) и возможностью подстройки выходного напряжения. Источники питания выполнены в металлическом корпусе, ПП с компонентами покрыта лаком с двух сторон, что делает ее устойчивой к соляному туману и пыли. Изделия соответствуют требованиям ANSI/ISA 71.04-2013 G3 на устойчивость к коррозии, а также нормам ATEX для взрывоопасных зон.

Подробнее>>

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Настройка WndLpt для LPT порта на PCI карточке

Обратите внимание, если вы хотите использовать LPT порт, выполненный на отдельной PCI плате для непосредственного подключения 12-ти светодиодов, то 4 последних светодиода (подключенные к пинам 1, 14, 16 и 17) будут гореть тускло. Поэтому такой LPT порт есть смысл использовать только для 8 светодиодов.

При работе с LPT портом, расположенным на отдельной PCI карте, необходимо особым образом настроить программу WndLpt.

Итак:

1. Запускаем «Диспетчер устройств».

Для Windows XP: «Панель управления» –> «Система» –> вкладка «Оборудование» –> кнопка «Диспетчер устройств»

Для других Windows: «Панель управления» –> «Производительность и обслуживание» –> «Администрирование» –> «Управление компьютером» –> пункт «Диспетчер устройств»

2. В списке ищем пункт «Порты» и подпункт, соответствующий LPT порту PCI карточки.

Например, в случае, показанном на рисунке, этот порт называется «NetMos PCI ECP Parallel Port (LPT3)»

LPT порт в «Диспетчере устройств»

3. Открываем свойства этого LPT порта (по двойному клику).

4. В списке «Перечень ресурсов» ищем элемент «Диапазон ввода-вывода (I/O)» и его значение (например, 9400-9407).

Ресурсы LPT порта

5. Запоминаем первое шестнадцатеричное число 9400.

6. Запускаем программу WndLpt или активируем плагин WndLpt для леера Winamp/WMP/AIMP2.

7. Переходим на вкладку «Settings». Устанавливаем флажок «I know what I’m doing», подтверждая, тем самым, что вы трезво оцениваете возможные риски связанные с неправильной установкой базового адреса LPT порта. В поле «HEX» вводим ранее запомненное число 9400 и нажимаем кнопку «Apply».

LPT порт в «Диспетчере устройств»

8. Переходим на вкладку «Play» и смотрим на светодиоды — они должны мигать согласно сценария.

9. Если же чуда не произошло, то следует пункт 7 следует повторить с другим числом, указанным в списке ресурсов LPT порта PCI карточки. В данном случае это число 9000. Для настройки следует использовать непременно стартовый адрес диапазона (левое число).

Настройка адреса LPT порта действует на все утилиты идущие в комплекте в программой WndLpt.

Для старых версий прораммы WndLpt, не имеющих вкладки «Settings» настройка базового адреса осуществляется только через редактор реестра:

[HKEY_LOCAL_MACHINESOFTWAREMAViusLPT_port]
«addr»=dword:00009400

(число 00009400 в записывается в реестр)

Установка базового адреса LPT порта в реестре


// Обратная связь: m a v i u s @ y a n d e x . r u
// [mavius]
// GUID: {A5AB4727-F446-4cd4-8A80-14C2B7A42F42}


<<< К списку раздела.

Программирование портов ввода/вывода (LPT и ISA).

Данный материал взят с: http://students.soros.karelia.ru/~eugenes/

Данный материал основан на моём (его) личном опыте работы с материнской платой неизвестного (нет, не солдата) производителя. Чипсет — SIS. Если вдруг в Вашем случае дело будет обстоять другим образом, напишите мне. Также хочу сразу предупредить — я не профессиональный программист!!! Поэтому не ругайте меня за отсутствие проф. терминов, может быть кривых объяснений или ещё каких недочётов, которые я имею право не знать.

В повседневной практике я использую язык программирования «Паскаль», поэтому дальнейшие примеры буду давать на нём. Согласен, для написания «драйверов» лучше знать СИ и Ассемблер. Последний я на данный момент изучаю. Для моих устройств пока что хватает и Паскаля.

Работа с параллельным портом (LPT).

Обычно этот порт имеет базовый адрес 378h (LPT1), 278h (LPT2), 3BCh (LPT3). Окончание «h» свидетельствует о шестнадцатиричной системе счисления, так уж принято записывать адреса. Порт занимает три адреса, первый из них называется базовым. Так, для LPT1 диапазон занимаемых им адресов: 378h-37Ah. Базовый адрес служит для посылки/чтения байта на/из линии d0-d7 (пины 2-9 разъёма DB-25). Посылка не инвертируется. Приведу фрагмент программы, посылающей в порт число 170.

{начало программы}



begin

Port[$378]:=170

end.

{конец программы}

При запуске её на линиях d0-d7 появится число 170 в двоичном виде, что соответсвует 10101010. Т.е. единичный сигнал будет присутствовать на выводах d1, d3, d5, d7 (обозначени выводов начинается с d0!). Число 170 останется на выводах разъёма до тех пор, пока Вы не перешлёте туда же другое число (это может сделать и другая программа) или не выключите компьютер. Заметьте, что адрес порта в команде задан в шестнадцатиричном виде, а посылка — в десятиричном. Если вместо команды

Port[$378]:=170;

Вы примените

d:=Port[$378];

где d — некоторая переменная, то переменная примет значение последнего посланного в порт байта или, при переходе в режим приёма, значение байта, поданного на порт внешним устройством.

Базовый+1 адрес (379h для LPT1) служит для чтения состояний принтера, поступающих на входы ACK, -BUSY, PE, SLCT, ERROR. Сигнал -BUSY — инвертированныё, т.е. при подаче на него +5В компьютер будет считывать «0». Для опроса линий используются только старшие 5 битов. «1» в третьем бите соответствует высокому уровню сигнала на входе ERROR.
В четвёртом бите она индицирует о высоком уровне сигнала на входе SLCT, в пятом — на входе PE. Единица в шестом бите соответствует высокому уровню сигнала на ACK, а ноль в седьмом — выскому уровню на -BUSY. Если ваш компьютер имеет однонаправленный порт передачи данных, то эти пять линий предоставляют единственную возможность в опросе состояний внешних датчиков.

Ниже — пример программы, опрашивающей входные линии порта:

begin

d:=Port[$379]

end.

В переменной d после выполнения программы будет отображено состояние порта. Допустим, переменная вернула значение 126. В двоичном виде оно выглядит как 01111110. Младшие (правые) три бита (нулевой, первый и второй) не используются, и всегда равны 1, 1 и 0. Третий бит — 1, значит на ERROR высокий уровень. Та же ситуация на SLCT, PE, ACK и BUSY.

Базовый+2 адрес (37Ah) служит для записи битов на линии -STROBE, -AUTO FD, INIT, -SLCT IN. Нулевой бит посылает сигнал на -STROBE, первый — на -AUTO FD, второй — на INIT, и четвёртый — на -SLCT IN. Принцип записи — тот же, что и по базовому адресу. Нам же очень интересны следующие биты:
Пятый бит служит для разрешения/запрещения прерывания от внешнего устройства. Это полезно, если Вы умеете писать обработчики прерываний.

Шестой бит служит для перевода линий d0-d7 в режим приёма!!! Но перед этим необходимо убедиться, что в BIOS в типе порта поставлено SPP/EPP. Вот пример программы, которая считывает бит с линий данных:

begin

Port[$37A]:=32; {32 «зажигает» единицу в шестом бите}

d:=Port[$378];

end.

Не забудьте, что если Вы собрали устройство, которое через порт принтера опрашивает, допустим, один датчик, подключенный к d0 (pin 2), а остальные линии просто оставили «висеть» на воздухе, то в случае, когда на втором контакте порта будет единица, принимаемый байт будет не «1» а 255, т.к. неподключенные контакты имеют высокий уровень.

Программирование ISA устройств.

Программирование портов ISA практически не отличается от программирование порта LPT, т.к. по сути дела сам порт принтера является ISA устройством. Отличие состоит только в том, что при работе с параллельним портом можно было обходится без прерываний (хотя при разработке устройств, обрабатывающих данные в «real time» без них не обойтись).
Если Вы решили собирать ISA устройство, то очевидно, что Вам как раз и нужна обработка в реальном времени или быстрый (по сравнению с LPT) обмен данными. К сожалению, я пока что не имел опыта разработки драйверов, используюих прервания, поэтому на данный момент не смогу Вам объяснить методы написания таковых.

Возъмём простейший случай, когда Вы решили использовать шину ISA только для достижения 16-разрядного обмена. Если адрес LPT порта (в общем случае) является уже заданным, то Ваше устройство может использовать любые адреса (естественно, не занятые другими устройствами). Могу дать несколько советов при выборе адреса, который будет занимать устройство:

  • Тщательно проверьте, не будет ли оно конфликтовать с другими устройствами. Это может быть не только видеокарта, модем или звуковая карта, но и что-либо из внутренних устройств на материнской плате. Поиск свободных адресов можно осуществить в простейшем случае из Windows (Свойства: система -> Устройства. Двойной щелчок по пиктограмме «Компьютер» высветит меню, в котором можно будет просмотреть адреса).
  • Для подстраховки и удобства переноса устрйства на другой компьютер лучше сделать возможность выбора разных адресов джамперами (если Вы сможете организовать Plug&Play, тогда преклоняю свои колени..).
  • Старайтесь не занимать верхних адресов, т.к. они могут попросту не выводится на шину. Держитесь в окресностях адресного пространства, которое занимают другие ISA устройства.
  • Не забывайте выводить старшие линии адресов на своё устройство, т.к. может оказаться, что оно будет совпадать с другими устройствами младшими битами адреса.

    Если Вы сделали выборку адресов джамперами, то программируя на Паскале трудно будет программно изменить адрес устройства (поправьте, если я не прав). Будет гораздо проще применить Ассемблер-вставку в Вашу программу:
    mov dx, a
    mov al, d
    out dx, al

    Здесь в регистр dx мы кладём адрес порта, а в al — байт для отправки. Переменные a и d мы может спокойно передавать вставке из программы.


    Разработка и оформление Андрея Александровича Борисенко aka ICE.
    По всем вопросам просьба писать мне на icenet (at) narod.ru

  • Понравилась статья? Поделить с друзьями:

    Читайте также:

  • Как изменить адрес получения штрафов
  • Как изменить адрес получения посылки почта россии
  • Как изменить адрес получения пенсии через госуслуги
  • Как изменить адрес получения на алиэкспресс
  • Как изменить адрес получения карты сбербанка при перевыпуске

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии