Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не видится PCI устройство, почему?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
mSimple
Здравствуйте уважаемые! Помогите с таким вопросом: выпала задача разработать устройство с интерфейсом PCI на ПЛИС на языке VHDL. В качестве компонента контроллера PCI, был взят проверенный компонент написанный не мной. По ModelSim вроде даже все работает.. регистры пишутся и читаются. Вставляю все это хозяйство в комп и тишина.. ничего! Скачал PCIsope, он тоже моего устройства не видит... sad.gif Что-то я забыл, не могу понять что.

Отсюда вопрос: какие необходимо выполнить условия, чтобы устройство определилось.. ? Что оно должно сделать для этого?

Прошу прощения за ламерский вопрос, просто с PCI первый раз столкнулся.
Заранее благодарю всех за ответ.
BSV
Начните с простого.
Что за комп? Что за плата?
Питание на ядро ПЛИС и блоки ввода-вывода подается? Правильное? Конфигурация в ПЛИС грузится?

Необходимо чтобы было корректно реализовано конфигурационное пространство и команды, обеспечивающие его чтение и запись.
mSimple
Цитата(BSV @ Nov 12 2009, 21:54) *
Начните с простого.
Что за комп? Что за плата?
Питание на ядро ПЛИС и блоки ввода-вывода подается? Правильное? Конфигурация в ПЛИС грузится?


Комп самый обычный, настольный.., материнка ASUS P5Q, плата выполнена в формате compactPCI, подключенная через плату сопряжения.. сама плата в итоге будет вставляться в слот крейта и подключаться по кросс плате к мини ПЭВМ в соседнем слоте..

Питание на плате сопряжения от PCI есть и оно правильное.., горят соответствующие св. диоды и проверял тестером... Моя плата питается, соответственно, от платы сопряжения. Питание на ядро ПЛИС подается точно.. она конфигурируется, проверял ChipScope'ом.

Само устройство пока пустое, просто сделал пока несколько регистров: 1. Read_Only. 2. Write_Only и 3. Read_and_WRITE, пока хочу проверить как будут они читаться и писаться по шине..

Цитата
Необходимо чтобы было корректно реализовано конфигурационное пространство и команды, обеспечивающие его чтение и запись.


Не совсем понимаю.. есть адресное пространство на шине PCI компьютера, есть адресное пространство внутри PCI устройства.. как зарегистрировать себя в адресном пространстве шины.. ? Забыл сказать, устройство не является мастером шины.. Оно должно на шину что-то послать, чтобы ее включили или как?
XVR
PCI работает в терминах 3х разных адресных пространств - память, IO и конфигурационное. В последнем пространстве расположены регистры, отвечающие за работу собственно PCI устройства. Там есть некоторый набор стандартных регистров, по содержимому которых система опознает тип PCI устройства (да и вообще его наличие). Если вы не реализуете хотя бы минимальный набор этих регистров, ваше PCI устройство никто не увидит.
Смотрите описание PCI.
mSimple
Цитата(XVR @ Nov 13 2009, 13:11) *
PCI работает в терминах 3х разных адресных пространств - память, IO и конфигурационное. В последнем пространстве расположены регистры, отвечающие за работу собственно PCI устройства. Там есть некоторый набор стандартных регистров, по содержимому которых система опознает тип PCI устройства (да и вообще его наличие). Если вы не реализуете хотя бы минимальный набор этих регистров, ваше PCI устройство никто не увидит.
Смотрите описание PCI.

Так, что-то получилось.. устройство видится как PCI Scope, так и в диспетчере устройств Windows, сконфигурировал адресное пространство, назначил базовый адрес, включил I/O и MEM space decoding. что получилось смотрите на картинках.

во первых смущает строка "Problem 00000001h" Кто знает, что она значит?
во вторых, базовый адрес я назначил 80000000h - 80001FFFh, теперь мне не понятно, а как читать/писать во внутренние регистры устройства по этим адресам?
в устройстве есть:
REG_ONLY_READ BASE_ADDR + x"00000000"
REG_ONLY_WRITE BASE_ADDR + x"00000004"
REG_READ_AND_WRITE BASE_ADDR + x"00000008"

И возможно ли это вообще с помощью PCI-scope и без какого либо драйвера? Необходимо какой-то скрипт писать на С для этого?
SM
Цитата(mSimple @ Nov 13 2009, 16:49) *
во вторых, базовый адрес я назначил 80000000h - 80001FFFh,

Это, извините, как? Базовый адрес назначает BIOS в процессе инициализации PnP PCI. А не Вы (откуда Вы знаете, пересекли свой девайс с кем нибудь на шине или нет? А PnP-манагер знает).

А читать-писать без драйвера никак. Надо замапить пространство памяти карты в виртуальное пространство процесса, что можно сделать только из нулевого кольца. Или, как вариант, расположиться в IO-space и спокойно работать через нечто вроде giveio.
mSimple
Цитата(SM @ Nov 13 2009, 17:18) *
Это, извините, как? Базовый адрес назначает BIOS в процессе инициализации PnP PCI. А не Вы (откуда Вы знаете, пересекли свой девайс с кем нибудь на шине или нет? А PnP-манагер знает).

Возможно это разные какие-то базовые адреса blink.gif
Я сделал PCI Scop'ом следующее:
1. в BAR0 отправил FFFFFFFF, сконфигурировал BAR0 т.о. enable size detection
2. прочитал BAR0, т.о. узнал размер BAR0
3. записал в BAR0 0x8000_0000 - мой базовый адрес
4. записал в Command Register 0x000001C3 - включил I/O и MEM space decoding
5. все, как видно на второй картинке, базовый адрес присвоился (до этого он был равен 0x00000000) и диаппазон соответствует указанному мной внутри устройтва )

Цитата
А читать-писать без драйвера никак. Надо замапить пространство памяти карты в виртуальное пространство процесса, что можно сделать только из нулевого кольца. Или, как вариант, расположиться в IO-space и спокойно работать через нечто вроде giveio.



А как же я тогда открыв окно DEBUG в PCI Scope и вписав там "R.D 80000000" (команда чтения Double Word по адресу)
вижу
Memory read 80000000: 37550029 ").U7"

Где 37550029 значение записанное в регистр REG_READ_ONLY smile.gif
Другое дело, почему-то в регистры для записи ничего не пишется (( Будем разбираться дальше
SM
Цитата(mSimple @ Nov 13 2009, 17:37) *
Возможно это разные какие-то базовые адреса blink.gif
Я сделал PCI Scop'ом следующее:
1. в BAR0 отправил FFFFFFFF, сконфигурировал BAR0 т.о. enable size detection
2. прочитал BAR0, т.о. узнал размер BAR0
3. записал в BAR0 0x8000_0000 - мой базовый адрес
4. записал в Command Register 0x000001C3 - включил I/O и MEM space decoding
5. все, как видно на второй картинке, базовый адрес присвоился (до этого он был равен 0x00000000) и диаппазон соответствует указанному мной внутри устройтва )

Да, я все это понимаю, но это некорректно. Вы абсолютно уверены, что по адресу 0x8000000 в Вашей системе ничего и никого нет? Суть в том, что после загрузки системы PnP манагер должен сконфигурировать все устройства, а Вы - только считать все присвоенные в процессе конфигурации адреса. Но не писать их туда.

Цитата(mSimple @ Nov 13 2009, 17:37) *
А как же я тогда открыв окно DEBUG в PCI Scope и вписав там "R.D 80000000" (команда чтения Double Word по адресу)
вижу
Memory read 80000000: 37550029 ").U7"

Ну значит PCI Scope имеет в своем составе драйвер, дающий доступ ему к физическому адресному пространству. Но Вам для написания собственного софта общения с платой это никак не поможет.
cioma
Если не изменяет память при подаче питания в BAR устройства должен быть размер запрашиваемого куска, а уж биос этот размер считае и запишет назад в BAR стартовый адрес.
BSV
Цитата(cioma @ Nov 17 2009, 16:44) *
Если не изменяет память при подаче питания в BAR устройства должен быть размер запрашиваемого куска, а уж биос этот размер считае и запишет назад в BAR стартовый адрес.
Изменяет, спецификацию перечитайте biggrin.gif .
Kuzmi4
PCI LOCAL BUS SPECIFICATION, REV. 3.0, стр 226
Если в 2х словах: размер "запрашиваемого куска" закодирован "0" в возвращаемой, после чтения с конфиг пространства бара, инфе (биты 31-4).
2 BSV - так что вроде всё верноlaughing.gif
BSV
То, что размер определяется постоянной нулевой частью регистра - это вне всякого сомнения. Только не то, что бы он там лежал при включении питания. Топикстартер приводил алгоритм определения размера потребной области БИОСом.
cioma
ОК, для особо дотошных - заменить "при подаче питания" на "до момента опроса биосом" smile.gif
Например, если это плис, то она должна успеть сконфигурироваться за этот короткий промежуток времени, и ответить на конфигурационные циклы биоса. Если не ответила, то зачастую клок от этого слота будет отключен.
mSimple
Спасибо всем.. все получилось. по крайней мере на уровне PCI Scope. Его дебагером мои регистры и пишутся и читаются...

Цитата(cioma @ Nov 18 2009, 19:00) *
ОК, для особо дотошных - заменить "при подаче питания" на "до момента опроса биосом" smile.gif
Например, если это плис, то она должна успеть сконфигурироваться за этот короткий промежуток времени, и ответить на конфигурационные циклы биоса. Если не ответила, то зачастую клок от этого слота будет отключен.


Не знаю как у других, но судя по всему у меня успевает smile.gif При просмотре BAR в нем лежит какой-то адрес.. наверное, значит кто-то его туда вписал. Устройство видно в диспетчере устройств и Винда просит драйвер. Думаю для программистов этого будет достаточно. Хотя, я не уверен конечно, в свойствах устройства нет используемых ресурсов.. это может быть из-за того, что плис не успела ответить? Или просто из-за отсутствия драйвера так?
Shivers
Цитата(mSimple @ Nov 18 2009, 22:24) *
При просмотре BAR в нем лежит какой-то адрес.. наверное, значит кто-то его туда вписал.

Биос вписал

Цитата(mSimple @ Nov 18 2009, 22:24) *
Устройство видно в диспетчере устройств и Винда просит драйвер. Думаю для программистов этого будет достаточно. Хотя, я не уверен конечно, в свойствах устройства нет используемых ресурсов.. это может быть из-за того, что плис не успела ответить? Или просто из-за отсутствия драйвера так?

А какие ресурсы использует устройство? Про бар я понял - используется PCI MEM или IO. А что с прерываниями, или PCI Expansion ROM, или какие еще могут быть ресурсы? User defined регистры появятся в списке, только когда их туда добавит драйвер, а пока - только ресурсы определенные стандартом.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.