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

 
 
> адресация 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
Ответов (30 - 32)
sergey sva
сообщение Oct 11 2011, 05:46
Сообщение #31


Гуру
******

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



Вот в спецификации написано, в чем ошибся не соображу?
Код
Число  старших  битов,  которые  устройство  фактически  устанавливает,  зависит  от  того,  сколько
адресного пространства устройство может адресовать. Устройство, которое хочет адресное пространство
памяти 1 МБ (использующее 32-разрядный регистр базового  адреса) должно  сформировать  старшие 12
битов адресного регистра, аппаратно другие биты установлены в 0.
Программное  обеспечение  Включения  питания  может  определять  количество  адресного  пространства
требуемое  устройству  для  записи   всех  единиц  в  регистр  и  для  чтения  значений   обратно. Устройство
должно  возвращать 0  во  все  незадействованные  биты  адреса ,  точно  определяя  требуемое  адресное
пространство.
Эта  конструкция  предполагает,  что  все  задействованное  адресное  пространство  питается  от  двух
источников  и  располагается  линейно. Устройства  могут  задействовать  больше  адресного  пространства
чем  требуется,  но  декодирование  для  4КБ  пространства  Памяти  и  для 256-байтового  ввода/вывода
предложено  для  устройств,  которые  нуждаются  в  меньшем   их  количестве.  Устройства,  которые
потребляют  больше  адресного  пространства  чем  они  используют,  не  требуются,  чтобы  ответить  на
неиспользуемую часть того адресного пространства.
Go to the top of the page
 
+Quote Post
XVR
сообщение Oct 11 2011, 09:32
Сообщение #32


Гуру
******

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



Цитата
в чем ошибся не соображу?
Для того, что бы обнаружить биты в BAR регистре, которые можно установить, в них необходимо записать 1, а не надеяться на то, что она там будет сама по себе. Вы туда ничего не писали, соответственно все младшие нулевые биты адреса, которые туда записала ОС вы посчитали немодифицируемыми, а это не так



Вот, что должно быть:
Код
uint32_t barorg = PciReadConfigDWord(bus, dev, func, barnum);
PciWriteConfigDWord(bus, dev, func, barnum,-1);
uint32_t bartemp = PciReadConfigDWord(bus, dev, func, barnum);
PciWriteConfigDWord(bus, dev, func, barnum, barorg);

barstr.Value = barorg;
barstr.RangeStart =  barorg&~7;
barstr.Size       = -(bartemp&~7);
barstr.RangeEnd   =  barstr.RangeStart+barstr.Size;

Go to the top of the page
 
+Quote Post
sergey sva
сообщение Oct 11 2011, 15:29
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 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 BarReg1 = 0,  BarReg2 = 0;

    BarReg1 = PciReadConfigDWord(bus, dev, func, barnum);
     PciWriteConfigDWord(bus, dev, func, barnum,0xffffffff);
    BarReg2 = PciReadConfigDWord(bus, dev, func, barnum);
     PciWriteConfigDWord(bus, dev, func, barnum,BarReg1);

    
    if(BarReg1!=0){

               if(BarReg1&0x00000001){
                BarReg2&=0x0000ffff;
                barstr.Value      = BarReg1;
                barstr.RangeStart = BarReg2&~0x07;              
                barstr.Size       = 0x0000ffff-(BarReg2&~0x07);
                barstr.RangeEnd   = barstr.RangeStart+barstr.Size;
                memcpy(barstr.TypeB,"P  I/O",6);

               }else{
                barstr.Value      = BarReg1;
                barstr.RangeStart = BarReg2&~0x0f;              
                barstr.Size       = 0xffffffff-(BarReg2&~0x07);
                barstr.RangeEnd   = barstr.RangeStart+barstr.Size;
                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

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

 


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


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