Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Altera SoC независимый бут HPS и FPGA
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
serjj
Всем доброго

Столкнулся с довольно неожиданной проблемой. Планировал использовать независимую загрузку HPS и FPGA (каждая грузится из своей QSPI flash). Оба устройства успешно грузятся после подачи питания, но при попытке чтения процессором регистров из FPGA части по шине h2f_axi_master получаю нули вместо ожидаемых чисел. Пробовал вставлять задрежки или читать в цикле - результат тот же.
Если же, не перешивая FPGA, сбросить проц (cold reset) и по JTAG залить теже preloader и приложение, что и зашиты во флеш, то чтение данных из FPGA работает корректно.
В итоге в качестве решения придётся перейти на режим FPGA первая - HPS второй, загружая preloader из On-Chip memory FPGA (FPGA boot), а из QSPI выгружая уже саму прогу. В таком случае всё работает нормально. Но всё равно остаётся вопрос - почему при независимом буте возникает такая проблема? И что будет в случае HPS первый - FPGA вторая? Есть идеи в чём дело?

ЗЫ. Проверил эту особенность на отладке и на нашей плате - результат одинаков.
Kuzmi4
2 serjj
Глупый вопрос конечно, но вы точно следовали руководству по работе с enable-disable портов на FPGA ?
+ кажется где то в полотне регистров я видел там какие то статусные для портов, может вам попробовать посмотреть что в них.. ?
serjj
Цитата
Глупый вопрос конечно, но вы точно следовали руководству по работе с enable-disable портов на FPGA ?
+ кажется где то в полотне регистров я видел там какие то статусные для портов, может вам попробовать посмотреть что в них.. ?


В каком документе можно подробнее об этом почитать? Я пробовал использовать функцию alt_bridge_init из библиотеки hwlib/alt_bridge_manager - функция выполняется, но ничего не изменяется, таже проблема. Обнаружил, что у меня в настройках конфигурации FPGA стоял самый низкоскоростной режим - x1 12.5 MHz, хотя у меня флеш EPCQ128. Поменял на x4 100 MHz - на отладке SoCkit обмен заработал после включения питания, а на нашей плате - всё по прежнему. Сделал вывод, что при работе прелоадера происходит инициализация бриджей и в случае большой разницы в скорости обмена для флешек FPGA и HPS возможна такая ситуация, что FPGA сильно "тормозит" и бридж не поднимается (что-то вроде таймаута ожидания вхождения FPGA в USER MODE). Но тогда почему на одной плате работает, а на другой нет? И почему я не могу проинициализировать бридж своим софтом с помощью той же alt_bridge_init?
serjj
UPD. В тех случаях когда после включения обмена между FPGA и HPS нет, модули управления шины сидят в резете, судя по значению регистра brgmodrst в Reset Manager'е (brgmodrst = 0x7). Соответственно, когда всё ок, там 0x0. Видимо дело в этом, но что делать дальше пока не понятно, т.к. банальный сброс этого регистра ничего не даёт, требуется ещё что-то конфигурировать.
Kuzmi4
2 serjj
на счёт сброса регистров - уже раз было. На счёт "brgmodrst " - покажите как вы этот самый "банальный сброс этого регистра" делаете, у меня не было проблем никогда с писаниной-чтеним для этого регистра что с linux что с bare-metal.
Проверьте ещё "L3 (NIC-301) GPV / l3regs" - по у молчанию там нули, а значит L3 master-а не видят ничего.
serjj
Цитата
На счёт "brgmodrst " - покажите как вы этот самый "банальный сброс этого регистра" делаете

Код
volatile unsigned int *p_brgmodrst = (unsigned int *) 0xFFD0501C;
...
if (*p_brgmodrst)
      *p_brgmodrst = 0x0;

вот так, например.. Специальной функции в alt_bridge_manager или alt_reset_manager я что-то не усмотрел, а preloader так вообще какие-то свои либины использует.
Полагаю я работаю с регистром неправильно. Хотя из документации следует, что достаточно записать 0/1 в нужную позицию данного регистра для снятия сброса/сброса модуля, с которым он асоциируется. В карте регистров самого модуля (h2f в данном случае) каких-то принципиальных настроек не обнаружил. Да и вообще настройку можно провести так:
Код
alt_bridge_init(ALT_BRIDGE_H2F, NULL, NULL);

но после снятия резета и вызова функции интерфейс все равно лежит.

Не могли бы вы привести пример, как правильно сбрасывать и поднимать контроллер bridge'а в bare metal приложении (через hwlib или же напрямую через регистры)?

С L3 (NIC-301) GPV / l3regs не очень понял. Если там нули - то это нормальный режим, когда bridge функционирует или в случае, если что-то пошло не так?
Kuzmi4
2 serjj

Если в 2х словах,
вас интересуют 2 регистра:
brgmodrst
Software writes a bit to 1 to assert the module reset signal and to 0 to de-assert the module reset signal.
и
remap
0x1 - The LWHPS2FPGA AXI Bridge is visible to L3 masters.

Грубо говоря последовательность включения мостов hps такая - вам надо сначала убрать сброс (brgmodrst - нули), а потом сделать их видимыми для L3 master-ов (remap - единицы). Там кажись если по чесноку, то сначала сбросы-клоки ставятся и проверяются, потом FPGAMGR проверяться должен в вашем случае, потом кажись сброс для SDRAM порта, потом убирание сбросов с мостов, потом мап мостов для L3. Как то так, но думаю вам brgmodrst+remap будет достаточно. По записи - так и писал, если склероз не изменяет..

На счёт кода - если до завтра не получится запустить так как описал выше, маякните, поковыряюсь в коде, где то валяется (давно с bare-metal не работал).
serjj
Kuzmi4, спасибо большое! Заработало.

Не понял только, почему функция из hwlib для инициализации мостов не отрабатывает как положено. И может подскажите, где бы почитать каких нибудь документов, статей по низкоуровневому запуску разных модулей в HPS? Или вы от карты регистров всегда только отталкивались?
Kuzmi4
2 serjj
касательно hwlib - там читать надо чего они рекомендуют, я ж эту последовательность запуска тоже не сам придумал wink.gif ..
А на счёт bare-metal - я давно с ним не работал, всё больше на пингвине сижу, когда работал - читал доки на hwlib, сорцы разные смотрел + TechRef на HPS..
Посмотрите поискам по форуму, тут относительно недавно была кажется темка каксательно работы с hwlib для альткровского сок-а. Или спросите Stewart Little - думаю он вам что то точно подскажет толковое по этой тематике.
serjj
hwlib это песня... rolleyes.gif
nand запустил на ней только после того, как туда залез. А функция alt_nand_flash_page_read оказалось некорректно работает с массивами произвольной длины и нужно их выравнивать к page size. Например, если page size = 512 слов, а буфер чтения - 16 слов, то вычитать то он вычитает, но всю страницу. Т.е. первые 16 слов поместит в указанный буфер, а остальные 496 - запишет по соседству, поверх всех переменных расположенных в памяти за буфером на чтение... С чуваком пол дня эту "фичу" отлавливали, пока не стало понятно, что происходит, весьма небезопасная и кривая реализация ИМХО.

Тоже hwlib исходники иногда почитываю, там в хедерах по сути недостоющая документация находится, которую они не удосужились в pdf собрать smile3046.gif

А на пингвине вообще как? поприятнее работа идёт или тоже глюк на глюке?
Kuzmi4
2 serjj
пингвин он на то и пингвин что у него кругом всё одинаковое.. ну почти laughing.gif + либы всякие интересные пингвинячие и не очень можно прикручивать, что на bare-metal как минимум невозможно в том виде котором они распространяются и потому требуется серъёзная их переработка.
Собственно, я с bare-metal и спрыгнул, потому что смысла не было сидеть тонны кода лопатить которые нигде кроме как здесь не применяются. Для пингвина, чего надо - можно или в ядро крутиться засунуть, если критично, или на плисе реализовать, если очень критично..
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.