На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> DOS, Borland C и 32 бита.... , Обращение к 32 битному PCI - устройству
    Цитата archimed7592 @
    адрес небось далеко за мегабайтом лежит? а ты в него ещё записывать чего-то пытаешься

    Вот это на мысли наводит :)
    А плата использует Port IO или Memory Mapped IO?
    И какой адрес получается при чтении из конфигурационного пространства PCI?
      ну раз чудненько получается адрес, то наверное Memory Mapped IO :)
        Цитата AndNot @
        Другой вопрос если само железо не поддерживает 32-х битные операции с портами.

        Ну железо - промышленный комп с гигагерцовым пеньком. И естественно из под винды адвантековскими тестовыми утилитками плата чудненько управляется.
        Я раньше работал с их платами в досе - все чудно шло, но с вордовыми обменами. А с 32 битами вот с первой платой столкнулся...

        Добавлено
        Цитата cppasm @
        И какой адрес получается при чтении из конфигурационного пространства PCI?

        Сейчас точно не скажу - но адрес недалеко, где то что то типа 0x0C00
        Я говорил, что уже работал с этими платами, и с 16 разрядами все работало
          Вот уточнил - базовые адреса плат идут 0xC100, 0xC200 и т.д....
            Цитата vadymko @
            Вот уточнил - базовые адреса плат идут 0xC100, 0xC200 и т.д....
            насколько я понял из примеров на которые ты дал ссылку, под базовым адресом понимается порт в который ты должен писать значения, а не адрес в памяти :) так что out 0c100h, eax тебе в помощь :)
              Цитата archimed7592 @
              ну раз чудненько получается адрес, то наверное Memory Mapped IO

              Это откуда такие выводы?
              Базовый адрес - это базовый адрес.
              Просто адрес относительно которого отсчитываются все адреса регистров устройства.
              Может быть как Port IO, так и Memory Mapped IO.
              Цитата vadymko @
              Вот уточнил - базовые адреса плат идут 0xC100, 0xC200 и т.д....

              Уточнил как?
              Это в PCI conf прописано или ты другими путями какими-то смотрел?
              Вообще дамп конфигурационного пространства PCI этой платы очень бы помог - многое бы прояснилось...
              Снять можно скажем этой утилитой: http://members.datafast.net.au/dft0802/downloads/pci32.zip
              Запускать из консоли как-то так:
              ExpandedWrap disabled
                PCI32.EXE -D>pci.txt

              Отчёт будет в pci.txt, запости сюда, а лучше приаттач.
                Цитата cppasm @
                Это откуда такие выводы?
                Базовый адрес - это базовый адрес.
                :) просто в моём понимание адрес - это адрес, а никак не порт...но как я упомянул выше, судя по исходникам под базовым адресом у них понимается порт...а м. б. и не у них одних :)
                  Базовый адрес - это базовый адрес порта :)
                    Цитата archimed7592 @
                    просто в моём понимание адрес - это адрес, а никак не порт...

                    Ну у тя ж тоже адрес есть, хоть ты и не в памяти живёш ;)
                      Цитата cppasm @
                      Уточнил как?
                      Это в PCI conf прописано или ты другими путями какими-то смотрел?

                      Уточнил собственной программой ;) Пример получения этого адреса присутствует в приведенных примерах и работает для всех карт одинаково. Тут идет работа с обычными вордами и все уже откатано и чудно работает. Тот же адрес показывает и собственная адвантековская утилитка под виндой.
                      Еще раз уточню чтоб вопросов в эту сторону не было - с другими платами этой серии (с теми же платами цифрового ввода/вывода) все работает, то есть и получение адреса, и вывод значений.

                      Цитата cppasm @
                      Снять можно скажем этой утилитой:

                      Как попаду к железу сниму и скину ;)
                        Вот кусок рабочего кода, который я использую при работе с нашими PCI-устройствами. Именно BC31, DOS.
                        ВАЖНО! В настройках проекта поставить Option | Compiler | Advanced code generation | Instruction set -> 80386.
                        ExpandedWrap disabled
                          typedef   signed char schar;
                          typedef unsigned char byte;
                          typedef unsigned short word;
                          typedef unsigned long dword;
                           
                           
                           
                          dword devid  = 0x11112222; // Vendor ID, Device ID
                          dword devno = 0;           // Номер устройства (если несколько)
                           
                           
                           
                          #define outportv(addr,data) _DX = (addr); _EAX = (dword)(data); asm db 0x66; asm out dx,ax;
                          #define _inportd(addr) _DX = (addr); asm db 0x66; asm in ax,dx;
                          #define inportv(addr,v) _DX = (addr); asm db 0x66; asm in ax,dx; v = _EAX;
                           
                          dword inportd(word addr)
                          {
                           _DX = (addr);
                           asm db 0x66;
                           asm in ax,dx;
                           return _EAX;
                          }
                           
                          void outportd(word addr, dword data)
                          {
                           _DX = addr;
                           _EAX = data;
                           asm db 0x66;
                           asm out dx,ax;
                          }
                           
                          //-------------------------------------------------------------
                          // Инициализация устройства
                          //-------------------------------------------------------------
                          void FindDev(void)
                          {
                           _SI = (word) devno;
                           _DX = (word) (devid >> 16);
                           _CX = (word) devid;
                           _AX = 0xB102;
                           asm int 0x1A;
                           if (_AH != 0)
                            {
                           
                           _SI = (word) devno;
                           _DX = (word) (devid1 >> 16);
                           _CX = (word) devid1;
                           _AX = 0xB102;
                           asm int 0x1A;
                           if (_AH != 0)
                            {
                             printf("Ошибка поиска устройства\n");
                             exit(4);
                            }
                            }
                           bx = _BX;
                           
                           _DI = 0x10;
                           _BX = bx;
                           _AX = 0xB108 + 2;
                           asm int 0x1A;
                           if (_AH != 0)
                            {
                             printf("Ошибка чтения устройства\n");
                             exit(4);
                            }
                           bar10 = _ECX;
                           
                           base = bar10 & 0xFFFC;
                           
                           
                           _DI = 0x3C;
                           _BX = bx;
                           _AX = 0xB108 + 0;
                           asm int 0x1A;
                           irq = _CL;
                           
                           if (irq < 8)
                             intno = irq + 0x08;
                           else
                             intno = irq - 8 + 0x70;
                           
                           printf("BAR10 = %08lX, Base = %04X, IRQ = %d\n", bar10, base, irq);
                           if (base == 0)
                             exit(4);
                          }
                          Цитата vmp @
                          typedef signed char schar;
                          Сильно...
                          Внушает.
                            Цитата Adil @
                            Цитата (vmp @ Сегодня, 12:14)
                            typedef signed char schar;
                            Сильно...
                            Внушает.

                            А что делать, если приходится писать и таскать тексты программ между 5 процессорами разных архитектур и с разной длиной слова? И у 4 разных производителей компиляторов разные понятия о типе char - где знаковый, где беззнаковый, где настраивается ключем компилятора.
                              :wub: :wub: :wub:
                              Не подумайте чего плохого :lool:
                              vmp шаман ;)
                              Отцу русской демократии помогло

                              Цитата vmp @

                              ExpandedWrap disabled
                                #define outportv(addr,data) _DX = (addr); _EAX = (dword)(data); asm db 0x66; asm out dx,ax;
                                #define _inportd(addr) _DX = (addr); asm db 0x66; asm in ax,dx;
                                #define inportv(addr,v) _DX = (addr); asm db 0x66; asm in ax,dx; v = _EAX;


                              Не знаю что не так с предыдущими примерами, или что с ними не так делал я, но прокатил только последний вариант. Код х386 стоял в принципе везде, так что на это кивать вроде нечего...

                              Спасибо всем!!!
                                Ну это реально мистика :)
                                Вот это
                                ExpandedWrap disabled
                                  asm db 0x66; asm out dx,ax;
                                и вот это
                                ExpandedWrap disabled
                                  asm out dx,eax;
                                - это одно и то же...
                                Возможно правда с моделью памяти косяк в первом варианте - она на large рассчитана (far вызов).
                                И в чтении порта там ошибка - результат в eax возвращается, а надо dx:ax
                                Сообщение отредактировано: cppasm -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0485 ]   [ 16 queries used ]   [ Generated: 10.02.25, 12:38 GMT ]