|
адресация pci |
|
|
|
Aug 30 2011, 05:17
|
Гуру
     
Группа: Свой
Сообщений: 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# должны соответствовать двум младшим разрядам адреса порта ?
|
|
|
|
3 страниц
< 1 2 3
|
 |
Ответов
(30 - 32)
|
Oct 11 2011, 05:46
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Вот в спецификации написано, в чем ошибся не соображу? Код Число старших битов, которые устройство фактически устанавливает, зависит от того, сколько адресного пространства устройство может адресовать. Устройство, которое хочет адресное пространство памяти 1 МБ (использующее 32-разрядный регистр базового адреса) должно сформировать старшие 12 битов адресного регистра, аппаратно другие биты установлены в 0. Программное обеспечение Включения питания может определять количество адресного пространства требуемое устройству для записи всех единиц в регистр и для чтения значений обратно. Устройство должно возвращать 0 во все незадействованные биты адреса , точно определяя требуемое адресное пространство. Эта конструкция предполагает, что все задействованное адресное пространство питается от двух источников и располагается линейно. Устройства могут задействовать больше адресного пространства чем требуется, но декодирование для 4КБ пространства Памяти и для 256-байтового ввода/вывода предложено для устройств, которые нуждаются в меньшем их количестве. Устройства, которые потребляют больше адресного пространства чем они используют, не требуются, чтобы ответить на неиспользуемую часть того адресного пространства.
|
|
|
|
|
Oct 11 2011, 09: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;
|
|
|
|
|
Oct 11 2011, 15:29
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|