mirror of
https://github.com/Polprzewodnikowy/SummerCart64.git
synced 2024-11-25 15:16:53 +01:00
update fixes
This commit is contained in:
parent
201a4d023a
commit
ab0c72ce26
1
fw/project/lcmxo2/.gitignore
vendored
1
fw/project/lcmxo2/.gitignore
vendored
@ -1,5 +1,6 @@
|
|||||||
.recovery
|
.recovery
|
||||||
*.dir/
|
*.dir/
|
||||||
|
*.ccl
|
||||||
*.html
|
*.html
|
||||||
*.ini
|
*.ini
|
||||||
*.rva
|
*.rva
|
||||||
|
@ -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) {
|
||||||
|
3
sw/controller/.gitignore
vendored
3
sw/controller/.gitignore
vendored
@ -1,3 +1,2 @@
|
|||||||
/build_app
|
/build
|
||||||
/build_loader
|
|
||||||
*.svd
|
*.svd
|
||||||
|
@ -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)));
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user