На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
> DOS, Borland C и 32 бита.... , Обращение к 32 битному PCI - устройству
    Хаюшки.
    Вобщем тема такая - есть старая добрая программа написанная на Borland C++ 3.1, есть компьютер на котором это все чудно работает под DOS, и появляется новое железо (а конкретно PCI плата ЦАП Advantech PCI-1724) и сразу же появляется вопрос :
    Описание говорит что "эта плата специально разработана для легкого использования с помощью 32 бит комманд" :huh: То есть чтоб задать ей какое то значение есть определенная команда длинною в жизнь... эээ в 32 бита... ;)
    И возник тупик :wall: - реально ли вообще - может с помощью или его (Borland C) средств или ассемблерных вставок сделать вывод 32-битного слова в плату???
    Если все таки реально подскажите как?
      32-битные типы в BC++ 3.1 вроде никто не отменял. Есть библиотека-то какая-нибудь для работы с этой платой?
        Типы то есть, но во внешний порт, коим является PCI - плата как их засунуть?
        На диске шли сишный файлик для работы с PCI, примеры для DOS и Вынь, и dll-ки для винды. В примерах для доса этой платы нету :(
          Цитата vadymko @
          "эта плата специально разработана для легкого использования с помощью 32 бит комманд"

          А конкретнее?
          Цитата vadymko @
          Типы то есть, но во внешний порт, коим является PCI - плата как их засунуть?

          Это не вопрос. Адреса и порты платы можешь узнать с помощью PCI-BIOS.
          Цитата vadymko @
          На диске шли сишный файлик для работы с PCI, примеры для DOS

          Примеры в какую тему?
            В вставках компилятор не узнаёт EAX, но сам tasm от BC3.1 м расширенными регистрами работает.
            Не проверял в работе, но компилируется и линкуется и должно прокатить
            ExpandedWrap disabled
              ; 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
            Подключаешь этот файл к борландовскому проекту и можно юзать типа
            ExpandedWrap disabled
              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);
            Сообщение отредактировано: Adil -
              Цитата 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 м расширенными регистрами работает.
              Не проверял в работе, но компилируется и линкуется и должно прокатить


              А вот это уже интересно, спасибо, попробую...
                Цитата vadymko @
                Вот примеры в инете (500кб), такие же и на диске, но именно на эту плату нет

                Можно подобрать. Например ясно что девайс опознается так:
                ExpandedWrap disabled
                     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 дрова на твою плату.
                  Цитата 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

                  Это все надо загнать одним смыком....
                    Кстати может кто поможет бедному ;) скомпилирует библиотечку 32-разрядным инструментом каким либо что нибудь типа вышеприведенного?
                    Назовем ее типа "Вывод INT32 в порт в DOSе" 8-)
                      Можно. Только уточни какие функции и с какими параметрами нужны. Кстати, а почему бы на ватком Си не попробовать?
                        Функции всего две - ввод/вывод 32 битного слова из/в внешнюю шину.
                        В принципе все это реализовано в приведенном примере.
                        Все красиво реализовано - и передача и обработка 32 бит, единственно
                        меня терзают смутные сомнения, что TASM в строке
                        Цитата Adil @
                        out dx, eax

                        сгенерирует процессору опкод вывода 32-разрядного слова, а не любимого 16-битного :unsure: , хотя вроде по написанию должен :rolleyes:

                        Watcom не применял только изза неприменения ранее ;). Сам специализируюсь на программировании микроконтролеров, поэтому это для меня где то немного чуждая задача навязанная извне :wall:

                        З.Ы. Кстати не судите строго (или обьясните-не спец в ассемблере под ПК), но вот команда
                        ---
                        outport (dwBaseAddr,v_int);
                        ---
                        в сгенеренном ассемблере выглядит:
                        ?debug L 11
                        mov dx,word ptr [bp-8]
                        mov ax,word ptr [bp-4]
                        out dx,ax

                        то есть стек идет в минуса, а в вышеприведенном примере в плюса...
                        Сообщение отредактировано: vadymko -
                          Цитата 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

                          Вот это не сильно понял, это таблица?
                            Цитата vadymko @
                            сгенерирует процессору опкод вывода 32-разрядного слова, а не любимого 16-битного , хотя вроде по написанию должен

                            Ясно. Для режима 16-бит перед коммандами ставится опкод 66h. Например так:
                            ExpandedWrap disabled
                              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-х битные операции с портами.
                              Цитата cppasm @
                              Проблема не в том что не работает 32-битный ввод/вывод, а в том что ты не знаеш протокола общения с устройством.


                              Протокол состоит в банальной низкоуровневой записи в регистр платы по базовому адресу выдаваемому биосом для данной PCI платы. Адрес чудненько получается, а вот реакции на запись не происходит.

                              Цитата cppasm @
                              Вот это не сильно понял, это таблица?

                              нет это побитовая раскладка команды (это то мне как микроконтрольщику и понятнее всего :D ):
                              то есть младшие 14 бит - это значение для ЦАПа
                              потом 2 бита - задают режим его работы
                              следующие 8 бит задают номер канала (их на плате 32 штуки)
                              ну и старшие 8 бит не используются.

                              Значение Offset задает местонахождение этого регистра относительно базового адреса платы (в данном случае 0x00 )
                              Сформированная по этому образу команда и загоняется в этот регистр.
                                Цитата vadymko @
                                Адрес чудненько получается,
                                адрес небось далеко за мегабайтом лежит? а ты в него ещё записывать чего-то пытаешься :)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0469 ]   [ 16 queries used ]   [ Generated: 7.11.24, 10:54 GMT ]