Merge pull request #53 from badgeteam/renze/rp2040-update

Renze/rp2040 update
This commit is contained in:
Renze Nicolai 2022-06-02 02:11:39 +02:00 committed by GitHub
commit d7f9756939
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 69 deletions

View file

@ -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,20 +109,11 @@ 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];
uint8_t rx_buffer_pos = 0;
memset(rx_buffer, 0, sizeof(rx_buffer));
while (true) { while (true) {
if (rp2040_bl_sync()) break; if (rp2040_bl_sync()) break;
vTaskDelay(500 / portTICK_PERIOD_MS); vTaskDelay(100 / portTICK_PERIOD_MS);
} }
uint32_t flash_start = 0, flash_size = 0, erase_size = 0, write_size = 0, max_data_len = 0; uint32_t flash_start = 0, flash_size = 0, erase_size = 0, write_size = 0, max_data_len = 0;
@ -153,13 +131,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 +173,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 +186,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,28 +195,21 @@ 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");
pax_draw_text(pax_buffer, 0xFF000000, NULL, 18, 0, 20*1, message);
ili9341_write(ili9341, pax_buffer->buf);
if (sealRes) { if (sealRes) {
vTaskDelay(2000 / portTICK_PERIOD_MS); vTaskDelay(2000 / portTICK_PERIOD_MS);
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);
} else {
display_rp2040_update_state(pax_buffer, ili9341, "Update failed");
vTaskDelay(1000 / portTICK_PERIOD_MS);
restart();
} }
while (true) { while (true) {

View file

@ -108,8 +108,10 @@ void display_ota_state(pax_buf_t* pax_buffer, ILI9341* ili9341, const char* text
pax_noclip(pax_buffer); pax_noclip(pax_buffer);
const pax_font_t* font = pax_get_font("sky mono"); const pax_font_t* font = pax_get_font("sky mono");
pax_background(pax_buffer, 0xFFFFFF); pax_background(pax_buffer, 0xFFFFFF);
pax_vec1_t size = pax_text_size(font, 20, text); pax_vec1_t title_size = pax_text_size(font, 18, "Firmware update");
pax_draw_text(pax_buffer, 0xFF000000, font, 20, (320 / 2) - (size.x / 2), (240 - 20) / 2, text); pax_draw_text(pax_buffer, 0xFF000000, font, 18, (320 / 2) - (title_size.x / 2), 120 - 30, "Firmware 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); ili9341_write(ili9341, pax_buffer->buf);
} }
@ -200,7 +202,7 @@ void ota_update(pax_buf_t* pax_buffer, ILI9341* ili9341) {
ota_finish_err = esp_https_ota_finish(https_ota_handle); ota_finish_err = esp_https_ota_finish(https_ota_handle);
if ((err == ESP_OK) && (ota_finish_err == ESP_OK)) { if ((err == ESP_OK) && (ota_finish_err == ESP_OK)) {
ESP_LOGI(TAG, "ESP_HTTPS_OTA upgrade successful. Rebooting ..."); ESP_LOGI(TAG, "ESP_HTTPS_OTA upgrade successful. Rebooting ...");
display_ota_state(pax_buffer, ili9341, "Update completed"); display_ota_state(pax_buffer, ili9341, "Update installed");
vTaskDelay(1000 / portTICK_PERIOD_MS); vTaskDelay(1000 / portTICK_PERIOD_MS);
esp_restart(); esp_restart();
} else { } else {

Binary file not shown.