small fixes

This commit is contained in:
Mateusz Faderewski 2022-08-17 12:37:30 +02:00
parent 76296a44d8
commit 201a4d023a
4 changed files with 40 additions and 27 deletions

View File

@ -157,6 +157,31 @@ static vendor_error_t lcmxo2_fail (vendor_error_t error) {
return error; return error;
} }
uint32_t vendor_flash_size (void) {
return (FLASH_PAGE_SIZE * FLASH_NUM_PAGES);
}
vendor_error_t vendor_backup (uint32_t address, uint32_t *length) {
uint8_t buffer[FLASH_PAGE_SIZE];
*length = 0;
lcmxo2_reset_bus();
if (lcmxo2_enable_flash()) {
return lcmxo2_fail(VENDOR_ERROR_INIT);
}
lcmxo2_reset_flash_address();
for (int i = 0; i < (FLASH_PAGE_SIZE * FLASH_NUM_PAGES); i += FLASH_PAGE_SIZE) {
lcmxo2_read_flash_page(buffer);
fpga_mem_write(address + i, FLASH_PAGE_SIZE, buffer);
*length += FLASH_PAGE_SIZE;
}
lcmxo2_disable_flash();
lcmxo2_cleanup();
return VENDOR_OK;
}
vendor_error_t vendor_update (uint32_t address, uint32_t length) { vendor_error_t vendor_update (uint32_t address, uint32_t length) {
uint8_t buffer[FLASH_PAGE_SIZE]; uint8_t buffer[FLASH_PAGE_SIZE];
uint8_t verify_buffer[FLASH_PAGE_SIZE]; uint8_t verify_buffer[FLASH_PAGE_SIZE];
@ -202,27 +227,6 @@ vendor_error_t vendor_update (uint32_t address, uint32_t length) {
return VENDOR_OK; return VENDOR_OK;
} }
vendor_error_t vendor_backup (uint32_t address, uint32_t *length) {
uint8_t buffer[FLASH_PAGE_SIZE];
*length = 0;
lcmxo2_reset_bus();
if (lcmxo2_enable_flash()) {
return lcmxo2_fail(VENDOR_ERROR_INIT);
}
lcmxo2_reset_flash_address();
for (int i = 0; i < (FLASH_PAGE_SIZE * FLASH_NUM_PAGES); i += FLASH_PAGE_SIZE) {
lcmxo2_read_flash_page(buffer);
fpga_mem_write(address + i, FLASH_PAGE_SIZE, buffer);
*length += FLASH_PAGE_SIZE;
}
lcmxo2_disable_flash();
lcmxo2_cleanup();
return VENDOR_OK;
}
vendor_error_t vendor_reconfigure (void) { vendor_error_t vendor_reconfigure (void) {
lcmxo2_reset_bus(); lcmxo2_reset_bus();
lcmxo2_refresh(); lcmxo2_refresh();

View File

@ -9,7 +9,6 @@
typedef enum { typedef enum {
UPDATE_STATUS_NONE = 0,
UPDATE_STATUS_START = 1, UPDATE_STATUS_START = 1,
UPDATE_STATUS_MCU_START = 2, UPDATE_STATUS_MCU_START = 2,
UPDATE_STATUS_MCU_DONE = 3, UPDATE_STATUS_MCU_DONE = 3,
@ -31,7 +30,7 @@ static const uint8_t update_token[16] = "SC64 Update v2.0";
static uint8_t status_data[12] = { static uint8_t status_data[12] = {
'P', 'K', 'T', PACKET_CMD_UPDATE_STATUS, 'P', 'K', 'T', PACKET_CMD_UPDATE_STATUS,
0, 0, 0, 4, 0, 0, 0, 4,
0, 0, 0, UPDATE_STATUS_NONE, 0, 0, 0, UPDATE_STATUS_START,
}; };
@ -132,16 +131,18 @@ static void update_status_notify (update_status_t status) {
update_error_t update_backup (uint32_t address, uint32_t *length) { update_error_t update_backup (uint32_t address, uint32_t *length) {
hw_flash_t buffer; hw_flash_t buffer;
uint32_t mcu_length;
uint32_t fpga_length; uint32_t fpga_length;
*length += update_write_token(&address); *length += update_write_token(&address);
*length += update_prepare_chunk(&address, CHUNK_ID_MCU_DATA); *length += update_prepare_chunk(&address, CHUNK_ID_MCU_DATA);
for (uint32_t offset = 0; offset < hw_flash_size(); offset += sizeof(hw_flash_t)) { mcu_length = hw_flash_size();
for (uint32_t offset = 0; offset < mcu_length; offset += sizeof(hw_flash_t)) {
buffer = hw_flash_read(offset); buffer = hw_flash_read(offset);
fpga_mem_write(address + offset, sizeof(hw_flash_t), (uint8_t *) (&buffer)); fpga_mem_write(address + offset, sizeof(hw_flash_t), (uint8_t *) (&buffer));
} }
*length += update_finalize_chunk(&address, hw_flash_size()); *length += update_finalize_chunk(&address, mcu_length);
*length += update_prepare_chunk(&address, CHUNK_ID_FPGA_DATA); *length += update_prepare_chunk(&address, CHUNK_ID_FPGA_DATA);
if (vendor_backup(address, &fpga_length) != VENDOR_OK) { if (vendor_backup(address, &fpga_length) != VENDOR_OK) {
@ -153,7 +154,7 @@ update_error_t update_backup (uint32_t address, uint32_t *length) {
} }
update_error_t update_prepare (uint32_t address, uint32_t length) { update_error_t update_prepare (uint32_t address, uint32_t length) {
uint32_t end_address = address + length; uint32_t end_address = (address + length);
chunk_id_t id; chunk_id_t id;
uint32_t data_address; uint32_t data_address;
uint32_t data_length; uint32_t data_length;
@ -177,11 +178,17 @@ update_error_t update_prepare (uint32_t address, uint32_t length) {
break; break;
case CHUNK_ID_MCU_DATA: case CHUNK_ID_MCU_DATA:
if (data_length > hw_flash_size()) {
return UPDATE_ERROR_SIZE;
}
parameters.mcu_address = data_address; parameters.mcu_address = data_address;
parameters.mcu_length = data_length; parameters.mcu_length = data_length;
break; break;
case CHUNK_ID_FPGA_DATA: case CHUNK_ID_FPGA_DATA:
if (data_length > vendor_flash_size()) {
return UPDATE_ERROR_SIZE;
}
parameters.fpga_address = data_address; parameters.fpga_address = data_address;
parameters.fpga_length = data_length; parameters.fpga_length = data_length;
break; break;

View File

@ -10,6 +10,7 @@ typedef enum {
UPDATE_OK, UPDATE_OK,
UPDATE_ERROR_TOKEN, UPDATE_ERROR_TOKEN,
UPDATE_ERROR_CHECKSUM, UPDATE_ERROR_CHECKSUM,
UPDATE_ERROR_SIZE,
UPDATE_ERROR_UNKNOWN_CHUNK, UPDATE_ERROR_UNKNOWN_CHUNK,
UPDATE_ERROR_READ, UPDATE_ERROR_READ,
} update_error_t; } update_error_t;

View File

@ -15,8 +15,9 @@ typedef enum {
} vendor_error_t; } vendor_error_t;
vendor_error_t vendor_update (uint32_t address, uint32_t length); uint32_t vendor_flash_size (void);
vendor_error_t vendor_backup (uint32_t address, uint32_t *length); vendor_error_t vendor_backup (uint32_t address, uint32_t *length);
vendor_error_t vendor_update (uint32_t address, uint32_t length);
vendor_error_t vendor_reconfigure (void); vendor_error_t vendor_reconfigure (void);