juvf 17 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Не получается ни как загрузчик сделать. Пишу от отчаянья. Тренируюсь уже на кошках. Нужно разместить загрузчик в ончип, который при запуске скопирует программу из 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)жму ресет - тишина. Ни мигание лампочек, ни в терминале текста :( Где я оступился? Кому-нибудь удавалось свой загрузчик написать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reanimatorr 1 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба А зачем вам свой загрузчик? ) Может проще обойтись стандартным уже встроенным в epcs контроллер? ибо функцию который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление он выполняет вполне успешно.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба А зачем вам свой загрузчик? ) Может проще обойтись стандартным уже встроенным в epcs контроллер? ибо функцию который при запуске скопирует программу из EPCS в SDRAM и передаст ей управление он выполняет вполне успешно.. на самом деле вещь полезная: возможность хранить несколько прошивок, контроль их целостности. опять же, juvf хочет туда диагностику вставить. я делал несколько лет назад загрузчик на базе advanced_boot_copier по причине того, что штатный бутлоадер для CIII был сломан (кажется, версия квартуса 7.1 или 7.0). тогда у меня с пол-пинка завелось. как время появится, сделаю еще раз, проект здесь выложу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 18 мая, 2011 Опубликовано 18 мая, 2011 · Жалоба Где я оступился? Кому-нибудь удавалось свой загрузчик написать? Я делал свой загрузчик. Правда из 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба А зачем вам свой загрузчик? ) Может проще обойтись стандартным уже встроенным в epcs контроллер? До того как грузить код в SDRAM, нужно проверить - исправна ли это ОЗУ, не залипают ли ноги. Эту проверку я хочу встроить в загрузчик. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
barabek 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба До того как грузить код в SDRAM, нужно проверить - исправна ли это ОЗУ, не залипают ли ноги. Эту проверку я хочу встроить в загрузчик. Да и ещё. Вы пробуете в Nios IDE дебаггить пошагово по дизасемблеровскому коду "Instruction stepping mode" ? Только выставить в дебуггере "break at program entry". Вы ведь тогда попадете на код загрузчика и будет видно, что происходит. Делали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба в общем по инструкции ан458 не получилось собрать копировщик и темпаче дебажить. Закинул инструкцию за баню и сделал новый проект в эклипсе. скопипастил туда advanced_boot_loader.c. Копировщик с полпинка собрался и прикрутился к sof файлу и даже запускается по ресету. И даже дебаг копировщика запустился в полпинка. Теперь нужно найти заголовок программы в epcs. Дефолтный копировщик читает в епцс по начальному адресу заголовор pof. По нему определяет адрес конца аппаратной конфигурации и сразу за ним читает заголовок программы. После этого копирует программу в ОЗУ и передает управление в точку входа основной программы. Как бы найти где этот заголовок программы в епцс? Не могу найти расшифровку заголовка pof? Не могу определить размер конфигурации в epcs (( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 19 мая, 2011 Опубликовано 19 мая, 2011 · Жалоба Если я правильно понял вопрос, то весь процесс поиска .pof в EPCS и информации о длине в нем, в виде ассемблерного кода с пошаговыми комментариями подробно описан в <путь установки Nios>\nios2eds\components\altera_nios2\boot_loader_sources\boot_loader_epcs_bits_cyclone.S или boot_loader_epcs_bits_sii_siii_ciii.S. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Если я правильно понял вопрос, то весь процесс поиска .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) байт. у меня флешка epcs4, 512 Кб, от куда там 528433023? Не понятно пока, как дефолтный загрузчик вычисляет адрес программы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 20 мая, 2011 Опубликовано 20 мая, 2011 · Жалоба Рискну предположить, что у Вас все-таки CycloneIII или StratixII/III, а там более утонченная схема спрятать длину (из файла boot_loader_epcs_bits_sii_siii_ciii.S) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 25 мая, 2011 Опубликовано 25 мая, 2011 · Жалоба Рискну предположить, что у Вас все-таки CycloneIII или StratixII/III, а там более утонченная схема спрятать длину (из файла boot_loader_epcs_bits_sii_siii_ciii.S) ага, CycloneIII. Нашел я этот алгоритм. с полпинка определил все заголовки. В общем разбомбил я эту тему. Всё прекрасно грузится. А чтоб не забыть, как это делать, написал шпаргалку. Может она ещё кому полезна будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyF 0 25 мая, 2011 Опубликовано 25 мая, 2011 · Жалоба В общем разбомбил я эту тему. Поздравляю! Спасибо за информацию. Насколько я понимаю, часть с определением длины прошивки переведена в С из ассемблера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 25 мая, 2011 Опубликовано 25 мая, 2011 · Жалоба Насколько я понимаю, часть с определением длины прошивки переведена в С из ассемблера? Да. Практически скопипастил. даже имена переменных не переделывал. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gosu-art 0 29 августа, 2012 Опубликовано 29 августа, 2012 · Жалоба Можно у вас поинтересоваться. Получалось ли загружаться в SDRAM при использовании стандартного бутлода EPCS? Создал простой проект, попробовал ваш вариант со "своим загрузчиком" - работает! Но у меня блоков памяти в реальном проекте мало осталось, не хватит. А с использованием бутлода EPCSки не хочет грузится, хоть убей. И програмером пробовал, и консолью - не работает :1111493779: Пытался сделать так. Во всех вариантах Ниос видится, а программа не стартует. Помогите пожалуйста! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 10 октября, 2012 Опубликовано 10 октября, 2012 · Жалоба Можно у вас поинтересоваться. Получалось ли загружаться в SDRAM при использовании стандартного бутлода EPCS? Создал простой проект, попробовал ваш вариант со "своим загрузчиком" - работает! Но у меня блоков памяти в реальном проекте мало осталось, не хватит. А с использованием бутлода EPCSки не хочет грузится, хоть убей. Если ещё актуально.... Да, со стандартным загрузчиком EPCS всё прекрасно работает. Только некоторые чипы перестали шиться флешпрограмматором. Стал конвертировать sof и elf в hex-ы, а из хексов делаю jic. по вашей ссылке jic делается сразу из sof. уже не помню почему я делаю через хекс, но по мойму сразу из софа что-то не пошло. может вектора прерываний не правильно настроенны в BSP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться