Просмотр исходного кода

serial_comm: ignore consecutive SLIP delimiters (0xc0)

Extra 0xc0 are ignored, as bootloader responds with two extra delimiters after baudrate is changed.

In addition, debug printout in esp32 port was enhanced to simplify debugging.
Martin Válik 5 лет назад
Родитель
Сommit
48fa878d0b
2 измененных файлов с 43 добавлено и 10 удалено
  1. 34 5
      port/esp32_uart.c
  2. 9 5
      src/serial_comm.c

+ 34 - 5
port/esp32_uart.c

@@ -25,12 +25,39 @@
 // #define SERIAL_DEBUG_ENABLE
 // #define SERIAL_DEBUG_ENABLE
 
 
 #ifdef SERIAL_DEBUG_ENABLE
 #ifdef SERIAL_DEBUG_ENABLE
-void serial_debug_print(const uint8_t *data, uint16_t size)
+
+static void dec_to_hex_str(const uint8_t dec, uint8_t hex_str[3])
+{
+    static const uint8_t dec_to_hex[] = {
+        '0', '1', '2', '3', '4', '5', '6', '7',
+        '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+    };
+
+    hex_str[0] = dec_to_hex[(dec >> 4)];
+    hex_str[1] = dec_to_hex[(dec & 0xF)];
+    hex_str[2] = '\0';
+}
+
+static void serial_debug_print(const uint8_t *data, uint16_t size, bool write)
 {
 {
-    ESP_LOG_BUFFER_HEX("LOADER ESP32 PORT", data, size);
+    static bool write_prev = false;
+    uint8_t hex_str[3];
+
+    if(write_prev != write) {
+        write_prev = write;
+        printf("\n--- %s ---\n", write ? "WRITE" : "READ");
+    }
+
+    for(uint32_t i = 0; i < size; i++) {
+        dec_to_hex_str(data[i], hex_str);
+        printf("%s ", hex_str);
+    }
 }
 }
+
 #else
 #else
-void serial_debug_print(const uint8_t *data, uint16_t size) { }
+
+static void serial_debug_print(const uint8_t *data, uint16_t size, bool write) { }
+
 #endif
 #endif
 
 
 static int64_t s_time_end;
 static int64_t s_time_end;
@@ -81,7 +108,7 @@ esp_loader_error_t loader_port_serial_init(const loader_serial_config_t *config)
 
 
 esp_loader_error_t loader_port_serial_write(const uint8_t *data, uint16_t size, uint32_t timeout)
 esp_loader_error_t loader_port_serial_write(const uint8_t *data, uint16_t size, uint32_t timeout)
 {
 {
-    serial_debug_print(data, size);
+    serial_debug_print(data, size, true);
 
 
     uart_write_bytes(s_uart_port, (const char *)data, size);
     uart_write_bytes(s_uart_port, (const char *)data, size);
     esp_err_t err = uart_wait_tx_done(s_uart_port, pdMS_TO_TICKS(timeout));
     esp_err_t err = uart_wait_tx_done(s_uart_port, pdMS_TO_TICKS(timeout));
@@ -99,7 +126,9 @@ esp_loader_error_t loader_port_serial_write(const uint8_t *data, uint16_t size,
 esp_loader_error_t loader_port_serial_read(uint8_t *data, uint16_t size, uint32_t timeout)
 esp_loader_error_t loader_port_serial_read(uint8_t *data, uint16_t size, uint32_t timeout)
 {
 {
     int read = uart_read_bytes(s_uart_port, data, size, pdMS_TO_TICKS(timeout));
     int read = uart_read_bytes(s_uart_port, data, size, pdMS_TO_TICKS(timeout));
-    
+
+    serial_debug_print(data, read, false);
+
     if (read < 0) {
     if (read < 0) {
         return ESP_LOADER_ERROR_FAIL;
         return ESP_LOADER_ERROR_FAIL;
     } else if (read < size) {
     } else if (read < size) {

+ 9 - 5
src/serial_comm.c

@@ -82,13 +82,17 @@ static esp_loader_error_t SLIP_receive_packet(uint8_t *buff, uint32_t size)
 
 
     // Wait for delimiter
     // Wait for delimiter
     do {
     do {
-        esp_loader_error_t err = serial_read(&ch, 1);
-        if (err != ESP_LOADER_SUCCESS) {
-            return err;
-        }
+        RETURN_ON_ERROR( serial_read(&ch, 1) );
     } while (ch != DELIMITER);
     } while (ch != DELIMITER);
 
 
-    RETURN_ON_ERROR( SLIP_receive_data(buff, size) );
+    // Workaround: bootloader sends two dummy(0xc0) bytes after response when baud rate is changed.
+    do {
+        RETURN_ON_ERROR( serial_read(&ch, 1) );
+    } while (ch == DELIMITER);
+
+    buff[0] = ch;
+
+    RETURN_ON_ERROR( SLIP_receive_data(&buff[1], size - 1) );
 
 
     // Delimiter
     // Delimiter
     RETURN_ON_ERROR( serial_read(&ch, 1) );
     RETURN_ON_ERROR( serial_read(&ch, 1) );