Работа с PCI устройствами
Модератор: Модераторы
Работа с PCI устройствами
Никак не получается прочитать данные из PCI устройства (ПЛИС Altera), подключенного к шине PCI.
В устройстве реализована память размером в 1МБайт. При инициализации, BIOS назначает базовый адрес, который успешно считывается функцией PCI BIOS 1Аh. (Находим устройство, читаем конфигурационное пространство). Работаем в защищенном режиме.
Создается селектор, устанавливается базовый адрес дескриптора, равный прочитанному базовому адресу из конфигурационного поля устройства, устанавливается предел в 1МБайт (или ниже для проверки). При попытке считать байты из памяти командой seg_move() возникает Runtime error 216 at $... Назначаемый базовый адрес всегда $EFC00000. Машина - AMD Geode LX800, x86 совместимая.
Причем изредка программа работает, но максимальное смещение, по которому читаются данные - это $FFF, далее все таже ошибка! Что я должен прочитать я знаю! Устройство рабочее, есть альтернативные программы на visual c и ASM.
Уважаемые специалисты, подскажите как быть. Как читать память устройства, а то все примеры - как работать с буфером видеоадаптера или с областью памяти DOS.
(Применительно к FP для GO32v2 Dos extender. Compiler version 2.0.4)
В устройстве реализована память размером в 1МБайт. При инициализации, BIOS назначает базовый адрес, который успешно считывается функцией PCI BIOS 1Аh. (Находим устройство, читаем конфигурационное пространство). Работаем в защищенном режиме.
Создается селектор, устанавливается базовый адрес дескриптора, равный прочитанному базовому адресу из конфигурационного поля устройства, устанавливается предел в 1МБайт (или ниже для проверки). При попытке считать байты из памяти командой seg_move() возникает Runtime error 216 at $... Назначаемый базовый адрес всегда $EFC00000. Машина - AMD Geode LX800, x86 совместимая.
Причем изредка программа работает, но максимальное смещение, по которому читаются данные - это $FFF, далее все таже ошибка! Что я должен прочитать я знаю! Устройство рабочее, есть альтернативные программы на visual c и ASM.
Уважаемые специалисты, подскажите как быть. Как читать память устройства, а то все примеры - как работать с буфером видеоадаптера или с областью памяти DOS.
(Применительно к FP для GO32v2 Dos extender. Compiler version 2.0.4)
Методом "научного тыка"
,я выяснил, что как только я хочу установить базовый адрес дескриптора, превышающий или равный 1МБ (предел дескриптора памяти DOS), то программа вываливается с ошибкой Runtime Error 216 (превышение предела памяти!?). Если ниже 1МБ, то как только, я дохожу до предела 1МБ, при чтении данных, тоже самое - RTE 216. А мне нужен адрес $EFC00000. Как выйти из этой ситуации, незнаю. За ASM садиться неохото, долго код набирать. 
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Дескриптор получаю так:
selector:=allocate_ldt_descriptors(1);
set_segment_base_address(Selector,SelectorBase);
set_segment_limit(Selector,SelectorLimit);
и все.
Разве эта проблема не связана с расширителем DOS (16 bit). Ведь DOS, вроде бы, использует только 1 МБ памяти и я не могу адресовать все адресное пространство в 4 ГБ.
Я считал, что компилируя из FP для GO32 v2 DOS extender, программа пререйдет в защищенный режим и так как это 32битный компиллятор, то я смогу адресовать все пространство без проблем. Судя по всему здесь есть какой-то секрет!
selector:=allocate_ldt_descriptors(1);
set_segment_base_address(Selector,SelectorBase);
set_segment_limit(Selector,SelectorLimit);
и все.
Разве эта проблема не связана с расширителем DOS (16 bit). Ведь DOS, вроде бы, использует только 1 МБ памяти и я не могу адресовать все адресное пространство в 4 ГБ.
Я считал, что компилируя из FP для GO32 v2 DOS extender, программа пререйдет в защищенный режим и так как это 32битный компиллятор, то я смогу адресовать все пространство без проблем. Судя по всему здесь есть какой-то секрет!
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Мда, все функции получения дескриптора просто обращаются к INT 0x31, и имеется комментарий "работает только с настоящим DPMI".
Проблема в том, что Go32 не предоставляет DPMI? Нужно читать документацию... Что-то можно выяснить по значениям, которые возвращают set_segment_base_address() и set_segment_limit() - вроде бы должны TRUE возвращать, если все правильно. Может быть, что-то в самой Go32 подкрутить.
Наконец, если есть рабочая программа на ассемблере (а как она получает дескриптор
), ее не так уж трудно объединить с FPC - либо вставкой отдельных функций в текст, либо линковкой с .obj.
Проблема в том, что Go32 не предоставляет DPMI? Нужно читать документацию... Что-то можно выяснить по значениям, которые возвращают set_segment_base_address() и set_segment_limit() - вроде бы должны TRUE возвращать, если все правильно. Может быть, что-то в самой Go32 подкрутить.
Наконец, если есть рабочая программа на ассемблере (а как она получает дескриптор
А кто выдает мне эту ошибку?
Просто не может такого быть, что код должен работать нормально (я так понимаю, что программа переводит машину в защищенный режим), но отладчик отслеживает обращение программы и выдает сообщение об ошибке. Не знаю почему, но пару раз на экране появлялись верные данные по адресу EFC0 0000h - EFC 0FFF. Но после перекомпиляции адресация дальше мегабайта стала невозможной. Возможно я менял опции компилятора
Просто не может такого быть, что код должен работать нормально (я так понимаю, что программа переводит машину в защищенный режим), но отладчик отслеживает обращение программы и выдает сообщение об ошибке. Не знаю почему, но пару раз на экране появлялись верные данные по адресу EFC0 0000h - EFC 0FFF. Но после перекомпиляции адресация дальше мегабайта стала невозможной. Возможно я менял опции компилятора
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
