Форум: "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