|
Cyclone V: загрузука HPS из памяти FPGA (FPGA boot) |
|
|
|
Dec 25 2014, 08:18
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Доброго дня. Есть отладочная плата Arrow SoCkit от Terasic. Занимаюсь поднятием HPS, в частности зазгрузкой прелоадера (preloader). Приложения Baremetal. Удалось прогрузить кастомный прелоадер по JTAG через DS-5 Debugger. SDRAM успешно инициализируется/калибруется, в нее загружается приложение, выполняется, вроде бы все ок. Пошел дальше: стоит задача реализовать режим загрузки FPGA Boot, описанный в документации. Руководствовался документом AN709 HPS SoC Boot Guide - Cyclone V SoC Development Kit дока и инструкцией инструкция rocketboards. BSEL выставлен в 0х1 (FPGA boot mode). Сигналы разрешения загрузки из FPGA выставлены по мануалу, но HPS не загружается. Попытался подключиться дебагером, посмотреть что же там происходит: пишет, что проц в состоянии running. Попытки его остановить дают следующую ошибку: Код ERROR(TAD9-NAL30): ! Unable to stop device Cortex-A9_0 ! Cannot stop target. Если принудительно проресетить его через дебагер, он вроде бы пишет, что все ок, но попытка что либо посмотреть после не удается - пишет, что проц недоступен вовсе. Также проверил при BSEL 0x0, что по адресу 0xC0000000 (адрес On-Chip RAM в FPGA с hex файлом прелоадера) лежит собственно прелоадер. Возможно, HPS не выгружает прелоадер из памяти FPGA в свою встроенную память после снятия резета или он считывается неправильно. Сталкивался ли кто нибудь с загрузкой из ПЛИС раньше? Может быть какие нибудь идеи, куда копать? С примерами такой загрузки довольно тухло (как впрочем с примерами Baremetal вообще). Буду рад любой помощи!
Прикрепленные файлы
an709.pdf ( 1.41 мегабайт )
Кол-во скачиваний: 35
|
|
|
|
|
Dec 30 2014, 07:06
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Да загрузилась, встают PLL, я параллельно смотрел сигнал reset, который у меня вырабатывается по сигналу pll_locked. Он честно падает после загрузки FPGA. Если я убираю джампер, выставляя BSEL = 0x0, то я могу подключиться к процессору через дебагер и залить туда preloader вручную, так же в этом режиме проверил чтение из памяти FPGA и сигнал RVALID, все нормально читается, так что шина подключена правильно.
ЗЫ: Еще на одну вещь обратил внимание. При BSEL != 0x0, если в дебаггере подгрузить вручную preloader и посмотреть в Memory viewer содержимое сектора 0c0000000, то все ок, там лежит preloader, который должен загружаться из FPGA, но если запустить в дебаггере проект без preloader'a, то при попытке почитать по адресу 0c0000000 мы увидем, что память недоступна. Разве preloader как то управляет шиной h2f AXI? Получается как будто проц не видит сектор по 0c0000000 изначально и его нужно проинициализировать, но как тогда с загрузкой из FPGA...
Сообщение отредактировал serjj - Dec 30 2014, 07:35
|
|
|
|
|
Dec 30 2014, 07:39
|
Местный
  
Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701

|
Мне летом какой-то крутой ARM-перец на форуме Альтеры советовал хитрый метод отладки всего стартапа HPS в DS-5, начиная с 1 команды BootROM, только я забросил всё это болото Альтерное после неисчислимых мучений ёжика в тумане... Сырость неописуемая, и эти ребята во главе с Об. запрещают нам ковыряться пальцем в носу !..  ...Там примерно надо было нажать резетную кнопку на плате и держать, в DS-5 как-то подключиться "на будущее", отпустить кнопку -- и отладчик становится на самое начало по адресу 0, потом можно по дизассемблеру степать и видеть место, где висяк -- это глядя из самого проца. Но исходников С-ных нет в принципе, логику и названия функций надо соображать по asm. Ну и из ПЛИС можно в Тапок вывести чтение того куска ОЗУ, в котором Прелоадер сидит. Хотя бы из окна Memory видна она или висяк моментальный. Только у Альтеры, как повелось издревле, трудно отлаживать стартовые процессы -- прошивка должна уже сидеть и ждать, только тогда можно пускать Тапка вручную, нет автоматизации с его автостартом, как только прошивка загрузится. Но проца можно держать в резете и отпускать, только когда Тапок включится. По идее, увидев BSEL для загрузки из ПЛИС, BootROM должен проинитить мост проц-ПЛИС самостоятельно, у него же незря 60 К кодов заложено на всё про всё в неисчислимых вариантах. И передать управление на содержимое C0000000, которое должно стать видимым. Вообще, зря они намудрили с этими BSEL-ами и BootROM-ами накристалльными... Самое надёжное и удобное нам решение -- отдать загрузку на откуп системному архитектору (обычно никому не нужны несколько src) и 1-стадийное ПО. Проц стартует с 0, и что ему там подставили на шине по этому адресу на чтение, то пусть и запускается, мудрствование обычно всегда бывает лукавым. Плохой носитель -- можно повторять попытки загрузки с адреса 4М, 8М... В 4М флэши можно уже уместить нормальное приложение, которое и полный функционал обеспечит, и при необходимости DDR подымет и скопирует свой кусок туда, но только при нормальном отладчике и надёжности.
|
|
|
|
|
Dec 30 2014, 11:37
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Новые новости с Boot фронта После подачи питания и залифки .sof файла удалось получить в signaltap следующие эпюры:
При этом видно, что данные вычитываются из памяти подряд на каждом такте и никак не привязаны к сигналу RVALID. Если я читаю содержимое сектора 0с0000000 вручную, то картинка получается такая:
Транзакция на шине сопровождается сигналом RVALID, по которому master будет капчурить данные, полученные от slave'a. Я пока не специалист по AXI, но по-моему очевидно, что эпюр на второй картинке соответствует правильной транзакции, а на первой - неправильной. Уже хорошо то, что проц пытается что-то прочитать после загрузки FPGA  , но вопрос почему он считывает данные неправильно?.. PS. Сейчас все резеты сняты по умолчанию при загрузке FPGA: Код .reset_reset_n ( 1'b1 ), .hps_boot_fpga_boot_from_fpga_ready ( 1'b1 ), .hps_boot_fpga_boot_from_fpga_on_failure ( 1'b0 ), .hps_cold_rst_reset_n ( 1'b1 ), .hps_debug_rst_reset_n ( 1'b1 ), .hps_warm_rst_reset_n ( 1'b1 ), Если подавать резеты, сформированные по pll_locked, то проц не пытается загружаться с FPGA
|
|
|
|
|
Jan 9 2015, 11:31
|
Знающий
   
Группа: Участник
Сообщений: 959
Регистрация: 11-01-06
Из: Санкт-Петербург
Пользователь №: 13 050

|
Цитата(serjj @ Dec 25 2014, 11:18)  Сталкивался ли кто нибудь с загрузкой из ПЛИС раньше? Может быть какие нибудь идеи, куда копать? С примерами такой загрузки довольно тухло (как впрочем с примерами Baremetal вообще). Буду рад любой помощи! попробуйте пройти по заведомо рабочей траектории: http://habrahabr.ru/post/235707/с учетом специфики своего железа.. а уж потом запилите свое baremetal..
|
|
|
|
|
Jan 12 2015, 09:42
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Продолжение "войны" с 5-м Cyclone'ом Пост на хабре я читал, всё конечно здорово, но вопрос не в Baremetal или Linux, а в загрузке HPS из FPGA. Сделал снимок каналов AXI Address Read и Data Read в Signaltap. И вот что получилось:
Поставил триггер на ARVALID. Он ставит начальный адрес бёрста, адрес текущий до памяти доходит, данные вычитываются, но сигналы RVALID и RREADY на канале Data Read не выставляются, следовательно мастер (HPS) не получает данные. За согласование интерефейсов памяти и проца отвечает компонент mm_interconnect, который qsys поставил сам. Это первый момент, который меня смутил. Второй: адрес выставляется не по порядку, но тут я не уверен - может так и надо, порядок вычитывания определяет программа Boot loader'a, которая зашита в ROM HPS и недоступна... А вот таже картинка, только в другом масштабе, сигналы RVALID & RREADY так и не появляются.
Документ по AXI, по которому смотрю как и что должно быть, может кому будет полезно
AXI4_specification.pdf ( 1.82 мегабайт )
Кол-во скачиваний: 557ЗЫ: может кто поделиться лекарством для DS-5?  пробная лицензия закончилась...
Сообщение отредактировал serjj - Jan 12 2015, 09:44
|
|
|
|
|
Jan 26 2015, 05:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 284
Регистрация: 9-04-06
Пользователь №: 15 968

|
Добрый день, serjj.
Появилось время на знакомство с HPS, появились вопросы, которые Вы видимо прошли. Если не трудно помогите советом.
1. Почему boot из FPGA? Надо же что-то в FPGA городить чтобы залить файл в HPS? Хочу использовать boot из QSPI (FPGA и HPS), может чего-то не учел? 2. В DS5 как создается проект? Просто new project c++ и все, пишем сорс, компилируем и готово? Привык что в ниосе еще огромная BSP. Неужели тут ничего, кроме сорсов приложения ? 3. При boot-е из QSPI я так понял сначала грузим HPS, а как грузится FPGA? Видел что надо rbf файл сделать, а куда его втолкнуть потом?
Пока в голове каша, может вопросы примитивные, пожалуйста подскажите документы в которых искать ответы.
Спасибо.
|
|
|
|
|
Jan 26 2015, 07:48
|
Знающий
   
Группа: Участник
Сообщений: 527
Регистрация: 4-06-14
Из: Санкт-Петербург
Пользователь №: 81 866

|
Здравствуйте. Цитата Почему boot из FPGA? Надо же что-то в FPGA городить чтобы залить файл в HPS? Хочу использовать boot из QSPI (FPGA и HPS), может чего-то не учел? Потому что на нашей плате есть только Cyclone V и NAND flash. По задумке preloader грузится из FPGA OCRAM, а приложение - из NAND. Тип приложения - baremetal. При это ПЛИС умеет грузить себя сама. Цитата В DS5 как создается проект? Просто new project c++ и все, пишем сорс, компилируем и готово? Привык что в ниосе еще огромная BSP. Неужели тут ничего, кроме сорсов приложения ? Советую для начала брать за основу проекты вот отсюда. Мне помогает. Там не все так просто, нужно правильно настроить makefile, я вот например раньше его открывал, только что бы настройки bsp подкорректировать, с SoC нужно будет чаще туда лазить.. Использую gcc для сборки. Вот пару советов: - запускайте Eclipse через EDS консоль, тогда он правильно подхватывает все зависимости, иначе могут быть ошибки на этапе сборки проектов - в папке ALTERA_PATH\VERSION\embedded\ip\altera\hps\altera_hps\hwlib\include лежат h-шники альтеры, которые понадобяться для работы с периферией проца - для подключения новой периферии его нужно добавить 1) в инклуде исходника, 2) в makefile, пример: В С файле код, который останавливает Watchdog: Код #include <stdio.h> #include "alt_clock_manager.h" #include "alt_watchdog.h" int main(int argc, char** argv) { ALT_STATUS_CODE status = ALT_E_SUCCESS; if (status == ALT_E_SUCCESS) { printf("INFO: Stopping Watchdog 0 Timer.\n"); status = alt_wdog_stop(ALT_WDOG0); } // Check if Watchdog0 is running if (status == ALT_E_SUCCESS) { if (alt_wdog_tmr_is_enabled(ALT_WDOG0) == true) { printf("INFO: Watchdog 0 Timer is running.\n"); } else { printf("INFO: Watchdog 0 Timer is not running.\n"); } } printf("Hello!\n"); return 0; } В Makefile строки, которые отвечают за подключение либ: Код HWLIBS_SRC := alt_watchdog.c alt_clock_manager.c EXAMPLE_SRC := hello.c io.c C_SRC := $(EXAMPLE_SRC) $(HWLIBS_SRC) За недостатком документации по программированию этого чуда, комментарии в h-шниках весьма полезны для изучения программной модели, там например иногда английским по белому пишут, какие функции нужно вызывать вначале, что бы данная периферия заработала или как что включать/выключать... - приложение можно собрать либо как hosted либо как unhosted с помощью (как я понял следующих строк Makefile): Для unhosted: Код LINKER_SCRIPT := cycloneV-dk-ram-modified.ld Для hosted: Код LINKER_SCRIPT := cycloneV-dk-ram-hosted.ld В примерах Altera делается инициализация системы, на нее стоит обратить внимание, особенно на прерывания и MMU. Есть такие чудо файлы - alt_pt.h и alt_pt.c, в альтеровской папке я их не нашел, забрал из примеров, они нужны для инициализации кэша (по-умолчанию он выключен из-за чего проц работает ужасно медленно, разумеется). Все вышесказанное имеет значение, если вы хотите делать baremetal app. Если у вас линух предполагается, то он всю эту низкоуровневую мишуру сам сделает.. Но нам пока линух неинтересен, поэтому я вожусь с baremetal. Цитата При boot-е из QSPI я так понял сначала грузим HPS, а как грузится FPGA? Видел что надо rbf файл сделать, а куда его втолкнуть потом? Посмотрите вот отсюда например. Сам не делал, поэтому тут не скажу. Знаю, что rbf размещают в некоторой области флехи, откуда загрузчик его потом заберет. Если хотите порыть вглубь, то вот направление: в папке, которая создается после генерации preloader'a из которой он потом собирается spl_bps\uboot-socfpga\arch\arm\cpu\armv7\socfpga есть файл spl.c, собственно исходники preloader'a (часть), в конце файла есть секция CONFIG_SPL_FPGA_LOAD, там описана загрузка ПЛИС процом. В preloader'e соответственно нужно эту опцию разрешить. Удачи.
|
|
|
|
|
Jul 28 2016, 14:32
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(serjj @ Jan 26 2015, 11:48)  В примерах Altera делается инициализация системы, на нее стоит обратить внимание, особенно на прерывания и MMU. Есть такие чудо файлы - alt_pt.h и alt_pt.c, в альтеровской папке я их не нашел, забрал из примеров, они нужны для инициализации кэша (по-умолчанию он выключен из-за чего проц работает ужасно медленно, разумеется). Сейчас уже есть в HWlib файлы alt_cache.h и alt_mmu.h. В первом есть необходимая настройка кэшей, а во втором - MMU. Насколько я понимаю, работа с кэшем данных без MMU практически невозможна, ведь как можно без MMU задавать, какие регионы памяти кэшируются, а какие нет? К примеру, области регистров периферии не должны кэшироваться. Кто нибудь работал с кэшами и MMU под bare metal?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|