Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

Работа с портом с конкретным адресом. Запись и чтение   Найти похожие ветки 

 
Velimir ©   (2006-04-24 14:18) [0]

Собсно сабж!
Какими в дельфи есть встроенные функции для работы с портом, если у меня есть адрес этого порта...
Хотелось бы найти аналог outport и inport из С.

Сорри если вопрос очень тупой, но я нигде не нашел этих функций... Действительно, как-то тормозом себя чуствую...
Заранее всем спасибо за помощь!


 
MBo ©   (2006-04-24 14:27) [1]

>аналог outport и inport из С
В NT-системах это не работает и в C - прямой доступ к портам запрещен.
Есть специальные драйвера - giveio, WinIO, UserPort и т.д.


 
Velimir ©   (2006-04-25 08:24) [2]

Огромное спасибо за помощь! А то я уже думал, что у меня крыша поехала =)


 
Anatoly Podgoretsky ©   (2006-04-25 09:11) [3]

Velimir ©   (24.04.06 14:18)  
Аналог простой
asm
 IN AL, port
 OUT port, AL

Только ведь дело не в этом, точно также outport и inport не работоспособны даже на Win 3.1 кроме некоторых случаев.


 
isasa ©   (2006-04-26 10:43) [4]

А чем CreateFile обидел?


 
!Fobos ©   (2006-04-28 10:39) [5]

Человеки, у меня та же трабла: нада организовать раюоту с ISA шиной. Мож подскажете, как мона сделать? Заранее благодарю!


 
Сергей М. ©   (2006-04-28 11:18) [6]


> раюоту с ISA шиной


Что есть "работа с ISA шиной" ?


 
!Fobos ©   (2006-04-28 13:07) [7]

Есть плата, которая вешается на ISA шину компа. Надо считывать с нее данные.


 
Сергей М. ©   (2006-04-28 13:31) [8]


> !Fobos ©   (28.04.06 13:07) [7]


> плата, которая вешается на ISA шину компа


Нет никакой разницы, куда она, эта плата, "вешается".

С т.з. процессора и программы существуют порты ввода-вывода (в т.ч. отображенные на пространство адресуемой памяти).


 
Чапаев ©   (2006-04-28 14:48) [9]


> в т.ч. отображенные на пространство адресуемой памяти

Пример можно? Звучит знакомо, а где применяется, не припомню...


 
Сергей М. ©   (2006-04-28 14:58) [10]


> Пример можно?


Можно.

К примеру, эквивалентом

out $XX, $YY

при этом будет

mov [someaddr], $yy


 
Чапаев ©   (2006-04-28 15:12) [11]

Нет, это мне понятно. :-)

Мне хотелось бы узнать о конкретном устройстве, порты которого отображены в память.


> где применяется, не припомню


 
!Fobos ©   (2006-05-02 09:18) [12]


> Сергей М. ©   (28.04.06 13:31) [8]


А можно узнать, как в Делфи считывать данные с порта? Если можно, примерчик....вроде как для того используется CreateFile или я ошибаюсь...


 
Сергей М. ©   (2006-05-02 11:44) [13]


> Чапаев ©   (28.04.06 15:12) [11]


В kernel-mode-драйверах, например, видеокарт.


 
!Fobos ©   (2006-05-03 08:33) [14]


> Сергей М. ©   (28.04.06 13:31) [8]

Если конкретнее, то есть плата, на которой имеется кэш-память объемом 32 Кб. Адрес известен: $300. Нужно считывать с нее данные в массив. Есть прога на Паскале, но там это более-менее понятно организовано. Прога работает под Win95. Перевожу прогу на Делфи и столкнулся с такой вот проблемой. Понятно, что под XP проектировать её не стоит, т.к. шина Isa, под которую собрана плата, в современных компах отсутствует.


 
isasa ©   (2006-05-03 10:49) [15]

Насколько помню, CreateFile работает с именем, а не с адресом.

CreateFile("\\.\<зарегистрированное в системе имя девайса>", ...)


 
!Fobos ©   (2006-05-03 14:12) [16]


> isasa ©   (03.05.06 10:49) [15]

А по моей проблеме ты ничего не знаешь?

Здесь есть кто-нить, кто может мне помочь? Неужели никто такими вещами не занимался??? (помогите бедному лузеру %))


 
isasa ©   (2006-05-03 14:33) [17]

!Fobos ©   (03.05.06 14:12) [16]

У тебя что, секретный девайс, у которого нет имени в системе? :)


 
isasa ©   (2006-05-03 14:36) [18]

:)
В противном случае надо опускаться до уровня зарегистрированных служб(драйверов).


 
!Fobos ©   (2006-05-04 08:13) [19]


> У тебя что, секретный девайс, у которого нет имени в системе?
>  :)


Хм..., ну доберусь до компа с этим девайсом посмотрю как он там называется (раньше об этом не задумывался).
Интересно, а как обзывается девайс в системе, если он собран своими руками?


 
Сергей М. ©   (2006-05-04 08:41) [20]


> !Fobos ©   (04.05.06 08:13) [19]


> как обзывается девайс в системе, если он собран своими руками?


Если дивайс "собран своими руками", то первое что должно прийти в голову - написание драйвера этого дивайса под требуемую ОС. Драйвер этот должен быть полноценным драйвером, отвечающим всем требованиям WDM.

См. NT DDK.


 
!Fobos ©   (2006-05-04 12:51) [21]


> Сергей М. ©   (04.05.06 08:41) [20]


> isasa ©   (03.05.06 14:36) [18]


Ребят, я не большой спец в этих делах и может чего-нить не понимаю, но мне кажется, что прога, которая работает с этой платой, и есть драйвер для нее. По-моему мы уходим от темы. Я просто пытаюсь выяснить, как в Делфи обращаться к портам I/O.


 
Сергей М. ©   (2006-05-04 13:08) [22]


> прога, которая работает с этой платой, и есть драйвер для
> нее


Может и "драйвер". Но не с т.з. Windows.


> как в Делфи обращаться к портам I/O


С портами должен работать kernel-mode-драйвер, в дан. случае тобой разработанный.


 
Elen ©   (2006-05-04 13:15) [23]


>!Fobos ©

Поищи компоненты работы с портом. А вообще помоему CreateFile и вариант с ассемблером (см. выше) лучше не придумаеш для Делфи


 
Сергей М. ©   (2006-05-04 13:18) [24]


> вариант с ассемблером (см. выше)


Где там, "выше", про ассемблер ?


 
Elen ©   (2006-05-04 13:19) [25]


>!Fobos ©

Поищи компоненты работы с портом. А вообще помоему CreateFile и вариант с ассемблером (см. выше) лучше не придумаеш для Делфи


 
krid24 ©   (2006-05-04 13:26) [26]


> Если дивайс "собран своими руками", то первое что должно
> прийти в голову - написание драйвера этого дивайса под требуемую
> ОС

Для ISA платы это не обязательно.


>  как в Делфи обращаться к портам I/O.

Это от системы зависит, а не от языка. А вообще, во втором посте уже ответили - ищешь в инете драйвер giveio.sys (например), из проги его динамически загружаешь, обращаешься к портам асмовыми in и out, потом драйвер выгружаешь. Все. Ну это для NT, а в Win9x можешь напрямую in/out юзать.


 
Сергей М. ©   (2006-05-04 13:32) [27]


> krid24 ©   (04.05.06 13:26) [26]


> Для ISA платы это не обязательно.


Глупости.
Столь же "необязателен" драйвер для любого другого периферийного дивайса на любой другой шине.


> из проги его динамически загружаешь, обращаешься к портам
> асмовыми in и out


А потом запускаешь еще косой десяток оных "прог", и все они наперегонки начинают выполнять свои IN и OUT к одному и тому же порту. Бардак-с) ..


 
krid24 ©   (2006-05-04 15:14) [28]


> Глупости.
> Столь же "необязателен" драйвер для любого другого периферийного
> дивайса на любой другой шине.

Ничего подобного. Не надо все мешать в одну кучу. Речь идет о конкретных платах. Я сам работал не с одной ISA платой, которые не требовали никаких драйверов и управлялись только через порты. И есть девайсы, которые в обязательном порядке требуют драйверов, садятся на прерывания, etc.


> А потом запускаешь еще косой десяток оных "прог", и все
> они наперегонки начинают выполнять свои IN и OUT к одному
> и тому же порту. Бардак-с) ..

Ну по этой логике тот же DOS вообще бы не работал :) На самом деле никакого бардака не будет. Во-первых, несколько инструкций IN одновременно не выполнишь ). Во-вторых, во многих платах предусмотрены задержки после выполнения операций, связанных с доступом к ним по портам. В-третьих, такие же задержки предусматривают и в программах (в тех же драйверах). Так, что возможный бардак зависит не от возможности обращаться к портам, а от кривых рук разработчиков )
Ну а тот же драйвер giveio может спокойно обслуживать все процессы в системе, будь их десяток или сотня.


 
Wal ©   (2006-05-04 15:30) [29]


> Ну по этой логике тот же DOS вообще бы не работал
Дос был однозадачным в доску, в отличие от виндовса.

> Так, что возможный бардак зависит не от возможности обращаться
> к портам, а от кривых рук разработчиков
Вот поэтому разработчики с прямыми руками всегда предоставляют драйвера.

> Я сам работал не с одной ISA платой
Я тоже работал не с одной платой, и не только ISA. В ДОСе без всяких драйверов. В винде тоже можно без драйверов с тем же giveio, но это "костыли", а не нормальная работа.


 
Сергей М. ©   (2006-05-04 15:30) [30]


> krid24 ©   (04.05.06 15:14) [28]


Ты несешь несусветицу, видимую тобой лишь с твоей колокольни.


 
krid24 ©   (2006-05-04 20:51) [31]

Да с какой моей колокольни-то?
Если есть ISA плата, которая (упрощенно) в один порт принимает параметры сигнала, в другой код старта и начинает непрерывно этот сигнал генерить до тех пор, пока не получит код останова, то на кой ей драйвер-то нужен? Писать для какого-нибудь простейшего генератора сигналов WDM?? Ну-ну.. Нужно тогда уж еще и в Microsoft драйвер оттестировать и цифровую подпись получить..
А ведь большое колличество самопальных ISA плат, сделаных для внутреннего пользования, являются чем-то подобным. И именно их я и имел ввиду (а не сплошь и рядом все девайсы подряд, о чем, кстати, говорил).
Так что, не соглашусь с уважаемыми оппонентами -  никаких драйверов для такого рода плат не нужно по-определению. В них просто нет необходимости.
Впрочем, автор вопроса не сказал, что у него за плата, так что спор по сути дела безпредметный получается.


 
!Fobos ©   (2006-05-05 08:04) [32]


> krid24 ©   (04.05.06 20:51) [31]

Согласен с тобой. Для "моего" устройства не было написано драйвера (еще раз повторюсь, что не я изначально разрабатывал плату и софт). Есть только программа, обслуживающая плату.
А что тебя конкретно интересует по плате? Это устройство сбора данных. Как уже писал выше, чтение производится из кэш-памяти по адресу $300.


 
Сергей М. ©   (2006-05-05 08:22) [33]


> krid24 ©   (04.05.06 20:51) [31]


Ну а причем здесь ISA ?
Все тоже самое настолько же справедливо для любого другого дивайса на любой другой шине ..

И WinAPI здесь тоже ни причем, пока речь не идет о взаимодействии с драйвером дивайса документированным способом (CreateFile, Read/WriteFile, DeviceIOControl).


 
!Fobos ©   (2006-05-06 08:22) [34]

Мда...думаю, что здесь мне никто ничем конкретным не поможет...((
Процедурку чтения из порта (а также процедурку записи управляющего слова) я написал  на ассемблере, научил винду ХР-шную не ругаться на асм-вставки (не смейтесь надо мной:))). Вроде что-то читается, но почему то кажется, что читается не то, что нужно. Может ли кто объяснить, как, вызывая чтение из кэш-памяти в массив 32000 раз можно забить весь массив значениями, а точнее откуда она (кэш-память ну или что там за это отвечает) знает, что при каждом следующем обращении к ней мне надо считать следующий байт?
Вы уж извините, если я задаю глупые вопросы....программер из меня не ахти...


 
Сергей М. ©   (2006-05-06 09:06) [35]


> !Fobos ©   (06.05.06 08:22) [34]


Приводи код.


 
!Fobos ©   (2006-05-06 14:48) [36]


> Сергей М. ©   (06.05.06 09:06) [35]


Вот две процедурки работы с портом:

procedure DataIn(PortAddress:word);

var
 ByteValue:byte;

begin
  asm
   push dx
   mov dx, PortAddress
  end;
  for i:=0 to 32767 do
     begin
       asm
       in al,dx
       mov ByteValue,al
       end;
       Data[i]:=ByteValue;
     end;
  asm
   pop dx
  end;
end;

procedure DataOut(ByteValue:byte;PortAddress:word);

asm
 push dx
 mov dx,PortAddress
 mov al,ByteValue
 out dx,al
 pop dx

end;

Запуская программу в пошаговом режиме и следя за массивом Data я заметил, что вне зависимости от того, к какому порту я обращаюсь, этот массив забивается практически одними и теми же значениями...
Плюс еще в первоначальной проге используются 2 порта с адресами $20 и $21. Что за порты, ума не приложу, возможно они испоьзуются для обработки прерываний...


 
Сергей М. ©   (2006-05-06 15:53) [37]

procedure DataIn(PortAddress:word);
var
ByteValue:byte;
Addr: Word;
begin
 Addr := PortAddress; //параметр PortAddress передается через eax, запомним его в лок.переменной
 for i:=0 to 32767 do
    begin
      asm
       push eax
       push edx        
       mov dx, Addr
       in al,dx
       mov ByteValue,al
       pop edx
       pop eax
      end;
      Data[i]:=ByteValue;
    end;
end;

procedure DataOut(ByteValue:byte;PortAddress:word);
asm
//ByteValue передается в eax
//PortAddress - в edx
out dx,al
end;


> массив забивается практически одними и теми же значениями


А где написано, что должен разными ?
Док-ция на дивайс от производителя имеется ?


 
krid24 ©   (2006-05-06 18:14) [38]


> Ну а причем здесь ISA ?

Да вобщем-то ни причем, просто !Fobos говорил про плату на ISA шине.


> Плюс еще в первоначальной проге используются 2 порта с адресами
> $20 и $21. Что за порты, ума не приложу, возможно они испоьзуются
> для обработки прерываний...

В принципе да, эти порты используются при программировании контроллера прерываний.


 
isasa ©   (2006-05-07 11:46) [39]

Умные дадьки и тетки карячились, думали, как заставить это железо одновременно читать порт, слушать музыку, ограть в Blitzkriag ... а ты со своими командами :)
В, общем, выхода два:
1. Послать дядек и теток, загрузить Win98 и ниже, и наслаждаться.
2. "Вписать" работу с железом в требования дядек и теток(т.е. на уровне драйверов), и работать через CreateFile.


 
!Fobos ©   (2006-05-10 08:17) [40]


> Сергей М. ©   (06.05.06 15:53) [37]


Документации на девайс нету, разве что дипломная работа.
Массив, как мне кажется, забивается разными значениями, т.к., синусоиду, к примеру, прога рисует нормально(то есть она синусоида, а не прямая линия).
На данный момент проблема именно в считывании сигнала с порта(кэш-памяти), остальное все уже практически переписал для Делфи. Сейчас програма что-то считывает, но это явно не тот уже хотя бы потому, чьл какой бы я номер порта не ставил, картинка выглядит одинаково. На паскалевском варианте программы написана процедура обработки прерывания. Как перевести её на Делфи я пока понятия не имею, но мне кажется что проблема сейчас именно в этом.



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.04 c
2-1156749497
GeneralMotors
2006-08-28 11:18
2006.09.17
Пробудить комп


2-1156911310
Sirus
2006-08-30 08:15
2006.09.17
Контроль введенных значений в DBGRID-e


15-1156718025
impuls
2006-08-28 02:33
2006.09.17
Исходники TeeChartPro7


5-1139387480
WellSlava
2006-02-08 11:31
2006.09.17
компонеты Raize


1-1154988125
Яков
2006-08-08 02:02
2006.09.17
Boolean поле(нужна помощь, сроки поджимают, горю!)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский