|
Запись .jic файла в EPCS через программу из NIOS II., Чтобы сделать Update прошивки в EPCS в автоматическом режиме. |
|
|
|
Feb 9 2015, 11:52
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Здравствуйте! Хотел бы сделать возможность обновлять прошивку EPCS ( что-то типа Remote Update ) таким способом. На плате имеется Cyclone IV с кофигурационной схемой AS с возможностью загрузки .jic файла через JTAG ( SFL ).
В EPCS находится единственный .jic файл, который был загружен туда через JTAG этой схеме. При включении питания .jic файл из EPCS конфигурирует и инициализирует Cyclone IV. Если этот .jic файл ( находящийся внутри EPCS ) нужно обновить ( сделать что-то типа Remote Update ), то можно ли это сделать через NIOS II не вручную, а в автоматическом режиме? Например так - новый .jic файл передаётся с обновлением ПО, становится доступным для NIOS II и NIOS II перезаписывает новый .jic файл в EPCS, затирая предыдущий. После следующего включения-выключения питания Cyclone IV конфигурируется и инициализируется уже с нового .jic файла. Как это сделать? Видимо это должна быть некая программа на C для NIOS II? Есть ли где это описано у Альтеры, есть ли пример такой программы?
|
|
|
|
|
 |
Ответов
|
Feb 9 2015, 13:06
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(FLTI @ Feb 9 2015, 15:53)  Где доступнее всего описано с примером ( в том числе с программой на С для NIOSа ) - как писать/читать EPCS через NIOS при помощи EPCS Controller-a ? Можете взять в качестве примера немного подправив (используются только ф-ии alt_epcs_flash_init(), alt_epcs_flash_erase_block(), alt_epcs_flash_write_block(), ну и если читать надо, тогда - alt_epcs_flash_read_block()): CODE #include "altera_avalon_epcs_flash_controller.h"
static alt_flash_epcs_dev epcs_flash = { { ALT_LLIST_ENTRY, EPCS_FLASH_CONTROLLER_NAME, NULL, NULL, alt_epcs_flash_write, alt_epcs_flash_read, alt_epcs_flash_get_info, alt_epcs_flash_erase_block, alt_epcs_flash_write_block, ((void*)(EPCS_FLASH_CONTROLLER_BASE)) }, (EPCS_FLASH_CONTROLLER_REGISTER_OFFSET + EPCS_FLASH_CONTROLLER_BASE) };
short factory_cb(unsigned char *data, unsigned short size, unsigned short idx) { static int block_offset; static int data_offset; static unsigned long sec_addr = 0; static unsigned int prev_idx;
if(idx == 1) { alt_epcs_flash_init(&epcs_flash); block_offset = FACTORY_PAGE_START_ADDRESS; data_offset = FACTORY_PAGE_START_ADDRESS;
prev_idx = 0; sec_addr = FACTORY_PAGE_START_ADDRESS; }
if(idx % 128 == 1) // 512*128 = 65536 = 64 kbyte { alt_epcs_flash_erase_block(&epcs_flash.dev, sec_addr); sec_addr += CONFIG_DEV_SECTOR_SIZE; }
if(size) { unsigned char buffer[512]; for(int i = 0; i < size; i++) { swap_bits(&data[i]); buffer[i] = data[i]; } alt_epcs_flash_write_block(&epcs_flash.dev, block_offset, data_offset, buffer, size); data_offset += size; if((data_offset % CONFIG_DEV_SECTOR_SIZE) == 0) { block_offset += CONFIG_DEV_SECTOR_SIZE; } }
prev_idx = idx;
return 1; }
Ранее, для загрузки по CAN, использовался немного другой вариант: CODE #include "alt_types.h" #include "system.h"
#define ALT_USE_EPCS_FLASH
#include "altera_avalon_epcs_flash_controller.h" #include "epcs_loader.h" #include "include/MCP2515.h"
ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INSTANCE(EPCS_FLASH_CONTROLLER_0, epcs_flash);
void epcs_loader(unsigned int *data) { int i; static int block_offset; static int data_offset;
unsigned long tmp[2]; char buf[8];
if(data[0] == BOOT_START_CMD && data[1] == BOOT_START_CMD) { ALTERA_AVALON_EPCS_FLASH_CONTROLLER_INIT(EPCS_FLASH_CONTROLLER_0, epcs_flash); block_offset = 0; data_offset = 0; for(i = 0; i < EPCS_NUMBER_SECTORS; i++) { alt_epcs_flash_erase_block(&epcs_flash.dev, block_offset); block_offset += EPCS_SECTOR_BYTES; } block_offset = 0; tmp[0] = BOOT_OK_RESPONSE; tmp[1] = BOOT_OK_RESPONSE; CmdTx(0, CAN_BOOT_API_ID, (alt_u16*) tmp, 8); } else if(data[0] == BOOT_END_CMD && data[1] == BOOT_END_CMD) { block_offset = 0; data_offset = 0;
tmp[0] = BOOT_END_RESPONSE; tmp[1] = BOOT_END_RESPONSE; CmdTx(0, CAN_BOOT_API_ID, (alt_u16*) tmp, 8); } else { for(i = 0; i < 4; i++) { //buf[i] = (data[0] >> (8 * i)) & 0xFF; //buf[i + 4] = (data[1] >> (8 * i)) & 0xFF; buf[i] = data[0] & 0xFF; buf[i + 4] = data[1] & 0xFF; data[0] = data[0] >> 8; data[1] = data[1] >> 8; swap_bits(&buf[i]); swap_bits(&buf[i + 4]);
} alt_epcs_flash_write_block(&epcs_flash.dev, block_offset, data_offset, buf, 8); data_offset += 8; if((data_offset % EPCS_SECTOR_BYTES) == 0) { block_offset += EPCS_SECTOR_BYTES; }
tmp[0] = BOOT_OK_RESPONSE; tmp[1] = BOOT_OK_RESPONSE; CmdTx(0, CAN_BOOT_API_ID, (alt_u16*) &tmp, 8); } }
Цитата(FLTI @ Feb 9 2015, 15:53)  Ок, понятно, надо писать в EPCS, но в другую её область, чтобы не затереть исходную прошивку. Чтобы FPGA стартовала - записываете прошивку с адреса 0.
|
|
|
|
|
Feb 11 2015, 13:14
|
Местный
  
Группа: Свой
Сообщений: 399
Регистрация: 8-06-05
Пользователь №: 5 832

|
Цитата(doom13 @ Feb 9 2015, 16:06)  Можете взять в качестве примера немного подправив (используются только ф-ии alt_epcs_flash_init(), alt_epcs_flash_erase_block(), alt_epcs_flash_write_block(), ну и если читать надо, тогда - alt_epcs_flash_read_block()): Спасибо за пример, в Эклипсе скомпилировался без ошибок! Я в С не силён, разбираюсь сейчас по тексту. Нет ли у Вас этого исходника с комментариями? Если нет, то поясните пожалуйста, что такое idx?
|
|
|
|
|
Feb 11 2015, 17:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 404
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539

|
Цитата(FLTI @ Feb 11 2015, 16:14)  Спасибо за пример, в Эклипсе скомпилировался без ошибок! Я в С не силён, разбираюсь сейчас по тексту. Нет ли у Вас этого исходника с комментариями? Если нет, то поясните пожалуйста, что такое idx? idx - это номер блока данных (прошивка в данном случае передаётся по TFTP, размер блока данных 512 байт, последний блок может быть меньше 512). Вам необходимо просто при приёме прошивки правильно формировать адреса, куда будут ложиться данные. Перед записью данных необходимо стирать страницу, которая будет записана. Можно стереть сразу всю область памяти занимаемую прошивкой, но это долго, для варианта с TFTP не подходит (не дождётся ответа). Для второго варианта (загрузка по CAN, ждем ответа о выполнении стирания сколь угодно долго) использовалось полное стирание памяти перед началом записи. Особого внимания приведённому коду уделять не стоит, просто пример функций используемых для записи EPCS/EPCQ.
|
|
|
|
Сообщений в этой теме
FLTI Запись .jic файла в EPCS через программу из NIOS II. Feb 9 2015, 11:52 Stewart Little Цитата(FLTI @ Feb 9 2015, 14:52) Например... Feb 9 2015, 12:09 FLTI Цитата(Stewart Little @ Feb 9 2015, 15:09... Apr 19 2015, 13:48  doom13 Цитата(FLTI @ Apr 19 2015, 16:48) 2). За... Apr 24 2015, 19:42   FLTI Цитата(doom13 @ Apr 24 2015, 22:42) Если ... Apr 25 2015, 11:36 doom13 Цитата(FLTI @ Feb 9 2015, 14:52) Как это ... Feb 9 2015, 12:23 FLTI Цитата(doom13 @ Feb 9 2015, 15:23) Для за... Feb 9 2015, 12:40  doom13 Цитата(FLTI @ Feb 9 2015, 15:35) Я что-то... Feb 9 2015, 12:42 FLTI Тут ещё вот какая засада притаилась: http://www.al... Feb 9 2015, 16:41 doom13 Цитата(FLTI @ Feb 9 2015, 19:41) Тут ещё ... Feb 9 2015, 19:24
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|