mirror of
https://github.com/marqs85/ossc
synced 2025-05-30 08:34:22 +03:00
fix firmware update functionality
This commit is contained in:
parent
30d403f157
commit
6198ce7d9e
@ -130,7 +130,7 @@ alt_u32 I2C_read(alt_u32 base,alt_u32 last)
|
||||
int I2C_write
|
||||
assumes that any addressing and start
|
||||
has already been done.
|
||||
writes one byte of data from the slave.
|
||||
writes one byte of data from the slave.
|
||||
If last is set the stop bit set.
|
||||
inputs
|
||||
base = the base address of the component
|
||||
@ -182,7 +182,7 @@ alt_u32 I2C_write(alt_u32 base,alt_u8 data, alt_u32 last)
|
||||
|
||||
}
|
||||
|
||||
void SPI_read(alt_u32 base, alt_u8 *rdata, int len)
|
||||
void __attribute__((noinline, flatten, __section__(".text_bram"))) SPI_read(alt_u32 base, alt_u8 *rdata, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -197,7 +197,7 @@ void SPI_read(alt_u32 base, alt_u8 *rdata, int len)
|
||||
}
|
||||
}
|
||||
|
||||
void SPI_write(alt_u32 base, const alt_u8 *wdata, int len)
|
||||
void __attribute__((noinline, flatten, __section__(".text_bram"))) SPI_write(alt_u32 base, const alt_u8 *wdata, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
2
ossc.cof
2
ossc.cof
@ -10,7 +10,7 @@
|
||||
<user_name>Page_0</user_name>
|
||||
<page_flags>1</page_flags>
|
||||
<bit0>
|
||||
<sof_filename>output_files/ossc.sof</sof_filename>
|
||||
<sof_filename>output_files/ossc.sof<compress_bitstream>1</compress_bitstream></sof_filename>
|
||||
</bit0>
|
||||
</sof_data>
|
||||
<hex_block>
|
||||
|
1
ossc.qsf
1
ossc.qsf
@ -258,4 +258,5 @@ set_global_assignment -name SEARCH_PATH rtl
|
||||
set_global_assignment -name SEARCH_PATH software/sys_controller/mem_init/
|
||||
set_global_assignment -name SEARCH_PATH ip/ibex_qsys/rtl_extra
|
||||
set_global_assignment -name VERILOG_MACRO "SYNTHESIS=<None>"
|
||||
set_global_assignment -name STRATIXIII_UPDATE_MODE REMOTE
|
||||
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
|
@ -82,6 +82,11 @@ avinput_t target_input;
|
||||
|
||||
alt_u8 pcm1862_active;
|
||||
|
||||
flash_ctrl_dev flashctrl_dev = {.regs = (volatile gen_flash_if_regs*)INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_CSR_BASE,
|
||||
.flash_size = 0x0200000};
|
||||
|
||||
rem_update_dev rem_reconfig_dev = {.regs = (volatile rem_update_regs*)0x0002a000};
|
||||
|
||||
uint8_t sl_def_iv_x, sl_def_iv_y;
|
||||
|
||||
alt_u32 read_it2(alt_u32 regaddr);
|
||||
@ -951,6 +956,9 @@ int main()
|
||||
// Start system timer
|
||||
alt_timestamp_start();
|
||||
|
||||
// Write-protect flash
|
||||
flash_write_protect(&flashctrl_dev, 1);
|
||||
|
||||
init_stat = init_hw();
|
||||
|
||||
if (init_stat >= 0) {
|
||||
|
@ -20,6 +20,7 @@
|
||||
#ifndef FIRMWARE_H_
|
||||
#define FIRMWARE_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "alt_types.h"
|
||||
#include "sysconfig.h"
|
||||
|
||||
@ -40,23 +41,29 @@
|
||||
|
||||
#define FW_UPDATE_RETRIES 3
|
||||
|
||||
#define FW_IMAGE_ERROR 100
|
||||
#define FW_HDR_ERROR 101
|
||||
#define FW_HDR_CRC_ERROR 102
|
||||
#define FW_DATA_CRC_ERROR 103
|
||||
#define FW_UPD_CANCELLED 104
|
||||
|
||||
typedef struct {
|
||||
char fw_key[4];
|
||||
alt_u8 version_major;
|
||||
alt_u8 version_minor;
|
||||
uint8_t version_major;
|
||||
uint8_t version_minor;
|
||||
char version_suffix[8];
|
||||
alt_u32 hdr_len;
|
||||
alt_u32 data_len;
|
||||
alt_u32 data_crc;
|
||||
alt_u32 hdr_crc;
|
||||
} fw_hdr;
|
||||
uint32_t hdr_len;
|
||||
uint32_t data_len;
|
||||
uint32_t data_crc;
|
||||
char padding[482];
|
||||
uint32_t hdr_crc;
|
||||
} __attribute__((packed)) fw_hdr;
|
||||
|
||||
typedef struct {
|
||||
uint32_t unused[29];
|
||||
uint32_t reconfig_start;
|
||||
} rem_update_regs;
|
||||
|
||||
typedef struct {
|
||||
volatile rem_update_regs *regs;
|
||||
} rem_update_dev;
|
||||
|
||||
int fw_update();
|
||||
|
||||
void fw_update_commit(uint32_t* cluster_idx, uint8_t* databuf, uint32_t bytes_to_copy, uint16_t fs_csize, uint16_t fs_startsec);
|
||||
|
||||
#endif
|
||||
|
@ -30,190 +30,223 @@
|
||||
#include "lcd.h"
|
||||
#include "utils.h"
|
||||
#include "menu.h"
|
||||
#include "ff.h"
|
||||
#include "file.h"
|
||||
#include "altera_avalon_pio_regs.h"
|
||||
|
||||
extern char menu_row1[LCD_ROW_LEN+1], menu_row2[LCD_ROW_LEN+1];
|
||||
extern alt_u16 rc_keymap[REMOTE_MAX_KEYS];
|
||||
extern SD_DEV sdcard_dev;
|
||||
extern alt_u32 sys_ctrl;
|
||||
extern flash_ctrl_dev flashctrl_dev;
|
||||
extern rem_update_dev rem_reconfig_dev;
|
||||
|
||||
static int check_fw_header(alt_u8 *databuf, fw_hdr *hdr)
|
||||
{
|
||||
alt_u32 crcval, tmp;
|
||||
|
||||
strncpy(hdr->fw_key, (char*)databuf, 4);
|
||||
if (strncmp(hdr->fw_key, "OSSC", 4))
|
||||
return FW_IMAGE_ERROR;
|
||||
|
||||
hdr->version_major = databuf[4];
|
||||
hdr->version_minor = databuf[5];
|
||||
strncpy(hdr->version_suffix, (char*)(databuf+6), 8);
|
||||
hdr->version_suffix[7] = 0;
|
||||
|
||||
memcpy(&tmp, databuf+14, 4);
|
||||
hdr->hdr_len = bswap32(tmp);
|
||||
memcpy(&tmp, databuf+18, 4);
|
||||
hdr->data_len = bswap32(tmp);
|
||||
memcpy(&tmp, databuf+22, 4);
|
||||
hdr->data_crc = bswap32(tmp);
|
||||
// Always at bytes [508-511]
|
||||
memcpy(&tmp, databuf+508, 4);
|
||||
hdr->hdr_crc = bswap32(tmp);
|
||||
|
||||
if (hdr->hdr_len < 26 || hdr->hdr_len > 508)
|
||||
return FW_HDR_ERROR;
|
||||
|
||||
crcval = crc32(databuf, hdr->hdr_len, 1);
|
||||
|
||||
if (crcval != hdr->hdr_crc)
|
||||
return FW_HDR_CRC_ERROR;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int check_fw_image(alt_u32 offset, alt_u32 size, alt_u32 golden_crc, alt_u8 *tmpbuf)
|
||||
{
|
||||
alt_u32 crcval=0, i, bytes_to_read;
|
||||
//int fw_update(char *dirname, char *filename) {
|
||||
int fw_update() {
|
||||
FIL fw_file;
|
||||
SDRESULTS res;
|
||||
char dirname_root[10];
|
||||
fw_hdr hdr;
|
||||
int retval;
|
||||
unsigned bytes_read, bytes_to_copy;
|
||||
uint32_t crcval, hdr_len, btn_vec;
|
||||
uint32_t cluster_idx[100]; // enough for >=4kB cluster size
|
||||
uint8_t databuf[SD_BLK_SIZE]; // temp buffer for data
|
||||
uint16_t fs_csize, fs_startsec, cl_iter, cl_soffs;
|
||||
|
||||
for (i=0; i<size; i=i+SD_BLK_SIZE) {
|
||||
bytes_to_read = ((size-i < SD_BLK_SIZE) ? (size-i) : SD_BLK_SIZE);
|
||||
res = SD_Read(&sdcard_dev, tmpbuf, (offset+i)/SD_BLK_SIZE, 0, bytes_to_read);
|
||||
|
||||
if (res != SD_OK)
|
||||
return -res;
|
||||
|
||||
crcval = crc32(tmpbuf, bytes_to_read, (i==0));
|
||||
}
|
||||
|
||||
if (crcval != golden_crc)
|
||||
return FW_DATA_CRC_ERROR;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int fw_update()
|
||||
{
|
||||
int retval, i;
|
||||
int retries = FW_UPDATE_RETRIES;
|
||||
char *errmsg;
|
||||
alt_u8 databuf[SD_BLK_SIZE];
|
||||
alt_u32 btn_vec;
|
||||
alt_u32 bytes_to_rw;
|
||||
fw_hdr fw_header;
|
||||
|
||||
#ifdef CHECK_STACK_USE
|
||||
// estimate stack usage, assuming around here is the worst case (due to 512B databuf)
|
||||
alt_u32 sp;
|
||||
asm volatile("mv %0, sp" : "=r"(sp));
|
||||
sniprintf(menu_row1, LCD_ROW_LEN+1, "Stack size:");
|
||||
sniprintf(menu_row2, LCD_ROW_LEN+1, "%lu bytes", (ONCHIP_MEMORY2_0_BASE+ONCHIP_MEMORY2_0_SIZE_VALUE)-sp);
|
||||
ui_disp_menu(1);
|
||||
usleep(1000000);
|
||||
#endif
|
||||
|
||||
retval = check_sdcard(databuf);
|
||||
SPI_CS_High();
|
||||
retval = file_mount();
|
||||
if (retval != 0) {
|
||||
retval = -retval;
|
||||
goto failure;
|
||||
printf("SD card not detected %d\n", retval);
|
||||
return -1;
|
||||
}
|
||||
|
||||
retval = check_fw_header(databuf, &fw_header);
|
||||
if (retval != 0)
|
||||
goto failure;
|
||||
//sniprintf(dirname_root, sizeof(dirname_root), "/%s", dirname);
|
||||
sniprintf(dirname_root, sizeof(dirname_root), "/");
|
||||
f_chdir(dirname_root);
|
||||
|
||||
sniprintf(menu_row1, LCD_ROW_LEN+1, "Validating data");
|
||||
sniprintf(menu_row2, LCD_ROW_LEN+1, "%u bytes", (unsigned)fw_header.data_len);
|
||||
ui_disp_menu(1);
|
||||
retval = check_fw_image(512, fw_header.data_len, fw_header.data_crc, databuf);
|
||||
if (retval != 0)
|
||||
goto failure;
|
||||
if (!file_open(&fw_file, "ossc.bin")) {
|
||||
strlcpy(menu_row1, "Checking FW", LCD_ROW_LEN+1);
|
||||
strlcpy(menu_row2, "Please wait...", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
|
||||
sniprintf(menu_row1, LCD_ROW_LEN+1, "%u.%.2u%s%s", fw_header.version_major, fw_header.version_minor, (fw_header.version_suffix[0] == 0) ? "" : "-", fw_header.version_suffix);
|
||||
strncpy(menu_row2, "Update? 1=Y, 2=N", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
|
||||
while (1) {
|
||||
btn_vec = IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE) & RC_MASK;
|
||||
|
||||
if (btn_vec == rc_keymap[RC_BTN1]) {
|
||||
break;
|
||||
} else if (btn_vec == rc_keymap[RC_BTN2]) {
|
||||
retval = FW_UPD_CANCELLED;
|
||||
goto failure;
|
||||
if (f_read(&fw_file, &hdr, sizeof(hdr), &bytes_read) != F_OK) {
|
||||
printf("FW hdr read error\n");
|
||||
retval = -3;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
usleep(WAITLOOP_SLEEP_US);
|
||||
hdr_len = bswap32(hdr.hdr_len);
|
||||
|
||||
if (strncmp(hdr.fw_key, "OSSC", 4) || (hdr_len < 26 || hdr_len > 508)) {
|
||||
printf("Invalid FW header\n");
|
||||
retval = -4;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
crcval = crc32((unsigned char *)&hdr, hdr_len, 1);
|
||||
hdr.hdr_len = bswap32(hdr.hdr_len);
|
||||
hdr.data_len = bswap32(hdr.data_len);
|
||||
hdr.data_crc = bswap32(hdr.data_crc);
|
||||
hdr.hdr_crc = bswap32(hdr.hdr_crc);
|
||||
if (crcval != hdr.hdr_crc) {
|
||||
printf("Invalid FW header CRC (0x%.8x instead of 0x%.8x)\n", crcval, hdr.hdr_crc);
|
||||
retval = -5;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
printf("Firmware %u.%u%s%s\n", hdr.version_major, hdr.version_minor, hdr.version_suffix[0] ? "-" : "", hdr.version_suffix);
|
||||
bytes_to_copy = hdr.data_len;
|
||||
printf(" Image: %u bytes, crc 0x%.8x\n", hdr.data_len, hdr.data_crc);
|
||||
if (hdr.data_len >= 16*FLASH_SECTOR_SIZE) {
|
||||
printf("Image exceeds flash allocation\n");
|
||||
retval = -6;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
sniprintf(menu_row1, LCD_ROW_LEN+1, "v%u.%u%s%s", hdr.version_major, hdr.version_minor, hdr.version_suffix[0] ? "-" : "", hdr.version_suffix);
|
||||
sniprintf(menu_row2, LCD_ROW_LEN+1, "Update? 1=Y, 2=N");
|
||||
ui_disp_menu(1);
|
||||
|
||||
while (1) {
|
||||
btn_vec = IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE) & RC_MASK;
|
||||
|
||||
if (btn_vec == rc_keymap[RC_BTN1]) {
|
||||
break;
|
||||
} else if (btn_vec == rc_keymap[RC_BTN2]) {
|
||||
//set_func_ret_msg("Cancelled");
|
||||
retval = 1;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
usleep(WAITLOOP_SLEEP_US);
|
||||
}
|
||||
|
||||
strlcpy(menu_row2, "Please wait...", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
|
||||
// check if 512-byte header is on first or second cluster
|
||||
fs_startsec = fw_file.obj.fs->database;
|
||||
fs_csize = fw_file.obj.fs->csize;
|
||||
if (fs_csize == 1) {
|
||||
cl_iter = 1;
|
||||
cl_soffs = 0;
|
||||
cluster_idx[0] = fw_file.obj.sclust;
|
||||
} else {
|
||||
cl_iter = 0;
|
||||
cl_soffs = 1;
|
||||
}
|
||||
// record cluster IDs to an array
|
||||
if ((f_read_cc(&fw_file, &cluster_idx[cl_iter], bytes_to_copy, &bytes_read, (sizeof(cluster_idx)/sizeof(cluster_idx[0]))-1) != F_OK) || (bytes_read != bytes_to_copy)) {
|
||||
printf("FW cluster error\n");
|
||||
retval = -7;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
file_close(&fw_file);
|
||||
f_chdir("/");
|
||||
|
||||
printf("Checking copied data...\n");
|
||||
while (bytes_to_copy > 0) {
|
||||
bytes_read = (bytes_to_copy > SD_BLK_SIZE) ? SD_BLK_SIZE : bytes_to_copy;
|
||||
res = SD_Read(&sdcard_dev, databuf, ((cluster_idx[cl_iter]-2)*fs_csize+fs_startsec+cl_soffs), 0, bytes_read);
|
||||
if (res != SD_OK) {
|
||||
printf("FW data read error\n");
|
||||
retval = -8;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
crcval = crc32((unsigned char *)&databuf, bytes_read, (bytes_to_copy==hdr.data_len));
|
||||
bytes_to_copy -= bytes_read;
|
||||
|
||||
cl_soffs += 1;
|
||||
if (cl_soffs == fs_csize) {
|
||||
cl_iter += 1;
|
||||
cl_soffs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (crcval != hdr.data_crc) {
|
||||
printf("Image: Invalid CRC (0x%.8x)\n", crcval);
|
||||
retval = -9;
|
||||
goto close_file;
|
||||
}
|
||||
|
||||
printf("Starting update procedure...\n");
|
||||
strlcpy(menu_row1, "Updating", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
|
||||
//disable video output
|
||||
tvp_powerdown();
|
||||
sys_ctrl |= VIDGEN_OFF;
|
||||
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
|
||||
usleep(10000);
|
||||
|
||||
// No return from here
|
||||
fw_update_commit(cluster_idx, databuf, hdr.data_len, fs_csize, fs_startsec);
|
||||
return 0;
|
||||
} else {
|
||||
printf("FW file not found\n");
|
||||
f_chdir("/");
|
||||
return -2;
|
||||
}
|
||||
|
||||
//disable video output
|
||||
tvp_powerdown();
|
||||
sys_ctrl |= VIDGEN_OFF;
|
||||
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
|
||||
usleep(10000);
|
||||
|
||||
strncpy(menu_row1, "Updating FW", LCD_ROW_LEN+1);
|
||||
update_init:
|
||||
strncpy(menu_row2, "please wait...", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
|
||||
/*retval = copy_sd_to_flash(512/SD_BLK_SIZE, 0, fw_header.data_len, databuf);
|
||||
if (retval != 0)
|
||||
goto failure;
|
||||
|
||||
strncpy(menu_row1, "Verifying flash", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
retval = verify_flash(0, fw_header.data_len, fw_header.data_crc, databuf);
|
||||
if (retval != 0)
|
||||
goto failure;*/
|
||||
|
||||
SPI_CS_High();
|
||||
|
||||
strncpy(menu_row1, "Firmware updated", LCD_ROW_LEN+1);
|
||||
strncpy(menu_row2, "please restart", LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
while (1) {}
|
||||
|
||||
return 0;
|
||||
|
||||
failure:
|
||||
SPI_CS_High();
|
||||
|
||||
switch (retval) {
|
||||
case SD_NOINIT:
|
||||
errmsg = "No SD card det.";
|
||||
break;
|
||||
case FW_IMAGE_ERROR:
|
||||
errmsg = "Invalid image";
|
||||
break;
|
||||
case FW_HDR_ERROR:
|
||||
errmsg = "Invalid header";
|
||||
break;
|
||||
case FW_HDR_CRC_ERROR:
|
||||
errmsg = "Invalid hdr CRC";
|
||||
break;
|
||||
case FW_DATA_CRC_ERROR:
|
||||
errmsg = "Invalid data CRC";
|
||||
break;
|
||||
case FW_UPD_CANCELLED:
|
||||
errmsg = "Update cancelled";
|
||||
break;
|
||||
default:
|
||||
errmsg = "SD/Flash error";
|
||||
break;
|
||||
}
|
||||
strncpy(menu_row2, errmsg, LCD_ROW_LEN+1);
|
||||
ui_disp_menu(1);
|
||||
usleep(1000000);
|
||||
|
||||
// Critical error, retry update
|
||||
if ((retval < 0) && (retries > 0)) {
|
||||
sniprintf(menu_row1, LCD_ROW_LEN+1, "Retrying update");
|
||||
retries--;
|
||||
goto update_init;
|
||||
}
|
||||
|
||||
render_osd_page();
|
||||
return -1;
|
||||
close_file:
|
||||
file_close(&fw_file);
|
||||
f_chdir("/");
|
||||
return retval;
|
||||
}
|
||||
|
||||
// commit FW update. Do not call functions located in flash during update
|
||||
void __attribute__((noinline, flatten, noreturn, __section__(".text_bram"))) fw_update_commit(uint32_t* cluster_idx, uint8_t* databuf, uint32_t bytes_to_copy, uint16_t fs_csize, uint16_t fs_startsec) {
|
||||
int i, sectors;
|
||||
SDRESULTS res;
|
||||
uint16_t cl_iter, cl_soffs;
|
||||
uint32_t addr, bytes_read;
|
||||
uint32_t *data_to;
|
||||
|
||||
flash_write_protect(&flashctrl_dev, 0);
|
||||
|
||||
// Erase sectors
|
||||
addr = 0;
|
||||
sectors = (bytes_to_copy/FLASH_SECTOR_SIZE) + ((bytes_to_copy % FLASH_SECTOR_SIZE) != 0);
|
||||
data_to = (uint32_t*)(INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_MEM_BASE);
|
||||
|
||||
for (i=0; i<sectors; i++) {
|
||||
flash_sector_erase(&flashctrl_dev, addr);
|
||||
addr += FLASH_SECTOR_SIZE;
|
||||
}
|
||||
|
||||
if (fs_csize == 1) {
|
||||
cl_iter = 1;
|
||||
cl_soffs = 0;
|
||||
} else {
|
||||
cl_iter = 0;
|
||||
cl_soffs = 1;
|
||||
}
|
||||
|
||||
// Write data
|
||||
while (bytes_to_copy > 0) {
|
||||
bytes_read = (bytes_to_copy > SD_BLK_SIZE) ? SD_BLK_SIZE : bytes_to_copy;
|
||||
res = SD_Read(&sdcard_dev, databuf, ((cluster_idx[cl_iter]-2)*fs_csize+fs_startsec+cl_soffs), 0, bytes_read);
|
||||
//TODO: retry if read fails
|
||||
|
||||
bytes_to_copy -= bytes_read;
|
||||
for (i=0; i<bytes_read; i++)
|
||||
databuf[i] = bitswap8(databuf[i]);
|
||||
for (i=0; i<bytes_read; i+=4)
|
||||
*data_to++ = *((uint32_t*)&databuf[i]);
|
||||
|
||||
cl_soffs += 1;
|
||||
if (cl_soffs == fs_csize) {
|
||||
cl_iter += 1;
|
||||
cl_soffs = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// flush command FIFO before FPGA reconfiguration start
|
||||
*(volatile uint32_t*)(INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_MEM_BASE);
|
||||
|
||||
rem_reconfig_dev.regs->reconfig_start = 1;
|
||||
|
||||
while (1) {}
|
||||
}
|
||||
|
@ -208,9 +208,7 @@ MENU(menu_scanlines, P99_PROTECT({ \
|
||||
{ "Sl. alternating", OPT_AVCONFIG_SELECTION, { .sel = { &tc.sl_altern, OPT_WRAP, SETTING_ITEM(off_on_desc) } } },
|
||||
{ LNG("Sl. alignment","スキャンラインポジション"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.sl_id, OPT_WRAP, SETTING_ITEM(sl_id_desc) } } },
|
||||
{ LNG("Sl. type","スキャンラインルイ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.sl_type, OPT_WRAP, SETTING_ITEM(sl_type_desc) } } },
|
||||
#ifndef DEBUG
|
||||
{ "< Custom Sl. >", OPT_SUBMENU, { .sub = { &menu_cust_sl, NULL, NULL } } },
|
||||
#endif
|
||||
}))
|
||||
|
||||
MENU(menu_postproc, P99_PROTECT({ \
|
||||
@ -251,11 +249,9 @@ MENU(menu_settings, P99_PROTECT({ \
|
||||
{ LNG("<Load profile >","<プロファイルロード >"), OPT_FUNC_CALL, { .fun = { load_profile, &profile_arg_info } } },
|
||||
{ LNG("<Save profile >","<プロファイルセーブ >"), OPT_FUNC_CALL, { .fun = { save_profile, &profile_arg_info } } },
|
||||
{ LNG("<Reset settings>","<セッテイヲショキカ >"), OPT_FUNC_CALL, { .fun = { set_default_avconfig, NULL } } },
|
||||
#ifndef DEBUG
|
||||
{ LNG("<Import sett. >","<セッテイヨミコミ >"), OPT_FUNC_CALL, { .fun = { import_userdata, NULL } } },
|
||||
{ LNG("<Export sett. >","<セッテイカキコミ >"), OPT_FUNC_CALL, { .fun = { export_userdata, NULL } } },
|
||||
{ LNG("<Fw. update >","<ファームウェアアップデート>"), OPT_FUNC_CALL, { .fun = { fw_update, NULL } } },
|
||||
#endif
|
||||
}))
|
||||
|
||||
|
||||
|
@ -25,7 +25,7 @@
|
||||
#include "sysconfig.h"
|
||||
#include "io.h"
|
||||
|
||||
inline unsigned char bitswap8(unsigned char v)
|
||||
inline __attribute__((flatten, __section__(".text_bram"))) unsigned char bitswap8(unsigned char v)
|
||||
{
|
||||
return ((v * 0x0802LU & 0x22110LU) |
|
||||
(v * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
|
||||
|
@ -94,11 +94,11 @@ DWORD __SD_Power_Of_Two(BYTE e)
|
||||
return(partial);
|
||||
}
|
||||
|
||||
inline void __SD_Assert(void){
|
||||
inline void __attribute__((flatten, __section__(".text_bram"))) __SD_Assert(void){
|
||||
SPI_CS_Low();
|
||||
}
|
||||
|
||||
inline void __SD_Deassert(void){
|
||||
inline void __attribute__((flatten, __section__(".text_bram"))) __SD_Deassert(void){
|
||||
SPI_CS_High();
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ void __SD_Speed_Transfer(BYTE throttle) {
|
||||
else SPI_Freq_Low();
|
||||
}
|
||||
|
||||
BYTE __SD_Send_Cmd(BYTE cmd, DWORD arg)
|
||||
BYTE __attribute__((noinline, flatten, __section__(".text_bram"))) __SD_Send_Cmd(BYTE cmd, DWORD arg)
|
||||
{
|
||||
BYTE wiredata[10];
|
||||
BYTE crc, res;
|
||||
@ -361,7 +361,7 @@ SDRESULTS SD_Init(SD_DEV *dev)
|
||||
#endif
|
||||
}
|
||||
|
||||
SDRESULTS SD_Read(SD_DEV *dev, void *dat, DWORD sector, WORD ofs, WORD cnt)
|
||||
SDRESULTS __attribute__((noinline, flatten, __section__(".text_bram"))) SD_Read(SD_DEV *dev, void *dat, DWORD sector, WORD ofs, WORD cnt)
|
||||
{
|
||||
#if defined(_M_IX86) // x86
|
||||
// Check the sector query
|
||||
|
@ -15,11 +15,11 @@ void SPI_Init (void) {
|
||||
I2C_init(SD_SPI_BASE,ALT_CPU_FREQ,400000);
|
||||
}
|
||||
|
||||
void SPI_W(const BYTE *wd, int len) {
|
||||
void __attribute__((noinline, flatten, __section__(".text_bram"))) SPI_W(const BYTE *wd, int len) {
|
||||
SPI_write(SD_SPI_BASE, wd, len);
|
||||
}
|
||||
|
||||
void SPI_R(BYTE *rd, int len) {
|
||||
void __attribute__((noinline, flatten, __section__(".text_bram"))) SPI_R(BYTE *rd, int len) {
|
||||
SPI_read(SD_SPI_BASE, rd, len);
|
||||
}
|
||||
|
||||
@ -34,16 +34,17 @@ BYTE SPI_RW (BYTE d) {
|
||||
return w;
|
||||
}
|
||||
|
||||
void SPI_Release (void) {
|
||||
void __attribute__((noinline, flatten, __section__(".text_bram"))) SPI_Release (void) {
|
||||
SPI_CS_High();
|
||||
return;
|
||||
}
|
||||
|
||||
inline void SPI_CS_Low (void) {
|
||||
inline void __attribute__((flatten, __section__(".text_bram"))) SPI_CS_Low (void) {
|
||||
sys_ctrl &= ~SD_SPI_SS_N;
|
||||
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
|
||||
}
|
||||
|
||||
inline void SPI_CS_High (void){
|
||||
inline void __attribute__((flatten, __section__(".text_bram"))) SPI_CS_High (void){
|
||||
sys_ctrl |= SD_SPI_SS_N;
|
||||
IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, sys_ctrl);
|
||||
}
|
||||
@ -56,7 +57,7 @@ inline void SPI_Freq_Low (void) {
|
||||
I2C_init(SD_SPI_BASE,ALT_CPU_FREQ,400000);
|
||||
}
|
||||
|
||||
int SPI_Timer_On (WORD ms) {
|
||||
int __attribute__((noinline, flatten, __section__(".text_bram"))) SPI_Timer_On (WORD ms) {
|
||||
if (!sd_timer_ts) {
|
||||
sd_timer_ts = alt_timestamp() + ms*(TIMER_0_FREQ/1000);
|
||||
return 0;
|
||||
@ -64,11 +65,11 @@ int SPI_Timer_On (WORD ms) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
inline BOOL SPI_Timer_Status (void) {
|
||||
inline BOOL __attribute__((flatten, __section__(".text_bram"))) SPI_Timer_Status (void) {
|
||||
return alt_timestamp() < sd_timer_ts;
|
||||
}
|
||||
|
||||
inline void SPI_Timer_Off (void) {
|
||||
inline void __attribute__((flatten, __section__(".text_bram"))) SPI_Timer_Off (void) {
|
||||
sd_timer_ts = 0;
|
||||
return;
|
||||
}
|
||||
|
55
sys.qsys
55
sys.qsys
@ -293,6 +293,27 @@
|
||||
type = "int";
|
||||
}
|
||||
}
|
||||
element remote_update_0
|
||||
{
|
||||
datum _sortIndex
|
||||
{
|
||||
value = "16";
|
||||
type = "int";
|
||||
}
|
||||
}
|
||||
element remote_update_0.avl_csr
|
||||
{
|
||||
datum _lockedAddress
|
||||
{
|
||||
value = "1";
|
||||
type = "boolean";
|
||||
}
|
||||
datum baseAddress
|
||||
{
|
||||
value = "172032";
|
||||
type = "String";
|
||||
}
|
||||
}
|
||||
element sc_config_0
|
||||
{
|
||||
datum _sortIndex
|
||||
@ -578,6 +599,21 @@
|
||||
<parameter name="SYNCHRONOUS_EDGES" value="deassert" />
|
||||
<parameter name="USE_RESET_REQUEST" value="0" />
|
||||
</module>
|
||||
<module
|
||||
name="remote_update_0"
|
||||
kind="altera_remote_update"
|
||||
version="24.1"
|
||||
enabled="1">
|
||||
<parameter name="AUTO_DEVICE_SPEEDGRADE" value="8" />
|
||||
<parameter name="CBX_AUTO_BLACKBOX" value="ALL" />
|
||||
<parameter name="DEVICE" value="EP4CE15E22C8" />
|
||||
<parameter name="DEVICE_FAMILY" value="Cyclone IV E" />
|
||||
<parameter name="GUI_config_device" value="EPCS16" />
|
||||
<parameter name="check_app_pof" value="false" />
|
||||
<parameter name="check_avalon_interface" value="true" />
|
||||
<parameter name="m_support_write_config_check" value="false" />
|
||||
<parameter name="operation_mode" value="REMOTE" />
|
||||
</module>
|
||||
<module name="sc_config_0" kind="sc_config" version="1.0" enabled="1" />
|
||||
<module name="timer_0" kind="altera_avalon_timer" version="24.1" enabled="1">
|
||||
<parameter name="alwaysRun" value="false" />
|
||||
@ -672,6 +708,15 @@
|
||||
<parameter name="baseAddress" value="0x00020100" />
|
||||
<parameter name="defaultConnection" value="false" />
|
||||
</connection>
|
||||
<connection
|
||||
kind="avalon"
|
||||
version="24.1"
|
||||
start="ibex_0.avalon_master_bus_data"
|
||||
end="remote_update_0.avl_csr">
|
||||
<parameter name="arbitrationPriority" value="1" />
|
||||
<parameter name="baseAddress" value="0x0002a000" />
|
||||
<parameter name="defaultConnection" value="false" />
|
||||
</connection>
|
||||
<connection
|
||||
kind="avalon"
|
||||
version="24.1"
|
||||
@ -816,6 +861,11 @@
|
||||
version="24.1"
|
||||
start="clk_27.clk"
|
||||
end="i2c_opencores_1.clock" />
|
||||
<connection
|
||||
kind="clock"
|
||||
version="24.1"
|
||||
start="clk_27.clk"
|
||||
end="remote_update_0.clock" />
|
||||
<connection
|
||||
kind="clock"
|
||||
version="24.1"
|
||||
@ -894,6 +944,11 @@
|
||||
version="24.1"
|
||||
start="clk_27.clk_reset"
|
||||
end="intel_generic_serial_flash_interface_top_0.reset" />
|
||||
<connection
|
||||
kind="reset"
|
||||
version="24.1"
|
||||
start="clk_27.clk_reset"
|
||||
end="remote_update_0.reset" />
|
||||
<connection
|
||||
kind="reset"
|
||||
version="24.1"
|
||||
|
741
sys.sopcinfo
741
sys.sopcinfo
@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<EnsembleReport name="sys" kind="sys" version="1.0" fabric="QSYS">
|
||||
<!-- Format version 24.1 1077 (Future versions may contain additional information.) -->
|
||||
<!-- 2025.04.18.22:02:06 -->
|
||||
<!-- 2025.05.03.12:04:14 -->
|
||||
<!-- A collection of modules and connections -->
|
||||
<parameter name="AUTO_GENERATION_ID">
|
||||
<type>java.lang.Integer</type>
|
||||
<value>1745002926</value>
|
||||
<value>1746263054</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
@ -402,6 +402,12 @@ parameters are a RESULT of the module parameters. -->
|
||||
<slaveName>clock</slaveName>
|
||||
<name>i2c_opencores_1.clock</name>
|
||||
</clockDomainMember>
|
||||
<clockDomainMember>
|
||||
<isBridge>false</isBridge>
|
||||
<moduleName>remote_update_0</moduleName>
|
||||
<slaveName>clock</slaveName>
|
||||
<name>remote_update_0.clock</name>
|
||||
</clockDomainMember>
|
||||
<clockDomainMember>
|
||||
<isBridge>false</isBridge>
|
||||
<moduleName>sc_config_0</moduleName>
|
||||
@ -3314,6 +3320,14 @@ parameters are a RESULT of the module parameters. -->
|
||||
<baseAddress>131328</baseAddress>
|
||||
<span>256</span>
|
||||
</memoryBlock>
|
||||
<memoryBlock>
|
||||
<isBridge>false</isBridge>
|
||||
<moduleName>remote_update_0</moduleName>
|
||||
<slaveName>avl_csr</slaveName>
|
||||
<name>remote_update_0.avl_csr</name>
|
||||
<baseAddress>172032</baseAddress>
|
||||
<span>128</span>
|
||||
</memoryBlock>
|
||||
<memoryBlock>
|
||||
<isBridge>false</isBridge>
|
||||
<moduleName>intel_generic_serial_flash_interface_top_0</moduleName>
|
||||
@ -10799,6 +10813,604 @@ parameters are a RESULT of the module parameters. -->
|
||||
</port>
|
||||
</interface>
|
||||
</module>
|
||||
<module
|
||||
name="remote_update_0"
|
||||
kind="altera_remote_update"
|
||||
version="24.1"
|
||||
path="remote_update_0">
|
||||
<!-- Describes a single module. Module parameters are
|
||||
the requested settings for a module instance. -->
|
||||
<parameter name="DEVICE_FAMILY">
|
||||
<type>java.lang.String</type>
|
||||
<value>CYCLONEIVE</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
<sysinfo_type>DEVICE_FAMILY</sysinfo_type>
|
||||
</parameter>
|
||||
<parameter name="DEVICE">
|
||||
<type>java.lang.String</type>
|
||||
<value>EP4CE15E22C8</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
<sysinfo_type>DEVICE</sysinfo_type>
|
||||
</parameter>
|
||||
<parameter name="CBX_AUTO_BLACKBOX">
|
||||
<type>java.lang.String</type>
|
||||
<value>ALL</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="operation_mode">
|
||||
<type>java.lang.String</type>
|
||||
<value>REMOTE</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="GUI_config_device">
|
||||
<type>java.lang.String</type>
|
||||
<value>EPCS16</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="m_support_write_config_check">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="check_avalon_interface">
|
||||
<type>boolean</type>
|
||||
<value>true</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="check_app_pof">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="config_device_addr_width">
|
||||
<type>int</type>
|
||||
<value>24</value>
|
||||
<derived>true</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="is_epcq">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>true</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="in_data_width">
|
||||
<type>int</type>
|
||||
<value>24</value>
|
||||
<derived>true</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="out_data_width">
|
||||
<type>int</type>
|
||||
<value>24</value>
|
||||
<derived>true</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="AUTO_DEVICE_SPEEDGRADE">
|
||||
<type>java.lang.String</type>
|
||||
<value>8</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
<sysinfo_type>DEVICE_SPEEDGRADE</sysinfo_type>
|
||||
</parameter>
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<interface name="avl_csr" kind="avalon_slave" version="24.1">
|
||||
<!-- The connection points exposed by a module instance for the
|
||||
particular module parameters. Connection points and their
|
||||
parameters are a RESULT of the module parameters. -->
|
||||
<assignment>
|
||||
<name>embeddedsw.configuration.isFlash</name>
|
||||
<value>0</value>
|
||||
</assignment>
|
||||
<assignment>
|
||||
<name>embeddedsw.configuration.isMemoryDevice</name>
|
||||
<value>0</value>
|
||||
</assignment>
|
||||
<assignment>
|
||||
<name>embeddedsw.configuration.isNonVolatileStorage</name>
|
||||
<value>0</value>
|
||||
</assignment>
|
||||
<assignment>
|
||||
<name>embeddedsw.configuration.isPrintableDevice</name>
|
||||
<value>0</value>
|
||||
</assignment>
|
||||
<parameter name="addressAlignment">
|
||||
<type>com.altera.sopcmodel.avalon.AvalonConnectionPoint$AddressAlignment</type>
|
||||
<value>DYNAMIC</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="addressGroup">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="addressSpan">
|
||||
<type>java.math.BigInteger</type>
|
||||
<value>128</value>
|
||||
<derived>true</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="addressUnits">
|
||||
<type>com.altera.sopcmodel.avalon.EAddrBurstUnits</type>
|
||||
<value>WORDS</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="alwaysBurstMaxBurst">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="associatedClock">
|
||||
<type>java.lang.String</type>
|
||||
<value>clock</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="associatedReset">
|
||||
<type>java.lang.String</type>
|
||||
<value>reset</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="bitsPerSymbol">
|
||||
<type>int</type>
|
||||
<value>8</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="bridgedAddressOffset">
|
||||
<type>java.math.BigInteger</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="bridgesToMaster">
|
||||
<type>com.altera.entityinterfaces.IConnectionPoint</type>
|
||||
<value></value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="burstOnBurstBoundariesOnly">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="burstcountUnits">
|
||||
<type>com.altera.sopcmodel.avalon.EAddrBurstUnits</type>
|
||||
<value>WORDS</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="constantBurstBehavior">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="explicitAddressSpan">
|
||||
<type>java.math.BigInteger</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="holdTime">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="interleaveBursts">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="isBigEndian">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="isFlash">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="isMemoryDevice">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="isNonVolatileStorage">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="linewrapBursts">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="maximumPendingReadTransactions">
|
||||
<type>int</type>
|
||||
<value>1</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="maximumPendingWriteTransactions">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="minimumUninterruptedRunLength">
|
||||
<type>int</type>
|
||||
<value>1</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="printableDevice">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="readLatency">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="readWaitStates">
|
||||
<type>int</type>
|
||||
<value>1</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="readWaitTime">
|
||||
<type>int</type>
|
||||
<value>1</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="registerIncomingSignals">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="registerOutgoingSignals">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="setupTime">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="timingUnits">
|
||||
<type>com.altera.sopcmodel.avalon.TimingUnits</type>
|
||||
<value>Cycles</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="transparentBridge">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="wellBehavedWaitrequest">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="writeLatency">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="writeWaitStates">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="writeWaitTime">
|
||||
<type>int</type>
|
||||
<value>0</value>
|
||||
<derived>false</derived>
|
||||
<enabled>false</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<type>avalon</type>
|
||||
<isStart>false</isStart>
|
||||
<port>
|
||||
<name>avl_csr_write</name>
|
||||
<direction>Input</direction>
|
||||
<width>1</width>
|
||||
<role>write</role>
|
||||
</port>
|
||||
<port>
|
||||
<name>avl_csr_read</name>
|
||||
<direction>Input</direction>
|
||||
<width>1</width>
|
||||
<role>read</role>
|
||||
</port>
|
||||
<port>
|
||||
<name>avl_csr_writedata</name>
|
||||
<direction>Input</direction>
|
||||
<width>32</width>
|
||||
<role>writedata</role>
|
||||
</port>
|
||||
<port>
|
||||
<name>avl_csr_readdata</name>
|
||||
<direction>Output</direction>
|
||||
<width>32</width>
|
||||
<role>readdata</role>
|
||||
</port>
|
||||
<port>
|
||||
<name>avl_csr_readdatavalid</name>
|
||||
<direction>Output</direction>
|
||||
<width>1</width>
|
||||
<role>readdatavalid</role>
|
||||
</port>
|
||||
<port>
|
||||
<name>avl_csr_waitrequest</name>
|
||||
<direction>Output</direction>
|
||||
<width>1</width>
|
||||
<role>waitrequest</role>
|
||||
</port>
|
||||
<port>
|
||||
<name>avl_csr_address</name>
|
||||
<direction>Input</direction>
|
||||
<width>5</width>
|
||||
<role>address</role>
|
||||
</port>
|
||||
</interface>
|
||||
<interface name="clock" kind="clock_sink" version="24.1">
|
||||
<!-- The connection points exposed by a module instance for the
|
||||
particular module parameters. Connection points and their
|
||||
parameters are a RESULT of the module parameters. -->
|
||||
<parameter name="externallyDriven">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="ptfSchematicName">
|
||||
<type>java.lang.String</type>
|
||||
<value></value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>false</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<type>clock</type>
|
||||
<isStart>false</isStart>
|
||||
<port>
|
||||
<name>clock</name>
|
||||
<direction>Input</direction>
|
||||
<width>1</width>
|
||||
<role>clk</role>
|
||||
</port>
|
||||
</interface>
|
||||
<interface name="reset" kind="reset_sink" version="24.1">
|
||||
<!-- The connection points exposed by a module instance for the
|
||||
particular module parameters. Connection points and their
|
||||
parameters are a RESULT of the module parameters. -->
|
||||
<parameter name="associatedClock">
|
||||
<type>java.lang.String</type>
|
||||
<value>clock</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="synchronousEdges">
|
||||
<type>com.altera.sopcmodel.reset.Reset$Edges</type>
|
||||
<value>DEASSERT</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<type>reset</type>
|
||||
<isStart>false</isStart>
|
||||
<port>
|
||||
<name>reset</name>
|
||||
<direction>Input</direction>
|
||||
<width>1</width>
|
||||
<role>reset</role>
|
||||
</port>
|
||||
</interface>
|
||||
</module>
|
||||
<module name="sc_config_0" kind="sc_config" version="1.0" path="sc_config_0">
|
||||
<!-- Describes a single module. Module parameters are
|
||||
the requested settings for a module instance. -->
|
||||
@ -12666,6 +13278,57 @@ parameters are a RESULT of the module parameters. -->
|
||||
<endModule>intel_generic_serial_flash_interface_top_0</endModule>
|
||||
<endConnectionPoint>avl_csr</endConnectionPoint>
|
||||
</connection>
|
||||
<connection
|
||||
name="ibex_0.avalon_master_bus_data/remote_update_0.avl_csr"
|
||||
kind="avalon"
|
||||
version="24.1"
|
||||
start="ibex_0.avalon_master_bus_data"
|
||||
end="remote_update_0.avl_csr">
|
||||
<parameter name="arbitrationPriority">
|
||||
<type>int</type>
|
||||
<value>1</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="baseAddress">
|
||||
<type>java.math.BigInteger</type>
|
||||
<value>0x0002a000</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="defaultConnection">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<startModule>ibex_0</startModule>
|
||||
<startConnectionPoint>avalon_master_bus_data</startConnectionPoint>
|
||||
<endModule>remote_update_0</endModule>
|
||||
<endConnectionPoint>avl_csr</endConnectionPoint>
|
||||
</connection>
|
||||
<connection
|
||||
name="ibex_0.avalon_master_bus_data/intel_generic_serial_flash_interface_top_0.avl_mem"
|
||||
kind="avalon"
|
||||
@ -13602,6 +14265,33 @@ parameters are a RESULT of the module parameters. -->
|
||||
<endModule>i2c_opencores_1</endModule>
|
||||
<endConnectionPoint>clock</endConnectionPoint>
|
||||
</connection>
|
||||
<connection
|
||||
name="clk_27.clk/remote_update_0.clock"
|
||||
kind="clock"
|
||||
version="24.1"
|
||||
start="clk_27.clk"
|
||||
end="remote_update_0.clock">
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<startModule>clk_27</startModule>
|
||||
<startConnectionPoint>clk</startConnectionPoint>
|
||||
<endModule>remote_update_0</endModule>
|
||||
<endConnectionPoint>clock</endConnectionPoint>
|
||||
</connection>
|
||||
<connection
|
||||
name="clk_27.clk/sc_config_0.clock_sink"
|
||||
kind="clock"
|
||||
@ -14012,6 +14702,33 @@ parameters are a RESULT of the module parameters. -->
|
||||
<endModule>intel_generic_serial_flash_interface_top_0</endModule>
|
||||
<endConnectionPoint>reset</endConnectionPoint>
|
||||
</connection>
|
||||
<connection
|
||||
name="clk_27.clk_reset/remote_update_0.reset"
|
||||
kind="reset"
|
||||
version="24.1"
|
||||
start="clk_27.clk_reset"
|
||||
end="remote_update_0.reset">
|
||||
<parameter name="deviceFamily">
|
||||
<type>java.lang.String</type>
|
||||
<value>UNKNOWN</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<parameter name="generateLegacySim">
|
||||
<type>boolean</type>
|
||||
<value>false</value>
|
||||
<derived>false</derived>
|
||||
<enabled>true</enabled>
|
||||
<visible>true</visible>
|
||||
<valid>true</valid>
|
||||
</parameter>
|
||||
<startModule>clk_27</startModule>
|
||||
<startConnectionPoint>clk_reset</startConnectionPoint>
|
||||
<endModule>remote_update_0</endModule>
|
||||
<endConnectionPoint>reset</endConnectionPoint>
|
||||
</connection>
|
||||
<connection
|
||||
name="clk_27.clk_reset/onchip_memory2_0.reset1"
|
||||
kind="reset"
|
||||
@ -14277,7 +14994,7 @@ parameters are a RESULT of the module parameters. -->
|
||||
<version>1.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>15</instanceCount>
|
||||
<instanceCount>16</instanceCount>
|
||||
<name>clock_sink</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IMutableConnectionPoint</subtype>
|
||||
@ -14285,7 +15002,7 @@ parameters are a RESULT of the module parameters. -->
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>16</instanceCount>
|
||||
<instanceCount>17</instanceCount>
|
||||
<name>reset_sink</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IMutableConnectionPoint</subtype>
|
||||
@ -14293,7 +15010,7 @@ parameters are a RESULT of the module parameters. -->
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>16</instanceCount>
|
||||
<instanceCount>17</instanceCount>
|
||||
<name>avalon_slave</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IMutableConnectionPoint</subtype>
|
||||
@ -14420,6 +15137,14 @@ parameters are a RESULT of the module parameters. -->
|
||||
<displayName>Reset Bridge</displayName>
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>1</instanceCount>
|
||||
<name>altera_remote_update</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IModule</subtype>
|
||||
<displayName>Remote Update Intel FPGA IP</displayName>
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>1</instanceCount>
|
||||
<name>sc_config</name>
|
||||
@ -14437,7 +15162,7 @@ parameters are a RESULT of the module parameters. -->
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>21</instanceCount>
|
||||
<instanceCount>22</instanceCount>
|
||||
<name>avalon</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IConnection</subtype>
|
||||
@ -14445,7 +15170,7 @@ parameters are a RESULT of the module parameters. -->
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>15</instanceCount>
|
||||
<instanceCount>16</instanceCount>
|
||||
<name>clock</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IConnection</subtype>
|
||||
@ -14461,7 +15186,7 @@ parameters are a RESULT of the module parameters. -->
|
||||
<version>24.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<instanceCount>15</instanceCount>
|
||||
<instanceCount>16</instanceCount>
|
||||
<name>reset</name>
|
||||
<type>com.altera.entityinterfaces.IElementClass</type>
|
||||
<subtype>com.altera.entityinterfaces.IConnection</subtype>
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
@ -35,6 +36,18 @@
|
||||
|
||||
#define FW_HDR_LEN 26
|
||||
|
||||
typedef struct {
|
||||
char fw_key[4];
|
||||
uint8_t version_major;
|
||||
uint8_t version_minor;
|
||||
char version_suffix[8];
|
||||
uint32_t hdr_len;
|
||||
uint32_t data_len;
|
||||
uint32_t data_crc;
|
||||
char padding[482];
|
||||
uint32_t hdr_crc;
|
||||
} __attribute__((packed)) fw_header;
|
||||
|
||||
static uint32_t crc32_tab[] = {
|
||||
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
|
||||
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
|
||||
@ -94,99 +107,170 @@ uint32_t crc32(uint32_t crc, const void *buf, size_t size)
|
||||
return crc ^ ~0U;
|
||||
}
|
||||
|
||||
void bitswap8_buf(unsigned char *buf, size_t length)
|
||||
{
|
||||
for (size_t i=0; i<length; i++)
|
||||
buf[i] = ((buf[i] * 0x0802LU & 0x22110LU) | (buf[i] * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
unsigned char block;
|
||||
|
||||
int fd_i, fd_o;
|
||||
struct stat fileinfo;
|
||||
|
||||
int fd_i[2], fd_o;
|
||||
struct stat fileinfo[2];
|
||||
char fw_bin_name[MAX_FILENAME];
|
||||
char hdrbuf[HDR_SIZE];
|
||||
char rdbuf[BUF_SIZE];
|
||||
unsigned fw_version_major;
|
||||
unsigned fw_version_minor;
|
||||
uint32_t hdr_crc;
|
||||
uint32_t crc = 0;
|
||||
|
||||
unsigned int i, bytes_read, bytes_written, tot_bytes_read = 0;
|
||||
|
||||
if ((argc < 3) || (argc > 4)) {
|
||||
printf("Usege: %s rbf version [version_suffix]\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((fd_i = open(argv[1], O_RDONLY)) == -1 || fstat(fd_i, &fileinfo) == -1) {
|
||||
printf("Couldn't open input file\n");
|
||||
fw_header hdr = {0};
|
||||
unsigned fw_version_major, fw_version_minor;
|
||||
int legacy_mode = 0;
|
||||
uint32_t bin_offset, padding;
|
||||
|
||||
unsigned int i, bytes_read, bytes_written, tot_bytes_read[3] = {0, 0, 0};
|
||||
|
||||
if ((argc < 3) || (argc > 6)) {
|
||||
printf("Usage: %s rbf bin bin_offset version [version_suffix]\nLegacy usage: %s rbf version [version_suffix]\n", argv[0], argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
snprintf(fw_bin_name, MAX_FILENAME-1, "ossc_%s%s%s.bin", argv[2], (argc == 4) ? "-" : "", (argc == 4) ? argv[3] : "");
|
||||
|
||||
if ((fd_o = open(fw_bin_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR)) == -1) {
|
||||
if (argc < 5)
|
||||
legacy_mode = 1;
|
||||
|
||||
if ((fd_i[0] = open(argv[1], O_RDONLY)) == -1 || fstat(fd_i[0], &fileinfo[0]) == -1) {
|
||||
printf("Couldn't open input RBF file\n");
|
||||
return -1;
|
||||
}
|
||||
if (!legacy_mode) {
|
||||
if ((fd_i[1] = open(argv[2], O_RDONLY)) == -1 || fstat(fd_i[1], &fileinfo[1]) == -1) {
|
||||
printf("Couldn't open input BIN file\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (legacy_mode)
|
||||
snprintf(fw_bin_name, MAX_FILENAME-1, "ossc_%s%s%s.bin", argv[2], (argc == 4) ? "-" : "", (argc == 4) ? argv[3] : "");
|
||||
else
|
||||
snprintf(fw_bin_name, MAX_FILENAME-1, "ossc_%s%s%s.bin", argv[4], (argc == 6) ? "-" : "", (argc == 6) ? argv[5] : "");
|
||||
|
||||
if ((fd_o = open(fw_bin_name, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1) {
|
||||
printf("Couldn't open output file\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((sscanf(argv[2], "%u.%u", &fw_version_major, &fw_version_minor) != 2) || (fw_version_major > 255) || (fw_version_minor > 255)) {
|
||||
if ((sscanf(legacy_mode ? argv[2] : argv[4], "%u.%u", &fw_version_major, &fw_version_minor) != 2) || (fw_version_major > 255) || (fw_version_minor > 255)) {
|
||||
printf("Invalid version format specified\n");
|
||||
return -1;
|
||||
}
|
||||
//printf("%s, %u.%u\n", argv[2], fw_version_major, (uint8_t)fw_version_minor);
|
||||
|
||||
memset(hdrbuf, 0x00, HDR_SIZE);
|
||||
snprintf(hdrbuf, FW_KEY_SIZE+1, "OSSC");
|
||||
hdrbuf[4] = (uint8_t)fw_version_major;
|
||||
hdrbuf[5] = (uint8_t)fw_version_minor;
|
||||
snprintf(hdrbuf+6, FW_SUFFIX_MAX_SIZE+1, (argc == 4) ? argv[3] : "");
|
||||
*((uint32_t*)(hdrbuf+6+FW_SUFFIX_MAX_SIZE)) = htonl(FW_HDR_LEN);
|
||||
*((uint32_t*)(hdrbuf+6+FW_SUFFIX_MAX_SIZE+4)) = htonl((uint32_t)fileinfo.st_size);
|
||||
snprintf(hdr.fw_key, FW_KEY_SIZE+1, "OSSC");
|
||||
hdr.version_major = (uint8_t)fw_version_major;
|
||||
hdr.version_minor = (uint8_t)fw_version_minor;
|
||||
snprintf(hdr.version_suffix, FW_SUFFIX_MAX_SIZE, legacy_mode ? ((argc == 4) ? argv[3] : "") : ((argc == 6) ? argv[5] : ""));
|
||||
hdr.hdr_len = htobe32(FW_HDR_LEN);
|
||||
|
||||
// data CRC
|
||||
while ((bytes_read = read(fd_i, rdbuf, BUF_SIZE)) > 0) {
|
||||
crc = crc32(crc, rdbuf, bytes_read);
|
||||
tot_bytes_read += bytes_read;
|
||||
if (legacy_mode) {
|
||||
hdr.data_len = htobe32((uint32_t)fileinfo[0].st_size);
|
||||
|
||||
// data CRC (rbf)
|
||||
while ((bytes_read = read(fd_i[0], rdbuf, BUF_SIZE)) > 0) {
|
||||
hdr.data_crc = crc32(hdr.data_crc, rdbuf, bytes_read);
|
||||
tot_bytes_read[0] += bytes_read;
|
||||
}
|
||||
} else {
|
||||
bin_offset = (uint32_t)strtol(argv[3], NULL, 16);
|
||||
|
||||
// data CRC (rbf)
|
||||
while ((bytes_read = read(fd_i[0], rdbuf, BUF_SIZE)) > 0) {
|
||||
hdr.data_crc = crc32(hdr.data_crc, rdbuf, bytes_read);
|
||||
tot_bytes_read[0] += bytes_read;
|
||||
}
|
||||
// data CRC (padding)
|
||||
memset(rdbuf, 0xff, sizeof(rdbuf));
|
||||
padding = bin_offset - tot_bytes_read[0];
|
||||
while (tot_bytes_read[1] < padding) {
|
||||
bytes_read = ((padding-tot_bytes_read[1]) > sizeof(rdbuf)) ? sizeof(rdbuf) : (padding-tot_bytes_read[1]);
|
||||
hdr.data_crc = crc32(hdr.data_crc, rdbuf, bytes_read);
|
||||
tot_bytes_read[1] += bytes_read;
|
||||
}
|
||||
// data CRC (bin)
|
||||
while ((bytes_read = read(fd_i[1], rdbuf, BUF_SIZE)) > 0) {
|
||||
bitswap8_buf(rdbuf, bytes_read);
|
||||
hdr.data_crc = crc32(hdr.data_crc, rdbuf, bytes_read);
|
||||
tot_bytes_read[2] += bytes_read;
|
||||
}
|
||||
hdr.data_len = htobe32((uint32_t)fileinfo[0].st_size+padding+(uint32_t)fileinfo[1].st_size);
|
||||
}
|
||||
*((uint32_t*)(hdrbuf+6+FW_SUFFIX_MAX_SIZE+8)) = htonl(crc);
|
||||
|
||||
// header CRC
|
||||
hdr_crc = crc32(0, hdrbuf, FW_HDR_LEN);
|
||||
*((uint32_t*)(hdrbuf+HDR_SIZE-4)) = htonl(hdr_crc);
|
||||
hdr.data_crc = htobe32(hdr.data_crc);
|
||||
hdr.hdr_crc = crc32(0, &hdr, FW_HDR_LEN);
|
||||
hdr.hdr_crc = htobe32(hdr.hdr_crc);
|
||||
|
||||
if (tot_bytes_read != fileinfo.st_size) {
|
||||
printf("Incorrect size output file\n");
|
||||
return -1;
|
||||
if ((tot_bytes_read[0] != fileinfo[0].st_size) || (!legacy_mode && (tot_bytes_read[2] != fileinfo[1].st_size))) {
|
||||
printf("Incorrect size input data read\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("version %u.%u%s%s: %u bytes\n", fw_version_major, fw_version_minor, (argc == 4) ? "-" : "", hdrbuf+6, fileinfo.st_size);
|
||||
printf("Header CRC32: %.8x\n", hdr_crc);
|
||||
printf("Data CRC32: %.8x\n", crc);
|
||||
printf("version %u.%u%s%s: %u bytes\n", fw_version_major, fw_version_minor, (argc == 4+2*!legacy_mode) ? "-" : "", hdr.version_suffix, tot_bytes_read[0]+tot_bytes_read[1]+tot_bytes_read[2]);
|
||||
printf("Header CRC32: %.8x\n", htobe32(hdr.hdr_crc));
|
||||
printf("Data CRC32: %.8x\n", htobe32(hdr.data_crc));
|
||||
|
||||
bytes_written = write(fd_o, hdrbuf, HDR_SIZE);
|
||||
bytes_written = write(fd_o, &hdr, HDR_SIZE);
|
||||
if (bytes_written != HDR_SIZE) {
|
||||
printf("Couldn't write output file\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
tot_bytes_read = 0;
|
||||
lseek(fd_i, 0, SEEK_SET);
|
||||
while ((bytes_read = read(fd_i, rdbuf, BUF_SIZE)) > 0) {
|
||||
tot_bytes_read[0] = 0;
|
||||
lseek(fd_i[0], 0, SEEK_SET);
|
||||
while ((bytes_read = read(fd_i[0], rdbuf, BUF_SIZE)) > 0) {
|
||||
bytes_written = write(fd_o, rdbuf, bytes_read);
|
||||
if (bytes_written != bytes_read) {
|
||||
printf("Couldn't write output file\n");
|
||||
return -1;
|
||||
}
|
||||
tot_bytes_read += bytes_read;
|
||||
tot_bytes_read[0] += bytes_read;
|
||||
}
|
||||
|
||||
if (tot_bytes_read != fileinfo.st_size) {
|
||||
if (tot_bytes_read[0] != fileinfo[0].st_size) {
|
||||
printf("Incorrect size output file\n");
|
||||
return -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!legacy_mode) {
|
||||
memset(rdbuf, 0xff, sizeof(rdbuf));
|
||||
while (tot_bytes_read[1] > 0) {
|
||||
bytes_read = (tot_bytes_read[1] > sizeof(rdbuf)) ? sizeof(rdbuf) : tot_bytes_read[1];
|
||||
bytes_written = write(fd_o, rdbuf, bytes_read);
|
||||
if (bytes_written != bytes_read) {
|
||||
printf("Couldn't write output file\n");
|
||||
return -1;
|
||||
}
|
||||
tot_bytes_read[1] -= bytes_read;
|
||||
}
|
||||
|
||||
tot_bytes_read[2] = 0;
|
||||
lseek(fd_i[1], 0, SEEK_SET);
|
||||
while ((bytes_read = read(fd_i[1], rdbuf, BUF_SIZE)) > 0) {
|
||||
bitswap8_buf(rdbuf, bytes_read);
|
||||
bytes_written = write(fd_o, rdbuf, bytes_read);
|
||||
if (bytes_written != bytes_read) {
|
||||
printf("Couldn't write output file\n");
|
||||
return -1;
|
||||
}
|
||||
tot_bytes_read[2] += bytes_read;
|
||||
}
|
||||
if (tot_bytes_read[2] != fileinfo[1].st_size) {
|
||||
printf("Incorrect size output bin file\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
printf("Firmware image written to %s\n", fw_bin_name);
|
||||
|
||||
|
||||
close(fd_o);
|
||||
close(fd_i);
|
||||
|
||||
close(fd_i[0]);
|
||||
if (!legacy_mode)
|
||||
close(fd_i[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user