Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.14.86] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Хаюшки.
Вобщем тема такая - есть старая добрая программа написанная на Borland C++ 3.1, есть компьютер на котором это все чудно работает под DOS, и появляется новое железо (а конкретно PCI плата ЦАП Advantech PCI-1724) и сразу же появляется вопрос : Описание говорит что "эта плата специально разработана для легкого использования с помощью 32 бит комманд" То есть чтоб задать ей какое то значение есть определенная команда длинною в жизнь... эээ в 32 бита... И возник тупик - реально ли вообще - может с помощью или его (Borland C) средств или ассемблерных вставок сделать вывод 32-битного слова в плату??? Если все таки реально подскажите как? |
Сообщ.
#2
,
|
|
|
32-битные типы в BC++ 3.1 вроде никто не отменял. Есть библиотека-то какая-нибудь для работы с этой платой?
|
Сообщ.
#3
,
|
|
|
Типы то есть, но во внешний порт, коим является PCI - плата как их засунуть?
На диске шли сишный файлик для работы с PCI, примеры для DOS и Вынь, и dll-ки для винды. В примерах для доса этой платы нету |
Сообщ.
#4
,
|
|
|
Цитата vadymko @ "эта плата специально разработана для легкого использования с помощью 32 бит комманд" А конкретнее? Цитата vadymko @ Типы то есть, но во внешний порт, коим является PCI - плата как их засунуть? Это не вопрос. Адреса и порты платы можешь узнать с помощью PCI-BIOS. Цитата vadymko @ На диске шли сишный файлик для работы с PCI, примеры для DOS Примеры в какую тему? |
Сообщ.
#5
,
|
|
|
В вставках компилятор не узнаёт EAX, но сам tasm от BC3.1 м расширенными регистрами работает.
Не проверял в работе, но компилируется и линкуется и должно прокатить ; FILE 'port32.asm' ;32bit input/output function .386p PORT32_TEXT segment byte public use16 'CODE' assume cs:PORT32_TEXT _inpdw proc far push bp mov bp, sp mov dx, word ptr [bp+6] in eax, dx shld edx, eax, 16 ;исправлена ошибка - возвращаться должно через dx:ax - спасибо [b]cppasm[/b] ret _inpdw endp _outpdw proc far push bp mov bp, sp mov dx, word ptr [bp+6] mov eax, dword ptr [bp+8] out dx, eax pop bp ret _outpdw endp PORT32_TEXT ends public _outpdw public _inpdw end extern "C" { unsigned long __cdecl inpdw(unsigned int port); void __cdecl outpdw(unsigned int port, unsigned long value); } unsigned long i = inpdw(25); outpdw(25, i); |
Сообщ.
#6
,
|
|
|
Цитата AndNot @ А конкретнее? The PCI-1724U is delivered with an easy-to-use 32-bit device driver for user programming under the Windows 2000/95/98/ME/XP operating sys- tems. We advise users to program the PCI-1724U using the 32-bit device drivers provided by Advantech to avoid the complexity of low-level reg- istry programming. Вот примеры в инете (500кб), такие же и на диске, но именно на эту плату нет http://taiwan.advantech.com.tw/unzipfunc/unzipfile.asp?File_Id=1%2BFW%2B2428 Базовый адрес естественно я получу от биоса, но по этому адресу мне надо записать 32-разрядное слово, в два смыка (2 ворда со смещением) естественно сразу попробовал - не катит Цитата Adil @ В вставках компилятор не узнаёт EAX, но сам tasm от BC3.1 м расширенными регистрами работает. Не проверял в работе, но компилируется и линкуется и должно прокатить А вот это уже интересно, спасибо, попробую... |
Сообщ.
#7
,
|
|
|
Цитата vadymko @ Вот примеры в инете (500кб), такие же и на диске, но именно на эту плату нет Можно подобрать. Например ясно что девайс опознается так: iErrCode = find_pci_device( 0x1724, 0x13fe, 0, &ucBusNumber, &ucDevAndFunc ); if (iErrCode == NOT_SUCCESSFUL ) { printf("\nPCI-1724 search fail.\n"); exit(1); } // //Get base address, from PCI base address range 2 // iErrCode = read_configuration_dword( ucBusNumber, ucDevAndFunc, PCI_CS_BASE_ADDRESS_2, &dwData); if (iErrCode == NOT_SUCCESSFUL) { printf("\nPCI-1724 gets base address fail.\n"); exit(1); } else dwBaseAddr = dwData & 0xfffffffc; Это уже не мало. Далее можешь попытаться сделать как и для модели 1720. Скорее всего разница у них не очень большая, можно и в кон попасть. Или дизассмить VxD дрова на твою плату. |
Сообщ.
#8
,
|
|
|
Цитата vadymko @ В вставках компилятор не узнаёт EAX, но сам tasm от BC3.1 м расширенными регистрами работает. Не проверял в работе, но компилируется и линкуется и должно прокатить С сожалением приходится констатировать - не прокатило Результат тот же когда я работал обычным 16-разрядным outport-ом, то есть нулевой Цитата AndNot @ Можно подобрать. Например ясно что девайс опознается так: Ну это то как раз единственное что и работает.. Так как относится скорее не к самой плате а к PCI вообще... а дальше уже идет конкретика платы.... Вот оттуда же из руководства - команда выглядит так: Offset___________PCI-1724U Register Format Address____D31~D24_____D23~D16_____D15__D14__D13~D0 0x00_________N/A____Group/Channel___REG1_REG0___DAC ______________________Select Bit________________Data ______________________________________________Code Это все надо загнать одним смыком.... |
Сообщ.
#9
,
|
|
|
Кстати может кто поможет бедному скомпилирует библиотечку 32-разрядным инструментом каким либо что нибудь типа вышеприведенного?
Назовем ее типа "Вывод INT32 в порт в DOSе" |
Сообщ.
#10
,
|
|
|
Можно. Только уточни какие функции и с какими параметрами нужны. Кстати, а почему бы на ватком Си не попробовать?
|
Сообщ.
#11
,
|
|
|
Функции всего две - ввод/вывод 32 битного слова из/в внешнюю шину.
В принципе все это реализовано в приведенном примере. Все красиво реализовано - и передача и обработка 32 бит, единственно меня терзают смутные сомнения, что TASM в строке Цитата Adil @ out dx, eax сгенерирует процессору опкод вывода 32-разрядного слова, а не любимого 16-битного , хотя вроде по написанию должен Watcom не применял только изза неприменения ранее . Сам специализируюсь на программировании микроконтролеров, поэтому это для меня где то немного чуждая задача навязанная извне З.Ы. Кстати не судите строго (или обьясните-не спец в ассемблере под ПК), но вот команда --- outport (dwBaseAddr,v_int); --- в сгенеренном ассемблере выглядит: ?debug L 11 mov dx,word ptr [bp-8] mov ax,word ptr [bp-4] out dx,ax то есть стек идет в минуса, а в вышеприведенном примере в плюса... |
Сообщ.
#12
,
|
|
|
Цитата vadymko @ то есть стек идет в минуса, а в вышеприведенном примере в плюса... Ну это кому как нравится. Просто всё зависит от того куда указывает bp. А по поводу темы в общем - приведённые выше процедуры 100% рабочие. И tasm всё нормально откомпилирует. Проблема не в том что не работает 32-битный ввод/вывод, а в том что ты не знаеш протокола общения с устройством. Цитата vadymko @ Offset___________PCI-1724U Register Format Address____D31~D24_____D23~D16_____D15__D14__D13~D0 0x00_________N/A____Group/Channel___REG1_REG0___DAC ______________________Select Bit________________Data ______________________________________________Code Вот это не сильно понял, это таблица? |
Сообщ.
#13
,
|
|
|
Цитата vadymko @ сгенерирует процессору опкод вывода 32-разрядного слова, а не любимого 16-битного , хотя вроде по написанию должен Ясно. Для режима 16-бит перед коммандами ставится опкод 66h. Например так: dword inportd (port: word) { asm { mov dx, [port] db 66h in ax, dx } } outportd (port: word; num: dword) { asm { db 66h mov ax, word ptr [num] mov dx, [port] db 66h out dx ,ax И так далее, таким макаром. Так что внешние модули не нужны. Другой вопрос если само железо не поддерживает 32-х битные операции с портами. |
Сообщ.
#14
,
|
|
|
Цитата cppasm @ Проблема не в том что не работает 32-битный ввод/вывод, а в том что ты не знаеш протокола общения с устройством. Протокол состоит в банальной низкоуровневой записи в регистр платы по базовому адресу выдаваемому биосом для данной PCI платы. Адрес чудненько получается, а вот реакции на запись не происходит. Цитата cppasm @ Вот это не сильно понял, это таблица? нет это побитовая раскладка команды (это то мне как микроконтрольщику и понятнее всего ): то есть младшие 14 бит - это значение для ЦАПа потом 2 бита - задают режим его работы следующие 8 бит задают номер канала (их на плате 32 штуки) ну и старшие 8 бит не используются. Значение Offset задает местонахождение этого регистра относительно базового адреса платы (в данном случае 0x00 ) Сформированная по этому образу команда и загоняется в этот регистр. |
Сообщ.
#15
,
|
|
|
Цитата vadymko @ адрес небось далеко за мегабайтом лежит? а ты в него ещё записывать чего-то пытаешься Адрес чудненько получается, |