Перейти к содержанию
    

Mavric84

Участник
  • Постов

    51
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Mavric84


  1. А как выполняется обработка прерывания? Особенно интересует заключительная часть.

     

    Подозреваю, что проблема связана с неправильной работой с котролером прерываний (клон 8259A), установленном на системной плате. Этому контролеру требуется указать, прерывание обработано, для того, чтобы снова разрешить обработку данного вида прерываний. Обычно делается это записью команды "nonspecific EOI" (с кодом 0x20) в порт 0x20. Если PCI прерывание находится на старших векторах (от 8 до 15), то команду нужно посылать на оба PIC-а (второй расположен по адресу 0xA0).

     

    Да это уже мне подсказали, спасибо.

     

    Но загвостка вся в том что, по словам программиста, записи по этим портам в 8259 производяться в ДОСе, а в МСВС это встроенно в систему (что исключает потребность производить данный операции с 8259)... но это мы еще проверим..

  2. Вообще-то в обработчике прерываний нужно еще кое-какие манипуляции с хостовым контроллером прерываний делать, в ПС это что-то I8259 подобное. Мышкин обработчик это делает, поэтому хостовый контроллер перевзводится, а Ваш обработчик, судя по Вашим описаниям, этого не делает.

    Если Вам нужно, то стукните в личку - пошлю пример для Win98.

    Стукнулся...

    Самое интересное что плата на PLX кирпиче работает с этим же самым драйвером нормально.

    Забыл ОС МСВС 3.0

  3. Дык, уже было сказано что прерывание в данной системе shared судя по всему и с мышкой в том числе, обработчики вызываются по цепочке, где они должны определять свой это intr или нет. глюк у Вас в софте, так как выставленный intr осцилом виден всегда.

     

    Хм... не понятно почему он даже к обработчику прерываний не обращается((

     

    Будем думать...

     

    Спасибо за советы.

  4. Решает ситуацию буфер с тремя состояниями. Вход данных заземляете, на вход разрешения подаете Ваш сигнал.

     

    Так и делал... ((( думал есть другой вариант(( все равно спасибо.

  5. Насчет отдельного примитива - не уверен.... Но ведь есть двунаправленные буферы... А значит есть и высокоимпедансное состояние.

     

    Например на VHDL

    entity open_drain is
    port(
      di : in std_logic;
      do : out std_logic
    );
    end entity;
    
    architecture behavioral of open_drain is
    begin
    
    with di select
        do <= '0' when '0',
        'Z' when others;
    
    end behavioral;

     

    Может конечно напутал чего.... Но примерно так.

     

     

    Что то не пойму про буферы?? мне нужен вывод с О.К.... вы хотете сказать что двунаправленный буфер решит ситуацию?? :05:

  6. Исходя из большого количества вопросов, попробую описать ситуацию более подробнее(прошу прощения заболел, в связи с этим могу подтормаживать, сильно не пинать)

     

    Имеется плата PCI, построен на ПЛИСе SPARTANe II (своей разработки), на нем сделан PCI контроллер, сей девайс подключается к внешнему интерфесу ВВОДА-ВЫВОДА. Чтение, запись в канал ввода-вывода осуществляется через пространство I/O. Чтение, запись работают норм. При приходе из канала ввода-вывода некой команды, выставляется прерывание, INT#A опускается в 0, вызывается обработчик прерываний который, читает определенный регистр в котором отражено что прерывание выставило именно это устройство, прерывание сбрасывается и выполняется некая команда.

    Если через некоторое время из канала приедет опять команда... то мой контроллер опять выставит прерывание на линии но обработчик почему то не вызывается такое ощущение что он просто не видит его??? смотрю на контакт INT#A он в 0, ..... система не виснет... стоит пошевелить мышкой как прерывание обрабатывается и сбрасывается и команда проходит.

     

    Как узнаю что не входит в обработку прерывания? вывожу на экран строчку типа "прерывание пришло" и вторую строчку вывожу после того как прочитаю регистр подтверждения прерывания "мое прерывание"... прерывание без шевеления мышки или нажатия клавиш на клавиатуре срабатывают ровно через раз.... вот такая ситуация...

  7. А как определяется, что свое или нет? На Xilinx идет эксклюзивное прерывание (оно не шарится ни с одним внутренним прерыванием (Может как-раз они с мышью и шарятся))?

    Не выходит из обработчика говорите, а как девайс узнает, что его прерывание отработано? Для этого надо прочитать (записать) соответствующий регистр девайса PCI.

    Осциллографом смотрели, что на шине творится или нет? А еще лучше логический анализатор цепануть или на Xilinx-e его реализовать, если есть свободные выводы...

     

     

    Свое не свое определяется путем чтения регистра в пространстве и.о.

     

    А можно поподробнее про это ЭКСЛЮЗИВНОЕ ПРЕРЫВАНИЕ(первый раз слышу)...(((

     

    Не, не выходит...., а НЕ ВХОДИТ в обработчик!!!

     

    прерывание установленно и в регистре 6 записанно 0х01 когда обработчик прочитал этот регистр он увидел что записано 0х01(это означает что прерывание выставленно именно этим устройством) и сбрасывает прерывание и очищает этот регистр.

  8. Вы пользуетесь готовым контроллером PCI в Xilinx или сами писали?

    Вопрос - где косяк? В железе или в драйвере?

    Насколько я знаю, необходимо сделать чтения из Xilinx-а, что бы сбросить прерывание (Оно проходит?). Лучший способ - тест, типа чтения регистра по прерыванию. Осциллограф на шину, и каждые 2 сек генерить прерывание, а драйвер сбрасывает его. Тогда все видно будет (Мы лично так отлаживались).

     

    А мышь - всего лишь событие (мне так кажется), которое заставляет софт шевелиться... Кто знает, что там в это время творится...

     

     

    Писали сами,

     

    Простите но немного не понимаю про чтение из XILINX??? для чего чтение??? на втором разе даже в обработчик прерывания не попадает(в то время как прерывание выставлено)

     

    для отладки добавлены две строки, первая после обработчика( что бы видеть что увидели прерывание), а вторая после строчек чтения регистра(определения свое или не свое прерывание)

  9. Устройство пси ставит INTA низкий уровень, который так и стоит низкий до сброса обработчиком в драйвере этого устройства. Если прерывание формируется правильно (что сомнительно), то копайте в своем драйвере.

    Причем тут мышка - сложно сказать.

     

     

    Да устройство первый раз поставило прерывание, драйвер увидел, прочитал доп. регистр, понял что свое прерыванием сбросил его. ВСЕ. но если опять повторить такое то прерывание выставиться и будет стоять до тех пор пока я не пошевелю мышкой(((.... при следующем разе опять все норм пройдет(без шевеления мышки)... след. раз опять будет висеть до мышиного шевеления(или нажатия на клаву)

     

    А что делает драйвер по приходу прерывания? Xilinx подключен шиной к х86 процессору? Читаете ли Вы какой либо регистр или область памяти в Xilinx по приходу прерывания или нет?

     

    (К сожалению не я пишу программу) вызывается обработчик прерывания... читатет регистр, понимает что его прерывание, сбрасывает его... на след раз что бы прокатило... нужно пошевелить мышкой... а еще через раз опять все норм...

     

    Xilinx является мостом шина ввода\вывода to PCI )

     

    Получается так. 1 прерывание проходит, 2 не проходит, 3 проходит 4 не проходит и.т.п. но если сделать вот так

     

    1-е прерывание проходит,(пошевелил мышкой) 2-е проходит, 3-е проходит, пошевелил мышкой, 4-е проходит

  10. Прерывание драйвер Вашего устройства должен сбрасывать в обработчике прерывания. как сбрасывать - см. доку на контроллер пси Вашего устройства.

     

    Контроллер своей разработки...(написал же вроде SPARTAN_2) драйвер просто не видит что выставленно прерывание...(сброс прерывания срабатывает.. исходя из того что первое прерывание отрабатывает..) стоит пошевелить мышкой и оно срабатывает...(причем тут мыша ума не приложу((м )

  11. Собстна трабл,

     

    Плата PCI_33_32 на спартане2, при подаче команды через внешнюю шину, на девайс , PCI девайс выставляет прерывание, собстна все так и происходит но до перврого раза....

    Пример...

     

    С внешней шины пришла команда-> PCI выставил прерывание-> прерывание отработало, (не трогая мышку и клаву) пытаемся еще раз передать команду на устройство, но теперь все затыкается.... причем не виснет(прерывание на PCI разъеме стоит) такое ощущение что обработчик прерываний его просто напросто не видит.... и стоит дотронуться до мышки и о ЧУДО прерывание срабатывает(увидело, распознало что свое и сбросило))

     

    Кто что может сказать??

  12. Если результаты моделирования нормальные - следующий этап - посмотреть, что творится на шине. Для этого можно воспользоваться замечательным средством под названием ChipScope Pro, с помощью которого можно захватить сигналы на шине в нужный момент и посмотреть, что выдается на шину.

     

    Спасибо....... сейчас попробую...

  13. Пардон, я уже переключился на него. :)

    Вернемся к одному из исходных вопросов - Вы свой Target моделировали?

     

     

    :) Бывает.......

     

    Да...

    Начиная от конфигурирования, заканчивая обращением к портам I/O, результаты моделирования вроде нормальные(не гуру... но все же)

  14. На первый взгляд все в порядке. Но на мысли наводит то, что Вы используете PLX9050, который может быть настроен совершенно по-разному. Например, у него может быть включен Prefetch для используемого Вами региона, который некорректно обрабатывается на локальной шине PLX. Запись может приводить к тому, что буфер Prefetch'a для чтения сбрасывается и мост еще раз производит чтение - на этот раз уже правильно.

     

    Каковы настройки моста и его локальной шины? Думаю, что копать нужно в этом направлении.

     

    Немного не понял.....(((

    Про ПЛХ9050, я имею ввиду что он работает нормально.......

    Данная проблема(с записями FF) проявляется на Target(e) собственной разработки (Spartan2)

  15. О чем я и говорил: эти строки к Вашему устройству ни коим образом не относятся (это соощения подсистемы блочного ввода/вывода).

    Вы цитируете вывод этой программы или по памяти его перепечатываете?

    На подозрения наводит "Latensy" и базовые адреса пространства ввода/вывода, у которых младший байт не равен 00.

    Вот бы еще увидеть, что именно Вы в ней делаете (код) и каким образом получаете адреса и обращаетесь по ним...

     

    PS: Если честно, то наше общение выглядит так, как будто бы я Вас пытаю, а не хочу помочь. Короче говоря - если хотите помощи, давайте исчерпывающую информацию, исходные данные.

     

    Базовые адр. конечно с 00(d800 и dc00 соотв.(просто переписывал))

    Программа отлажена на PLX9050

    Программа не моя... пишет программист-начальник... она отлажена, как уже писал на plx9050

     

    printk("\n ------------PCI present-----------\n");

    // ПРТЕДЕМСЕН ОБМЙЮЙЕ БДБРТЕТБ бул32

    ret_val=pcibios_find_device(0x1393,0x1680,0,&busnum,&devnum);

    if(ret_val == PCIBIOS_SUCCESSFUL)

    printk("\nret=%d busnum=%d devnum=%d",ret_val,busnum,devnum);

    else {

    printk("\n ADAPTER NOT FOUND ...ended... \n");

    return 1;

    }

    //ЮЙФБЕН ЛПЖЙЗХТБГЙА БДБРФЕТБ бул

    //Vendor_id Device_id

    pcibios_read_config_dword(busnum,devnum,0,&val1);

    printk("\n Device_id & Vendor_id =%x",val1);

     

    //---------------------------------------------------------------------------------------------

    //ВБЪПЧЩК БДТЕУ 0

    pcibios_read_config_dword(busnum,devnum,PCI_BASE_ADDRESS_0,&val1);

    printk("\n Bas.Adr.0 =%x",val1);

    if((val1 & 0x1) == 0x1) {

    //ЬФП РПТФЩ МПЛБМШОЩЕ

    reg00=val1-1;

    }

     

    //ВБЪПЧЩК БДТЕУ 1

     

     

    /*обращение к портам*/

     

    //outb(0xff,reg0+4);

    //outb(0xff,reg0+2);

     

    temp1=inb(reg0+4); /* константа которая должна чиаться по 4 адресу(читаю ... */

    printk("\nREG4==%X\n",temp1); /* путем открывания буферов) прочитается она если только */

    /* по 4 адр. прописать предварительно FF

     

    outb(0x55,reg0+4); /* в порт и.о. по 4 адресу пишем 55 и через передатчик по кольцу заводим на*/ temp1=inb(reg0+2); /* приемники и читаем по 2 адресу... все прочитается, если перед записью в */

    printk("\nREG2==%X\n",temp1); /* 4 поставить запись во 2 регистр этих самых FF

     

    //outb(0xff,reg0+4); /* */

    temp1=inb(reg0+4); /* так же прочитается константа если раскоментровать строку выше*/

    printk("\nREG4==%X\n",temp1);

     

     

    return 1;

  16. Согласитесь, строка немного оторвана от контекста... :)

    Поэтому она может относиться к чему угодно - сказать что-либо определенное в этом случае сложно.

    А еще лучше и результаты dmesg приведите. После этого, если Вы дадите пример Вашей программы, можно будет уже сказать что-нибудь более определенное.

     

    /dmseg

    ...

    blk: queue c0358740, I/O limit 4095Mb (mask 0xFFFFFFFF)

    ...

     

    /proc/pci

     

    Bus 0, dev 1, func. 0:

    Miltimedia controller: Moxa tehnologies Co Ltd Smartio c16 H/PCI

    irq 9

    Master, Latensy=80

    I/O at 0xd87f

    Non prefetchable 32 bit memory at (0xe70010ff)

    I/O at 0xDC1f

     

    МСВС 3.0

     

    программа выполнена в виде модуля в котором и организованно обращение к регистрам...

    outb...

    inb..

    printk

    3 оператора, ничего другого нет....

  17. Сочувствую. Однако у меня под этой же самой системой при работе с PCI в части пространства ввода/вывода из-под пользовательского приложения (iopl + inw и т.п.) и из-под драйвера (модуля ядра) никаких проблем не наблюдалось. Работал со множеством разных устройств.

    Лето, телепаты в отпусках. :crying: Остались простые люди. :1111493779: Вы бы посвятили нас - где именно Вы такое увидели? И что говорит 'cat /proc/pci'? :cranky:

     

    Нда... туго без телепатов...

    Строка появляется после того как происходит выбор операционки и начинается загрузка ядра и в этих именно строчках и появляется...

    По 'cat /proc/pci' скажу в понедельник... Хочу попробовать на другой машине и с нормальной линухой...попоробую на федоре..

  18. Читал......Байт на шине ориентирую исходя из адреса (00:01:10:11) в этом вроде проблем не возникало........

    Моделить пробовал (не гуру... но вроде все так...)

     

    Только что провел тест... (что то вроде инициализации портов) перед всеми записями и чтениями записал по нужным адресам FF, все пашет ок...... потом хоть 10 раз пиши, читай все ок.....

    Смущает то что не понятно что это такое(((

     

    К сожалению опять данная проблема всплыла((( опять же перед чтением константы, требуется записать FF. :wacko:

  19. Почитайте внимательно раздел 3.2.2. Addressing спецификации (особенно обратите внимание на использование бит AD(1:0) в операциях с портами ввода/вывода). Может, что и прояснится. Все ли трехстабильные буферы активны при чтении (независимо от BE)?

    Моделировать пробовали? В железо имеет смысл соваться только после успешных результатов временнОго моделирования.

     

    Читал......Байт на шине ориентирую исходя из адреса (00:01:10:11) в этом вроде проблем не возникало........

    Моделить пробовал (не гуру... но вроде все так...)

     

    Только что провел тест... (что то вроде инициализации портов) перед всеми записями и чтениями записал по нужным адресам FF, все пашет ок...... потом хоть 10 раз пиши, читай все ок.....

    Смущает то что не понятно что это такое(((

  20. Кто сталивался с такой траблой........

     

    Имеется PCI target(собственный, построен на Спартане2)...

    Смысл заключается в следующием........Внутри кристала организовываю 3 регистра(для тестирования) которые тактируются по CLK. В первый регистр данные пишутся при записи по 2 адресу, и читаются(путем открывания буферов) тоже по 2 адресу... все ок, что записал то и прочитал,.......... но если в такой же регистр записать по предположим 3 адресу, а прочитать по 4 ( адрес не имеет значение главное что бы адрес записи и чтения были разные) то читается по 4 не то что было записанно по 3, а 00. Но если между командами записи в 3 и чтением 4 вставить команду записи в 4 FF то все проходит нормально(прочитаю в 4-ом то что записал в 3-й)..... или пример чтения константы предположим по 6 адресу........ константа прочитается в том случае если перед чтением регистра будет стоять команда записи в этот регистр значения FF........

     

    Читал и спеку и книгу ничего подобного не нашел.....(прошу не путать с чтением BARов, там читается, как раз так)... но почему это происходит Вводом-выводом? непонятно...((( :help:

     

    Если потребуется могу выложить принт скрины регистров.....

  21. А на другом компе(не ноуте) пробовали установить? (Увидел что вроде пробовали)

    Про себя скажу, что на 98SE и ХР все ставится и работает. Про 2000- ничего не скажу(можно было бы поискать в поиске у XILINX на сайте, нет ли с ней проблем установки?)

    Одна проблема у вас будет - это лицензия под FPGA EXPRESS - нет его больше.

    Да... на другом компе встает все норм...

    Не встаёт( foundation:) ), только на ноуты, как выше писал ACER и IRU... дистрибутивы винды одинаковые, сам продукт один и тот же.......

    Может кто пробовал на ноут ставить???

×
×
  • Создать...