Add RP2040 firmware with version set to 2
This commit is contained in:
parent
7a11c31763
commit
501c1b5752
2 changed files with 26 additions and 58 deletions
|
@ -20,6 +20,17 @@
|
||||||
extern const uint8_t rp2040_firmware_bin_start[] asm("_binary_rp2040_firmware_bin_start");
|
extern const uint8_t rp2040_firmware_bin_start[] asm("_binary_rp2040_firmware_bin_start");
|
||||||
extern const uint8_t rp2040_firmware_bin_end[] asm("_binary_rp2040_firmware_bin_end");
|
extern const uint8_t rp2040_firmware_bin_end[] asm("_binary_rp2040_firmware_bin_end");
|
||||||
|
|
||||||
|
void display_rp2040_update_state(pax_buf_t* pax_buffer, ILI9341* ili9341, const char* text) {
|
||||||
|
pax_noclip(pax_buffer);
|
||||||
|
const pax_font_t* font = pax_get_font("sky mono");
|
||||||
|
pax_background(pax_buffer, 0xFFFFFF);
|
||||||
|
pax_vec1_t title_size = pax_text_size(font, 18, "Co-processor update");
|
||||||
|
pax_draw_text(pax_buffer, 0xFF000000, font, 18, (320 / 2) - (title_size.x / 2), 120 - 30, "Co-processor update");
|
||||||
|
pax_vec1_t size = pax_text_size(font, 18, text);
|
||||||
|
pax_draw_text(pax_buffer, 0xFF000000, font, 18, (320 / 2) - (size.x / 2), 120 + 10, text);
|
||||||
|
ili9341_write(ili9341, pax_buffer->buf);
|
||||||
|
}
|
||||||
|
|
||||||
void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
size_t firmware_size = rp2040_firmware_bin_end - rp2040_firmware_bin_start;
|
size_t firmware_size = rp2040_firmware_bin_end - rp2040_firmware_bin_start;
|
||||||
char message[64];
|
char message[64];
|
||||||
|
@ -36,32 +47,14 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
restart();
|
restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*pax_noclip(pax_buffer);
|
if (fw_version < 0x02) { // Update required
|
||||||
pax_background(pax_buffer, 0xCCCCCC);
|
display_rp2040_update_state(pax_buffer, ili9341, "Starting bootloader...");
|
||||||
memset(message, 0, sizeof(message));
|
|
||||||
snprintf(message, sizeof(message) - 1, "RP2040 firmware: 0x%02X", fw_version);
|
|
||||||
pax_draw_text(pax_buffer, 0xFF000000, NULL, 18, 0, 20*0, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
vTaskDelay(100 / portTICK_PERIOD_MS);*/
|
|
||||||
|
|
||||||
if (fw_version < 0x01) { // Update required
|
|
||||||
pax_noclip(pax_buffer);
|
|
||||||
pax_background(pax_buffer, 0x325aa8);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Updating RP2040...");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, message);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Starting bootloader");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 13, 0, 20*1, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
rp2040_reboot_to_bootloader(rp2040);
|
rp2040_reboot_to_bootloader(rp2040);
|
||||||
esp_restart();
|
esp_restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fw_version == 0xFF) { // RP2040 is in bootloader mode
|
if (fw_version == 0xFF) { // RP2040 is in bootloader mode
|
||||||
pax_noclip(pax_buffer);
|
display_rp2040_update_state(pax_buffer, ili9341, "Starting update...");
|
||||||
pax_background(pax_buffer, 0x325aa8);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Updating RP2040...");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
|
|
||||||
uint8_t bl_version;
|
uint8_t bl_version;
|
||||||
if (rp2040_get_bootloader_version(rp2040, &bl_version) != ESP_OK) {
|
if (rp2040_get_bootloader_version(rp2040, &bl_version) != ESP_OK) {
|
||||||
|
@ -86,13 +79,7 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
|
|
||||||
rp2040_bl_install_uart();
|
rp2040_bl_install_uart();
|
||||||
|
|
||||||
pax_noclip(pax_buffer);
|
display_rp2040_update_state(pax_buffer, ili9341, "Preparing...");
|
||||||
pax_background(pax_buffer, 0x325aa8);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Updating RP2040...");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, message);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Waiting for bootloader");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 13, 0, 20*1, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
vTaskDelay(1 / portTICK_PERIOD_MS);
|
vTaskDelay(1 / portTICK_PERIOD_MS);
|
||||||
|
@ -122,13 +109,7 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pax_noclip(pax_buffer);
|
display_rp2040_update_state(pax_buffer, ili9341, "Synchronizing...");
|
||||||
pax_background(pax_buffer, 0x325aa8);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Updating RP2040...");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, message);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Waiting for bootloader sync");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 13, 0, 20*1, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
|
|
||||||
char rx_buffer[16];
|
char rx_buffer[16];
|
||||||
uint8_t rx_buffer_pos = 0;
|
uint8_t rx_buffer_pos = 0;
|
||||||
|
@ -153,13 +134,7 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
restart();
|
restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
pax_noclip(pax_buffer);
|
display_rp2040_update_state(pax_buffer, ili9341, "Erasing...");
|
||||||
pax_background(pax_buffer, 0x325aa8);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Updating RP2040...");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, message);
|
|
||||||
snprintf(message, sizeof(message) - 1, "Erasing flash");
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 13, 0, 20*1, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
|
|
||||||
uint32_t erase_length = firmware_size;
|
uint32_t erase_length = firmware_size;
|
||||||
erase_length = erase_length + erase_size - (erase_length % erase_size); // Round up to erase size
|
erase_length = erase_length + erase_size - (erase_length % erase_size); // Round up to erase size
|
||||||
|
@ -201,11 +176,8 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
|
|
||||||
pax_noclip(pax_buffer);
|
pax_noclip(pax_buffer);
|
||||||
pax_background(pax_buffer, 0x325aa8);
|
pax_background(pax_buffer, 0x325aa8);
|
||||||
snprintf(message, sizeof(message) - 1, "Updating RP2040... %u%%", percentage);
|
snprintf(message, sizeof(message) - 1, "Writing... %u%%", percentage);
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 18, 0, 20*0, message);
|
display_rp2040_update_state(pax_buffer, ili9341, message);
|
||||||
snprintf(message, sizeof(message) - 1, "Writing @ 0x%08X", 0x10010000 + position);
|
|
||||||
pax_draw_text(pax_buffer, 0xFFFFFFFF, NULL, 13, 0, 20*1, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
|
|
||||||
uint32_t checkCrc = 0;
|
uint32_t checkCrc = 0;
|
||||||
memset(txBuffer, 0, write_size);
|
memset(txBuffer, 0, write_size);
|
||||||
|
@ -217,6 +189,7 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
if (writeSuccess && (blockCrc == checkCrc)) {
|
if (writeSuccess && (blockCrc == checkCrc)) {
|
||||||
position += txSize;
|
position += txSize;
|
||||||
} else {
|
} else {
|
||||||
|
display_rp2040_update_state(pax_buffer, ili9341, "CRC mismatch");
|
||||||
while (!rp2040_bl_sync()) {
|
while (!rp2040_bl_sync()) {
|
||||||
vTaskDelay(20 / portTICK_PERIOD_MS);
|
vTaskDelay(20 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
@ -225,16 +198,11 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
|
|
||||||
free(txBuffer);
|
free(txBuffer);
|
||||||
|
|
||||||
pax_noclip(pax_buffer);
|
display_rp2040_update_state(pax_buffer, ili9341, "Finalizing...");
|
||||||
pax_background(pax_buffer, 0xCCCCCC);
|
|
||||||
memset(message, 0, sizeof(message));
|
|
||||||
snprintf(message, sizeof(message) - 1, "Sealing...");
|
|
||||||
pax_draw_text(pax_buffer, 0xFF000000, NULL, 18, 0, 20*0, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
|
|
||||||
bool sealRes = rp2040_bl_seal(0x10010000, 0x10010000, totalLength, totalCrc);
|
bool sealRes = rp2040_bl_seal(0x10010000, 0x10010000, totalLength, totalCrc);
|
||||||
|
|
||||||
snprintf(message, sizeof(message) - 1, "Result: %s", sealRes ? "OK" : "FAIL");
|
snprintf(message, sizeof(message) - 1, "%s", sealRes ? "OK" : "FAIL");
|
||||||
pax_draw_text(pax_buffer, 0xFF000000, NULL, 18, 0, 20*1, message);
|
pax_draw_text(pax_buffer, 0xFF000000, NULL, 18, 0, 20*1, message);
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
ili9341_write(ili9341, pax_buffer->buf);
|
||||||
|
|
||||||
|
@ -243,12 +211,12 @@ void rp2040_updater(RP2040* rp2040, pax_buf_t* pax_buffer, ILI9341* ili9341) {
|
||||||
pax_noclip(pax_buffer);
|
pax_noclip(pax_buffer);
|
||||||
pax_background(pax_buffer, 0xCCCCCC);
|
pax_background(pax_buffer, 0xCCCCCC);
|
||||||
memset(message, 0, sizeof(message));
|
memset(message, 0, sizeof(message));
|
||||||
snprintf(message, sizeof(message) - 1, "Waiting for reset...");
|
display_rp2040_update_state(pax_buffer, ili9341, "Update completed");
|
||||||
pax_draw_text(pax_buffer, 0xFF000000, NULL, 18, 0, 20*0, message);
|
|
||||||
ili9341_write(ili9341, pax_buffer->buf);
|
|
||||||
rp2040_bl_go(0x10010000);
|
rp2040_bl_go(0x10010000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
display_rp2040_update_state(pax_buffer, ili9341, "Update failed");
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in a new issue