|
Чтение портов I\O PCI, Странно.....((( |
|
|
|
Jul 10 2007, 09:19
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Кто сталивался с такой траблой........ Имеется PCI target(собственный, построен на Спартане2)... Смысл заключается в следующием........Внутри кристала организовываю 3 регистра(для тестирования) которые тактируются по CLK. В первый регистр данные пишутся при записи по 2 адресу, и читаются(путем открывания буферов) тоже по 2 адресу... все ок, что записал то и прочитал,.......... но если в такой же регистр записать по предположим 3 адресу, а прочитать по 4 ( адрес не имеет значение главное что бы адрес записи и чтения были разные) то читается по 4 не то что было записанно по 3, а 00. Но если между командами записи в 3 и чтением 4 вставить команду записи в 4 FF то все проходит нормально(прочитаю в 4-ом то что записал в 3-й)..... или пример чтения константы предположим по 6 адресу........ константа прочитается в том случае если перед чтением регистра будет стоять команда записи в этот регистр значения FF........ Читал и спеку и книгу ничего подобного не нашел.....(прошу не путать с чтением BARов, там читается, как раз так)... но почему это происходит Вводом-выводом? непонятно...(((  Если потребуется могу выложить принт скрины регистров.....
Сообщение отредактировал Mavric84 - Jul 10 2007, 09:21
|
|
|
|
|
Jul 10 2007, 11:10
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(BSV @ Jul 10 2007, 14:52)  Какой размерности регистры? Байтовые? Да...... Пишу, читаю, байт
|
|
|
|
|
Jul 10 2007, 13:36
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(BSV @ Jul 10 2007, 16:15)  Почитайте внимательно раздел 3.2.2. Addressing спецификации (особенно обратите внимание на использование бит AD(1:0) в операциях с портами ввода/вывода). Может, что и прояснится. Все ли трехстабильные буферы активны при чтении (независимо от BE)? Моделировать пробовали? В железо имеет смысл соваться только после успешных результатов временнОго моделирования. Читал......Байт на шине ориентирую исходя из адреса (00:01:10:11) в этом вроде проблем не возникало........ Моделить пробовал (не гуру... но вроде все так...) Только что провел тест... (что то вроде инициализации портов) перед всеми записями и чтениями записал по нужным адресам FF, все пашет ок...... потом хоть 10 раз пиши, читай все ок..... Смущает то что не понятно что это такое(((
|
|
|
|
|
Jul 13 2007, 07:50
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(Mavric84 @ Jul 10 2007, 17:36)  Читал......Байт на шине ориентирую исходя из адреса (00:01:10:11) в этом вроде проблем не возникало........ Моделить пробовал (не гуру... но вроде все так...)
Только что провел тест... (что то вроде инициализации портов) перед всеми записями и чтениями записал по нужным адресам FF, все пашет ок...... потом хоть 10 раз пиши, читай все ок..... Смущает то что не понятно что это такое((( К сожалению опять данная проблема всплыла((( опять же перед чтением константы, требуется записать FF.
|
|
|
|
|
Jul 15 2007, 15:51
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(BSV @ Jul 14 2007, 01:17)  Управляющая программа работает под DOS или под чем-то еще? Под МСВСом  ... И при загрузки углядел интересненькую строчку....: I/O 4096 (0xFFFFFFFF)
Сообщение отредактировал Mavric84 - Jul 15 2007, 16:07
|
|
|
|
|
Jul 15 2007, 16:39
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Mavric84 @ Jul 15 2007, 19:51)  Под МСВСом  ... Сочувствую. Однако у меня под этой же самой системой при работе с PCI в части пространства ввода/вывода из-под пользовательского приложения (iopl + inw и т.п.) и из-под драйвера (модуля ядра) никаких проблем не наблюдалось. Работал со множеством разных устройств. Цитата И при загрузки углядел интересненькую строчку....: I/O 4096 (0xFFFFFFFF) Лето, телепаты в отпусках.  Остались простые люди.  Вы бы посвятили нас - где именно Вы такое увидели? И что говорит 'cat /proc/pci'?
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 15 2007, 17:01
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(makc @ Jul 15 2007, 20:39)  Сочувствую. Однако у меня под этой же самой системой при работе с PCI в части пространства ввода/вывода из-под пользовательского приложения (iopl + inw и т.п.) и из-под драйвера (модуля ядра) никаких проблем не наблюдалось. Работал со множеством разных устройств. Лето, телепаты в отпусках.  Остались простые люди.  Вы бы посвятили нас - где именно Вы такое увидели? И что говорит 'cat /proc/pci'?  Нда... туго без телепатов... Строка появляется после того как происходит выбор операционки и начинается загрузка ядра и в этих именно строчках и появляется... По 'cat /proc/pci' скажу в понедельник... Хочу попробовать на другой машине и с нормальной линухой...попоробую на федоре..
|
|
|
|
|
Jul 15 2007, 18:26
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Mavric84 @ Jul 15 2007, 21:01)  Нда... туго без телепатов... Строка появляется после того как происходит выбор операционки и начинается загрузка ядра и в этих именно строчках и появляется... Согласитесь, строка немного оторвана от контекста... Поэтому она может относиться к чему угодно - сказать что-либо определенное в этом случае сложно. Цитата По 'cat /proc/pci' скажу в понедельник... Хочу попробовать на другой машине и с нормальной линухой...попоробую на федоре.. А еще лучше и результаты dmesg приведите. После этого, если Вы дадите пример Вашей программы, можно будет уже сказать что-нибудь более определенное.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 16 2007, 05:54
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(makc @ Jul 15 2007, 22:26)  Согласитесь, строка немного оторвана от контекста... Поэтому она может относиться к чему угодно - сказать что-либо определенное в этом случае сложно. А еще лучше и результаты 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 оператора, ничего другого нет....
|
|
|
|
|
Jul 16 2007, 06:02
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
Цитата(Mavric84 @ Jul 16 2007, 09:54)  /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 Вы цитируете вывод этой программы или по памяти его перепечатываете? На подозрения наводит "Laten sy" и базовые адреса пространства ввода/вывода, у которых младший байт не равен 00. Цитата программа выполнена в виде модуля в котором и организованно обращение к регистрам... outb... inb.. printk 3 оператора, ничего другого нет.... Вот бы еще увидеть, что именно Вы в ней делаете (код) и каким образом получаете адреса и обращаетесь по ним... PS: Если честно, то наше общение выглядит так, как будто бы я Вас пытаю, а не хочу помочь. Короче говоря - если хотите помощи, давайте исчерпывающую информацию, исходные данные.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
|
Jul 16 2007, 06:37
|
Участник

Группа: Новичок
Сообщений: 51
Регистрация: 15-10-05
Пользователь №: 9 699

|
Цитата(makc @ Jul 16 2007, 10:02)  О чем я и говорил: эти строки к Вашему устройству ни коим образом не относятся (это соощения подсистемы блочного ввода/вывода). Вы цитируете вывод этой программы или по памяти его перепечатываете? На подозрения наводит "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;
Сообщение отредактировал Mavric84 - Jul 16 2007, 06:53
|
|
|
|
|
Jul 16 2007, 07:50
|

Гуру
     
Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904

|
На первый взгляд все в порядке. Но на мысли наводит то, что Вы используете PLX9050, который может быть настроен совершенно по-разному. Например, у него может быть включен Prefetch для используемого Вами региона, который некорректно обрабатывается на локальной шине PLX. Запись может приводить к тому, что буфер Prefetch'a для чтения сбрасывается и мост еще раз производит чтение - на этот раз уже правильно.
Каковы настройки моста и его локальной шины? Думаю, что копать нужно в этом направлении.
--------------------
BR, Makc В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|