реклама на сайте
подробности

 
 
> адресация pci
sergey sva
сообщение Aug 30 2011, 05:17
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
Шина PCI использует 32-разрядную адресацию портов ввода-вывода. В фазе адреса задатчик указывает точный адрес младшего из байтов, к которому осуществляется обращение. Для передачи значащих байтов будут использоваться те линии AD, которые соответствуют положению этих байтов в двойном слове. Например, если выполняется чтение байта из порта 00001012h, то в фазе адреса будет задан именно этот адрес, а сам байт будет находиться на линиях AD[23:16], чему соответствует комбинация 1011 на линиях C/BE[3:0]#.

Линии разрешения байтов C/BE# должны соответствовать двум младшим разрядам адреса порта.

Немного не понятно подскажите,
Например мастеру нужно прочитать ввод вывод, мастер устанавливает frame, на C/BE команда 0010 на AD адрес и фронт такта, в следующих тактах C/BE указывает где расположен байт на линиях AD. Но если C/Be 0000 то байт будет на ad0-ad7 . тут написано
Цитата
Линии разрешения байтов C/BE# должны соответствовать двум младшим разрядам адреса порта
?
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3 >  
Start new topic
Ответов (15 - 29)
XVR
сообщение Sep 6 2011, 09:02
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sergey sva @ Sep 6 2011, 12:52) *
Один формат краткий номер функции и номер регистра, в другом номер шины ... для чего два формата?
Давно это было, но если мне не изменяет память, то один формат предназначен для записи конфиг. регистров самого моста (или устройства), в 2й формат для передачи запроса на доступ к конфиг. пространству через мост (к устройствам, подключенным за ним)

Go to the top of the page
 
+Quote Post
vitan
сообщение Sep 6 2011, 11:46
Сообщение #17


не указал(а) ничего о себе.
******

Группа: Свой
Сообщений: 3 325
Регистрация: 6-04-06
Пользователь №: 15 887



Цитата(XVR @ Sep 6 2011, 13:02) *
если мне не изменяет память

Не изменяет, так и есть.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Sep 7 2011, 04:46
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Вычитал из книги Петрова вывод m66en должен соединяться с clk + резистор нагрузочный, его к земле присоединять, не совсем понимаю что здесь написано.
Цитата
Сегмент системной платы предназначенный для работы на частоте 66 ,должен обеспечить один нагрузочный резистор на вываоде m66 шинно соединена со всеми разъемами и компонентами предназначенными для использования только на системной плате которые содержад вывод m66 цепь синхронизации 66 должна соединяться с выводом m66что бы генерировать такты соответсвующей частоты для сигмента (от33до66) если выставлен сигнал m66 и от 0до33 если m66 снят.
Go to the top of the page
 
+Quote Post
vitan
сообщение Sep 7 2011, 06:52
Сообщение #19


не указал(а) ничего о себе.
******

Группа: Свой
Сообщений: 3 325
Регистрация: 6-04-06
Пользователь №: 15 887



Цитата(sergey sva @ Sep 7 2011, 08:46) *
Вычитал из книги Петрова вывод m66en должен соединяться с clk + резистор нагрузочный, его к земле присоединять, не совсем понимаю что здесь написано.

lol.gif
Ух! Ржунимагупаццталом.
Это в книжках нынче так пишут? Да еще и в таком олбанском стиле? Да, спасти этот мир тяжело...

Для сегмента с поддержкой 66 МГц M66EN равен 1. Для сегмента 33 МГц- нулю. Сегмент - это несколько слотов, на которых пины M66EN соединены между собой.

Читайте стандарт, не надо больше книжек..
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Sep 7 2011, 07:43
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



)) книга с интернета в текстовом формате кто то наверно её переписал. в отсканированном не очень удобно читать.
Там еще для target, написано должна быть развязка земли от M66EN конденсатором.
Немного не понял как адресуется бар например для памяти? младшие байты 1-2указывают разрешение 64 или 32 ,
а как адрес указать к примеру: в устройстве 16 регистров 32бита нужно что бы доступ к ним был с адреса 0xf0 и по 0xff.
Что устройство должно записать BAR ?
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 7 2011, 10:46
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Немного не понял как адресуется бар например для памяти? младшие байты 1-2указывают разрешение 64 или 32 ,
Биты, а не байты. Ставьте 32х битный BAR.
Цитата
а как адрес указать к примеру: в устройстве 16 регистров 32бита нужно что бы доступ к ним был с адреса 0xf0 и по 0xff.
Не выйдет. Адреса будут всегда с 0 (относительно BAR'а)
Если вам надо 16 регистров, то биты в BAR0 должны быть такими -
0,1 - RO - 01 (Насколько помню, т.е. memory/32bit)
2-6 - RO - 0
7-31 - RW
В дешифраторе на вашем устройстве должны сравниваться биты адреса 7-31 с такими же битами BAR0
Цитата
Что устройство должно записать BAR ?
Устройство - ничего. Писать будет ОС (с PC)
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Sep 7 2011, 11:29
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
Писать будет ОС (с PC)

Система будет перебирать все адреса, например нужно прочитать 15й регистр? В устройстве дешифраторе должен ждать когда система запишет 15 в BAR (7-31)?
Прочитал еще: система вначале сохраняет значение BAR после записывает туда FFFFFFFF после читает отбрасывает биты 0-3 и вычисляет адрес.
Что то не пойму как это происходит.

Сообщение отредактировал sergey sva - Sep 7 2011, 11:41
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 7 2011, 12:07
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Система будет перебирать все адреса, например нужно прочитать 15й регистр?
Нет конечно
Цитата
В устройстве дешифраторе должен ждать когда система запишет 15 в BAR (7-31)?
Тоже нет
Цитата
Что то не пойму как это происходит.

Пример:
Код
Есть начало окна адресов для PCI. Пусть это будет 0xC0000000 (TOP)
ОС находит ваше устройство, пишет 0xFFFFFFFF в ваш BAR0, читает, что получилось - 0xFFFFFF81
ОС получает размер окна, для регистров вашего устройства (число нулей в BAR0) - 128 байтов
ОС выравнивает TOP на 128 байтов (ваш TOP уже выровнен) и записывает его в BAR0. Там теперь 0xC0000001
TOP смещается на 128 байтов - 0xC0000080

Теперь запись в 15 регистр (смещение регистра в BAR0 - 15*4 = 0x3C)
Код
ОС (драйвер) берет базу из образа вашего BAR0 (0xC0000000), который запомнен во внутренних структурах ОС, прибавляет смещение (результат 0xC000003C) и пишет по этому адресу 4х байтовое значение.
В вашем устройстве ловится запись по адресу 0xC000003C, старшие биты адреса (32-7=25 битов) сравниваются с содержимым BAR0. Т.к. они совпадают, то устройство производит запись в регистр 15 (биты адреса 2-6).
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Sep 8 2011, 05:02
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Понятно, не то что в книгах пишут))
Цитата
Пусть это будет 0xC0000000 (TOP)

Любой может быть ?
Цитата
что получилось - 0xFFFFFF81

Как посчитали ?
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 8 2011, 08:23
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sergey sva @ Sep 8 2011, 09:02) *
Любой может быть ?
Это определит система
Цитата
Как посчитали ?
Все разряды BAR0, которые RO намертво привязаны к константам и запись в них 1 игнорируется. Все разряды RW запишут 1, которая впоследствии и прочтется


Go to the top of the page
 
+Quote Post
sergey sva
сообщение Sep 8 2011, 08:42
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Цитата
RO намертво привязаны к константам и запись в них 1 игнорируется.

Понятно, бит 0 1 2 служебные, а 3456 бит это количество доступных регистров. Остальные прочитаются как 1.
немного не уловил, 0xFFFFFF81 это нужно сдвинуть на 128 байт? откуда 128получилось?
Вот из книги, не пойму "а затем все значения увеличиваются на 1"
Прикрепленное изображение



Сообщение отредактировал sergey sva - Sep 8 2011, 09:18
Go to the top of the page
 
+Quote Post
XVR
сообщение Sep 8 2011, 18:16
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
0xFFFFFF81 это нужно сдвинуть на 128 байт?
Нет, это просто адрес (за исключением 3х младших битов, их нужно считать нулями). Считаем количество нулей справа, получаем 7 нулей. Размер - 2**7+1 (128)
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 10 2011, 16:05
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Набросал функцию которая должна из прочитанного бара определять диапазон ,размер и тип. но пока не работает Помогите разобраться.
Код
TBarReg GetPciBar(uint8_t bus, uint8_t dev, uint8_t func,uint8_t barnum)
{
    TBarReg  barstr;
    uint32_t bartemp = PciReadConfigDWord(bus, dev, func, barnum);
    uint32_t baradrran = 0;

    if(bartemp !=0){

               if(bartemp&0x00000001){
                   baradrran = 7;
                   for(uint32_t bari = 2; bari < 16; bari++ ){
                   if((bartemp>>bari)&0x00000001)break;
                   baradrran =  baradrran | (0x00000001<<bari);

                   }//end for
                barstr.Value = bartemp;
                barstr.RangeStart =  ((bartemp>>2)<<2)&0x0000ffff;
                barstr.RangeEnd   =  baradrran | barstr.RangeStart;
                barstr.Size       =  barstr.RangeEnd - barstr.RangeStart;
                memcpy(barstr.TypeB,"P  I/O",6);

               }else{

                   baradrran = 0x0f;
                   for(dword bari = 3; bari < 32; bari++ ){
                   if((bartemp>>bari)&0x00000001)break;
                   baradrran =  baradrran | (0x00000001<<bari);

                   }//end for
                barstr.Value = bartemp;
                barstr.RangeStart = (bartemp>>3)<<3;
                barstr.RangeEnd   =  baradrran | barstr.RangeStart;
                barstr.Size       =  barstr.RangeEnd-barstr.RangeStart;
                memcpy(barstr.TypeB,"MEMORY",6);

               }//end else
        
        
        
    }else{
        barstr.Value      = 0;
        barstr.RangeStart = 0;
        barstr.RangeEnd   = 0;
        barstr.Size       = 0;
        memcpy(barstr.TypeB,"No BAR",6);
    }//end else bartemp != 0


return barstr;
}//end GetPciBar
//-------------------------------------------------------------------------------------------------//
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 10 2011, 16:58
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Вы забыли записать в BAR FFFFFFF.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 10 2011, 18:03
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



ок сейчас попробую, а правильно делаю?
Вот к примеру в баре записано 0x00009401 эта функция дает такой результат диапазон P I/O 0x00009400-0x000097ff размер 0x3ff
это правильно?

Попробовал еще одной програмкой PCIsniffer она дает такой результат bar 0x00009401 P I/O 0x00009400-0x0000940F размер 0x10.

Попробовал в линуксе он дает такой результат P I/O 0x9000-0x900F размер 0x10.

Как правильно вычислить размер начальный и конечный диапазон, размер? Думал что нужно посчитать нули и 2 в этой степени (количества нулей) будет концом диапазона, 0x00009400 это 1001010000000000 10 нулей 2 в 10 степени будет 3ff.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 22:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016