реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Свой загрузчик
juvf
сообщение May 18 2011, 10:09
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



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


Где я оступился? Кому-нибудь удавалось свой загрузчик написать?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Reanimator++
сообщение May 18 2011, 16:40
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 399
Регистрация: 1-01-06
Из: Волгоград
Пользователь №: 12 763



А зачем вам свой загрузчик? )
Может проще обойтись стандартным уже встроенным в epcs контроллер?
ибо функцию который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление он выполняет вполне успешно..
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 18 2011, 23:07
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(Reanimator++ @ May 18 2011, 23:40) *
А зачем вам свой загрузчик? )
Может проще обойтись стандартным уже встроенным в epcs контроллер?
ибо функцию который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление он выполняет вполне успешно..

на самом деле вещь полезная: возможность хранить несколько прошивок, контроль их целостности. опять же, juvf хочет туда диагностику вставить. я делал несколько лет назад загрузчик на базе advanced_boot_copier по причине того, что штатный бутлоадер для CIII был сломан (кажется, версия квартуса 7.1 или 7.0). тогда у меня с пол-пинка завелось. как время появится, сделаю еще раз, проект здесь выложу.
Go to the top of the page
 
+Quote Post
barabek
сообщение May 18 2011, 23:27
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(juvf @ May 18 2011, 21:09) *
Где я оступился? Кому-нибудь удавалось свой загрузчик написать?


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

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


Код
Вариант 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
Go to the top of the page
 
+Quote Post
juvf
сообщение May 19 2011, 02:33
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Reanimator++ @ May 18 2011, 22:40) *
А зачем вам свой загрузчик? )
Может проще обойтись стандартным уже встроенным в epcs контроллер?

До того как грузить код в SDRAM, нужно проверить - исправна ли это ОЗУ, не залипают ли ноги. Эту проверку я хочу встроить в загрузчик.
Go to the top of the page
 
+Quote Post
barabek
сообщение May 19 2011, 04:27
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(juvf @ May 19 2011, 13:33) *
До того как грузить код в SDRAM, нужно проверить - исправна ли это ОЗУ, не залипают ли ноги. Эту проверку я хочу встроить в загрузчик.


Да и ещё. Вы пробуете в Nios IDE дебаггить пошагово по дизасемблеровскому коду "Instruction stepping mode" ? Только выставить в дебуггере "break at program entry". Вы ведь тогда попадете на код загрузчика и будет видно, что происходит. Делали?
Go to the top of the page
 
+Quote Post
juvf
сообщение May 19 2011, 08:08
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



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


Go to the top of the page
 
+Quote Post
Sergey'F
сообщение May 19 2011, 10:06
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Если я правильно понял вопрос, то весь процесс поиска .pof в EPCS и информации о длине в нем, в виде ассемблерного кода с пошаговыми комментариями подробно описан в
<путь установки Nios>\nios2eds\components\altera_nios2\boot_loader_sources\boot_loader_epcs_bits_cyclone.S или boot_loader_epcs_bits_sii_siii_ciii.S.
Go to the top of the page
 
+Quote Post
juvf
сообщение May 20 2011, 10:30
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Sergey'F @ May 19 2011, 16:06) *
Если я правильно понял вопрос, то весь процесс поиска .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.gif
у меня флешка epcs4, 512 Кб, от куда там 528433023? Не понятно пока, как дефолтный загрузчик вычисляет адрес программы?
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение May 20 2011, 11:29
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Рискну предположить, что у Вас все-таки CycloneIII или StratixII/III, а там более утонченная схема спрятать длину (из файла boot_loader_epcs_bits_sii_siii_ciii.S)
Go to the top of the page
 
+Quote Post
juvf
сообщение May 25 2011, 08:42
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Sergey'F @ May 20 2011, 17:29) *
Рискну предположить, что у Вас все-таки CycloneIII или StratixII/III, а там более утонченная схема спрятать длину (из файла boot_loader_epcs_bits_sii_siii_ciii.S)

ага, CycloneIII. Нашел я этот алгоритм. с полпинка определил все заголовки.
В общем разбомбил я эту тему. Всё прекрасно грузится. А чтоб не забыть, как это делать, написал шпаргалку. Может она ещё кому полезна будет.
Go to the top of the page
 
+Quote Post
Sergey'F
сообщение May 25 2011, 14:47
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 17-09-05
Из: Москва
Пользователь №: 8 660



Цитата(juvf @ May 25 2011, 12:42) *
В общем разбомбил я эту тему.

Поздравляю! Спасибо за информацию. Насколько я понимаю, часть с определением длины прошивки переведена в С из ассемблера?
Go to the top of the page
 
+Quote Post
juvf
сообщение May 25 2011, 16:07
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Sergey'F @ May 25 2011, 20:47) *
Насколько я понимаю, часть с определением длины прошивки переведена в С из ассемблера?

Да. Практически скопипастил. даже имена переменных не переделывал. laughing.gif
Go to the top of the page
 
+Quote Post
gosu-art
сообщение Aug 29 2012, 14:13
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 555
Регистрация: 14-10-09
Пользователь №: 52 939



Можно у вас поинтересоваться. Получалось ли загружаться в SDRAM при использовании стандартного бутлода EPCS?
Создал простой проект, попробовал ваш вариант со "своим загрузчиком" - работает! Но у меня блоков памяти в реальном проекте мало осталось, не хватит. А с использованием бутлода EPCSки не хочет грузится, хоть убей. И програмером пробовал, и консолью - не работает 1111493779.gif
Пытался сделать так. Во всех вариантах Ниос видится, а программа не стартует.
Помогите пожалуйста!
Go to the top of the page
 
+Quote Post
juvf
сообщение Oct 10 2012, 10:06
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(gosu-art @ Aug 29 2012, 20:13) *
Можно у вас поинтересоваться. Получалось ли загружаться в SDRAM при использовании стандартного бутлода EPCS?
Создал простой проект, попробовал ваш вариант со "своим загрузчиком" - работает! Но у меня блоков памяти в реальном проекте мало осталось, не хватит. А с использованием бутлода EPCSки не хочет грузится, хоть убей.

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

может вектора прерываний не правильно настроенны в BSP?
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 20:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01535 секунд с 7
ELECTRONIX ©2004-2016