Не получается ни как загрузчик сделать. Пишу от отчаянья. Тренируюсь уже на кошках. Нужно разместить загрузчик в ончип, который при запуске скопирует программу из 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)жму ресет - тишина. Ни мигание лампочек, ни в терминале текста
Где я оступился? Кому-нибудь удавалось свой загрузчик написать?
Эскизы прикрепленных изображений