OSDev http://osdev.su/ |
|
PCI http://osdev.su/viewtopic.php?f=7&t=473 |
Страница 1 из 3 |
Автор: | Bargest [ 07 дек 2011, 19:41 ] |
Заголовок сообщения: | PCI |
Собираюсь реализовывать работу с PCI. Посоветуйте пожалуйста документации или какие статьи по нему. Спецификацию PCI начал читать - там больше аппаратной части. А мне нужно именно сама работа: как определить все PCI устройства, как писать/читать их регистры, ... |
Автор: | pavia [ 07 дек 2011, 20:20 ] |
Заголовок сообщения: | Re: PCI |
А чего там разбираться? Обсуждали сто раз. Поищи. Есть 2 порта. Принцип похож на общение с другими устройствами. В первый устанавливаешь адрес из второго читаешь пишешь данные. *) Есть такое понятие как конфигурационное пространство(КФП). Это набор регистров которые есть у каждого устройства PCI. Вот адрес задает шину устройство, функцию(логическое устройство), а также номер регистра в КФП. Регистр 4 байта. Для того чтобы найти все устройства. 1. Узнать число шин. Варианты: a) Прочитать из PIR table сигнатура "$PCI" б) Биос вызывать нужное прерывание с) путём подсчёта мостов PCI-PCI 2. Перебираешь все устройства и шины. Можно совместить с пунктом c). Читаешь нулевой регистр и по нему определяешь присутствие или отсутствие устройства. 3. По нулевому устройству определяешь есть ли логические устройства. Из КФП читаешь регистры с базовых адресов(РБА/BAR). Надо сказать что БРА бывают двух типов I. которые указывают либо на базовый адрес порта ввода/вывода доступные через команды in out. II. которые указывают либо на базовый адрес порта ввода/вывода отображенного в память(ПВВОП/ MMIO) доступные через команды mov [],r и другии команды работы с памятью. *) Там есть ещё флаг C который, как я понимаю служит сигнализацией что адрес целиком записан. |
Автор: | pavia [ 07 дек 2011, 20:30 ] |
Заголовок сообщения: | Re: PCI |
РБА/BAR служит для непосредственной работы с устройством. Описание и принцип действия этих портов читается из спецификации на конкретное устройство. Отдельно надо поговорить про IRQ. В КФП просто информационное поле для IRQ и запись в него не влияет на устройство. За переназначение отвечает IRQ routing, реализация зависит от железа. Специфика прерываний описана в спецификации PCI. |
Автор: | Bargest [ 07 дек 2011, 21:02 ] |
Заголовок сообщения: | Re: PCI |
Спасибо большое! А каков формат PIR table? В плане где в ней искать количество шин? И правильно ли я понял, что получив число шин, нужно тыркаться во все устройства перебором? И еще, как отличить BAR разных видов? Всмысле как определить, какие из них указывают на адрес порта, а какие на память (кроме как "число маленькое - значит порт")? Кстати, в вике пишут, что их надо не читать, а как раз наоборот, мол изначально они сами частенько не выставлены. |
Автор: | pavia [ 08 дек 2011, 05:29 ] |
Заголовок сообщения: | Re: PCI |
a) Цитата: А каков формат PIR table? В плане где в ней искать количество шин? http://ru.osdev.wikia.com/wiki/PCI_IRQ_Routing_Table_Specification b) http://ru.osdev.wikia.com/wiki/PCI_BIOS c) Уже сказал. Перебор с подсчётом мостов. Цитата: И правильно ли я понял, что получив число шин, нужно тыркаться во все устройства перебором? Да правильно. Цитата: И еще, как отличить BAR разных видов? Всмысле как определить, какие из них указывают на адрес порта, а какие на память (кроме как "число маленькое - значит порт")? Кстати, в вике пишут, что их надо не читать, а как раз наоборот, мол изначально они сами частенько не выставлены. Если в БИОСе выбрано PnP OS то должно выставляться. Вот если не выбрано, то возможно надо выставлять. Задачка не простая. Так как зависимость по железу будет большой. Пока советую просто читать. А вот с установкой если столкнётесь то делайте под конкретную материку. |
Автор: | pavia [ 08 дек 2011, 05:33 ] |
Заголовок сообщения: | Re: PCI |
По поводу типа BAR определяется по флагам в самом регистре читай PCI Local Bus Specification. Revision 3.0 |
Автор: | Bargest [ 08 дек 2011, 18:49 ] |
Заголовок сообщения: | Re: PCI |
Благодарю! Только вот не нашел в PIR table поля, отвечающего за количество шин. Пожалуй заюзаю биос или подсчет мостов. Подсчет мостов - значит, перечисляем все на первой шине, находим мост (если есть), перечисляем на следующей? Как тогда определить, что встретили мост? |
Автор: | Bargest [ 14 дек 2011, 22:17 ] |
Заголовок сообщения: | Re: PCI |
UP. Читать регистры научился, но все еще не знаю, как узнать, когда встретил мост. |
Автор: | pavia [ 16 дек 2011, 13:40 ] |
Заголовок сообщения: | Re: PCI |
Header Type (тип заголовка) – если бит 7 равен 1 то устройство содержит несколько функций. Если бит 6 равен 0 то заголовок стандартный. Стандартные заголовки: 00 – стандартный смотри выше. 01 – стандартный для моста PCI-to-PCI 02 – стандартный для моста CardBus. |
Автор: | Bargest [ 17 дек 2011, 13:21 ] |
Заголовок сообщения: | Re: PCI |
Спасибо. Перечисление сделал, работает. Теперь немного наивный вопрос: А есть способ определить, какого типа устройство? В USB насколько я знаю есть несколько стандартных типов устройств. Есть ли подобное в PCI, чтобы система могла однозначно сказать: "Это видеокарта. А это сетевая. А это контроллер дисков."? К чему это я: хочу работать с дисками через контроллер дисков PCI-ный. И нормальный DMA сделать. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |