update fixes

This commit is contained in:
Polprzewodnikowy 2022-08-18 02:33:47 +02:00
parent 201a4d023a
commit ab0c72ce26
7 changed files with 76 additions and 68 deletions

View File

@ -1,5 +1,6 @@
.recovery .recovery
*.dir/ *.dir/
*.ccl
*.html *.html
*.ini *.ini
*.rva *.rva

View File

@ -28,6 +28,8 @@
static io32_t exception_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(64))); static io32_t exception_framebuffer[SCREEN_WIDTH * SCREEN_HEIGHT] __attribute__((aligned(64)));
static int char_x;
static int char_y;
static const vi_regs_t vi_config[] = {{ static const vi_regs_t vi_config[] = {{
.CR = ( .CR = (
VI_CR_PIXEL_ADVANCE_1 | VI_CR_PIXEL_ADVANCE_1 |
@ -75,6 +77,9 @@ static void exception_init_screen (void) {
const vi_regs_t *cfg = &vi_config[OS_INFO->tv_type]; const vi_regs_t *cfg = &vi_config[OS_INFO->tv_type];
uint32_t *background_data = (uint32_t *) (&assets_exception_background); uint32_t *background_data = (uint32_t *) (&assets_exception_background);
char_x = BORDER_WIDTH;
char_y = BORDER_HEIGHT;
for (int i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i += 2) { for (int i = 0; i < (SCREEN_WIDTH * SCREEN_HEIGHT); i += 2) {
io_write(&exception_framebuffer[i], *background_data); io_write(&exception_framebuffer[i], *background_data);
io_write(&exception_framebuffer[i + 1], *background_data); io_write(&exception_framebuffer[i + 1], *background_data);
@ -98,18 +103,15 @@ static void exception_init_screen (void) {
} }
static void exception_draw_character (char c) { static void exception_draw_character (char c) {
static int x = BORDER_WIDTH;
static int y = BORDER_HEIGHT;
if (c == '\n') { if (c == '\n') {
x = BORDER_WIDTH; char_x = BORDER_WIDTH;
y += LINE_HEIGHT; char_y += LINE_HEIGHT;
return; return;
} }
if ((x + FONT_WIDTH) > (SCREEN_WIDTH - BORDER_WIDTH)) { if ((char_x + FONT_WIDTH) > (SCREEN_WIDTH - BORDER_WIDTH)) {
x = BORDER_WIDTH; char_x = BORDER_WIDTH;
y += LINE_HEIGHT; char_y += LINE_HEIGHT;
} }
if ((c < ' ') || (c > '~')) { if ((c < ' ') || (c > '~')) {
@ -117,8 +119,8 @@ static void exception_draw_character (char c) {
} }
for (int i = 0; i < (FONT_WIDTH * FONT_HEIGHT); i++) { for (int i = 0; i < (FONT_WIDTH * FONT_HEIGHT); i++) {
int c_x = x + (i % FONT_WIDTH); int c_x = char_x + (i % FONT_WIDTH);
int c_y = y + (i / FONT_WIDTH); int c_y = char_y + (i / FONT_WIDTH);
if ((c_x >= (SCREEN_WIDTH - BORDER_WIDTH)) || (c_y >= (SCREEN_HEIGHT - BORDER_HEIGHT))) { if ((c_x >= (SCREEN_WIDTH - BORDER_WIDTH)) || (c_y >= (SCREEN_HEIGHT - BORDER_HEIGHT))) {
break; break;
@ -130,7 +132,7 @@ static void exception_draw_character (char c) {
} }
} }
x += FONT_WIDTH; char_x += FONT_WIDTH;
} }
static void exception_print_string (const char *s) { static void exception_print_string (const char *s) {

View File

@ -1,3 +1,2 @@
/build_app /build
/build_loader
*.svd *.svd

View File

@ -8,7 +8,7 @@
#define CIC_STACK_SIZE (256) #define CIC_STACK_SIZE (256)
#define RTC_STACK_SIZE (256) #define RTC_STACK_SIZE (256)
#define GVR_STACK_SIZE (1024) #define GVR_STACK_SIZE (1536)
uint8_t cic_stack[CIC_STACK_SIZE] __attribute__((aligned(8))); uint8_t cic_stack[CIC_STACK_SIZE] __attribute__((aligned(8)));

View File

@ -267,9 +267,9 @@ void hw_crc32_reset (void) {
uint32_t hw_crc32_calculate (uint8_t *data, uint32_t length) { uint32_t hw_crc32_calculate (uint8_t *data, uint32_t length) {
for (uint32_t i = 0; i < length; i++) { for (uint32_t i = 0; i < length; i++) {
*(__IO uint8_t *) (CRC->DR) = data[i]; *(__IO uint8_t *) (&CRC->DR) = data[i];
} }
return CRC->DR; return (CRC->DR ^ 0xFFFFFFFF);
} }
uint32_t hw_flash_size (void) { uint32_t hw_flash_size (void) {
@ -359,6 +359,10 @@ static void hw_init_mcu (void) {
RCC->IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN; RCC->IOPENR |= RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN;
SysTick->LOAD = (((64000000 / 1000)) - 1);
SysTick->VAL = 0;
SysTick->CTRL = (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
hw_gpio_init(GPIO_ID_LED, GPIO_OUTPUT, GPIO_PP, GPIO_SPEED_VLOW, GPIO_PULL_NONE, GPIO_AF_0, 0); hw_gpio_init(GPIO_ID_LED, GPIO_OUTPUT, GPIO_PP, GPIO_SPEED_VLOW, GPIO_PULL_NONE, GPIO_AF_0, 0);
} }
@ -437,12 +441,10 @@ static void hw_init_tim (void) {
} }
static void hw_init_misc (void) { static void hw_init_misc (void) {
SysTick->LOAD = (((64000000 / 1000)) - 1);
SysTick->VAL = 0;
SysTick->CTRL = (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk);
RCC->AHBENR |= RCC_AHBENR_CRCEN; RCC->AHBENR |= RCC_AHBENR_CRCEN;
CRC->CR = (CRC_CR_REV_OUT | CRC_CR_REV_IN_0);
hw_gpio_init(GPIO_ID_N64_RESET, GPIO_INPUT, GPIO_PP, GPIO_SPEED_VLOW, GPIO_PULL_DOWN, GPIO_AF_0, 0); hw_gpio_init(GPIO_ID_N64_RESET, GPIO_INPUT, GPIO_PP, GPIO_SPEED_VLOW, GPIO_PULL_DOWN, GPIO_AF_0, 0);
hw_gpio_init(GPIO_ID_N64_CIC_CLK, GPIO_INPUT, GPIO_PP, GPIO_SPEED_VLOW, GPIO_PULL_DOWN, GPIO_AF_0, 0); hw_gpio_init(GPIO_ID_N64_CIC_CLK, GPIO_INPUT, GPIO_PP, GPIO_SPEED_VLOW, GPIO_PULL_DOWN, GPIO_AF_0, 0);
hw_gpio_init(GPIO_ID_N64_CIC_DQ, GPIO_OUTPUT, GPIO_OD, GPIO_SPEED_VLOW, GPIO_PULL_UP, GPIO_AF_0, 1); hw_gpio_init(GPIO_ID_N64_CIC_DQ, GPIO_OUTPUT, GPIO_OD, GPIO_SPEED_VLOW, GPIO_PULL_UP, GPIO_AF_0, 1);

View File

@ -56,16 +56,6 @@ static void lcmxo2_reg_set (uint8_t reg, uint8_t value) {
while (fpga_reg_get(REG_VENDOR_SCR) & VENDOR_SCR_BUSY); while (fpga_reg_get(REG_VENDOR_SCR) & VENDOR_SCR_BUSY);
} }
static uint8_t lcmxo2_reg_get (uint8_t reg) {
fpga_reg_set(REG_VENDOR_SCR,
(reg << VENDOR_SCR_ADDRESS_BIT) |
(0 << VENDOR_SCR_LENGTH_BIT) |
VENDOR_SCR_START
);
while (fpga_reg_get(REG_VENDOR_SCR) & VENDOR_SCR_BUSY);
return fpga_reg_get(REG_VENDOR_DATA) & 0xFF;
}
static void lcmxo2_reset_bus (void) { static void lcmxo2_reset_bus (void) {
lcmxo2_reg_set(LCMXO2_CFGCR, CFGCR_RSTE); lcmxo2_reg_set(LCMXO2_CFGCR, CFGCR_RSTE);
lcmxo2_reg_set(LCMXO2_CFGCR, 0); lcmxo2_reg_set(LCMXO2_CFGCR, 0);
@ -91,14 +81,41 @@ static void lcmxo2_cleanup (void) {
} }
static void lcmxo2_read_data (uint8_t *buffer, uint32_t length) { static void lcmxo2_read_data (uint8_t *buffer, uint32_t length) {
for (uint32_t i = 0; i < length; i++) { while (length > 0) {
*buffer++ = lcmxo2_reg_get(LCMXO2_CFGRXDR); uint32_t block_size = (length > 4) ? 4 : length;
fpga_reg_set(REG_VENDOR_SCR,
(LCMXO2_CFGRXDR << VENDOR_SCR_ADDRESS_BIT) |
((block_size - 1) << VENDOR_SCR_LENGTH_BIT) |
VENDOR_SCR_START
);
while (fpga_reg_get(REG_VENDOR_SCR) & VENDOR_SCR_BUSY);
uint32_t data = fpga_reg_get(REG_VENDOR_DATA);
data <<= ((4 - block_size) * 8);
for (int i = 0; i < block_size; i++) {
*buffer++ = ((data >> 24) & 0xFF);
data <<= 8;
length -= 1;
}
} }
} }
static void lcmxo2_write_data (uint8_t *buffer, uint32_t length) { static void lcmxo2_write_data (uint8_t *buffer, uint32_t length) {
for (uint32_t i = 0; i < length; i++) { while (length > 0) {
lcmxo2_reg_set(LCMXO2_CFGTXDR, *buffer++); uint32_t block_size = (length > 4) ? 4 : length;
uint32_t data = 0;
for (int i = 0; i < block_size; i++) {
data = ((data << 8) | *buffer++);
length -= 1;
}
data <<= ((4 - block_size) * 8);
fpga_reg_set(REG_VENDOR_DATA, data);
fpga_reg_set(REG_VENDOR_SCR,
(LCMXO2_CFGTXDR << VENDOR_SCR_ADDRESS_BIT) |
((block_size - 1) << VENDOR_SCR_LENGTH_BIT) |
VENDOR_SCR_WRITE |
VENDOR_SCR_START
);
while (fpga_reg_get(REG_VENDOR_SCR) & VENDOR_SCR_BUSY);
} }
} }

View File

@ -9,12 +9,9 @@
typedef enum { typedef enum {
UPDATE_STATUS_START = 1, UPDATE_STATUS_MCU = 1,
UPDATE_STATUS_MCU_START = 2, UPDATE_STATUS_FPGA = 2,
UPDATE_STATUS_MCU_DONE = 3, UPDATE_STATUS_DONE = 0x80,
UPDATE_STATUS_FPGA_START = 4,
UPDATE_STATUS_FPGA_DONE = 5,
UPDATE_STATUS_DONE = 6,
UPDATE_STATUS_ERROR = 0xFF, UPDATE_STATUS_ERROR = 0xFF,
} update_status_t; } update_status_t;
@ -30,25 +27,22 @@ 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_START, 0, 0, 0, UPDATE_STATUS_ERROR,
}; };
static uint32_t update_checksum (uint32_t address, uint32_t length) { static uint32_t update_checksum (uint32_t address, uint32_t length) {
uint32_t remaining = length; uint8_t buffer[32];
uint32_t block_size; uint32_t block_size;
uint32_t checksum = 0; uint32_t checksum = 0;
uint8_t buffer[32];
hw_crc32_reset(); hw_crc32_reset();
while (length > 0) {
for (uint32_t i = 0; i < length; i += sizeof(buffer)) { block_size = (length > sizeof(buffer)) ? sizeof(buffer) : length;
block_size = (remaining > sizeof(buffer)) ? sizeof(buffer) : remaining;
fpga_mem_read(address, block_size, buffer); fpga_mem_read(address, block_size, buffer);
checksum = hw_crc32_calculate(buffer, block_size); checksum = hw_crc32_calculate(buffer, block_size);
remaining -= block_size; address += block_size;
length -= block_size;
} }
return checksum; return checksum;
} }
@ -91,6 +85,7 @@ static bool update_get_chunk (uint32_t *address, chunk_id_t *chunk_id, uint32_t
uint32_t id; uint32_t id;
uint32_t checksum; uint32_t checksum;
fpga_mem_read(*address, sizeof(id), (uint8_t *) (&id)); fpga_mem_read(*address, sizeof(id), (uint8_t *) (&id));
*chunk_id = (chunk_id_t) (id);
*address += sizeof(id); *address += sizeof(id);
fpga_mem_read(*address, sizeof(*data_length), (uint8_t *) (data_length)); fpga_mem_read(*address, sizeof(*data_length), (uint8_t *) (data_length));
*address += sizeof(*data_length); *address += sizeof(*data_length);
@ -120,11 +115,13 @@ static void update_status_notify (update_status_t status) {
fpga_usb_push(status_data[i]); fpga_usb_push(status_data[i]);
} }
fpga_reg_set(REG_USB_SCR, USB_SCR_WRITE_FLUSH); fpga_reg_set(REG_USB_SCR, USB_SCR_WRITE_FLUSH);
if (status != UPDATE_STATUS_ERROR) { if (status == UPDATE_STATUS_DONE) {
update_blink_led(100, 250, status); update_blink_led(15, 85, 10);
hw_delay_ms(1000); } else if (status == UPDATE_STATUS_ERROR) {
} else {
update_blink_led(1000, 1000, 30); update_blink_led(1000, 1000, 30);
} else {
update_blink_led(15, 185, 2);
hw_delay_ms(500);
} }
} }
@ -134,7 +131,7 @@ update_error_t update_backup (uint32_t address, uint32_t *length) {
uint32_t mcu_length; 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);
mcu_length = hw_flash_size(); mcu_length = hw_flash_size();
@ -214,35 +211,25 @@ bool update_check (void) {
void update_perform (void) { void update_perform (void) {
hw_flash_t buffer; hw_flash_t buffer;
update_status_notify(UPDATE_STATUS_START);
if (parameters.mcu_length != 0) { if (parameters.mcu_length != 0) {
update_status_notify(UPDATE_STATUS_MCU_START); update_status_notify(UPDATE_STATUS_MCU);
hw_flash_erase(); hw_flash_erase();
for (uint32_t offset = 0; offset < parameters.mcu_length; offset += sizeof(hw_flash_t)) { for (uint32_t offset = 0; offset < parameters.mcu_length; offset += sizeof(hw_flash_t)) {
fpga_mem_read(parameters.mcu_address + offset, sizeof(hw_flash_t), (uint8_t *) (&buffer)); fpga_mem_read(parameters.mcu_address + offset, sizeof(hw_flash_t), (uint8_t *) (&buffer));
hw_flash_program(offset, buffer); hw_flash_program(offset, buffer);
if (hw_flash_read(offset) != buffer) { if (hw_flash_read(offset) != buffer) {
update_status_notify(UPDATE_STATUS_ERROR); update_status_notify(UPDATE_STATUS_ERROR);
while (1); // TODO: jump to STM32 bootloader? while (1);
} }
} }
update_status_notify(UPDATE_STATUS_MCU_DONE);
} }
if (parameters.fpga_length != 0) { if (parameters.fpga_length != 0) {
update_status_notify(UPDATE_STATUS_FPGA_START); update_status_notify(UPDATE_STATUS_FPGA);
if (vendor_update(parameters.fpga_address, parameters.fpga_length) != VENDOR_OK) { if (vendor_update(parameters.fpga_address, parameters.fpga_length) != VENDOR_OK) {
update_status_notify(UPDATE_STATUS_ERROR); update_status_notify(UPDATE_STATUS_ERROR);
while (1); // TODO: jump to STM32 bootloader? while (1);
} }
update_status_notify(UPDATE_STATUS_FPGA_DONE);
} }
update_status_notify(UPDATE_STATUS_DONE); update_status_notify(UPDATE_STATUS_DONE);