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

Не получается ни как загрузчик сделать. Пишу от отчаянья. Тренируюсь уже на кошках. Нужно разместить загрузчик в ончип, который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление. Делаю всё по пдф an458.pdf Скачал демо-загрузчик с альтеры. Только платформу свою сделал. Делаю все как доктора прописали:

 

1) создал в SOPC cвой процессор со своей периферией, рис1. Вектор сброса и прерываний в cpu на boot_rom, офсет ресета = 0, офсет прерываний = 0х20, размер boot_rom 8 Кбайт. Сгенерировал *.sopc

2) поместил в папру проекта папку с примером загрузчика boot_copier_sw

3) открыл файл <project>/boot_copier_sw/bsp/advanced_boot_copier/boot_copier_bsp_settings.tcl в текстовом редакторе. исправил следующие настройки

 

set ONCHIP 1

 

set EXCEPTION_OFFSET 0x20

set RESET_OFFSET 0x00000000

 

set BOOT_ROM_SIZE 0x2000

 

set SDRAM_SIZE 0x07FFFFF // я так понял что это размер моей внешней SDRAM в байтах

set FLASH_SIZE 0x080000 // а это размер EPCS. У меня EPCS4, соответственно выставил 512 Кбайт

 

заменил имена периферии на свои, peripheral_subsystem_jtag_uart на jtag_uart, peripheral_subsystem_sys_clk_timer на timerSys.

из-за строчки "add_memory_region ext_flash ext_flash $EXT_FLASH_REGION_START $EXT_FLASH_REGION_SIZE" была ошибка, не мог сделать регион .ext_flash. т.к. я внешнюю cfi не собираюсь использовать, то я эту строку закомментировал.

 

4) подправил <project>/boot_copier_sw/app/advanced_boot_copier/advanced_boot_copier.c

указал метод #define BOOT_METHOD BOOT_EPCS_FROM_ONCHIP_ROM

исправил имя порта с лампочками PERIPHERAL_SUBSYSTEM_LED_PIO_BASE на своё IOLED_BASE

 

5) запустил из <project>/boot_copier_sw/app/advanced_boot_copier скрипт ./create-this-app и получил заветный выхлоп удачной сборки

Info: (advanced_boot_copier.elf) 8788 Bytes program size (code + initialized data).
Info:                            184 Bytes free for stack + heap.
Info: Creating advanced_boot_copier.objdump
nios2-elf-objdump --disassemble --syms --all-header advanced_boot_copier.elf >advanced_boot_copier.objdump
[advanced_boot_copier build complete]

To download and run the application:
    1. Make sure the board is connected to the system.
    2. Run 'nios2-configure-sof <SOF_FILE_PATH>' to configure the FPGA with the hardware design.
    3. If you have a stdio device, run 'nios2-terminal' in a different shell.
    4. Run 'make download-elf' from the application directory.

To debug the application:
    Import the project into Nios II IDE.  Refer to Nios II IDE Documentation for more information.

Только вот смущает 8788 Bytes program size, вроде для этого проекта по инструкции нужно выделить 8 Кбайт, а код занимает немного больше. ??? Ну да ладно, альтеровцам виднее.

 

6) Теперь тестовый проект Hello World. Перехожу в <project>/boot_copier_sw/app/hello_world и запускаю ./create-this-app. Здесь ни чего сложного, ни чего править не нужно

вывод

Info: (hello_world.elf) 46 KBytes program size (code + initialized data).
Info:                   8138 KBytes free for stack + heap.
Info: Creating hello_world.objdump
nios2-elf-objdump --disassemble --syms --all-header --source hello_world.elf >hello_world.objdump
[hello_world build complete]

 

7) Packing the Test Application in a Boot Record

скрипт make_flash_image_script.sh почему-то не заработал. не может создать копию эльфа в hello_world.elf.tmp.elf, пишет

ERROR: trying to strip entry section from elf file hello_world.elf.tmp.elf
Permission denited!

в скрипте закоментировал это копирование и из файл менеджера сам сделал копию. запустил скрипт.......

тут интересный момент. вот в оригинале как сказано

Open <project>/boot_copier_sw/app/hello_world/make_flash_image_script.sh in

a text editor and update the flash_base and flash_end parameters to match your

system.

в переводе Егорова
...обновите параметры flash_base и flash_end на те, что вы сделали в системе.
Вот тут загвоздка! что за адреса flash_base and flash_end? Я задовал в системе адреса контроллера епцс. Больше я адресов с флеш ни каких не делал. Выставил начальный и конечные адреса епцс-флеш-контроллера. Получаю ошибку
(WARNING) elf2flash: ELF file will not fit in flash.  No flash file created

ERROR: converting srec file hello_world.elf.tmp.srec to binary.

А какое ещё адрес выставлять? ну по умолчанию в скрипте были

flash_base=0x00000000;
flash_end=0x00FFFFFF;

чем-то напоминает на внутренние адреса в EPCS-FLASH. т.е. нужно указать минимальный адрес и максимальный той epcs-флешке, которая стоит на плате. Запускаю скрипт.... вижу завтеное "Script completed successfully."

 

8) Booting CFI or EPCS Flash From On-Chip Memory

Выполняю "elf2hex advanced_boot_copier.elf 0x1810000 0х1811FFF --width=32 --create-lanes=0 ../../../boot_rom.hex" и получаю нужный boot_rom.hex

 

9)В квартусе запускаю компиляцию. Умный компилятор только подхватил мой boot_rom.hex для инициализации onchip-memory boot_rom

10)команда "bin2flash --input=hello_world.elf.flash.bin --output=hello_world.flash --location=0x00060000"

11)команда "nios2-flash-programmer --base=<flash_base> --epcs hello_world.flash", выход команды

Using cable "USB-Blaster [USB-1]", device 1, instance 0x01
Resetting and pausing target processor: OK

              : Checksumming existing contents          

00060000      : Verifying existing contents             

00060000      : Reading existing contents               

Checksummed/read 19kB in 0.4s                                        

00060000 ( 0%): Erasing                                 

Erased 64kB in 0.6s (106.6kB/s)                        

00060000 ( 0%): Programming                             

Programmed 46KB +18KB in 1.4s (45.7KB/s)                   
Did not attempt to verify device contents
Leaving target processor paused

12)команда "nios2-download -r -g"

светодиоды не маргнули, а должны вроде....

13)команда "nios2-terminal"

14)жму ресет - тишина. Ни мигание лампочек, ни в терминале текста :(

 

 

Где я оступился? Кому-нибудь удавалось свой загрузчик написать?

post-49045-1305712929_thumb.png

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


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

А зачем вам свой загрузчик? )

Может проще обойтись стандартным уже встроенным в epcs контроллер?

ибо функцию который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление он выполняет вполне успешно..

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


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

А зачем вам свой загрузчик? )

Может проще обойтись стандартным уже встроенным в epcs контроллер?

ибо функцию который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление он выполняет вполне успешно..

на самом деле вещь полезная: возможность хранить несколько прошивок, контроль их целостности. опять же, juvf хочет туда диагностику вставить. я делал несколько лет назад загрузчик на базе advanced_boot_copier по причине того, что штатный бутлоадер для CIII был сломан (кажется, версия квартуса 7.1 или 7.0). тогда у меня с пол-пинка завелось. как время появится, сделаю еще раз, проект здесь выложу.

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


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

Где я оступился? Кому-нибудь удавалось свой загрузчик написать?

 

Я делал свой загрузчик. Правда из CFI в DDR (свой контроллер) , т.к. контроллер был свой то стандартный загрузчик не совсем подходил ( у меня необходимо некоторую инициализацию контроллера DDR сделать средствами Nios) Чтобы не забыть написал себе шпаргалку :).

 

К сожалению не могу на работе приатачить файл, поэтому извините, выложу как есть содержимое.

 

 

Вариант 2. копируем содержимое папки  C:\altera\90\nios2eds\components\altera_nios2\boot_loader_sources куда нужно. В папке должны присутствовать исходники и makefile. Редактируем файл нужного загрузчика под свои нужды. Запускаем NIOScommandShell. Переходим в свою папку. Вводим команду make. Все готово. Появились файлы xxx.srec и их копии, но в формате big-endian xxx_be.srec. 
Если нужно грузиться с CFI (адрес сброса указывает на CFI и, при этом, в настройках системной библиотеки указывается, что область кода программы .text располагается не CFI), то при компиляции указать свой бутлоадер, т.е. что бы при исполнении команды elf2flash использовалась опция --boot=<мой_бутлоадер>.srec. 
Если нужно грузиться с onchip ROM (при использовании EPSC это обязательно!), то полученный файл xxx.srec переводим в формат Intel HEX командой nios2-elf-objcopy –O ihex –I srec <мой_бутлоадер>.srec <мой_бутлоадер>.hex. (эту команду можно спрятать в макефайл 
%.hex : $(OBJ)/%.elf $(OBJ)
    $(E) Creating MY HEX file $@
    $(S) elf2hex --base=0x000 --end=0x7ff --width=32 --input=$< --output-target=$@
    $(S) cp $@ boot.hex

Но при этом нужно добавить в таргет SRECS = \...(старое)….. \boot_loader_cfi.hex\
\ boot.hex
)
. Затем подсовываем этот файл в квартус перед компиляцией, указав в настройках onchip ROM использовать этот файл при инициализации. Можно назвать файл одноименно с названием этой ROM в SOPC.

Прошивка основной программы во Flash (вариант загрузки с внутренней памяти).
1.    Запускаем FlashProgrammer единожды. Он создает в папке Debug скрипт  flash_programmer.sh. 
2.    Создаем его копию и переименовываем, например MY.sh.
3.     Создаем свой псевдо-бутлоадер в этой же папке (например qboot.srec), содержащий:
S0030000FC
S113000000000000000000000000000000000000EC
S113001000000000000000000000000000000000DC
S9030000FC
Создаваемый в предыдущем разделе бутлоадер должен учитывать, что реальные данные будут после текста этого псевдо-бутлоадера. В теле псевдо-бутлоадера можно вставить свою информацию, типа ревизия, версия и т.п. Реальные данные содержат поля. Каждое поле начинается с длинны поля (только данные) 4байта и стартового адреса назначения. Если поле длины равно 0, то это последнее поле и следуещее поле содержит адрес перехода на начало основной программы.
4.    Меняем в этом скрипте адрес сброса (с реального адреса внутренней памяти на базовый адрес CFI или EPCS и указываем свой псевдобутлоадер. Пример.
Было
"$SOPC_KIT_NIOS2/bin/elf2flash" --base=0x05000000 --end=0x5ffffff --reset=0x6002800 --input="test_memory.elf" --output="Flash.flash" --boot="C:/altera/90/ip/altera/nios2_ip/altera_nios2/boot_loader_cfi.srec"
Стало 
"$SOPC_KIT_NIOS2/bin/elf2flash" --base=0x05000000 --end=0x5ffffff --reset=0x05000000 --input="test_memory.elf" --output="Flash.flash" --boot="qboot.srec"

5. Запускаем NIOScommandShell, меняем директорию на папку Debug и выполняем команду ./my.sh

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


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

А зачем вам свой загрузчик? )

Может проще обойтись стандартным уже встроенным в epcs контроллер?

До того как грузить код в SDRAM, нужно проверить - исправна ли это ОЗУ, не залипают ли ноги. Эту проверку я хочу встроить в загрузчик.

 

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


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

До того как грузить код в SDRAM, нужно проверить - исправна ли это ОЗУ, не залипают ли ноги. Эту проверку я хочу встроить в загрузчик.

 

Да и ещё. Вы пробуете в Nios IDE дебаггить пошагово по дизасемблеровскому коду "Instruction stepping mode" ? Только выставить в дебуггере "break at program entry". Вы ведь тогда попадете на код загрузчика и будет видно, что происходит. Делали?

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


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

в общем по инструкции ан458 не получилось собрать копировщик и темпаче дебажить. Закинул инструкцию за баню и сделал новый проект в эклипсе. скопипастил туда advanced_boot_loader.c. Копировщик с полпинка собрался и прикрутился к sof файлу и даже запускается по ресету. И даже дебаг копировщика запустился в полпинка. Теперь нужно найти заголовок программы в epcs. Дефолтный копировщик читает в епцс по начальному адресу заголовор pof. По нему определяет адрес конца аппаратной конфигурации и сразу за ним читает заголовок программы. После этого копирует программу в ОЗУ и передает управление в точку входа основной программы. Как бы найти где этот заголовок программы в епцс? Не могу найти расшифровку заголовка pof? Не могу определить размер конфигурации в epcs ((

 

 

 

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


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

Если я правильно понял вопрос, то весь процесс поиска .pof в EPCS и информации о длине в нем, в виде ассемблерного кода с пошаговыми комментариями подробно описан в

<путь установки Nios>\nios2eds\components\altera_nios2\boot_loader_sources\boot_loader_epcs_bits_cyclone.S или boot_loader_epcs_bits_sii_siii_ciii.S.

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


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

Если я правильно понял вопрос, то весь процесс поиска .pof в EPCS и информации о длине в нем, в виде ассемблерного кода с пошаговыми комментариями подробно описан в

<путь установки Nios>\nios2eds\components\altera_nios2\boot_loader_sources\boot_loader_epcs_bits_cyclone.S или boot_loader_epcs_bits_sii_siii_ciii.S.

По шагам его изучил. Там читается узсы начиная с 0 и ищется первое входждение 0х56. Это синхробайт. потом 4 байта пропускаются, след 4 - это длинна, причем in bit-reversing.

 

вот что лежит в реальной рабочей epcs

S1230000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
S123002056EFEFEFEFEFEFCFDFDF9FDFCF8F9F9FBFBFBFBF9FFF9F9FFFFFDFDF9F9FBFBFD5
S1230040BF9FBFBFBF9F9FDFDFF47AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAC
S1230060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9C
S1230080FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7C
S12300A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5C
S12300C0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF3C
S12300E0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C
S1230100FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FA

 

56EFEFEF - это синхронизация, EFEFEFCF - это нам не интересно, DFDF9FD - а это типа длинна. первый мл, и биты наоборот. Перекодирую и получаю длинны в битах fbf9fbfb. / на 8 = 528433023 (dec) байт. :wacko:

у меня флешка epcs4, 512 Кб, от куда там 528433023? Не понятно пока, как дефолтный загрузчик вычисляет адрес программы?

 

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


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

Рискну предположить, что у Вас все-таки CycloneIII или StratixII/III, а там более утонченная схема спрятать длину (из файла boot_loader_epcs_bits_sii_siii_ciii.S)

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


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

Рискну предположить, что у Вас все-таки CycloneIII или StratixII/III, а там более утонченная схема спрятать длину (из файла boot_loader_epcs_bits_sii_siii_ciii.S)

ага, CycloneIII. Нашел я этот алгоритм. с полпинка определил все заголовки.

В общем разбомбил я эту тему. Всё прекрасно грузится. А чтоб не забыть, как это делать, написал шпаргалку. Может она ещё кому полезна будет.

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


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

В общем разбомбил я эту тему.

Поздравляю! Спасибо за информацию. Насколько я понимаю, часть с определением длины прошивки переведена в С из ассемблера?

 

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


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

Насколько я понимаю, часть с определением длины прошивки переведена в С из ассемблера?

Да. Практически скопипастил. даже имена переменных не переделывал. :laughing:

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


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

Можно у вас поинтересоваться. Получалось ли загружаться в SDRAM при использовании стандартного бутлода EPCS?

Создал простой проект, попробовал ваш вариант со "своим загрузчиком" - работает! Но у меня блоков памяти в реальном проекте мало осталось, не хватит. А с использованием бутлода EPCSки не хочет грузится, хоть убей. И програмером пробовал, и консолью - не работает :1111493779:

Пытался сделать так. Во всех вариантах Ниос видится, а программа не стартует.

Помогите пожалуйста!

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


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

Можно у вас поинтересоваться. Получалось ли загружаться в SDRAM при использовании стандартного бутлода EPCS?

Создал простой проект, попробовал ваш вариант со "своим загрузчиком" - работает! Но у меня блоков памяти в реальном проекте мало осталось, не хватит. А с использованием бутлода EPCSки не хочет грузится, хоть убей.

Если ещё актуально.... Да, со стандартным загрузчиком EPCS всё прекрасно работает. Только некоторые чипы перестали шиться флешпрограмматором. Стал конвертировать sof и elf в hex-ы, а из хексов делаю jic. по вашей ссылке jic делается сразу из sof. уже не помню почему я делаю через хекс, но по мойму сразу из софа что-то не пошло.

 

может вектора прерываний не правильно настроенны в BSP?

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


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

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

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

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

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

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

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

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

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

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