Перейти к содержанию
    

Altera SoC независимый бут HPS и FPGA

Всем доброго

 

Столкнулся с довольно неожиданной проблемой. Планировал использовать независимую загрузку 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 вторая? Есть идеи в чём дело?

 

ЗЫ. Проверил эту особенность на отладке и на нашей плате - результат одинаков.

Изменено пользователем serjj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 serjj

Глупый вопрос конечно, но вы точно следовали руководству по работе с enable-disable портов на FPGA ?

+ кажется где то в полотне регистров я видел там какие то статусные для портов, может вам попробовать посмотреть что в них.. ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глупый вопрос конечно, но вы точно следовали руководству по работе с 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?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UPD. В тех случаях когда после включения обмена между FPGA и HPS нет, модули управления шины сидят в резете, судя по значению регистра brgmodrst в Reset Manager'е (brgmodrst = 0x7). Соответственно, когда всё ок, там 0x0. Видимо дело в этом, но что делать дальше пока не понятно, т.к. банальный сброс этого регистра ничего не даёт, требуется ещё что-то конфигурировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 serjj

на счёт сброса регистров - уже раз было. На счёт "brgmodrst " - покажите как вы этот самый "банальный сброс этого регистра" делаете, у меня не было проблем никогда с писаниной-чтеним для этого регистра что с linux что с bare-metal.

Проверьте ещё "L3 (NIC-301) GPV / l3regs" - по у молчанию там нули, а значит L3 master-а не видят ничего.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На счёт "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 функционирует или в случае, если что-то пошло не так?

Изменено пользователем serjj

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 не работал).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Kuzmi4, спасибо большое! Заработало.

 

Не понял только, почему функция из hwlib для инициализации мостов не отрабатывает как положено. И может подскажите, где бы почитать каких нибудь документов, статей по низкоуровневому запуску разных модулей в HPS? Или вы от карты регистров всегда только отталкивались?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 serjj

касательно hwlib - там читать надо чего они рекомендуют, я ж эту последовательность запуска тоже не сам придумал ;) ..

А на счёт bare-metal - я давно с ним не работал, всё больше на пингвине сижу, когда работал - читал доки на hwlib, сорцы разные смотрел + TechRef на HPS..

Посмотрите поискам по форуму, тут относительно недавно была кажется темка каксательно работы с hwlib для альткровского сок-а. Или спросите Stewart Little - думаю он вам что то точно подскажет толковое по этой тематике.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

hwlib это песня... :rolleyes:

nand запустил на ней только после того, как туда залез. А функция alt_nand_flash_page_read оказалось некорректно работает с массивами произвольной длины и нужно их выравнивать к page size. Например, если page size = 512 слов, а буфер чтения - 16 слов, то вычитать то он вычитает, но всю страницу. Т.е. первые 16 слов поместит в указанный буфер, а остальные 496 - запишет по соседству, поверх всех переменных расположенных в памяти за буфером на чтение... С чуваком пол дня эту "фичу" отлавливали, пока не стало понятно, что происходит, весьма небезопасная и кривая реализация ИМХО.

 

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

 

А на пингвине вообще как? поприятнее работа идёт или тоже глюк на глюке?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 serjj

пингвин он на то и пингвин что у него кругом всё одинаковое.. ну почти :laughing: + либы всякие интересные пингвинячие и не очень можно прикручивать, что на bare-metal как минимум невозможно в том виде котором они распространяются и потому требуется серъёзная их переработка.

Собственно, я с bare-metal и спрыгнул, потому что смысла не было сидеть тонны кода лопатить которые нигде кроме как здесь не применяются. Для пингвина, чего надо - можно или в ядро крутиться засунуть, если критично, или на плисе реализовать, если очень критично..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...