From 5b7e84e322a29c9824e59106069d931bfb3024d8 Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Wed, 10 Sep 2025 13:25:29 +0200 Subject: [PATCH 1/9] New buttons --- .../simulator/creator_uielto_target_flash.js | 240 ++++++++++++++++-- 1 file changed, 215 insertions(+), 25 deletions(-) diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index be64d9b54..cef3e973a 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -83,8 +83,15 @@ flash_url = "http://localhost:8080", */ - flashing = false, - running = false, + + flashing = false, + running = false, + debugging = false, + fullclean = false, + stoprunning = false, + eraseflash = false, + showPopup: false, + pendingAction: null, } }, @@ -249,8 +256,7 @@ //Google Analytics creator_ga('simulator', 'simulator.download_driver', 'simulator.download_driver'); }, - - do_flash( ) + do_flash( ) { this.save(); @@ -271,19 +277,57 @@ this_env = this; gateway_remote_flash(this.flash_url + "/flash", farg).then( function(data) { - this_env.flashing = false; - show_notification(data, 'danger') ; - } ) ; + this_env.flashing = false; + console.log(JSON.stringify(data, null, 2)); + if (JSON.stringify(data, null, 2).includes('Flash completed successfully')) { + show_notification('Flashing program success.', 'success'); + } + if (JSON.stringify(data, null, 2).includes('No UART port found')) { + show_notification('Error flashing: Not found UART port', 'danger'); + } + if (JSON.stringify(data, null, 2).includes('cr_ functions are not supported in this mode')) { + show_notification('CREATino code in CREATOR module. Make sure the "Arduino Support" checkbox is selected', 'danger'); + } + } ) ; //Google Analytics creator_ga('simulator', 'simulator.flash', 'simulator.flash'); }, + do_stop_monitor() + { + + this.save(); + + this.stoprunning = true; + + var farg = { + target_board: this.target_board, + target_port: this.target_port, + assembly: code_assembly, + } ; + + this_env = this; + gateway_remote_monitor(this.flash_url + "/stopmonitor", farg).then( function(data) { + this_env.stoprunning = false; + //show_notification(data, 'danger') ; + console.log(JSON.stringify(data, null, 2)); + if (JSON.stringify(data, null, 2).includes('Process stopped')) { + show_notification('Process stopped.', 'success'); + } + } ) ; + + //Google Analytics + creator_ga('simulator', 'simulator.stopmonitor', 'simulator.stopmonitor'); + + }, + do_monitor( ) { this.save(); this.running = true; + this.stoprunning = false; var farg = { target_board: this.target_board, @@ -293,14 +337,110 @@ this_env = this; gateway_remote_monitor(this.flash_url + "/monitor", farg).then( function(data) { - this_env.running = false; - //show_notification(data, 'danger') ; + this_env.running = false; + console.log(JSON.stringify(data, null, 2)); + if (JSON.stringify(data, null, 2).includes('No UART port found')) { + show_notification('Error: Not found UART port', 'danger'); + } } ) ; //Google Analytics creator_ga('simulator', 'simulator.monitor', 'simulator.monitor'); }, + + do_debug( ) + { + this.save(); + + this.debugging = true; + + var farg = { + target_board: this.target_board, + target_port: this.target_port, + assembly: code_assembly, + } ; + + this_env = this; + gateway_remote_monitor(this.flash_url + "/debug", farg).then( function(data) { + this_env.debugging = false; + //show_notification(data, 'danger') ; + } ) ; + + //Google Analytics + creator_ga('simulator', 'simulator.debug', 'simulator.debug'); + }, + showConfirmPopup(action) { + this.pendingAction = action; + this.showPopup = true; + }, + + confirmAction() { + this.showPopup = false; + if (this.pendingAction === 'fullclean') { + this.do_fullclean(); + } else if (this.pendingAction === 'eraseflash') { + this.do_erase_flash(); + } + this.pendingAction = null; + }, + + do_fullclean( ) + { + this.save(); + + this.fullclean = true; + + var farg = { + target_board: this.target_board, + target_port: this.target_port, + assembly: code_assembly, + } ; + + this_env = this; + gateway_remote_monitor(this.flash_url + "/fullclean", farg).then( function(data) { + this_env.fullclean = false; + console.log(JSON.stringify(data, null, 2)); + if (JSON.stringify(data, null, 2).includes('Full clean done.')) { + show_notification('Full clean done.', 'success'); + } + if (JSON.stringify(data, null, 2).includes('Nothing to clean')) { + show_notification('Nothing to clean', 'success'); + } + + } ) ; + + //Google Analytics + creator_ga('simulator', 'simulator.fullclean', 'simulator.fullclean'); + }, + do_erase_flash( ) + { + this.save(); + + this.eraseflash = true; + + var farg = { + target_board: this.target_board, + target_port: this.target_port, + assembly: code_assembly, + } ; + + this_env = this; + gateway_remote_monitor(this.flash_url + "/eraseflash", farg).then( function(data) { + this_env.eraseflash = false; + //show_notification(data, 'danger') ; + console.log(JSON.stringify(data, null, 2)); + if (JSON.stringify(data, null, 2).includes('Erase flash done')) { + show_notification('Erase flash done. Please, unplug and plug the cable(s) again', 'success'); + } + if (JSON.stringify(data, null, 2).includes('Could not open /dev/ttyUSB0, the port is busy or doesn\'t exist')) { + show_notification('Error erasing flash: Hint: Check if the port is correct and ESP connected', 'danger'); + } + } ) ; + + //Google Analytics + creator_ga('simulator', 'simulator.eraseflash', 'simulator.eraseflash'); + }, // //General // @@ -642,22 +782,72 @@ ' ' + ' ' + ' ' + - ' ' + - ' ' + - ' Flash' + - ' Flashing...' + - ' ' + - ' ' + - ' ' + - ' ' + - ' ' + - ' Monitor' + - ' Runing...' + - ' ' + - ' ' + - ' ' + - ' ' + - ' ' + + // Columna 1: Flash, Clean y Erase Flash + '' + + '
' + + + ' ' + + ' ' + + ' Flash' + + ' Flashing...' + + ' ' + + ' ' + + + ' ' + + ' ' + + ' Clean' + + ' Cleaning...' + + ' ' + + ' ' + + + ' ' + + ' ' + + ' Erase Flash' + + ' Erasing...' + + ' ' + + ' ' + + + ' ' + + ' ' + + '

This action will delete your previous work. Are you sure you want to proceed?

' + + ' ' + + '
' + + + '
' + + '
' + + + // Columna 2: Monitor, Debug y Stop + '' + + '
' + + + ' ' + + ' ' + + ' Monitor' + + ' Running' + + ' ' + + ' ' + + + ' ' + + ' ' + + ' Debug' + + ' Debugging' + + ' ' + + ' ' + + + ' ' + + ' ' + + ' Stop' + + ' Stopping' + + ' ' + + ' ' + + + '
' + + '
' + + ' ' + + '' + ' ' + ' ' + ' ' + From a6c2308d2ef8d45f199f4ec15ffb8b370819e30a Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Mon, 22 Sep 2025 12:18:12 +0200 Subject: [PATCH 2/9] Added new driver + new prerrequisites --- .../simulator/creator_uielto_target_flash.js | 52 +- gateway/esp32-rv/.gitignore | 5 - gateway/esp32-rv/CMakeLists.txt | 1 + gateway/esp32-rv/creator/io.h | 127 ---- gateway/esp32-rv/gateway.py | 435 +++++++++++-- gateway/esp32-rv/gbdscript.gdb | 16 + gateway/esp32-rv/gdbinit | 2 + gateway/esp32-rv/main/CMakeLists.txt | 4 +- gateway/esp32-rv/main/creator.s | 2 +- gateway/esp32-rv/main/ecall.s | 345 ----------- gateway/esp32-rv/main/io.s | 571 ------------------ gateway/esp32-rv/main/rdcycle.s | 2 +- .../esp32-rv/main/syscall/return_from_panic.S | 71 +++ gateway/esp32-rv/main/syscall/test_panic.c | 267 ++++++++ gateway/esp32-rv/openscript.cfg | 14 + gateway/esp32-rv/tests/random.s | 2 +- gateway/esp32-rv/tests/random_array.s | 2 +- gateway/esp32-rv/tests/sleep.s | 2 +- gateway/esp32c2.zip | Bin 20980 -> 19420 bytes gateway/esp32c3.zip | Bin 20980 -> 19420 bytes gateway/esp32c6.zip | Bin 20980 -> 19420 bytes gateway/esp32h2.zip | Bin 20980 -> 19420 bytes gateway/esp32s2.zip | Bin 18542 -> 18542 bytes gateway/esp32s3.zip | Bin 18542 -> 18542 bytes 24 files changed, 807 insertions(+), 1113 deletions(-) delete mode 100644 gateway/esp32-rv/.gitignore delete mode 100644 gateway/esp32-rv/creator/io.h create mode 100644 gateway/esp32-rv/gbdscript.gdb create mode 100644 gateway/esp32-rv/gdbinit delete mode 100644 gateway/esp32-rv/main/ecall.s delete mode 100644 gateway/esp32-rv/main/io.s create mode 100644 gateway/esp32-rv/main/syscall/return_from_panic.S create mode 100644 gateway/esp32-rv/main/syscall/test_panic.c create mode 100644 gateway/esp32-rv/openscript.cfg diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index cef3e973a..d1a6b7322 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -674,12 +674,40 @@ ' ' + ' ' + ' ' + - ' ' + + ' ' + ' ' + ' ' + ' ' + ' ' + - ' Follow the instructions from: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/' + + ' Follow the instructions from: https://github.com/espressif/esp-idf/releases/tag/v5.3.2' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' How to install Python 3.9:' + + '
' +
+                                                        'sudo apt install software-properties-common\n' +
+                                                        'sudo add-apt-repository ppa:deadsnakes/ppa\n' +
+                                                        'sudo apt install python3.9' +
+                    '                                  
' + + ' ' + + '
' + + ' How to change Python environment if you have another installed:' + + ' ' + + 'sudo update-alternatives --set python3 /usr/bin/python3.9' + + ' ' + ' ' + ' ' + ' ' + @@ -708,7 +736,25 @@ ' ' + ' ' + ' ' + - ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' Install Openocd
' + + ' Install the GDB web interface: pip3 install gdbgui ' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + '
' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + ' Download Driver' + ' ' + ' ' + diff --git a/gateway/esp32-rv/.gitignore b/gateway/esp32-rv/.gitignore deleted file mode 100644 index fbae2f16b..000000000 --- a/gateway/esp32-rv/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -sdkconfig -sdkconfig.old -tmp_assembly.s -build -main/program.s diff --git a/gateway/esp32-rv/CMakeLists.txt b/gateway/esp32-rv/CMakeLists.txt index 0a454d064..cc2ff9e57 100644 --- a/gateway/esp32-rv/CMakeLists.txt +++ b/gateway/esp32-rv/CMakeLists.txt @@ -4,3 +4,4 @@ cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(hello_world) +target_link_libraries(${project_elf} PRIVATE "-Wl,--wrap=esp_panic_handler") \ No newline at end of file diff --git a/gateway/esp32-rv/creator/io.h b/gateway/esp32-rv/creator/io.h deleted file mode 100644 index 276ca38a1..000000000 --- a/gateway/esp32-rv/creator/io.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez - * - * This file is part of CREATOR. - * - * CREATOR is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * CREATOR is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with CREATOR. If not, see . - * - */ - -/** @file io.h - * @brief Input Output Interface for Creator - * @author José Antonio Verde Jiménez - * @copyright Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez - * - * This file provides a common interface for routines for input and output. - * The implementation is written in assembly and might change depending on the - * device. But the interface is the same. - */ - -#ifndef __CREATOR_IO_HPP -#define __CREATOR_IO_HPP - -/** @defgroup Creator_Input Input routines for Creator - * @brief Input routines for Creator - * - * Functions get_character(), peek_character() and get_string(), use an - * internal buffer so editing is possible. A line feed or carriage return is - * needed to continue. - * - * @{ - */ - -/** Read a character from standard input immediately. Don't show the character - * on screen. This function doesn't work well along get_character(), - * peek_character() or get_string(), because they need to write to a buffer to - * work well. - * - * @return - * Returns a character between 0 and 255 on success. - * It returns -1 on error or when EOF is reached. - */ -int get_immediate (); - -/** Read a character from standard input. It echos the character. - * - * @return - * Returns a character between 0 and 255 on success. - * It returns -1 on error or when EOF is reached. - */ -int get_character (); - -/** Peek on the next character on the standard input, but don't read it. That - * way you can see the next character without "destroying it". - * - * @return - * Returns a character between 0 and 255 on success. - * It returns -1 on error or when EOF is reached. - */ -int peek_character (); - -/** Read from standard input into a string buffer. The last character is - * written to be '\0'. - * - * This function supposes that the length of the string is *at least*, - * length + 1 characters long. string[length] will be 0. - * - * Note that carriage returns, line feeds and carriage return + line feed are - * all treated like line feeds. - * - * @param[out] string - * A pointer to the begining of the string buffer. - * - * @param[in] length - * The amount of characters to be read from standard input. - */ -void get_string (char *string, int length); - -/** @} */ - -/** @defgroup Creator_Output Output routines for Creator - * @brief Output routines for Creator - * - * @{ - */ - - -/** Write a character immediately (flush and synchronise it) on standard output - * and display it on the screen. - * - * @param[in] c - * A character. - */ -void put_immediate (char c); - -/** Write a character zero-terminated string on standard output, flush and - * synchronise standard output and display it on the screen. - * - * @param[in] string - * The pointer to the begining of the string. - */ -void put_zstring (char *string); - -/** Write a string with a given length on standard output, flush and - * synchronise standard output and display it on the screen. - * - * @param[in] string - * The pointer to the begining of the string. - * - * @param[in] length - * The length of said string - */ -void put_string (char *string, int length); - -/** @} */ - -#endif//__CREATOR_IO_HPP diff --git a/gateway/esp32-rv/gateway.py b/gateway/esp32-rv/gateway.py index f09d5ee64..08673c8c2 100755 --- a/gateway/esp32-rv/gateway.py +++ b/gateway/esp32-rv/gateway.py @@ -2,7 +2,7 @@ # -# Copyright 2022-2024 Felix Garcia Carballeira, Diego Carmarmas Alonso, Alejandro Calderon Mateos +# Copyright 2022-2024 Felix Garcia Carballeira, Diego Carmarmas Alonso, Alejandro Calderon Mateos, Elisa Utrilla Arroyo # # This file is part of CREATOR. # @@ -21,10 +21,69 @@ # +import glob +import sys +import threading +from time import sleep, time from flask import Flask, request, jsonify, send_file, Response from flask_cors import CORS, cross_origin import subprocess, os, signal +import logging +# Configure logging +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') + +BUILD_PATH = '.' +process_holder = {} + +#### (*) Cleaning functions +def do_fullclean_request(request): + """ Full clean the build directory """ + try: + req_data = request.get_json() + target_device = req_data['target_port'] + req_data['status'] = '' + # flashing steps... + if error ==0: + do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'fullclean']) + if error == 0: + req_data['status'] += 'Full clean done.\n' + except Exception as e: + req_data['status'] += str(e) + '\n' + return jsonify(req_data) + +def do_eraseflash_request(request): + """ Erase flash the target device """ + try: + req_data = request.get_json() + target_device = req_data['target_port'] + req_data['status'] = '' + # flashing steps... + if error == 0: + error = do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'-p',target_device,'erase-flash']) + if error == 0: + req_data['status'] += 'Erase flash done. Please, unplug and plug the cable(s) again\n' + + except Exception as e: + req_data['status'] += str(e) + '\n' + + return jsonify(req_data) + +def do_stop_monitor_request(request): + """Shortcut for stopping Monitor / debug """ + try: + req_data = request.get_json() + req_data['status'] = '' + print("Killing Monitor") + error = kill_all_processes("idf.py") + if error == 0: + req_data['status'] += 'Process stopped\n' + + + except Exception as e: + req_data['status'] += str(e) + '\n' + + return jsonify(req_data) # (1) Get form values def do_get_form(request): @@ -67,60 +126,6 @@ def creator_build(file_in, file_out): fout.write("####################\n") continue - if (data[0] == 'ecall'): - fout.write("#### ecall ####\n") - fout.write("addi sp, sp, -128\n") - fout.write("sw x1, 120(sp)\n") - fout.write("sw x3, 112(sp)\n") - fout.write("sw x4, 108(sp)\n") - fout.write("sw x5, 104(sp)\n") - fout.write("sw x6, 100(sp)\n") - fout.write("sw x7, 96(sp)\n") - fout.write("sw x8, 92(sp)\n") - fout.write("sw x9, 88(sp)\n") - fout.write("sw x18, 52(sp)\n") - fout.write("sw x19, 48(sp)\n") - fout.write("sw x20, 44(sp)\n") - fout.write("sw x21, 40(sp)\n") - fout.write("sw x22, 36(sp)\n") - fout.write("sw x23, 32(sp)\n") - fout.write("sw x24, 28(sp)\n") - fout.write("sw x25, 24(sp)\n") - fout.write("sw x26, 20(sp)\n") - fout.write("sw x27, 16(sp)\n") - fout.write("sw x28, 12(sp)\n") - fout.write("sw x29, 8(sp)\n") - fout.write("sw x30, 4(sp)\n") - fout.write("sw x31, 0(sp)\n") - - fout.write("jal _myecall\n") - - fout.write("lw x1, 120(sp)\n") - fout.write("lw x3, 112(sp)\n") - fout.write("lw x4, 108(sp)\n") - fout.write("lw x5, 104(sp)\n") - fout.write("lw x6, 100(sp)\n") - fout.write("lw x7, 96(sp)\n") - fout.write("lw x8, 92(sp)\n") - fout.write("lw x9, 88(sp)\n") - fout.write("lw x18, 52(sp)\n") - fout.write("lw x19, 48(sp)\n") - fout.write("lw x20, 44(sp)\n") - fout.write("lw x21, 40(sp)\n") - fout.write("lw x22, 36(sp)\n") - fout.write("lw x23, 32(sp)\n") - fout.write("lw x24, 28(sp)\n") - fout.write("lw x25, 24(sp)\n") - fout.write("lw x26, 20(sp)\n") - fout.write("lw x27, 16(sp)\n") - fout.write("lw x28, 12(sp)\n") - fout.write("lw x29, 8(sp)\n") - fout.write("lw x30, 4(sp)\n") - fout.write("lw x31, 0(sp)\n") - fout.write("addi sp, sp, 128\n") - fout.write("###############\n") - continue - fout.write(line) # close input + output files @@ -174,14 +179,60 @@ def do_flash_request(request): ret = text_file.write(asm_code) text_file.close() + # Kill debug processes + if 'openocd' in process_holder: + logging.debug('Killing OpenOCD') + kill_all_processes("openocd") + process_holder.pop('openocd', None) + + if 'gdbgui' in process_holder: + logging.debug('Killing GDBGUI') + kill_all_processes("gdbgui") + process_holder.pop('gdbgui', None) + # transform th temporal assembly file error = creator_build('tmp_assembly.s', "main/program.s"); if error != 0: req_data['status'] += 'Error adapting assembly file...\n' # flashing steps... + if error == 0 : + error = check_uart_connection() + if error != 0: + req_data['status'] += 'No UART port found.\n' + logging.error("No UART port found.") + raise Exception("No UART port found") if error == 0: error = do_cmd(req_data, ['idf.py', 'fullclean']) + # Disable memory protection + sdkconfig_path = os.path.join(BUILD_PATH, "sdkconfig") + # 1. Check out previous sdkconfig + # (*) This configuration is EXCUSIVELY FOR ESP-IDF WITHOUT ARDUINO + defaults_path = os.path.join(BUILD_PATH, "sdkconfig.defaults") + if target_board == 'esp32c3': + with open(defaults_path, "w") as f: + f.write( + "# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE is not set\n" + "# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK is not set\n" + ) + #TODO: Add other boards here... + + # 2. If previous sdkconfig exists, check if mem protection is disabled (for debug purposes) + if os.path.exists(sdkconfig_path): + if target_board == 'esp32c3': + # Memory Protection + do_cmd(req_data, [ + 'sed', '-i', + r'/^CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=/c\# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE is not set', + sdkconfig_path + ]) + # Memory protection lock + do_cmd(req_data, [ + 'sed', '-i', + r'/^CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=/c\# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK is not set', + sdkconfig_path + ]) + #TODO: Add other boards here... if error == 0: error = do_cmd(req_data, ['idf.py', 'set-target', target_board]) if error == 0: @@ -202,6 +253,18 @@ def do_monitor_request(request): target_device = req_data['target_port'] req_data['status'] = '' + # Kill debug process + + if 'openocd' in process_holder: + logging.debug('Killing OpenOCD') + kill_all_processes("openocd") + process_holder.pop('openocd', None) + + if 'gdbgui' in process_holder: + logging.debug('Killing GDBGUI') + kill_all_processes("gdbgui") + process_holder.pop('gdbgui', None) + do_cmd(req_data, ['idf.py', '-p', target_device, 'monitor']) except Exception as e: @@ -261,6 +324,244 @@ def do_stop_flash_request(request): return jsonify(req_data) +# (6) Debug + +# (6.1) Physical connections check +def check_uart_connection(): + """ Checks UART devices """ + devices = glob.glob('/dev/ttyUSB*') + logging.debug(f"Found devices: {devices}") + if "/dev/ttyUSB0" in devices: + logging.info("Found UART.") + return 0 + elif devices: + logging.error("Other UART devices found (Is the name OK?).") + return 0 + else: + logging.error("NO UART port found.") + return 1 + +def check_jtag_connection(): + """ Checks JTAG devices """ + command = ["lsusb"] + try: + lsof = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, errs = lsof.communicate(timeout=5) + if output: + output_text = output.decode(errors="ignore") + if "JTAG" in output_text: + logging.info("JTAG found") + return True + else: + logging.warning("JTAG missing") + return False + except subprocess.TimeoutExpired: + lsof.kill() + output, errs = lsof.communicate() + except Exception as e: + logging.error(f"Error checking JTAG: {e}") + return None + return False +# --- (6.2) Debug processes monitoring functions --- + +def check_gdb_connection(): + """ Checks gdb status """ + command = ["lsof", "-i", ":3333"] + try: + lsof = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output, errs = lsof.communicate(timeout=5) + logging.debug("GDB connection output: %s", output.decode()) + return output.decode() + except subprocess.TimeoutExpired: + lsof.kill() + output, errs = lsof.communicate() + logging.error(" GDB:Timeout waiting for GDB connection.") + except Exception as e: + logging.error(f"Error checking GDB: {e}") + return None + return False + +def monitor_openocd_output(req_data, cmd_args, name): + logfile_path = os.path.join(BUILD_PATH, f"{name}.log") + try: + with open(logfile_path, "a", encoding="utf-8") as logfile: + process_holder[name] = subprocess.Popen( + cmd_args, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, + universal_newlines=True + ) + proc = process_holder[name] + + # Logfile + for line in proc.stdout: + line = line.rstrip() + logfile.write(line + "\n") + logfile.flush() + logging.debug(f"[{name}] {line}") + + proc.stdout.close() + retcode = proc.wait() + logging.debug(f"Process {name} finished with code {retcode}") + return proc + + except Exception as e: + logging.error(f"Error executing command {name}: {e}") + process_holder.pop(name, None) + return None + +def kill_all_processes(process_name): + try: + if not process_name: + logging.error("El nombre del proceso no puede estar vacío.") + return 1 + + # Comando para obtener los PIDs de los procesos + get_pids_cmd = f"ps aux | grep '[{process_name[0]}]{process_name[1:]}' | awk '{{print $2}}'" + result = subprocess.run(get_pids_cmd, shell=True, capture_output=True, text=True) + + # PIDs list + pids = result.stdout.strip().split() + + if not pids: + logging.warning(f"Not processes found '{process_name}'.") + return 1 # Devuelve 1 para indicar que no se hizo nada + + # Ejecuta kill solo si hay PIDs + kill_cmd = f"kill -9 {' '.join(pids)}" + result = subprocess.run(kill_cmd, shell=True, capture_output=True, timeout=120, check=False) + + if result.returncode != 0: + logging.error(f"Error al intentar matar los procesos {process_name}. Salida: {result.stderr.strip()}") + else: + logging.info(f"Todos los procesos '{process_name}' han sido eliminados.") + + return result.returncode + + except subprocess.TimeoutExpired as e: + logging.error(f"El proceso excedió el tiempo de espera: {e}") + return 1 + + except subprocess.CalledProcessError as e: + logging.error(f"Error al ejecutar el comando: {e}") + return 1 + + except Exception as e: + logging.error(f"Ocurrió un error inesperado: {e}") + return 1 + + +# (6.3) OpenOCD Function +def start_openocd_thread(req_data): + try: + thread = threading.Thread( + target=monitor_openocd_output, + args=(req_data, ['openocd', '-f', './openscript.cfg'], 'openocd'), + daemon=True + ) + thread.start() + logging.debug("Starting OpenOCD thread...") + return thread + except Exception as e: + req_data['status'] += f"Error starting OpenOCD: {str(e)}\n" + logging.error(f"Error starting OpenOCD: {str(e)}") + return None +# (6.4) GDBGUI function +def start_gdbgui(req_data): + route = os.path.join(BUILD_PATH, 'gdbinit') + logging.debug(f"GDB route: {route}") + route = os.path.join(BUILD_PATH, 'gdbinit') + if os.path.exists(route) and os.path.exists("./gbdscript.gdb"): + logging.debug(f"GDB route: {route} exists.") + else: + logging.error(f"GDB route: {route} does not exist.") + req_data['status'] += f"GDB route: {route} does not exist.\n" + return jsonify(req_data) + req_data['status'] = '' + if check_uart_connection: + logging.info("Starting GDBGUI...") + gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '-x', route, 'monitor'] + sleep(5) + try: + process_holder['gdbgui'] = subprocess.run( + gdbgui_cmd, + stdout=sys.stdout, + stderr=sys.stderr, + text=True + ) + if process_holder['gdbgui'].returncode != -9 and process_holder['gdbgui'].returncode != 0: + logging.error(f"Command failed with return code {process_holder['gdbgui'].returncode}") + + except subprocess.CalledProcessError as e: + logging.error("Failed to start GDBGUI: %s", e) + req_data['status'] += f"Error starting GDBGUI (code {e.returncode}): {e.stderr}\n" + return None + except Exception as e: + logging.error("Unexpected error in GDBGUI: %s", e) + req_data['status'] += f"Unexpected error starting GDBGUI: {e}\n" + return None + + req_data['status'] += f"Finished debug session: {e}\n" + else: + req_data['status'] += f"UART not connected: {e}\n" + return jsonify(req_data) + + + +def do_debug_request(request): + global stop_event + global process_holder + error = 0 + try: + req_data = request.get_json() + target_device = req_data['target_port'] + req_data['status'] = '' + + # Check .elf files in BUILD_PATH + route = BUILD_PATH +'/build' + logging.debug(f"Checking for ELF files in {route}") + elf_files = [f for f in os.listdir(route) if f.endswith(".elf")] + if not elf_files: + req_data['status'] += "No ELF file found in build directory.\n" + logging.error("No ELF file found in build directory.") + return jsonify(req_data) + logging.debug("Delete previous work") + # Clean previous debug system + if error == 0: + if 'openocd' in process_holder: + logging.debug('Killing OpenOCD') + kill_all_processes("openocd") + process_holder.pop('openocd', None) + + # Check if JTAG is connected + if not check_jtag_connection(): + req_data['status'] += "No JTAG found\n" + return jsonify(req_data) + + # Start OpenOCD + logging.info("Starting OpenOCD...") + openocd_thread = start_openocd_thread(req_data) + while process_holder.get('openocd') is None: + sleep(1) + #start_openocd_thread(req_data) + + # Start gdbgui + #logging.info("Starting gdbgui") + error = start_gdbgui(req_data) + if error != 0: + req_data['status'] += "Error starting gdbgui\n" + return jsonify(req_data) + else: + req_data['status'] += "Build error\n" + + except Exception as e: + req_data['status'] += f"Unexpected error: {str(e)}\n" + logging.error(f"Exception in do_debug_request: {e}") + + return jsonify(req_data) + # Setup flask and cors: app = Flask(__name__) @@ -302,6 +603,30 @@ def post_job(): def post_stop_flash(): return do_stop_flash_request(request) +# (6) POST /fullclean -> clean build directory +@app.route("/fullclean", methods=["POST"]) +@cross_origin() +def post_fullclean_flash(): + return do_fullclean_request(request) + +# (7) POST /eraseflash -> clean board flash +@app.route("/eraseflash", methods=["POST"]) +@cross_origin() +def post_erase_flash(): + return do_eraseflash_request(request) + +# (8) POST /debug -> debug +@app.route("/debug", methods=["POST"]) +@cross_origin() +def post_debug(): + return do_debug_request(request) + +# (9) Stop monitor +@app.route("/stopmonitor", methods=["POST"]) +@cross_origin() +def post_stop_monitor(): + return do_stop_monitor_request(request) + # Run app.run(host='0.0.0.0', port=8080, use_reloader=False, debug=True) \ No newline at end of file diff --git a/gateway/esp32-rv/gbdscript.gdb b/gateway/esp32-rv/gbdscript.gdb new file mode 100644 index 000000000..263322e31 --- /dev/null +++ b/gateway/esp32-rv/gbdscript.gdb @@ -0,0 +1,16 @@ +delete breakpoints +target extended-remote :3333 +set remotetimeout 10 +monitor reset halt +maintenance flush register-cache +b main +continue + +define hook-stop + set $inst = *(unsigned int *)$pc + if $inst == 0x00000073 + set $next = $pc + 4 + tbreak *$next + continue + end +end diff --git a/gateway/esp32-rv/gdbinit b/gateway/esp32-rv/gdbinit new file mode 100644 index 000000000..77a153b98 --- /dev/null +++ b/gateway/esp32-rv/gdbinit @@ -0,0 +1,2 @@ +source ./build/gdbinit/symbols +source ./gbdscript.gdb diff --git a/gateway/esp32-rv/main/CMakeLists.txt b/gateway/esp32-rv/main/CMakeLists.txt index 37526735f..defd3a360 100644 --- a/gateway/esp32-rv/main/CMakeLists.txt +++ b/gateway/esp32-rv/main/CMakeLists.txt @@ -1,9 +1,9 @@ idf_component_register( SRCS + "syscall/test_panic.c" + "syscall/return_from_panic.S" "program.s" "creator-esp.c" - "ecall.s" - "io.s" "creator.s" INCLUDE_DIRS "..") diff --git a/gateway/esp32-rv/main/creator.s b/gateway/esp32-rv/main/creator.s index 43069045d..4af8fd554 100644 --- a/gateway/esp32-rv/main/creator.s +++ b/gateway/esp32-rv/main/creator.s @@ -1,5 +1,5 @@ # -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez +# Copyright 2018-2024 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez # # This file is part of CREATOR. # diff --git a/gateway/esp32-rv/main/ecall.s b/gateway/esp32-rv/main/ecall.s deleted file mode 100644 index 98eba8907..000000000 --- a/gateway/esp32-rv/main/ecall.s +++ /dev/null @@ -1,345 +0,0 @@ -# -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez -# -# This file is part of CREATOR. -# -# CREATOR is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# CREATOR is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with CREATOR. If not, see . -# - -# ecall Module -# ============ -# This module implements the _myecall function, which will be used in a future -# to implement the ecall instruction. For the time being, every instance of -# ecall is replaced with a call to _myecall (pushing all the registers first, -# so they can be restored after the call). -# -# AUTHOR: José Antonio Verde Jiménez - -# ==== .rodata ============================================================== # -.section .rodata - -.align 2 - -vector: - .word unknown # a7 = 0 - .word print_int # a7 = 1 - .word print_float # a7 = 2 - .word print_double # a7 = 3 - .word print_string # a7 = 4 - .word read_int # a7 = 5 - .word read_float # a7 = 6 - .word read_double # a7 = 7 - .word read_string # a7 = 8 - .word sbrk # a7 = 9 - .word exit # a7 = 10 - .word print_char # a7 = 11 - .word read_char # a7 = 12 - -vector_size: - .word (vector_size - vector) / 4 - -unknown_msg: - .asciz "\033[31;1m¡Unknown system call!\033[0m\n" - -not_implemented_msg: - .asciz "\033[31;1mNot implemented\033[0m\n" - -sbrk_error_msg: - .asciz "\033[31;1mSBRK: Memory exhausted\033[0m\n" - -integers: - .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - .byte 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1 - .byte -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1 - .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - .byte -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1 - .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 - -images: .byte '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' - -# ==== .data ================================================================ # -.section .data - -.set POOL_CAPACITY, 65536 - -.align 2 -pool_capacity: .word POOL_CAPACITY -pool_size: .word 0 - -pool: .space POOL_CAPACITY - -# A small buffer for strings -buffer: .space 256 -buffer_end: - -# ==== .text ================================================================ # -.section .text - -.type _ecall, @function -.globl _myecall - -_not_implemented: - addi sp, sp, -4 - sw ra, 0(sp) - la a0, not_implemented_msg - li a7, 4 - jal ra, _myecall - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -unknown: - addi sp, sp, -4 - sw ra, 0(sp) - li a7, 4 - la a0, unknown_msg - jal ra, _myecall - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: void print_int (int number, int base = 10) -# PARAMETERS: int a0 : The number base, it is ignored, 10 is always used. -# RETURNS: NONE -# DESCRIPTION: Print an integer into the string using the given base. - -print_int: - addi sp, sp, -4 - sw ra, 0(sp) - - # a0 : number - # a1 : base - li a1, 10 - la a2, buffer_end - la a3, images - - sgtz t0, a0 # t0 := a0 > 0 ? 1 : 0 - seqz t1, a0 # t1 := a0 == 0 ? 1 : 0 - or t0, t0, t1 # t0 := t0 or t1 - slli t0, t0, 1 # t0 := 2 * t0 - addi t4, t0, -1 # t4 := t0 - 1 - # Now, t4 is -1 if negative and 1 if positive or zero - sltz a4, a0 # a4 := a0 < 0 ? 1 : 0 - - # End the string with a zero - sb zero, -1(a2) - addi a2, a2, -2 - - print_int_loop: - rem t0, a0, a1 # value := number rem base - mul t0, t0, t4 # Negative number case - div a0, a0, a1 # number := number / base - add t0, a3, t0 # images + value - lb t0, 0(t0) # *(images + value) - sb t0, 0(a2) # *buffer = *(images + value) - addi a2, a2, -1 - bne a0, zero, print_int_loop - - beq a4, zero, print_int_positive - print_int_negative: - li t0, '-' - sb t0, 0(a2) - addi a2, a2, -1 - - print_int_positive: - addi a0, a2, 1 - - jal ra, put_zstring - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -print_float: - j _not_implemented # TODO -print_double: - j _not_implemented # TODO - -print_string: - j put_zstring - -# FUNCTION: (int, bool) read_int (int base = 10) -# PARAMETERS: int a0 : The number base, it is ignored, 10 is always used. -# RETURNS: int a0 : The result of reading the integer -# bool a1 : true if it succeeded, false if it failed -# DESCRIPTION: Read an integer from standard input and return it. It stops -# reading if it finds a non integer value. -read_int: - addi sp, sp, -20 - sw ra, 0(sp) - sw s0, 4(sp) # For the result - sw s1, 8(sp) # For the base - sw s2, 12(sp) # For the sign - sw s3, 16(sp) # Characters read - - jal ra, skip_separators - - mv s0, zero # Result = 0 - li a0, 10 # s0 will contain the base, in a future this parameter will - mv s1, a0 # be accepted. - li s2, 1 # Positive - mv s3, zero - - li t0, 2 - li t1, 16 - blt s1, t0, read_int_bad_base # a1 < 2 (Invalid base) - bgt s1, t1, read_int_bad_base # a1 > 16 (Invalid base) - - jal ra, peek_character - li t0, '+' - li t1, '-' - beq a0, t0, read_int_positive - beq a0, t1, read_int_negative - j read_int_parse - read_int_negative: - li s2, -1 - read_int_positive: - jal ra, get_character # Feed a character and ignore it. - read_int_parse: - jal ra, peek_character - blt a0, zero, read_int_stop # exit when char < 0 - la t0, integers - add t0, t0, a0 - lb t0, 0(t0) # t0 = integers[char] - blt t0, zero, read_int_stop # exit when t0 < -1 - bge t0, s1, read_int_stop # exit when not in base - addi s3, s3, 1 - mul s0, s0, s1 - add s0, s0, t0 # result = result * base + integers[char] - jal ra, get_character # read it - j read_int_parse - - read_int_stop: - beq s3, zero, read_int_failed # No characters read. - mul a0, s0, s2 - li a1, 1 # return (result * sign, true) - j read_int_end - - read_int_failed: - read_int_bad_base: - mv a0, zero - mv a1, zero - j read_int_end - - read_int_end: - lw ra, 0(sp) - lw s0, 4(sp) - lw s1, 8(sp) - lw s2, 12(sp) - lw s3, 16(sp) - addi sp, sp, 20 - jr ra - -read_float: - j _not_implemented # TODO -read_double: - j _not_implemented # TODO -read_string: - j get_string - -# TODO: Implement a good memory pool -sbrk: - addi sp, sp, -4 - sw ra, 0(sp) - - la t0, pool_capacity - la t1, pool_size - la t2, pool - - lw t3, 0(t0) # capacity - lw t4, 0(t1) # size - add t5, t4, a0 # t5 = size + a0 - bgt t5, t3, sbrk_overflow - - sbrk_valid: - sw t5, 0(t1) # size = size'old + a0 - add a0, t2, t4 # return pool + size'old - j sbrk_end - - sbrk_overflow: - la a0, sbrk_error_msg - la a7, 4 - jal ra, _myecall - - sbrk_end: - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -exit: - j _exit - -print_char: - j put_immediate - -read_char: - j get_character - -_myecall: - addi sp, sp, -4 - sw ra, 0(sp) - - # Check it is in range - la t0, vector_size - lw t0, 0(t0) - blt a7, zero, _myecall_unknown - bgt a7, t0, _myecall_unknown - - # # Call it - la t0, vector - slli a7, a7, 2 - add t0, t0, a7 - lw t0, 0(t0) - jalr ra, t0 # goto vector[a7 * 4] - j _myecall_end - - _myecall_unknown: - la a0, unknown_msg - li a7, 4 - jal ra, _myecall # print_string - - _myecall_end: - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: skip_separators -# PARAMETERS: NONE -# RETURNS: NONE -# DESCRIPTION: This function skips separators (spaces, tabulations...), until -# it finds something different. - .type skip_separators, @function -skip_separators: - addi sp, sp, -4 - sw ra, 0(sp) - skip_separators_loop: - jal ra, peek_character - li t0, '\n' # Line feed - li t1, '\r' # Carriage return - li t2, ' ' # Space - li t3, '\t' # Tabulator - beq a0, t0, skip_separators_skip_it - beq a0, t1, skip_separators_skip_it - beq a0, t2, skip_separators_skip_it - beq a0, t3, skip_separators_skip_it - j skip_separators_end - skip_separators_skip_it: - jal ra, get_character - j skip_separators_loop - skip_separators_end: - lw ra, 0(sp) - addi sp, sp, 4 - jr ra diff --git a/gateway/esp32-rv/main/io.s b/gateway/esp32-rv/main/io.s deleted file mode 100644 index ce6c46e85..000000000 --- a/gateway/esp32-rv/main/io.s +++ /dev/null @@ -1,571 +0,0 @@ -# -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez -# -# This file is part of CREATOR. -# -# CREATOR is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# CREATOR is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with CREATOR. If not, see . -# - -# I/O Module -# ========== -# The following constraints hold for the device's standard I/O: -# -# * Reading a character doesn't echo. -# * Once a character is written you cannot delete it (backspace) or move -# back (arrow keys). -# * Writing doesn't echo until a line feed is issued. -# -# Therefore this module attempts to solve this by creating a very simple -# editable line where input can be modified using arrow keys, and characters -# can be removed with backspace. -# -# This file implements the following global functions: -# -# int get_immediate () -# int get_character () -# int peek_character () -# void get_string (char *string, int length); -# -# void put_immediate (char c) -# void put_zstring (char *c); -# void put_string (char *c, int length); -# -# TODO: Add latin-1 for accents -# -# AUTHOR: José Antonio Verde Jiménez - -# ==== .rodata ============================================================== # -.section .rodata - -go_right_str: .asciz "\033[1C" -go_left_str: .asciz "\033[1D" - -# ==== .data ================================================================ # - -.section .data - -# char line[] -# A very long string buffer (UTF-8) where the input characters are stored and -# modified. Writing is done to this string until a newline character is found -# (\n, \r or \r\n), then I/O operations can continue. -.set LINE_SIZE, 80 -.align 2 -line: .space LINE_SIZE -.align 2 - -# int begin -# Begin cursor, points to the beginning of the line, it increases while the -# line is being read. -begin: .word 0 - -# int end -# End cursor, points to the end of the line. -end: .word 0 - -# int next -# The next character to be read if any. -# If the number is -1, then we reached EOF. -# Otherwise, it stores the next 8 bit character in buffer. -next: .word 0 - -# bool full -# True if there is a buffered character. -full: .word 0 - -# ==== .rodata ============================================================== # - -.section .rodata - -.align 2 -line_capacity: .word LINE_SIZE - -# ==== .text ================================================================ # - -.section .text - -# FUNCTION: int get_immediate () -# PARAMETERS: NONE -# RETURNS: int a0 : -1 on EOF, otherwise the character read -# DESCRIPTION: Read the next character without echoing it. - .type get_immediate, @function - .globl get_immediate -get_immediate: - addi sp, sp, -8 - sw ra, 0(sp) - sw s0, 4(sp) - - la t0, next - la t1, full - lw t2, 0(t1) - beq t2, zero, get_immediate_read_new # If not full read it. - - get_immediate_buffered: - sw zero, 0(t1) # full = 0 - lw a0, 0(t0) # return next - li t0, -1 - j get_immediate_end - - get_immediate_read_new: - mv a0, zero - la a1, next - li a2, 1 - jal ra, read # read(0, &next, 1) - beq zero, a0, get_immediate_eof - # TODO: Check if UTF-8 valid string - la t0, next # t0 = &next - lb a0, 0(t0) # a0 = next - j get_immediate_end - - get_immediate_eof: - li a0, -1 # Return -1 - - get_immediate_end: - lw ra, 0(sp) - lw s0, 4(sp) - addi sp, sp, 8 - jr ra - -# FUNCTION: void put_immediate (char c) -# PARAMETERS: a0 : char c -# RETURNS: NONE -# DESCRIPTION: Put a character immediately on the screen. - .type put_immediate, @function - .globl put_immediate -put_immediate: - addi sp, sp, -4 - sw ra, 0(sp) - - jal ra, put - jal ra, synchronise - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: void put_zstring (char *str) -# PARAMETERS: a0 : char *str -# RETURNS: NONE -# DESCRIPTION: Put a zero-terminated string on the screen. - .type put_zstring, @function - .globl put_zstring -put_zstring: - addi sp, sp, -8 - sw ra, 0(sp) - sw s0, 4(sp) - - mv s0, a0 - put_zstring_loop: - lb a0, 0(s0) - beq a0, zero, put_zstring_end - jal ra, put - addi s0, s0, 1 - j put_zstring_loop - - put_zstring_end: - mv a0, zero - jal ra, synchronise - - lw ra, 0(sp) - lw s0, 4(sp) - addi sp, sp, 8 - jr ra - -# FUNCTION: void put_string (char *str, int length) -# PARAMETERS: a0 : char *str -# a1 : int length -# RETURNS: NONE -# DESCRIPTION: Put a `length' bytes long string on the screen. - .type put_string, @function - .globl put_string -put_string: - addi sp, sp, -12 - sw ra, 0(sp) - sw s0, 4(sp) - sw s1, 8(sp) - - mv s0, a0 - mv s1, a1 - put_string_loop: - beq s1, zero, put_string_end - lb a0, 0(s0) - jal ra, put - addi s0, s0, 1 - addi s1, s1, -1 - j put_string_loop - - put_string_end: - jal ra, synchronise - - lw ra, 0(sp) - lw s0, 4(sp) - lw s1, 8(sp) - addi sp, sp, 12 - jr ra - -# FUNCTION: void get_string (char *str, int length) -# PARAMETERS: a0 : char *str -# a1 : int length -# RETURNS: NONE -# DESCRIPTION: Read a `length' bytes long string. - .type get_string, @function - .globl get_string -get_string: - addi sp, sp, -12 - sw ra, 0(sp) - sw s0, 4(sp) - sw s1, 8(sp) - - mv s0, a0 # s0 = str - mv s1, a1 # s1 = length - get_string_loop: - beq s1, zero, get_string_end # exit when length = 0 - jal ra, get_character # a0 = get_character() - li t0, -1 - beq t0, a0, get_string_end # exit when EOF - sw a0, 0(s0) # *s0 = a0 - addi s1, s1, -1 - addi s0, s0, 1 - j get_string_loop - - get_string_end: - lw ra, 0(sp) - lw s0, 4(sp) - lw s1, 8(sp) - addi sp, sp, 12 - jr ra - -# FUNCTION: int get_character () -# PARAMETERS: NONE -# RETURNS: a0 : int -# DESCRIPTION: Read one character from standard input - .type get_character, @function - .globl get_character -get_character: - addi sp, sp, -4 - sw ra, 0(sp) - - jal ra, refill - la t0, begin - la t1, line - lw t2, 0(t0) - add t3, t2, t1 # t2 = line + begin - lb a0, 0(t3) # return *(line + begin) - addi t2, t2, 1 - sw t2, 0(t0) # begin++ - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: int peek_character () -# PARAMETERS: NONE -# RETURNS: a0 : int -# DESCRIPTION: Peek which will be the next character from standard input. - .type peek_character, @function - .globl peek_character -peek_character: - addi sp, sp, -4 - sw ra, 0(sp) - - jal ra, refill - la t0, begin - la t1, line - lw t0, 0(t0) - add t2, t1, t0 - lb a0, 0(t2) - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# ==== Utility ==== # - -# FUNCTION: int peek () -# PARAMETERS: NONE -# RETURNS: a0 : int ch -# DESCRIPTION: It checks the next character (if any) and returns it. The next -# time it is read or peeked, it returns the same character until -# it is read. - .type peek, @function -peek: - addi sp, sp, -4 - sw ra, 0(sp) - - la t1, full - lw a1, 0(t1) - bne a1, zero, peek_full # If full, goto peek_full - - peek_empty: - jal ra, get_immediate - la t1, full - li a1, 1 - sw a1, 0(t1) # Fill it - - peek_full: - la t0, next - lw a0, 0(t0) - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: void read_line () -# PARAMETERS: NONE -# RETURNS: NONE -# DESCRIPTION: Reads full line. - .type read_line, @function -read_line: - addi sp, sp, -24 - sw ra, 0(sp) - sw s0, 4(sp) - sw s1, 8(sp) - sw s2, 12(sp) - sw s3, 16(sp) - sw s4, 20(sp) - - la s0, line # s0 (line) - mv s1, zero # s1 (end) - mv s2, zero # s2 (cursor) - - read_line_loop: - jal ra, get_immediate - - li t0, -1 # EOF - li t1, '\n' # LF - li t2, '\r' # CR - li t3, 27 # ESC - li t4, '\b' # Backspace - - beq a0, t0, read_line_end # EOF - beq a0, t1, read_line_LF # Line Feed - beq a0, t2, read_line_CR # Carriage Return - beq a0, t3, read_line_on_ESC # Escape Sequence - beq a0, t4, read_line_on_DEL # Backspace - - read_line_normal: - # Check line capacity - la t0, line_capacity - lw t0, 0(t0) - addi t0, t0, -1 - bge s1, t0, read_line_loop # Line too long - - # Shift right the line - mv t0, s1 # t0 = end - add t1, s0, s1 # char *t1 = &line[end] - read_line_shift_right: - blt t0, s2, read_line_end_shift_right # exit when t0 = Cursor - lb t2, 0(t1) - sb t2, 1(t1) - addi t1, t1, -1 - addi t0, t0, -1 - j read_line_shift_right - read_line_end_shift_right: - - # Insert character - add t0, s0, s2 # t0 = &line[cursor] - sb a0, 0(t0) # line[cursor] = a0 - addi s1, s1, 1 # end++ - addi s2, s2, 1 # cursor++ - - # Redraw - add a0, s0, s2 - addi a0, a0, -1 # str = line + cursor - 1 - sub a1, s1, s2 - addi a1, a1, 1 # length = end - cursor + 1 - jal ra, put_string # put_string(t0, end - cursor + 1) - - # Move cursor back - mv s3, s2 # s3 = cursor - read_line_cursor_back: - beq s3, s1, read_line_end_cursor_back - la a0, go_left_str - jal ra, put_zstring - addi s3, s3, 1 # s3++ - j read_line_cursor_back - read_line_end_cursor_back: - - j read_line_loop - - read_line_LF: - add t0, s0, s1 - sb a0, 0(t0) # line[end] = '\n' - addi s1, s1, 1 - jal ra, put_immediate - j read_line_end - - read_line_CR: - jal ra, peek - li t0, '\n' - beq t0, a0, read_line_CR_win - read_line_CR_mac: - mv a0, t0 - j read_line_LF - - read_line_CR_win: - jal ra, get_immediate # Read it to skip it - j read_line_LF - - read_line_on_ESC: - jal ra, peek - li t0, '[' - bne a0, t0, read_line_loop # Bad sequence - jal ra, get_immediate - - jal ra, peek - li t0, 'A' - li t1, 'B' - li t2, 'C' - li t3, 'D' - - beq a0, t0, read_line_on_ESC_UP_DOWN - beq a0, t1, read_line_on_ESC_UP_DOWN - beq a0, t2, read_line_on_ESC_RIGHT - beq a0, t3, read_line_on_ESC_LEFT - j read_line_loop - - read_line_on_ESC_UP_DOWN: - jal ra, get_immediate # Buffer it and ignore it. - j read_line_loop - - read_line_on_ESC_LEFT: - jal ra, get_immediate - beq s2, zero, read_line_loop # Can't go to left. - addi s2, s2, -1 - la a0, go_left_str - jal ra, put_zstring - j read_line_loop - - read_line_on_ESC_RIGHT: - jal ra, get_immediate - bge s2, s1, read_line_loop # Can't go right. - addi s2, s2, 1 - la a0, go_right_str - jal ra, put_zstring - j read_line_loop - - read_line_on_DEL: - beq s2, zero, read_line_loop # Cursor at the beginning - beq s1, zero, read_line_loop # End at the beginning - - # Shift the string left - jal ra, put # Go back, not immediate. - addi s1, s1, -1 # end-- - addi s2, s2, -1 # cursor-- - mv s3, s2 # s3 = cursor - add s4, s0, s2 # s4 = line + cursor - read_line_shift_left: - beq s3, s1, read_line_end_shift_left - lb a0, 1(s4) - sb a0, 0(s4) # *s4 = *(s4 + 1) - jal ra, put # put(a0), Not buffered - addi s3, s3, 1 # s3++ - addi s4, s4, 1 # s4++ - j read_line_shift_left - read_line_end_shift_left: - li a0, ' ' - jal ra, put - li a0, '\b' - jal ra, put_immediate - - # Return cursor to last position - mv s3, s2 # s3 = cursor - read_line_DEL_cursor_back: - beq s3, s1, read_line_DEL_end_cursor_back - la a0, go_left_str - jal ra, put_zstring - addi s3, s3, 1 # s3++ - j read_line_cursor_back - read_line_DEL_end_cursor_back: - j read_line_loop - - read_line_end: - - la t0, begin - la t1, end - sw zero, 0(t0) # begin = 0 - sw s1, 0(t1) # end = end - - lw ra, 0(sp) - lw s0, 4(sp) - lw s1, 8(sp) - lw s2, 12(sp) - lw s3, 16(sp) - lw s4, 20(sp) - addi sp, sp, 24 - jr ra - -# FUNCTION: void put (char c) -# PARAMETERS: a0 : char c -# RETURNS: NONE -# DESCRIPTION: Put a character on the screen without synchronising. If the -# character is a line feed (\n) it transforms it to (\r\n). - .type put, @function -put: - addi sp, sp, -4 - sw ra, 0(sp) - - li t0, '\n' - bne t0, a0, put_skip - - put_CR: - li a0, '\r' - jal ra, putchar - li a0, '\n' - - put_skip: - jal ra, putchar - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: void synchronise () -# PARAMETERS: NONE -# RETURNS: NONE -# DESCRIPTION: Flush and synchronise output - .type synchronise, @function -synchronise: - addi sp, sp, -4 - sw ra, 0(sp) - - li a0, 1 # a0 = STDOUT - jal ra, fsync - - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# FUNCTION: void refill () -# PARAMETERS: NONE -# RETURNS: NONE -# DESCRIPTION: Refill the line buffer if it is empty. - .type refill, @function -refill: - addi sp, sp, -4 - sw ra, 0(sp) - - la t0, begin - la t1, end - lw t2, 0(t0) - lw t3, 0(t1) - sub t5, t3, t2 # t5 = end - begin - blt zero, t5, refill_end # return when end - begin > 0 - jal ra, read_line # Otherwise re-read the line - - refill_end: - lw ra, 0(sp) - addi sp, sp, 4 - jr ra - -# ======== END OF FILE ====================================================== # diff --git a/gateway/esp32-rv/main/rdcycle.s b/gateway/esp32-rv/main/rdcycle.s index d4b39658d..0acef85cd 100644 --- a/gateway/esp32-rv/main/rdcycle.s +++ b/gateway/esp32-rv/main/rdcycle.s @@ -1,5 +1,5 @@ # -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez +# Copyright 2018-2024 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez # # This file is part of CREATOR. # diff --git a/gateway/esp32-rv/main/syscall/return_from_panic.S b/gateway/esp32-rv/main/syscall/return_from_panic.S new file mode 100644 index 000000000..388407304 --- /dev/null +++ b/gateway/esp32-rv/main/syscall/return_from_panic.S @@ -0,0 +1,71 @@ +// Copyright 2021 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#include "riscv/rvruntime-frames.h" + +/* The riscv panic handler in components/riscv/vectors.S doesn't allow the panic + handler function to return. + + However, for the purposes of this test we want to allow the panic handler to return. + + There is functionality in vectors.S restore the CPU state, but it only + restores when CONTEXT_SIZE registers are + pushed onto the stack not RV_STK_FRMSZ registers + + Instead of messing with that, implement a full "restore from RvExcFrame" + function here which restores the CPU and then + returns from exception. + + Called as return_from_panic_handler(RvExcFrame *frame) +*/ +.global return_from_panic_handler +return_from_panic_handler: + or t0, a0, a0 /* use t0 as the working register */ + + /* save general registers */ + lw ra, RV_STK_RA(t0) + lw sp, RV_STK_SP(t0) + lw gp, RV_STK_GP(t0) + lw tp, RV_STK_TP(t0) + lw s0, RV_STK_S0(t0) + lw s1, RV_STK_S1(t0) + lw a0, RV_STK_A0(t0) + lw a1, RV_STK_A1(t0) + lw a2, RV_STK_A2(t0) + lw a3, RV_STK_A3(t0) + lw a4, RV_STK_A4(t0) + lw a5, RV_STK_A5(t0) + lw a6, RV_STK_A6(t0) + lw a7, RV_STK_A7(t0) + lw s2, RV_STK_S2(t0) + lw s3, RV_STK_S3(t0) + lw s4, RV_STK_S4(t0) + lw s5, RV_STK_S5(t0) + lw s6, RV_STK_S6(t0) + lw s7, RV_STK_S7(t0) + lw s8, RV_STK_S8(t0) + lw s9, RV_STK_S9(t0) + lw s10, RV_STK_S10(t0) + lw s11, RV_STK_S11(t0) + lw t3, RV_STK_T3(t0) + lw t4, RV_STK_T4(t0) + lw t5, RV_STK_T5(t0) + lw t6, RV_STK_T6(t0) + + lw t2, RV_STK_MEPC(t0) + csrw mepc, t2 + + lw t1, RV_STK_T1(t0) + lw t2, RV_STK_T2(t0) + lw t0, RV_STK_T0(t0) + mret diff --git a/gateway/esp32-rv/main/syscall/test_panic.c b/gateway/esp32-rv/main/syscall/test_panic.c new file mode 100644 index 000000000..ae440bab8 --- /dev/null +++ b/gateway/esp32-rv/main/syscall/test_panic.c @@ -0,0 +1,267 @@ +/* + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + * Panic handler wrapper in order to simulate ecalls in CREATOR using Espressif family + * Author: Elisa Utrilla Arroyo + * + */ + + +#include "riscv/rvruntime-frames.h" +#include "esp_private/panic_internal.h" +#include "esp_private/panic_reason.h" +#include "hal/wdt_hal.h" +#include "soc/timer_group_struct.h" +#include "soc/timer_group_reg.h" +#include "esp_rom_sys.h" +#include "esp_attr.h" +#include +#include "rom/uart.h" +#include "esp_task_wdt.h" + +#define POOL_CAPACITY 65536 // 64 KB poolç +char memory_pool[POOL_CAPACITY]; +int current_offset = 0; + +void disable_all_hw_watchdogs() { + // TG0 + TIMERG0.wdtwprotect.val = 0x50D83AA1; + TIMERG0.wdtconfig0.val = 0; + TIMERG0.wdtwprotect.val = 0; + + // TG1 + TIMERG1.wdtwprotect.val = 0x50D83AA1; + TIMERG1.wdtconfig0.val = 0; + TIMERG1.wdtwprotect.val = 0; +} + +extern void esp_panic_handler(panic_info_t *info); +volatile bool g_override_ecall = true; + +void __real_esp_panic_handler(panic_info_t *info); + + +void return_from_panic_handler(RvExcFrame *frm) __attribute__((noreturn)); +// -------------Read int from UART0 +static char buffer_int[16]; +static int idx = 0; + +int read_buffer_int(){ + unsigned char c = '\0'; + + uart_rx_one_char(&c); + //Is an space?? Finish it!! + if (c == '\n' || c == '\r') { + buffer_int[idx++] = '\0'; + esp_rom_printf("\n"); //echo + if (idx > 0) //Buffer has things + { + idx = 0; + return 0; + } + else{ return -1; } + + } + //Number: wait until another num comes up OR a \n + if (isdigit(c)) { + if (idx < sizeof(buffer_int) - 1) { + buffer_int[idx] = c; + esp_rom_printf("%c", c); + idx++; + return -1; + } + } + //TODO: Protocol for char instead of number + + return -1; +} +int read_int(){ + int value = 0; + int i = -1; + int sum = 0; + while (i == -1){ + i = read_buffer_int(); + if (i == -1){ + // + for (int x =1;x< 1000; x++){ + sum ++; + + } + } + } + // Transform into number + for (int z = 0; buffer_int[z] != '\0'; z++) { + value = value * 10 + (buffer_int[z] - '0'); + } + memset(buffer_int, 0, sizeof(buffer_int)); + return value; + +} +//------------- Read char from UART0 +char read_buffer_char(){ + unsigned char c = '\0'; + //esp_rom_printf("Value: %c",c); + + uart_rx_one_char(&c); + if (c != '\0') { + esp_rom_printf("%c", c); + return c; + } + else{ return '\0'; } + + return -1; +} + +char read_char() { + char value = '\0'; + int sum =0; + while (value == '\0'){ + value = read_buffer_char(); + if (value == '\0'){ + for (int x =1;x< 1000; x++){ + sum ++; + + } + } + } + return value; +} +//------------- Read string from UART0 +int read_buffer_string(char *dest, int length){ + unsigned char c = '\0'; + + uart_rx_one_char(&c); + //Is an space?? Finish it!! + if (c == '\n' || c == '\r') { + dest[idx++] = '\0'; + esp_rom_printf("\n"); //echo + if (idx > 0 || idx >= length) //Buffer has things or surpass the length + { + idx = 0; + return 0; + } + else{ return -1; } + + } + //Wait until another char comes + if (c != '\0') { + if (idx < length) { + dest[idx] = c; + esp_rom_printf("%c", c); + idx++; + return -1; + } + } + //TODO: Protocol for char instead of number + + return -1; +} + +void read_string(char *dest, int length) { + int value = 0; + int i = -1; + int sum = 0; + while (i == -1){ + i = read_buffer_string(dest,length); + if (i == -1){ + // + for (int x =1;x< 1000; x++){ + sum ++; + + } + } + } +} + +IRAM_ATTR void __wrap_esp_panic_handler(panic_info_t *info) +{ + RvExcFrame *frm = (RvExcFrame *)info->frame; + if ((frm->mcause == 0x0000000b || frm->mcause == 0x00000008) && g_override_ecall == true) { //Only catches Ecall syscalls + disable_all_hw_watchdogs(); + int cause = frm->a7; + //esp_rom_printf("Causa del panic (a7): %d\n", cause); + switch (cause) { + case 1: { //Print int + int value = frm->a0; + esp_rom_printf("%d\n", value); + break; + } + case 2: { //Print float TODO + esp_rom_printf("\033[1;31mFloat number operations not registered yet\033[0m\n"); + break; + } + case 3: { //Print double TODO + esp_rom_printf("\033[1;31mDouble number operations not registered yet\033[0m\n"); + break; + } + case 4: { //Print string + char* cadena = (char*) frm->a0; + esp_rom_printf("%s\n", cadena); + break; + } + case 5: { // Read int + int number_read = read_int(); + frm->a0 = number_read; + break; + } + case 6:{ // Read float TODO + esp_rom_printf("\033[1;31mFloat number operations not registered yet\033[0m\n"); + break; + } + case 7:{ //Read double TODO + esp_rom_printf("\033[1;31mDouble number operations not registered yet\033[0m\n"); + break; + } + case 8:{ //Read string + char* dest = (char*) frm->a0; + int length = frm->a1; + read_string(dest,length); + break; + } + case 9: { // sbrk + int increment = frm->a0; + if (current_offset + increment > POOL_CAPACITY || current_offset + increment < 0) { + frm->a0 = -1; // Offlimits + esp_rom_printf("\033[31;1mSBRK: Memory exhausted\033[0m\n"); + } else { + char *prev_brk = &memory_pool[current_offset]; + current_offset += increment; + frm->a0 = (int)prev_brk; + } + break; + } + case 10: { //exit + break; + } + case 11:{ //Print char + char caract = (char) frm->a0; + esp_rom_printf("%c\n", caract); + break; + } + case 12:{ //Read char + char char_leido = read_char(); + frm->a0 = char_leido; + break; + } + default: + esp_rom_printf("Not an ecall registered\n"); + break; + } + + + //frm->mepc = frm->ra; + if (cause == 10) + { + frm->mepc = frm->ra; + } + else + { + frm->mepc += 4; + } + + return_from_panic_handler(frm); + } else { + __real_esp_panic_handler(info); //Other fatal errors are treated as usual + } +} \ No newline at end of file diff --git a/gateway/esp32-rv/openscript.cfg b/gateway/esp32-rv/openscript.cfg new file mode 100644 index 000000000..837d99cd9 --- /dev/null +++ b/gateway/esp32-rv/openscript.cfg @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Example OpenOCD configuration file for ESP32-C3 connected via builtin USB-JTAG adapter. +# +# For example, OpenOCD can be started for ESP32-C3 debugging on +# +# openocd -f board/esp32c3-builtin.cfg +## Source the JTAG interface configuration file +source [find interface/esp_usb_jtag.cfg] +# Source the ESP32-C3 configuration file +source [find target/esp32c3.cfg] +# Inicializar target +init +reset halt diff --git a/gateway/esp32-rv/tests/random.s b/gateway/esp32-rv/tests/random.s index 8eca81744..f8384c09f 100644 --- a/gateway/esp32-rv/tests/random.s +++ b/gateway/esp32-rv/tests/random.s @@ -1,5 +1,5 @@ # -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez +# Copyright 2018-2024 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez # # This file is part of CREATOR. # diff --git a/gateway/esp32-rv/tests/random_array.s b/gateway/esp32-rv/tests/random_array.s index f488ce28e..4cc218b95 100644 --- a/gateway/esp32-rv/tests/random_array.s +++ b/gateway/esp32-rv/tests/random_array.s @@ -1,5 +1,5 @@ # -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez +# Copyright 2018-2024 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez # # This file is part of CREATOR. # diff --git a/gateway/esp32-rv/tests/sleep.s b/gateway/esp32-rv/tests/sleep.s index 614b70daf..f34f42fe6 100644 --- a/gateway/esp32-rv/tests/sleep.s +++ b/gateway/esp32-rv/tests/sleep.s @@ -1,5 +1,5 @@ # -# Copyright 2018-2025 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez +# Copyright 2018-2024 Felix Garcia Carballeira, Alejandro Calderon Mateos, Diego Camarmas Alonso, José Antonio Verde Jiménez # # This file is part of CREATOR. # diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index 76470e145f590c417f09c280d734ebd107a98538..195ad115cf96c1ab4149f2b52a40bc7ee84be172 100644 GIT binary patch delta 10997 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 delta 12517 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 L0Kk&W&wu|9prn}N diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index bf22deb28d0e81d082a3a603319f753ddd500109..78ac063a42662393021a3eadcc83a10fa69a9e6e 100644 GIT binary patch delta 10997 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 L0Kk&W&wu|9Bo>(m diff --git a/gateway/esp32h2.zip b/gateway/esp32h2.zip index eebc0181d82ab77b003d44821f4813e5b65ee3f6..e0dc3dd3d7948d98ae94cec9a64a481ef4181449 100644 GIT binary patch delta 10997 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 L0Kk&W&wu|9rEZxM diff --git a/gateway/esp32s2.zip b/gateway/esp32s2.zip index 584eaa302185551779df499c6bd70563f9756349..9da9df00d056be22e5d384852d6e0aaa27a39889 100644 GIT binary patch delta 606 zcmaDif$`l0M!o=VW)?065D?DOjGo9R%ONImAVcZXg^bCo?Il^jf&uzq!LPg*GbXn8 zfW;| zlYpy+=zr@f#k5^_GN+p?OhR<>2RAl|FY-r!vMh=YM)zbXTR5Rw^x8&_IS-sma` JvC-2*6#&jDuT%g4 delta 658 zcmaDif$`l0M!o=VW)?065NHbxj+n?N%kf(2a_UU;%c+z9=}EHmCjtcn^f~4N1waxL z+k03*3MX&3RtKvD32uI7{h5P@nMH(wiGhP*Rj5+Lr}8a1lREi_?jhwp;d$4yFcpEH`ZsmX~sIeNti I+dVy00alsM4FCWD diff --git a/gateway/esp32s3.zip b/gateway/esp32s3.zip index f22d2740492f42118f93c38eb9ee2666a188be58..e2963df8cb7306679804751d184ee9615ef05c64 100644 GIT binary patch delta 606 zcmaDif$`l0M!o=VW)?065D?DOjGo9R%ONImAVcZXg^bCo?Il^jf&uzq!LPg*GbXn8 zfW;| zlYpy+=zr@f#k5^_GN+p?OhR<>2RAl|FY-r!vMh=YM)zbXTR5Rw^x8&_IS-sma` JvC-2*6#&meuT}s6 delta 658 zcmaDif$`l0M!o=VW)?065NHbxj+n?N%kf(2a_UU;%c+z9=}EHmCjtcn^f~4N1=Dv;NG%!^|SWz{J48uqsq3V)9X4Z4Uk0lfil>|Iod}g(PQT zq6wGVoN404&H~mV&ZveEc4aKn;exmeEO|vw2`sq-<}k3Rw7vmc%j97Fe278!4fNrn zo5c*}m?6T)^byuh{;q$AkC91^8R7NG&t0@xK)#v$(Onws@5!dFwk#lzgGIo;7VwZ_ z;$)nx;~|Mq3UZ6EpMlQLKXm)ND5?=3Vv-leP5a z*pb|#2r{{EzR6WqW(J1MKtD;LxFywrVe&fzS!5j$ Date: Fri, 26 Sep 2025 10:29:26 +0200 Subject: [PATCH 3/9] Changed esp32c2 (no JTAG) for ESP32c6 (proven, working and with JTAG) --- .../simulator/creator_uielto_target_flash.js | 4 +-- gateway/esp32-rv/gateway.py | 24 +++++++++++++++++- .../openocd_scripts/openscript_esp32c3.cfg | 14 ++++++++++ .../openocd_scripts/openscript_esp32c6.cfg | 14 ++++++++++ gateway/esp32c2.zip | Bin 19420 -> 20713 bytes gateway/esp32c3.zip | Bin 19420 -> 20713 bytes gateway/esp32c6.zip | Bin 19420 -> 20713 bytes gateway/esp32h2.zip | Bin 19420 -> 20713 bytes gateway/esp32s2.zip | Bin 18542 -> 18542 bytes gateway/esp32s3.zip | Bin 18542 -> 18542 bytes 10 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 gateway/esp32-rv/openocd_scripts/openscript_esp32c3.cfg create mode 100644 gateway/esp32-rv/openocd_scripts/openscript_esp32c6.cfg diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index d1a6b7322..b5c7a7a9c 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -43,7 +43,7 @@ remote_target_boards = [ { text: 'Please select an option', value: "", disabled: true }, - { text: 'ESP32-C2 (RISC-V)', value: 'esp32c2' }, + { text: 'ESP32-C6 (RISC-V)', value: 'esp32c6' }, { text: 'ESP32-C3 (RISC-V)', value: 'esp32c3' }, { text: 'ESP32-H2 (RISC-V)', value: 'esp32h2' }, //{ text: 'ESP32-S2 (MIPS-32)', value: 'esp32s2' }, @@ -68,7 +68,7 @@ target_boards = [ { text: 'Please select an option', value: "", disabled: true }, - { text: 'ESP32-C2 (RISC-V)', value: 'esp32c2' }, + { text: 'ESP32-C6 (RISC-V)', value: 'esp32c6' }, { text: 'ESP32-C3 (RISC-V)', value: 'esp32c3' }, { text: 'ESP32-H2 (RISC-V)', value: 'esp32h2' }, //{ text: 'ESP32-S2 (MIPS-32)', value: 'esp32s2' }, diff --git a/gateway/esp32-rv/gateway.py b/gateway/esp32-rv/gateway.py index 08673c8c2..c211b12a2 100755 --- a/gateway/esp32-rv/gateway.py +++ b/gateway/esp32-rv/gateway.py @@ -216,6 +216,12 @@ def do_flash_request(request): "# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK is not set\n" ) #TODO: Add other boards here... + elif target_board == 'esp32c6': + with open(defaults_path, "w") as f: + f.write( + "CONFIG_FREERTOS_HZ=1000\n" + "# CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT is not set\n" + ) # 2. If previous sdkconfig exists, check if mem protection is disabled (for debug purposes) if os.path.exists(sdkconfig_path): @@ -232,6 +238,19 @@ def do_flash_request(request): r'/^CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=/c\# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK is not set', sdkconfig_path ]) + elif target_board == 'esp32c6': + #CONFIG_FREERTOS_HZ=1000 + do_cmd(req_data, [ + 'sed', '-i', + r'/^CONFIG_FREERTOS_HZ=/c\CONFIG_FREERTOS_HZ=1000', + sdkconfig_path + ]) + # PMP IDRAM split + do_cmd(req_data, [ + 'sed', '-i', + r'/^CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT=/c\# CONFIG_ESP_SYSTEM_PMP_IDRAM_SPLIT is not set', + sdkconfig_path + ]) #TODO: Add other boards here... if error == 0: error = do_cmd(req_data, ['idf.py', 'set-target', target_board]) @@ -455,10 +474,13 @@ def kill_all_processes(process_name): # (6.3) OpenOCD Function def start_openocd_thread(req_data): + target_board = req_data['target_board'] + script_board = './openocd_scripts/openscript_' + target_board + '.cfg' + logging.info(f"OpenOCD script: {script_board}") try: thread = threading.Thread( target=monitor_openocd_output, - args=(req_data, ['openocd', '-f', './openscript.cfg'], 'openocd'), + args=(req_data, ['openocd', '-f', script_board], 'openocd'), daemon=True ) thread.start() diff --git a/gateway/esp32-rv/openocd_scripts/openscript_esp32c3.cfg b/gateway/esp32-rv/openocd_scripts/openscript_esp32c3.cfg new file mode 100644 index 000000000..837d99cd9 --- /dev/null +++ b/gateway/esp32-rv/openocd_scripts/openscript_esp32c3.cfg @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Example OpenOCD configuration file for ESP32-C3 connected via builtin USB-JTAG adapter. +# +# For example, OpenOCD can be started for ESP32-C3 debugging on +# +# openocd -f board/esp32c3-builtin.cfg +## Source the JTAG interface configuration file +source [find interface/esp_usb_jtag.cfg] +# Source the ESP32-C3 configuration file +source [find target/esp32c3.cfg] +# Inicializar target +init +reset halt diff --git a/gateway/esp32-rv/openocd_scripts/openscript_esp32c6.cfg b/gateway/esp32-rv/openocd_scripts/openscript_esp32c6.cfg new file mode 100644 index 000000000..41e3f6c49 --- /dev/null +++ b/gateway/esp32-rv/openocd_scripts/openscript_esp32c6.cfg @@ -0,0 +1,14 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Example OpenOCD configuration file for ESP32-C3 connected via builtin USB-JTAG adapter. +# +# For example, OpenOCD can be started for ESP32-C3 debugging on +# +# openocd -f board/esp32c3-builtin.cfg +## Source the JTAG interface configuration file +source [find interface/esp_usb_jtag.cfg] +# Source the ESP32-C3 configuration file +source [find target/esp32c6.cfg] +# Inicializar target +init +reset halt diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index 195ad115cf96c1ab4149f2b52a40bc7ee84be172..e3e3d7c8079fd5f4a019818a6d67d7397076a1dd 100644 GIT binary patch delta 6339 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 diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index 78ac063a42662393021a3eadcc83a10fa69a9e6e..72d6bd6b39cce4297ba709fa51700d6f5fcb4896 100644 GIT binary patch delta 6476 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 Z{|8CdP)0$0dM(iJfASdsfTHl^{U0Jp!wUca delta 5543 zcmYM2WmJ@3w8n=a1V&*FyeMrICgqBm{<#EuULNzmW)kEXQ|rG$bwYzxGbO0Z{yeW2#b}9|q64S=*0(pd&(;T#4>yYWhvmgD<91XRGfOnnm6s zqegW6>+|kCM58CdiZO3Tmi$x_CtlLjNT~meGpI=+G$&PB2+d+lSp5-NAfahcYV0qO zAR4Cq4FuSjn#xf198GQ8BHT7$yX$OVT#tdb#jlTkZv2Mo13SbBp5Sb3BBk{St6*Pz z8Q3|RhTIMs&H)b|O~XsZ>d%(#KE^J#+U_ksq4pgS{Zebd`MUXW?}j^-l2ltfBFz=2 zsW&#~Pz+)Y8yoM_W!!j`1TKEMdJ)a8j?=|RGrE$qK_lI()}8_veJjYu99W(AXg$$d za8$O;0Ls)043+-6scxW@Nx`i+5$xp}A)<6X#<+s$;;4P^v69G}#eE1!QQ!Nz2}Bf} zG#+jhl$RHr9L-BJ^1?9UKLxOAE5vZdLk0HPFOn_7!$=}T3d+~$+=j*pZK_8HT#^u? zlGM2gRn;q`gU>>S3(AjXk4AnKa5S|wx3o1qX$H*zv0p91%*7Mr7`WCgyYP9Uo9C{K zQh1c8)xtwx68>qDJeK~4pU{MHzN(_c8^ZD|oLK5x%o}`3C zQ{9`Lk5`U7X(v}pKJwbtku<8>3N~)frhpT&8G!sG+fO#-oB!(^?z|}SkYX^*nv*(8 z$(_-5v95}T;-q9*v>atzd^oa?CPUfO*ZieHN<|Ales zH+03^-%G>75_F`T3N~ zR?P!*L-K4!ELEmO^GVE*3@%Lg7#*(^F(m?*AKN8aEl#raQ-3S z?oV73FbRc9_qxwjRz|$*KK~GWJiQriz}XzAl-1DxBObby-7o-2bDQz%KVip;_()92 zw~!u&u{UjoMIzBStK+C^PTN&Ui;c>v{2kmL;7FKfvERi#Yq>0@-lt{Z%yh(2SUb={ zum1kV!-7Qcy9FI0jf|JL^Xnw4^i3qt?rdz^cKt25x=WE+G6a_9mp|3M5EuI6v+a>! z0T73CZ~`f5P^g8`4}xx}jN>U9l33wT9vJET zoW|Ml!adMgO}w$h;Hxd3z0BD14yFGZb4p0#*&EUdX}YjjPfa6mi+w^(Tw42*o-5FF zIp?+D>CegqzuG7#8|n@B2KrPmU?hq!5q6fC6l2#$EXztOo!_sdq)x?nE0e3pN~Gw# zN+{vYY9da7dL2f};!BnE;P@r}OYQ-=*gh=;mLBTUFF1v~0q=Y}Cg9Chw%Gbx=f*#yx*oE}H z*J}GCuHzz3cuV$-wiU->UpWjLe+XV1HTa;UiatV>yJGY-gdQ9}PVuMlW)DaC4wQ0; zSlr5}qx?2c*A;{}jd4K$VCwdWXuolhX>NK@-oWPYmP1gRX;`r9v0P1CVEK0r60-&7 zT9V&Ssf9(G-UW+uNk4LxR*z;kXLg{B2Ld`4vXbg)d z#`VIemAvjn$wmWS1*H8@KgvW=D^5j7`jc>h!PdGz{prrb)K=|0KT+9y3r7)E0((tg|{r^q79QJ>1=NWHKQ>Q~Wf!i}OOfq{g&I;oGZk zB7^!$zpQcXvcQV#MtcZv)JRH#Dyz65o$u#^ZZF6@sh#rPa z)-%6m^!+V9`tcZ$2+t}g=Zmt}QTEbm9J;Hg$8PAD0vkocE*L!zQ+1s~mr`&uW<4C{ z9@dybW`mJYy8HN$hP+qM=!(Q|&@~C)gP5Kf<`XS}Lm7|sJNM-xZFF_fPxI8gG{wN5 zJ$$tpt7P)AnH)S9;{6W0~+CN)IBWJ)Y5Np~=Rx~|+wy{4uX!l~Y z{aLe^cxPg_1Vpm_>X!0Ni@!#{es8@F&3E7P>}9$QJ5gu+vm5m%2s?ZC7g7~;1fg}pHgBr-Oav1K zWSkHF%;?7xUfky9vds>_HXDXf;x>UULQlSw0{3?_vw2#jZ2O-|gGT3e$v;=DTp0&M zrR=GG=t=O}Xt{Z=>j3#;3kXxe95Wdhr8r|UJ6(lhz-#FQ##~56PUF;!IA34gjiW|( zS)Yh^?SSIDTqui_nRY7tR<-Q#JKk0C8%s zE)~@Ba?Io&>RkDr=W0^N)YzeeKCu{O=-){iud5!UvGXCvAS=n+T;@DfFKpTkZ--wt zRbHtaa=I)EI{PIrHrhsv9A#aP8?04>6qFr=)FEsY>X=6|+>}_n-uW_lmPBmSXur4J zMgFvD_q1Bi)_J~$7>wo9Jy!1n2u(FiwD2z&S4j`NEFb$Q>Yxf2OZfab4MnaK6~rLV z4O`wIt~DQr>Y5dd2v<6|l~m1!x$8h>#d|!yJ(=;!$UijoFoL)HnEUvoKb(R%H4Vwo zrSR}&4&b&Kh?7!myGW7Xg3#IC*-?UpuC5~a0HN9HsPyjDOJrz$A-Og1Txg<7lK`Re zy2?*ETc}%b01#4l;EPVVqAg4P*&QQ)sH!010nF(Hr_M8lj}a zeSq>LdP)?>G!JVMwp%9+ja0^YZU+I>#y3KHRLqoH42IKZs2%?GakC$X=AatkC{@M98B+GcMn5$Rp0aJ` zmF@K%+}bONwf&_Jo1sN8*C$x>;7{6#Tyxt;%B>$H>vGeM;>ZIYvWq>eGerc1v!Ohb zFMnQ_Buc$*OA1lMRiWW+OpYprM0`Bevu`^t&9zAyafT_hTr*XT%@NjJX(PZ zUmGbg(YAnkqJ;oo!t*Z)`RWhuHu~2JoTfwygO$jgOdZW6!GBjai`$-RXc*tD5zyHFA;15HWg)gc_t^ zZNojf)>BA9m?eIvk0-Ht4tI@c+nM?=!rZ}{mSM5x`;}M_RZ&#St8B361>xa1j?pvL zx!jW`6H%%WU91AejL^q7y94Up@>A=RQ@nMZJ5k%133%N0WNOCdEwTj@qsxL{oQ)P__h#Jvj{iMP!N&v;E^{(0MAc5?y^ zu9p;?x2EKPz~6^#yWGc|=DjI#$Lq;{!+G(Hu^^P2Dt>3#Khs zhzAe1{*#s@o>up;KiR77bwHlo0Gu@XQCx_w7n$Wj#A$V_QbJP#Rh+40_N-6n?!Z^R zaqK6(FGg$!?Gg{7of_p2VMNUzSLQa7b2c0FMApZ2-^`hkO{n%!JLKzGb^oqi@)@go zy9juQqroT=Gx6Q{vgfM9zA|OuZ2|UWayjT9lNc|5~kg%;i#lD z6a5{&+hFf9smNEt?@#8F6k7s!C9$d7dsfDDa^+KvedbN>LK=ZkL zUFmZ}Gv}zOr#@fhU>TB`CdMOP>Beo5H%ksu~B3x2`Ds zDJ`uTm^!`lAN%x2)v-O$++(Y28ki4EEs7p~n%<8>D21gI@JEobZd}<{GXhozgE0#l zB3>10Z}nOz+odY?c^Au497L0PZ9mBIF_9YJE)?nUN4f8bk1K|AtARBX!HcZl>$6*} zr(dp$J2D44!Q>v*XG*0?uA<|7au==s!rF}6!y6v?`0@G=r#-69#s{X zls4@{)ymWD?NO1q5d@k1z{2b&e-7$Gmq^8Nzv57mIC7!7$b3n4+cLP(mr?RT5k#x; ziWrsF@{<2-f#nokm>AJI`c*D+Lg>#GNnNu$nLUwhlhTJxm-A1PTyAlp8Q1oN_&3`( zVgv!EY1(y}m&plt@+lsyB*knUZI+}P|gn^m|t;_GyKcenhJP!ikYzVdGxn5h_?r1-%!(tue7>7ccASF;T!yRurc|z=&oyKDf!y(A5!-Pnd!zIE{zBY>| zI=i-G_w(GbYEzIbP(7y<@HoNwBsEL>O6!aFKt{Nvi?xMyaS2Ek~J9_T~0EpHM5RKI~81Crm;@U`I+! z{C3;<5x_^OG&7zFRp*PwQC$1`7rI7)sVZ^C;~4Y#He`oRC$?lKb2|%%FJK{KEqX$!wGi5u4)VZEGzm^}O%Ula?!a+H+JE?aw}TI<38r%5c6T^rtlt9OAQ131QR(%LXKomro;HV z%A`P!Y2w#eDo=rtoyt&T{Br{EODHnuxi&Z#iadI52;TquJVt7e5+HR|Sdr=KRA6Gt zf6|cp3osuol0oAY*n=J!s9^?%GyGSPBTqGy!Q#wFDa}`yENmd83ycz3uPFoeXGflE zz64M3AhonakYg%Xy#K$21c8V_6rjHc`MmbycJ)JQ Xt5A_*-YS6hTh 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 delta 5543 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 XtwKeLjq|sS?7tiR00fef|6BbJ)MS6q diff --git a/gateway/esp32s2.zip b/gateway/esp32s2.zip index 9da9df00d056be22e5d384852d6e0aaa27a39889..be11c636df1c3928c9c19fc67442b67849cef598 100644 GIT binary patch delta 38 scmaDif$`l0#tHh&5@y#X|J9S*7_dqY#NPZ@?mzfc&CI}=jIY@sY eSmK+$3?rB!Y8b!_W@MODu`}}nH9xiPi_@% From 58c4fe4d278f5e3d6077a33987bdc352d08ab58d Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Tue, 30 Sep 2025 11:17:20 +0200 Subject: [PATCH 4/9] Changed driver --- gateway/esp32-rv/main/creator-esp.c | 8 ++++---- gateway/esp32c2.zip | Bin 20713 -> 20712 bytes gateway/esp32c3.zip | Bin 20713 -> 20712 bytes gateway/esp32c6.zip | Bin 20713 -> 20712 bytes gateway/esp32h2.zip | Bin 20713 -> 20712 bytes gateway/esp32s2.zip | Bin 18542 -> 18542 bytes gateway/esp32s3.zip | Bin 18542 -> 18542 bytes 7 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gateway/esp32-rv/main/creator-esp.c b/gateway/esp32-rv/main/creator-esp.c index a2ebb5a31..332bd8b71 100644 --- a/gateway/esp32-rv/main/creator-esp.c +++ b/gateway/esp32-rv/main/creator-esp.c @@ -19,7 +19,7 @@ //////////////////////// para leer del monitor #include "esp_system.h" #include "esp_console.h" -#include "esp_vfs_dev.h" +#include "driver/uart_vfs.h" #include "esp_vfs_fat.h" //////////////////////// @@ -47,9 +47,9 @@ void app_main(void) { /////////// para leer del monitor ESP_ERROR_CHECK(uart_driver_install(CONFIG_ESP_CONSOLE_UART_NUM, 256, 0, 0, NULL, 0)); - esp_vfs_dev_uart_use_driver(CONFIG_ESP_CONSOLE_UART_NUM); - esp_vfs_dev_uart_port_set_rx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CR); - esp_vfs_dev_uart_port_set_tx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CRLF); + uart_vfs_dev_use_driver(CONFIG_ESP_CONSOLE_UART_NUM); + uart_vfs_dev_port_set_rx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CR); + uart_vfs_dev_port_set_tx_line_endings(CONFIG_ESP_CONSOLE_UART_NUM, ESP_LINE_ENDINGS_CRLF); ///////// printf("Started program... \n"); diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index e3e3d7c8079fd5f4a019818a6d67d7397076a1dd..26147e1a4b96822e993239a61c0f4e35dda09b18 100644 GIT binary patch delta 1004 zcmaF4knzPr#tHh&zq)Tvc4U;B7+}n7<9BUh+YaXcV3A-Dck^_{nJi$2F`Ed4;l)+Q z%q*;PYx8Md7DkZNYU?su)E{sskQj@273r#*IV98|Tx0z8ehY?6mW)xK1JV8j4 zk@+{+0+GoVge{=zEf<%m zbO`ia=wdZtqflBr z)5+y66E;}6TnkAl`ld5?<)e2ddv`vOJfk6Amuq_e+ERt7#;UBVjn3@uxK_g1$IB%Zu50ke zT6x>QH;ub~e%^GaAup*u{6XK8bC*)1Hi^y_x2{~lY?L}}N3Kka>Ki@HRU$X#y28c( z?)G3<^rX$@@y86GL+1m394&W_pKI~zdPLN;It!_9?BPrJT#Y4<3hw-CF>k`dx24=w z>+f$_@cQ1vT$#leUBVcozfR~m>zR5(>Wj#Y#5h}rqz##S6;#E03?@EYpI7e}ylU^q z1c`|m6_yflswy(`8@B!Dl>ILIBkX5`cB}cMvwz)^HmaR2&|N<3oYh>u8e!h)8#puN z?N$r)tQ6hY@O}9+{s!MO?^oS9{@X9C%$Utcg4h1*>p}|^_1>vFEgIQ#*F0Zj_T`sM z{-vbbhgkQVI`DMHuBl==|8~xvI^$wZiO~KxvU0y|6S=K|Jr=0l@U(qzJ~>0(7M!kE zs6S_d=7z}=gnmw5t!)k#f2tkK4rW*zH%s%Pr1QzA{Y=0)z|l`(a+x~cWCMR5#`MXy s{?W{VS`3r(wInBR@poWcHu5Ma3 zzzkzH5eUPJtB#pjOyJ_?)4VKd`!TS>7wUm zM!_6LrYoM483h$LPY}{%gxPaW*b2s!6>(#B1X`CSqQSu&3}j4{;euE7$4WKS2k zA5)jhUvbcBW!S9qMb@d_)r@=JRc^og`difnb1&oM3bv1@BFxMm9JdtRJm-^IOR|Ko zzTgY}YaQx764&IG`9#bsT&AzUv-|C5Kk;Oy^VRhyU4y1*HkTh;7E|_#-*o!3q_FQ( zo03!R9&g>MebnddZG)G!O0LHQ7i@ff&LsJkmoU$T89v893g4bK>-R4)<1Q7;@Rn{L zxx7?X)5^PZv-TxeX{_Alz91yha_@sqevzvpTuYcWwG;GMw+GoX8Rl`hA6ROzDWP4u z`^;@Xz> zIZ2=2)FJJR(Dq(u?bf^Mu2YqEFRKW>_?(sLLVvzTy^*B9$B&)zbsx3=PAokhxck_p zMIR0qnn=V=)Dk&cVe@M8?f%J{oq6k{FI4|s#v1#*JI`I&WY!6;1b>Gkjnmq48~hpN z&aY+joE`h&Oihx*yp9e5|kuuf#3 zkJ)GGjYp$&j&7ZkY4yIu>VvOI%ptQSwLjK68!QVtE_84HB_;;Bq{8qtyM5K0w%ndL z;i1JZlND}{C(QA=_Usdj+?I{=x^G>QE~p9od{VC{?Q~)iJ?QtSvYugby1FemKP^{(&IHai6SV>u!6HwzgW16hE8}MANq#Jx z@RUCJl%L7uP*3H_ivCiJ8Ix`NqnU%W7$)awNlxDE@4&cx@)!R|CI;il{sEzkWs{c% L*s`&DFaQAnywR!? diff --git a/gateway/esp32c3.zip b/gateway/esp32c3.zip index 357211ea62e7b43aa15f6d45f00db5c6a57c7127..449dbf03b01d0993e0d4711a93cadb245e31489d 100644 GIT binary patch delta 1012 zcmaF4knzPr#tHh&zq)Tvc4U;B7+}oIKk4?wwjIp>!6LyR?&j%?Gg-h4V>S^8!;7nq z87y*|mxU3;n0$$^4lEGN@4^VxEH!zWx6tHc0+wI}1wsm&l?1)Psy7!1c``Ep23sLA z`GT+oREOMTO%W@wF=-+i9AL&o87_#G^Auc|nSV{ZJ^88f6k*vQyXXrx{5DIN7#Nb+ z7#O4&WG3JDljY)M04d1;Dch`~UVrJr!leO%T5k`loc5JTGQBbFZNQBy@|*8(vftL- z$hdTaXSdSRntj#pEbj}mr_0T8EGquF_3m?3?xj&#cDip`blU(V`-vw(H^)d9ymamh%95!n~ z|FH@qufCk(Xvi9!Kbt6KyWe|bFYG`c#pxvhwJm|{eoBR{g@yzF{8p# zB2HCBW`4uA|D3YlWq*YIY|w5spLF)GThd0g(*?TAXPvW}%U2`JJADIZro7#1fu5D3 z8ymhaf5zY7d*=PBJI8K>&&e%0oOy}Ru*;8j+tSJ%N|3+5sw{0S~Rj|hbwHuzc@69J?sM~_m^$PXpOkhTV zkR;>e)!OD@&QtARb`WE-wQ&hpV3RSAG%reOpM2WS1e^~X{S+pbsq;-X@aJJnpKR+N r%^ax3FgagKa`F~`2gYTSzxqcq{WqE%5D>~(I(b=uEgOpm0}ucJz52S# delta 1019 zcmaE{kn!b0#tHh2I+GndL?+9M@JtLaX14LWHnD97lZ4r1M-O3;;N*BlQ;_K9>5Ma3 zzzkzH5eUPJtBx5ga+;Tg5yY5$iLVYU5X|qwIN9Dq6leg)w87nxZeoLJ6 zRE=+=RL$e z%qL=A;WB*%p51Rh`-vwrov*Gx=^8Xev$_1(vY4_@{HD{NC53&T+LWAf_jv18?V~QTX<>S-*dY8F#5zhPQP4$mON7npWPOo3$^& zN@L|V_XQ!5mU|y`@{3#*;abA1shyz5x;@CA$uN)0{lHR#O$qJN-Df6D(e2AmslW2E zrfcG3uIqPH*8KSEZSZpj&!o`y6SKNP&h?k2E!**W$@U30t(H#@tzYx(_9_vTqIF9g zp3Ycs=;VIkU@g_Hyk-^$?e?@AF-*#E+vqE;|HJpkOU8^eZ`}jOCp^Ww7*J$~$zuluO|cVg-Bz}?3#E&6b{&_p6`qL#?n z3Y%AxZ}(5u?95vqeWCjAGS=Ad-FfcHCbLd(CHOlWX`I%U+u+YAcYZCKCy!j5zUM(! zWuGM#chA;mW=$G`!pK9+Cs>KQGQ(;vL8Kh)2*?!Y@ShIJzQe9S&eZ#){Mb9C#R zOsn@LRv&y#Vh))tsr|9m*_*L~}fbU{tv=evS>4??;0j)%Bs9{e=lf3uj`EPmm4zwRa8e$N?wX{QsD z=s~|nmGumh)75Rk34FQwb0$bi*9w4Sk0;u}>>!cJR>mdF3cwt=(U?bik{=5vJjG8w z+2o}Gwrs2( H3_t(?gF&>| diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index 72d6bd6b39cce4297ba709fa51700d6f5fcb4896..030c06300e9a6b8e83b9010376c00d43cc31222b 100644 GIT binary patch delta 1012 zcmaF4knzPr#tHh&zq)Tvc4U;B7+}oIKk4?wwjIp>!6LyR?&j%?Gg-h4V>S^8!;7nq z87y*|mxU3;n0$$^4lEGN@4^VxEH!zWx6tHc0+wI}1wsm&l?1)Psy7!1c``Ep23sLA z`GT+oREOMTO%W@wF=-+i9AL&o87_#G^Auc|nSV{ZJ^88f6k*vQyXXrx{5DIN7#Nb+ z7#O4&WG3JDljY)M04d1;Dch`~UVrJr!leO%T5k`loc5JTGQBbFZNQBy@|*8(vftL- z$hdTaXSdSRntj#pEbj}mr_0T8EGquF_3m?3?xj&#cDip`blU(V`-vw(H^)d9ymamh%95!n~ z|FH@qufCk(Xvi9!Kbt6KyWe|bFYG`c#pxvhwJm|{eoBR{g@yzF{8p# zB2HCBW`4uA|D3YlWq*YIY|w5spLF)GThd0g(*?TAXPvW}%U2`JJADIZro7#1fu5D3 z8ymhaf5zY7d*=PBJI8K>&&e%0oOy}Ru*;8j+tSJ%N|3+5sw{0S~Rj|hbwHuzc@69J?sM~_m^$PXpOkhTV zkR;>e)!OD@&QtARb`WE-wQ&hpV3RSAG%reOpM2WS1e^~X{S+pbsq;-X@aJJnpKR+N r%^ax3FgagKa`F~`2gYTSzxqcq{WqE%5D>~(I(b=uEgOpm0}ucJz52S# delta 1019 zcmaE{kn!b0#tHh2I+GndL?+9M@JtLaX14LWHnD97lZ4r1M-O3;;N*BlQ;_K9>5Ma3 zzzkzH5eUPJtBx5ga+;Tg5yY5$iLVYU5X|qwIN9Dq6leg)w87nxZeoLJ6 zRE=+=RL$e z%qL=A;WB*%p51Rh`-vwrov*Gx=^8Xev$_1(vY4_@{HD{NC53&T+LWAf_jv18?V~QTX<>S-*dY8F#5zhPQP4$mON7npWPOo3$^& zN@L|V_XQ!5mU|y`@{3#*;abA1shyz5x;@CA$uN)0{lHR#O$qJN-Df6D(e2AmslW2E zrfcG3uIqPH*8KSEZSZpj&!o`y6SKNP&h?k2E!**W$@U30t(H#@tzYx(_9_vTqIF9g zp3Ycs=;VIkU@g_Hyk-^$?e?@AF-*#E+vqE;|HJpkOU8^eZ`}jOCp^Ww7*J$~$zuluO|cVg-Bz}?3#E&6b{&_p6`qL#?n z3Y%AxZ}(5u?95vqeWCjAGS=Ad-FfcHCbLd(CHOlWX`I%U+u+YAcYZCKCy!j5zUM(! zWuGM#chA;mW=$G`!pK9+Cs>KQGQ(;vL8Kh)2*?!Y@ShIJzQe9S&eZ#){Mb9C#R zOsn@LRv&y#Vh))tsr|9m*_*L~}fbU{tv=evS>4??;0j)%Bs9{e=lf3uj`EPmm4zwRa8e$N?wX{QsD z=s~|nmGumh)75Rk34FQwb0$bi*9w4Sk0;u}>>!cJR>mdF3cwt=(U?bik{=5vJjG8w z+2o}Gwrs2( H3_t(?gF&>| diff --git a/gateway/esp32h2.zip b/gateway/esp32h2.zip index bda1c28f298b4315aa82a3604cdc2a306697a123..2880475f6f65b9a202d02e2c3d342e1f0a04b312 100644 GIT binary patch delta 1012 zcmaF4knzPr#tHh&zq)Tvc4U;B7+}oIKk4?wwjIp>!6LyR?&j%?Gg-h4V>S^8!;7nq z87y*|mxU3;n0$$^4lEGN@4^VxEH!zWx6tHc0+wI}1wsm&l?1)Psy7!1c``Ep23sLA z`GT+oREOMTO%W@wF=-+i9AL&o87_#G^Auc|nSV{ZJ^88f6k*vQyXXrx{5DIN7#Nb+ z7#O4&WG3JDljY)M04d1;Dch`~UVrJr!leO%T5k`loc5JTGQBbFZNQBy@|*8(vftL- z$hdTaXSdSRntj#pEbj}mr_0T8EGquF_3m?3?xj&#cDip`blU(V`-vw(H^)d9ymamh%95!n~ z|FH@qufCk(Xvi9!Kbt6KyWe|bFYG`c#pxvhwJm|{eoBR{g@yzF{8p# zB2HCBW`4uA|D3YlWq*YIY|w5spLF)GThd0g(*?TAXPvW}%U2`JJADIZro7#1fu5D3 z8ymhaf5zY7d*=PBJI8K>&&e%0oOy}Ru*;8j+tSJ%N|3+5sw{0S~Rj|hbwHuzc@69J?sM~_m^$PXpOkhTV zkR;>e)!OD@&QtARb`WE-wQ&hpV3RSAG%reOpM2WS1e^~X{S+pbsq;-X@aJJnpKR+N r%^ax3FgagKa`F~`2gYTSzxqcq{WqE%5D>~(I(b=uEgOpm0}ucJz52S# delta 1019 zcmaE{kn!b0#tHh2I+GndL?+9M@JtLaX14LWHnD97lZ4r1M-O3;;N*BlQ;_K9>5Ma3 zzzkzH5eUPJtBx5ga+;Tg5yY5$iLVYU5X|qwIN9Dq6leg)w87nxZeoLJ6 zRE=+=RL$e z%qL=A;WB*%p51Rh`-vwrov*Gx=^8Xev$_1(vY4_@{HD{NC53&T+LWAf_jv18?V~QTX<>S-*dY8F#5zhPQP4$mON7npWPOo3$^& zN@L|V_XQ!5mU|y`@{3#*;abA1shyz5x;@CA$uN)0{lHR#O$qJN-Df6D(e2AmslW2E zrfcG3uIqPH*8KSEZSZpj&!o`y6SKNP&h?k2E!**W$@U30t(H#@tzYx(_9_vTqIF9g zp3Ycs=;VIkU@g_Hyk-^$?e?@AF-*#E+vqE;|HJpkOU8^eZ`}jOCp^Ww7*J$~$zuluO|cVg-Bz}?3#E&6b{&_p6`qL#?n z3Y%AxZ}(5u?95vqeWCjAGS=Ad-FfcHCbLd(CHOlWX`I%U+u+YAcYZCKCy!j5zUM(! zWuGM#chA;mW=$G`!pK9+Cs>KQGQ(;vL8Kh)2*?!Y@ShIJzQe9S&eZ#){Mb9C#R zOsn@LRv&y#Vh))tsr|9m*_*L~}fbU{tv=evS>4??;0j)%Bs9{e=lf3uj`EPmm4zwRa8e$N?wX{QsD z=s~|nmGumh)75Rk34FQwb0$bi*9w4Sk0;u}>>!cJR>mdF3cwt=(U?bik{=5vJjG8w z+2o}Gwrs2( H3_t(?gF&>| diff --git a/gateway/esp32s2.zip b/gateway/esp32s2.zip index be11c636df1c3928c9c19fc67442b67849cef598..890213714488b5183cca5c546a6e813365f280e2 100644 GIT binary patch delta 87 zcmaDif$`l0#tHh&|GRHb{;MZ9F~FGF#_!t1w%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) Wu*5fg8AdQe)G&Y<%*Zfd69E8zH6tSc delta 87 zcmaDif$`l0#tHh&5@y#X|J9S57+}o&mG|Prw%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) Wu*5fg8AdQe)G&Y<%*Zfd69E8Vts}+& diff --git a/gateway/esp32s3.zip b/gateway/esp32s3.zip index 84aa7606787a6e5f257a0d056c310121798ab7aa..a9fdc7e0fa0636536b7f23837e8c7f1043ae9e88 100644 GIT binary patch delta 95 zcmaDif$`l0#tHh&|GRHb{;MZ9F~FFaf70!VZM#9#W*5c{I$*|kU1mn8njnzCmzfc&CI}=jIY@sY dSmK+$3?rB!Y8b!_W@MODvoitpKDF-T0RREVB$ogH From f23cf51692485930e2453ffa783c89724d8ee8f9 Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Thu, 2 Oct 2025 13:28:22 +0200 Subject: [PATCH 5/9] Some fixes in driver and messages --- .../simulator/creator_uielto_target_flash.js | 21 +++-- gateway/esp32-rv/gateway.py | 85 ++++++++++-------- gateway/esp32-rv/main/syscall/test_panic.c | 1 - gateway/esp32c2.zip | Bin 20712 -> 20783 bytes gateway/esp32c3.zip | Bin 20712 -> 20783 bytes gateway/esp32c6.zip | Bin 20712 -> 20783 bytes gateway/esp32h2.zip | Bin 20712 -> 20783 bytes gateway/esp32s2.zip | Bin 18542 -> 18542 bytes gateway/esp32s3.zip | Bin 18542 -> 18542 bytes 9 files changed, 63 insertions(+), 44 deletions(-) diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index b5c7a7a9c..995b278a4 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -285,9 +285,6 @@ if (JSON.stringify(data, null, 2).includes('No UART port found')) { show_notification('Error flashing: Not found UART port', 'danger'); } - if (JSON.stringify(data, null, 2).includes('cr_ functions are not supported in this mode')) { - show_notification('CREATino code in CREATOR module. Make sure the "Arduino Support" checkbox is selected', 'danger'); - } } ) ; //Google Analytics @@ -342,6 +339,9 @@ if (JSON.stringify(data, null, 2).includes('No UART port found')) { show_notification('Error: Not found UART port', 'danger'); } + if (JSON.stringify(data, null, 2).includes('No ELF file found')) { + show_notification('Error: Built proyect not found', 'danger'); + } } ) ; //Google Analytics @@ -361,9 +361,17 @@ } ; this_env = this; - gateway_remote_monitor(this.flash_url + "/debug", farg).then( function(data) { - this_env.debugging = false; - //show_notification(data, 'danger') ; + gateway_remote_monitor(this.flash_url + "/debug", farg).then( function(data) { + this_env.debugging = false; + if (JSON.stringify(data, null, 2).includes('No ELF file found in build directory')) { + show_notification('Error: Not found proyect to debug', 'danger'); + } + if (JSON.stringify(data, null, 2).includes('No JTAG found')) { + show_notification('Error: JTAG no connected. Check wire installment', 'danger'); + } + if (JSON.stringify(data, null, 2).includes('No UART found')) { + show_notification('Error: UART no connected. Check wire installment', 'danger'); + } } ) ; //Google Analytics @@ -741,7 +749,6 @@ ' ' + ' ' + ' ' + - ' Install Openocd
' + ' Install the GDB web interface: pip3 install gdbgui ' + '
' + '
' + diff --git a/gateway/esp32-rv/gateway.py b/gateway/esp32-rv/gateway.py index c211b12a2..e06d42e20 100755 --- a/gateway/esp32-rv/gateway.py +++ b/gateway/esp32-rv/gateway.py @@ -43,14 +43,15 @@ def do_fullclean_request(request): req_data = request.get_json() target_device = req_data['target_port'] req_data['status'] = '' + error = 0 # flashing steps... - if error ==0: - do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'fullclean']) + if error == 0: + do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'fullclean']) if error == 0: req_data['status'] += 'Full clean done.\n' except Exception as e: req_data['status'] += str(e) + '\n' - return jsonify(req_data) + return jsonify(req_data) def do_eraseflash_request(request): """ Erase flash the target device """ @@ -59,6 +60,7 @@ def do_eraseflash_request(request): target_device = req_data['target_port'] req_data['status'] = '' # flashing steps... + error = 0 if error == 0: error = do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'-p',target_device,'erase-flash']) if error == 0: @@ -115,7 +117,6 @@ def creator_build(file_in, file_out): fout.write("addi sp, sp, -8\n") fout.write("sw ra, 4(sp)\n") fout.write("sw a0, 0(sp)\n") - fout.write("jal ra, _rdcycle\n") fout.write("mv "+ data[1] +", a0\n") @@ -284,8 +285,16 @@ def do_monitor_request(request): kill_all_processes("gdbgui") process_holder.pop('gdbgui', None) - do_cmd(req_data, ['idf.py', '-p', target_device, 'monitor']) - + build_root = BUILD_PATH +'/build' + if check_uart_connection() != 0: + req_data['status'] += "No UART port found\n" + return jsonify(req_data) + if os.path.isdir(build_root) and os.listdir(build_root): + do_cmd(req_data, ['idf.py', '-p', target_device, 'monitor']) + else: + req_data['status'] += "No ELF file found in build directory.\n" + logging.info("No elf found.") + except Exception as e: req_data['status'] += str(e) + '\n' @@ -349,7 +358,7 @@ def do_stop_flash_request(request): def check_uart_connection(): """ Checks UART devices """ devices = glob.glob('/dev/ttyUSB*') - logging.debug(f"Found devices: {devices}") + logging.info(f"Found devices: {devices}") if "/dev/ttyUSB0" in devices: logging.info("Found UART.") return 0 @@ -455,7 +464,7 @@ def kill_all_processes(process_name): if result.returncode != 0: logging.error(f"Error al intentar matar los procesos {process_name}. Salida: {result.stderr.strip()}") else: - logging.info(f"Todos los procesos '{process_name}' han sido eliminados.") + logging.debug(f"Todos los procesos '{process_name}' han sido eliminados.") return result.returncode @@ -476,7 +485,7 @@ def kill_all_processes(process_name): def start_openocd_thread(req_data): target_board = req_data['target_board'] script_board = './openocd_scripts/openscript_' + target_board + '.cfg' - logging.info(f"OpenOCD script: {script_board}") + logging.debug(f"OpenOCD script: {script_board}") try: thread = threading.Thread( target=monitor_openocd_output, @@ -502,32 +511,33 @@ def start_gdbgui(req_data): req_data['status'] += f"GDB route: {route} does not exist.\n" return jsonify(req_data) req_data['status'] = '' - if check_uart_connection: - logging.info("Starting GDBGUI...") - gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '-x', route, 'monitor'] - sleep(5) - try: - process_holder['gdbgui'] = subprocess.run( - gdbgui_cmd, - stdout=sys.stdout, - stderr=sys.stderr, - text=True - ) - if process_holder['gdbgui'].returncode != -9 and process_holder['gdbgui'].returncode != 0: - logging.error(f"Command failed with return code {process_holder['gdbgui'].returncode}") - - except subprocess.CalledProcessError as e: - logging.error("Failed to start GDBGUI: %s", e) - req_data['status'] += f"Error starting GDBGUI (code {e.returncode}): {e.stderr}\n" - return None - except Exception as e: - logging.error("Unexpected error in GDBGUI: %s", e) - req_data['status'] += f"Unexpected error starting GDBGUI: {e}\n" - return None - - req_data['status'] += f"Finished debug session: {e}\n" - else: - req_data['status'] += f"UART not connected: {e}\n" + if check_uart_connection(): + req_data['status'] += f"No UART found\n" + return jsonify(req_data) + + logging.info("Starting GDBGUI...") + gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '-x', route, 'monitor'] + sleep(5) + try: + process_holder['gdbgui'] = subprocess.run( + gdbgui_cmd, + stdout=sys.stdout, + stderr=sys.stderr, + text=True + ) + if process_holder['gdbgui'].returncode != -9 and process_holder['gdbgui'].returncode != 0: + logging.error(f"Command failed with return code {process_holder['gdbgui'].returncode}") + + except subprocess.CalledProcessError as e: + logging.error("Failed to start GDBGUI: %s", e) + req_data['status'] += f"Error starting GDBGUI (code {e.returncode}): {e.stderr}\n" + return None + except Exception as e: + logging.error("Unexpected error in GDBGUI: %s", e) + req_data['status'] += f"Unexpected error starting GDBGUI: {e}\n" + return None + + req_data['status'] += f"Finished debug session: {e}\n" return jsonify(req_data) @@ -556,7 +566,10 @@ def do_debug_request(request): logging.debug('Killing OpenOCD') kill_all_processes("openocd") process_holder.pop('openocd', None) - + # Check UART + if check_uart_connection(): + req_data['status'] += f"No UART found\n" + return jsonify(req_data) # Check if JTAG is connected if not check_jtag_connection(): req_data['status'] += "No JTAG found\n" diff --git a/gateway/esp32-rv/main/syscall/test_panic.c b/gateway/esp32-rv/main/syscall/test_panic.c index ae440bab8..9dc1242a7 100644 --- a/gateway/esp32-rv/main/syscall/test_panic.c +++ b/gateway/esp32-rv/main/syscall/test_panic.c @@ -159,7 +159,6 @@ int read_buffer_string(char *dest, int length){ } void read_string(char *dest, int length) { - int value = 0; int i = -1; int sum = 0; while (i == -1){ diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index 26147e1a4b96822e993239a61c0f4e35dda09b18..c300e279b8b7c8a0c526377820496d6ebc10901c 100644 GIT binary patch delta 7799 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 diff --git a/gateway/esp32c3.zip b/gateway/esp32c3.zip index 449dbf03b01d0993e0d4711a93cadb245e31489d..6e5cc9e3fc26262bf6e1624af4c31114e24110b6 100644 GIT binary patch delta 7799 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 z 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 diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index 030c06300e9a6b8e83b9010376c00d43cc31222b..8a753b637744ad9d0217c1ea530232e0c324c03b 100644 GIT binary patch delta 7799 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 z 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 diff --git a/gateway/esp32h2.zip b/gateway/esp32h2.zip index 2880475f6f65b9a202d02e2c3d342e1f0a04b312..6c1a6f56d11509b6d9e2b2bdbf65183ff527873b 100644 GIT binary patch delta 7799 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 z zFOQSRApn5(H`4MWr-dOLE*_tYrS-bDflUKsl{|`s?@u9vk6#UK8|i{)J~TZT2f%?D zN37DK=8TZ0I;Qe3_awG@iR1gRu0~a0)8V)rhBGVA*i$1mVD6RcIw=9NgSr@UKNHPY?0XQ&6CvUh7JmV5< zZ|9(?`YSZwzMsw(-IsfWqVp4Z9}Czh>~b);20cp@~{Z&wML z#7w%|Y*J6=1PpG-hB150>y4lG?0gGbwBbaOOMoTkwz86_BVmg|G54r6HiqDC&)k== zakzd%$y|CgI)|v<gk^X1J^tk#oL$T!mnpdg z)|7^eIiL;C+BY5O$(DnlAt_byfYxm{lUl= zLgc?)JSuJ!1ss!M&qdAhxQ7?am&~yt-;Vj&GtuDW=IQ#^?QN^?m1dXBg)7z`A#dTz z*ATcfN#WQdX|dq?h3>A zVNwhv5heOrxXQ7B~g@e6}<4^ir@}wNOU)ui$Vp5mIfrpBFD^IG1!CS zY{jBQ>;g9hGdk$W7(AKS_2-r><*Mvy#M`)r^5djMeo}2xw1gCv(^6Ervqj-c2Ku%{o5`{Uf3iycD;z86=Q|oSC3`;p0&S;yWXPoE>y*ors}? z4C+%|>>_DfrS>9bK`s>oUP?u5TG0s#s{*(-o%BRSHfM$LVQ}ZCJm60XKHz``hlRIe zwWZb9AiI#xCci^l6_>5IGtES6xVt%T9Yn3sF4}8-Dbzy>D`n;H+Htt3KEV7q`#m}g zQMnQ4G1pfuIo$|ZJFGABm&utj*XlhUmVMOmIro##Gy|gq(+vsfxIDnI&RL1o%gFic z+{f`2HmB3N4d7yZ9yVTc=fhr}uWuFO-`kGyE}rJ;>`{5L8;efZkHv^3Hk{AljYvCe zA>K-j98#Kpiv-R?HBzr%`Y(tweVqE*gX&)yQM$(ssQp@{*{P7569{MAm0bu1C7XA$M4BYp!?+Y8al?R0( z=;mzX0Ov|v<*Bio31evepS@GU&*Q^`yL!9hL z58az2)4=d1f|#N?XVkPud-n8Us=~n$@sOk}UfHKm{=@|7g!KVR-=C_T51i89-!La! z^U`4L*W-D#5#_(5i`p$#LS$l{_%zReXPp*(&66ZC-5U0q97WVR$?5yfp?e5lV=X|0-@NCJ&cx#-9`Rx&i`{bY8Aj2r?h-bTso8l!UfGh1^n#k3 zWR_*6P1g_4Hzr*lGZfoA%eBMx_?)Ff%|k7ICqF{AgYpMHX3ao>B>uK(G9p|c{+YVTV)wv($XF2du7 zV3s);-DJP-2(NAFL5cD+@pW-TV`B6)zRoKB0f&UHWrBWK1%&>U4i(&urj8Z=JFGVppG6=dRYXM16qHA#3zJU9k?pCMBQ@~Lq zt4W=iWt(IgX6eUY{d0UBk{QhtL!ax2U8@=4aqUg1q83mgQwm`|gBpI348AIob?k2u zv2^8&fFx?|mSl8c$Mte=iecSp6NI#4QwIdkU{(PNK~{@G)qMG7uAKt{wL)n?X`I1r zfmU=J|9Q?+s9Nyq_?M>qX{FAPX>hZbuYW8WhlaYdbJ-cZ4x*^Q!6DKGjnOv`ps=(B z{%phwFOf#Z&P7a@Fzk9^;#t0v?l{rDas%VbgQjIyW_%`JwsUGt(&7a6EI(pGFMC`Q z<~)jYO7#^xWT$79;`>K;X`+Nm!#}Y~47!b~;GsW{#ibeVD;(U$Wv`aKy}?5_G@;ph zXVfttW+P4uTvA{TQmFRM)$d(ERr6>weT3?5E)Qk0!{d35bMHg$jfW|6qH^2~G8=^! z!Zd9@+e8r^^#xeqb<3k+@gZRG`kZh)n&AwcYolW7i!aO;V3`S0^Xqhmh0OHRtC)xA zHdeIKpKf=v^u|haF9iI4^#i-}2);sI&RUA*S1C=;^YioY@7K@fvTx&6h{qdaqxthM zL&~a`@SONmSqFC#ILt*KEta#!ib7bNvg!+Y?eP@U5<<*A^U#6@=>oCTK^&8l7KzD4 zGu!9ymccy!b6^jzAR)5cdq}jvQV@-VI=3n^^Yb$hu6QYfQ6gKj01T9mwfFV&_lu~s zf{U$KMH>}5v~tM1{95suYimWpwxGk!4j~$t5;xFz7X0e(D?|jlv*`Nn($X=RB%f~D z)kcz=Z%)}mj8SWzk0o$34{%n?>(C{#Ffd36md?9Q;w3Ku`PwKS$!%y(TcQ@IITX38 zjd_N;#2*=#dFk{!g0mIark?VOk|Hih{aotCJxuUa#>#pNRt^(#pk0v3ULwWw@Yl^M zi!OxMjE%e2hIl1!anGYKbNah(pPnvz&_j3O#8O62E!R@!*%ih^nwDJI5|m7c8dHSu zkZFr+i12IP zmN4gVs$A{dP|)*MXwqY-n4ZRQ7XSaZrt6YR~8r|glbs6N^_pB7Z>@(tM zhzw9b@&&sMt=*ao^+iZ{TDv<9`t)82)enGSiAUMFOmJ(I^BVHg9o3k=KsY71Jh1KL zk}=($X}%h=UHt2;o@v35p2;kp21QInAe6+ONF%iwUdgb%l(hAaIos5ClD-O>&C-}v zj1O{dn5##ovXJ>J#0-honU$|tc8OOUpzQbvp&Xf&3C-anvqLq3v7@c%A9aiSdyKb2 z_w{$%i{QAYR0#XQVACNQ(2tv|F0D3VPdDDDO~2>}k!u#yb2vCTZdx1!FdM2!J+{9; zm}|k5e6BLB<+-(bc9Px9BagXRI%+X9e)Up1p_XUg@gQ zG@UP1ow>}i-DW70`I%)KnWGd_0x^KXJ?=595FGzovr==`5g?0bhH1G@?%1_)Yx^utqb8 zFj9EC^n~$RfZ5DuPt^|+V^q4lq-a!-mid;y=y>>WfzgWq?3$Lw9DVj&J{?2VV_3Me=v z*)(aKnj{fP{v%xbjRk*vDK$3@v!qBT;ax>=G|6ubsP3g$e3iUVJqJea za`htm{DpAtq8gJ*Q=hApUh%9Tea)ebV`dg|%#v$i*Rxl87cojKlhUM-?!^2G1Y5 z0sJ9A`!pV>5Itfq+y{aeVy`~5PVP#WPsvlBruw#01dmLnA8TJ&V4kKKyE>QG>*Li7 zl8G=w(Ujjhhz#S9IZP{MeCM{d-6Cxxm|lpFFWgIj{B6)SSD##s6&HC-o5E|l7qRM4 z2j^80=T*`$sso~=uQ6bhzzQr@AkYvI%cmL^k=>zpkN_W}h3R|43CN9R;z>aGLIN8# zS^luP)*StQjm_Fp>Wwz`%RNU7mU0wJ2G#gTSgE;;jpuU2ca$JEZcQW$lsyyz62zgB z+Omj94z)QbKe&pu^)ACfSr=rj*H@GoV!z&;@+Gg+^-c~YrxIP3C>Y$(ZbX4R`f(6H zGPC%e1s&q#Mi{4p*$^8R+q$|Fq9V)`O{h*Q%50&f?n&^eBxOl`~frS z>?~dxTNMNn&_>9KtqWKUMIKX3?)p^4$9T@qRs$!z;#4d>TlZ8$>2@`0U5@EOAgNt( zjOR$yKBb+NW4KB9AF1v)Eaa*B_L5HYfrV|mit15lfQY`pfa@2Un@O(o*6_fO| zec`u((dj58QaAg?ExD>F3~?{D_y%8$sn+ZqhV@ieP#XxTqKdmjZRuGcB|5ZYmsya! zTr7qtFX~VktC4y|wePY_SAV9`))4}{eo-I(KB^zYK&(!3T?^zPvWu<57kBn<$x_zW zyOFgOz~xBr^aq!E%D*?#Sg!bl864(gF=jML$6`d|oT$yLmttjGD>mcAqO+I|tmi(& zY;&V;RA@Y?%W81u+jWdsANctlUIPQCxHwva>OF>XB?bnkIJ0^|I#9FFys-jfXzqz7(SZhXsA0jCG{^ zM9r;3f9Y}~aLl=g9iDKa<&Z6i{XzgC*v-ST!~+lP>@tntOe%A%LB<=Te{06x?kL1YEo;=gsq}j zz0($4E{4NbJ~QkP+j4X_5bv=nI9TXc`_rPk>Ez_N{N>u=)t_o(O^N2z?)UeFu$AX{ z%wIBsA+XCq6SRUq-C>JZK=r5eX0MQ$>72h)t?e!oG(saE^|R=kG5={&9h>AHYN=&Z zImeA`+&drsIuLS9XrK~u5%mja3jrhn=AZ_~g^!Q0YoM-h_J+G&;YOns$hBj(c3!}4 zKFCG?McRN!eqSTsPH2Qvd{cafY#gP*z+E04vWT*06< z)f_CVHPRFKsHDn7L#G?a@n9tP-QGz6FK)Arg@Lra-;*?LR%Bz8=_?Lcmj)UKI(-I< zoLavGmm7O#TfEYJg&8C|UxNy9+Kc23i|q#YH(c@0POsOmK(wL9Dv1^7b=V5m(Xko6 z-$<3YyQrEWf-^!nFNxPVNOXRRHi52>)ke3N=<_gO;iiL$Q@n8!Ht@ zfY4qI;QzI{1gnWa4;BBVp&M!>2ohv)P%|=CD80HQf;kl&G?0oIdZ)wyEmtQ&D4>Od zcGFToO;yPL${|648Wad0>ENJ=bmUNJ4M~6~nnv)i+|YDQ0m}b( lQVIu$14s04qYL;OVWD2opPD2He@CZK6fG(wpyGd0{{v?ys{#N3 diff --git a/gateway/esp32s2.zip b/gateway/esp32s2.zip index 890213714488b5183cca5c546a6e813365f280e2..f1d38e65e728449416b1fbaea51523d9dda55704 100644 GIT binary patch delta 96 zcmaDif$`l0#tHh&vOf1F|J9S57+}o&FaF-dw%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) fu*5fg8AdQe)G&Y<%*ZgQVrSkIesA+r>rNg3QEMxm delta 96 zcmaDif$`l0#tHh&|GRHb{;MZ9F~FGF#_!t1w%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) eu*5fg8AdQe)G&Y<%*ZgQVrS+DYJO_n$pZk-lqVrNg3QEMxm delta 96 zcmaDif$`l0#tHh&|GRHb{;MZ9F~FFaf70!VZM#9#W*5c{I$*|kU1mn8njnzC Date: Thu, 2 Oct 2025 13:38:51 +0200 Subject: [PATCH 6/9] fix logging debug calls --- gateway/esp32-rv/gateway.py | 4 ++-- gateway/esp32c2.zip | Bin 20783 -> 20778 bytes gateway/esp32c3.zip | Bin 20783 -> 20778 bytes gateway/esp32c6.zip | Bin 20783 -> 20778 bytes gateway/esp32h2.zip | Bin 20783 -> 20778 bytes 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gateway/esp32-rv/gateway.py b/gateway/esp32-rv/gateway.py index e06d42e20..9e9044277 100755 --- a/gateway/esp32-rv/gateway.py +++ b/gateway/esp32-rv/gateway.py @@ -293,7 +293,7 @@ def do_monitor_request(request): do_cmd(req_data, ['idf.py', '-p', target_device, 'monitor']) else: req_data['status'] += "No ELF file found in build directory.\n" - logging.info("No elf found.") + logging.error("No elf found.") except Exception as e: req_data['status'] += str(e) + '\n' @@ -358,7 +358,7 @@ def do_stop_flash_request(request): def check_uart_connection(): """ Checks UART devices """ devices = glob.glob('/dev/ttyUSB*') - logging.info(f"Found devices: {devices}") + logging.debug(f"Found devices: {devices}") if "/dev/ttyUSB0" in devices: logging.info("Found UART.") return 0 diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index c300e279b8b7c8a0c526377820496d6ebc10901c..7216b61f81bbacfb3a7b86b6738218c26e4020ff 100644 GIT binary patch delta 2542 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 E0DIsB$^ZZW delta 2536 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 diff --git a/gateway/esp32c3.zip b/gateway/esp32c3.zip index 6e5cc9e3fc26262bf6e1624af4c31114e24110b6..f88aa226c9fd4682a3cbac5df1dbb84e10dc5580 100644 GIT binary patch delta 2542 zcmVf40?@l;@{jV*?^gc#J!=-fP1R!eoAJ6F|MOA)0-;3f3Oh#>?bzA_ zi_ciXJy2J&Ivj8T<>pdfAKFE1zZI$Pp;WcURS<6WA=?E>x@gAn8+gyJ9X8C8Wp2|( zKf*6kCU0vms5#!27#oo7Dzkt1_2mF!_{L#p6pP7E?vcZ;=4%o9;FpSML8uA>oNII$ zUmsCOs<7RMYG^{n4${ViYR_Q#=RS4p(KUD1K7gkOS+>3z{_qDCESUk-)S_-qJ^Pq_ zRDV4dwJ@uM<

zTtnwBP$LcFY0_0Fk;?J`o?krXiEbkr6$)HZT4aB4E8~gog`n^p zyY1NJPygz)tW$(5o1w;Ka}_qnb0oV(3jMsxyji<`{yaK)xuG9FSu8L@>$6)c5-TyW z)G4klp9mDm)V#O5qJvXS-sRp7pBKzXKhQ(}fhL0MxQKKWgGs_ct8e$d)?IQs+N61A z;Xytd<7tcsyYw*X>W+UTEBaPAi<6XB!Z)-flnvQX3Cr0K}|Ev3BLl4rET9A^KT)W;m>`M%D%}wHLD5f(0n^{_o zQ^eHzSgph!ypV!dtYMq{X;1liwu)=*V5-vM^4LZe6`I;2W}-(2gtA4TgqqH_T?7Fj^1v%(2M;80%Zq!XWQD6rAad%yPsnE_qjH*&7}yXKu6V zSa17vaP>VN8<6On`{-FWhbF732>;6aM?J zhyZ>up>KcfL~2?BkJxg>L57f~cqzO0{J;Nq;?~RYs8hPmI!#a%34RI8W631LZ}PyB zf?Zvl30Q*uR;!479@T%sKwypoCNQ;@f_bYC>~CzA@+GrxKbHBqJ-mCoGoKtC-#yv@ z?mfI`_Q#LZJXT&D&eJ)MBI$n`s?B-wVeUGdGT)LvtWXw;2b`?h z2v*-VYlfzzKbTyvHyz+jtv7|9^8~^+5SSU`2C7U_Z&Wvy23bsBQ#}@oT33h z05uQ)3bx<{UYXUwJ2ZTcjFX8Z0?3ffy)}s-ha=O~>Lk$pKeCTDv*p2r{5g-?m7~!- zMKOOWk~w;Qs4lQ&J7q~vP2F~fZCgZdct~);s(6eWV&UPxWm{&Z;9WNKqA>7|(FP##}t;|VSrG{&W|rbvY^ebbW`f9hFq z>95ihxm?AngoQx?^0;jwSw4B;=&LApu2K;4{OESGJP?%MNh~Tc$D3vHEd_GngV`0Z zwtJv)%Mn4J6_gE8fr0!POz@{OySC1v>6ep%>GE2Sb&;lI2dm=xyO!=qa%k)VNkV_W zJ}Nc?H;fzmMs=*Xn6vk%@Nb!@yIyf~=$MECkHdOqQ0G(#cS$)liH6FThB#chWYp8# znj(xGdWz-M7w@#Gi^`g)2CC~lmivI}w@LHdhU|qb_bW%;Rpz;K9=1s1m3NR;qfHb1 zdUs2jf_Ik?%ViB!JxtaJ2YOcgt%-l!74c@55@E=18_Oe>doY^>(u7<!p2CSSct zpz5m16U&y$UG4NB;j$-#@R&waZxh>*l&zxmVz#X)9d4=YHWR4tiFdgo?rhf2@|`9v zvDjhK_Eh{~+?!OsRmqC0a(n*+{7d30-wsRniQoM0eqH0sDv6y&cefeJ7=8t&Ah6O$ zlf6VA0lkymL|}ij1Gx#l2E)MFy3bX-ntwrv(A3_oF}e|gD39*o@C_JQ`Kf7HHDA#- zHuCoSxy@dN_BMvCtp+M(rkgUCdPDHrZm7}1Llv0R`PSIEQ+F7h>Ut#Bk#z40tzaIW z@?4sZb{zEyakD8_ zg1a*wanM8FJN=NP@2zq}FTLQR7+0HMEi%3+OQ_~c`t0dlZB40SV}D!m^OR1vrfP0| z&zo7rl;(`5dzG(k!NN8hX$%{-YtzVp%X9)+bWtY1n-P;!tkR9f+4DAM9vjHM8ULaC#w zsqJl9y;ck|R@l&OgCr__lV;yZea=!fg}N@OEt;=H4044XZMUUV)UfIgPscwFPR<6`LwO3HCREPbAFY?%&fjY>7_kGk{~f)gf|XxS z(fJco=nsE$X?kR=k8_#`SSBKq{YhQ3AxX?vSs1zLB1<{%s{XVsui((%h%Wf3?|jm| z=aLzfOEs{gMt5UKO{z+@sfAtlze;-EC6k;M_Do;9np6SIZWO_UDm8Vzv$~f|Qi6di zlHz-@&np&&W4n=1w4zlhX=zf^U0urVbY~?|MSp)(0;q~DYWN-PF@M)rExFCF0wZew zSyNlQNUB6GRV-`ltN`APR+?8&XUmJMh|q5}p)v{t8tD&{E_$>ZNix{05L2Hg5gmV2 zy^FP$j<)ehd$9Z_rdoq*-i<)i^(rR+jHQt|pzGU*F8vSUN=%~q-yVK@*u$3~!u%+~ z7v~D-*JBW;@(%8Q0kca;f(Q-DY(iVxfcZ0o6aWAdliE-$0xV>aF%y#;Q4R)1NB{r; E0DIsB$^ZZW delta 2536 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 diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index 8a753b637744ad9d0217c1ea530232e0c324c03b..44bcad73219c84d3cd66eb1e4b8619ec952c107e 100644 GIT binary patch delta 2542 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 E0DIsB$^ZZW delta 2536 zcmV0kD8G4Tow%TZp)lgozXY01=aoGad%*U*2f#U$e0@j|zWU!(lv4 zDA(c9w3-wBVi#!JUBOqMQvZ3EO#V^*`Q55Nzh}wfw<%ieelcE`;(tEMUm%ibU18^d zq8(d%T=5x8xCiP+R!0Lapxj*Q>qEN;?YAQJJ(Q|;xC+9}K4iNfNf*sHegp6MwZn#4 zvdnGTXh--(s^o3m1vRJJ5<`CjvR!2szrGwm4Bt5Hj6yN_$vtw|)qE{NAN*1gEC^LV zfOC!R;_CwnNfmbcPzg=Q&_UXmP~90U|JjVkP6Wom$k( zsV5(^kLs_-q7r76kQ`cglxyhR1DYqeM2SR}&+q)&F;8!?D+Trtp8R-Uk=swUwa2*$su41rAIA`_U-q*TEPRE)w z&n!F0XJb5!@m!Y~(tBJYiF&f+t@!#VY@biCle{ASMCZ-l7q$SU;cMkg!qg->7I2($ojQ?hq zR^t>gu|8HSu?H`t*cB_-CV$#fex9x3T05Akw75L9ktKzurihv7(E*`s5h$USvu&3` zQ|lwndURoeBFld;!Qx`0j1i3113hzWF#yK;7Bw))n+^qMIwP|faf?gd)miq2N6MMo ztU1=(ejQwWhsOpaI_Exm*3F^GYAV9N^8Qhev5i46GW=497mZ{7fW1qizu}*q4RHYb zbyDe63dFCZI4ccaMIRpGQ0*i&{vUxA`PCjWW5V@OA$_zq z*20a43w1tytMd=sUy%>d?p{(--S#!bIfT=NxhC&G4xy&@r_q%hfU%21`YH@7gB{n( zQF+Bd1n_^034LcLQqvN6#Fi@#GK4I}OWD2W|NXxcw_c7%ozi92X@a6i@GD>*OC}k9 zj|Y|%?CRo7z!LPgT1DjZsQeQK0#h6?fvL3=%v*h6e`B+hFPVM&vCPly;oak%`Q+&M z?$HKt@8LbOKYpYRKlV@0A0KV2B;oqjvGU?@p3Z-H6iL@mZOxMpbJyXN`Ih`)eX>wI z;AGV{u==K1Gc+ar!Q^_q=>TtPy(#pZClIzFmq)uvXVetI?^is!=kSTt6~+M^p(%sh z6b%3ZsCoETumvyh%B&9Fq2YUEoJ=GUK!$AYtw{tq9GR|GCxPz&k$tq8Ee|H-&w1Rg z9F2eGDT+~%%+d2hb$ua{y;+ah|yLw*ZZ#bewM3lIM-+cGl+@3Ns6g@JdB zUPv1N;L`?B_7Ix^ebv{Ek{}W0a#clx24YY|fHmfD5rWbn5U^?tEN>C4X&>Akn{9KA zg$qGULHPIo0eV0+Sh-~6PnJCO8bYI^CK`WE@k^_L^7u*{PjJzoF)ocYMJjyho1V1z zQ_q4+f0d@le$88JA>d6a7UqrEUm4cAxN4J~hfuQ_GVo``W-mH>usgDaE z%&vg7-2;tVjtKg!plpZ=4CK#Xfba}1Ex=2&9gGF)uO-pwqIW&KE zfh3_{9~GN{8^(=&qc~Pv%h~%=__s{dU9Y$|bWB8n$6-A)sB-jYz68U-*}BhFyqbSKh|ttttueX~f+&x!;PCwyS^24H zSv6nKHa7D1>$%NVhW0Lot(^ucWu}WVms&&cyKbn_!b269)cMxfw^Mf*o$7id){%7Q zlaNIee|Mu!NN^=nm&bv?-3*5#%(R@lY6_d4zkJZGc-HxY`73k?}=YLN#B}XHV~GYf2RxyW5JNr}VisRdee*-pned zG-o{Bt9)$>7Pi?)W7x1=n??p)rW44bi!%Ame~g%%VwG+*=GGh1rN*z^AZEwr! zwPKL5!iH`eBvI*_G}}(FpR`kB^`IXqx zl)3=oAe<|^)o*QlI{tBRayGag%2W6>p>p2-Xuafi{#J{@h#j!~@8}g3to(9{&i9Cp zj=-*U0Fl;$XY(Ww{aXtrS$9t7`|@j>e;{bU049GO2KfrbYu#%y^fz>`E{8yYd?O2x zL4TM_(<5VjoYO?WG7*_)TV7*Dgnp|Dl~EwjNPn1g(WBi+lEGeunEE`4==h^*U97cq zw2e>NgXQ-y)f!y$ZUmyPS26i#CoGN30bSodbm@N(S7H*?|Mu|P!ydi@5#~n;zBWg{ y9D_KOcX0m;vqngQ2n~m7LR*Nql7xvA000q_)le(}?U67PlNM1921`f)0002mfbci~ diff --git a/gateway/esp32h2.zip b/gateway/esp32h2.zip index 6c1a6f56d11509b6d9e2b2bdbf65183ff527873b..979f0bab02db7d5a0cbd715db5fa489fea4fcfd3 100644 GIT binary patch delta 2542 zcmVf40?@l;@{jV*?^gc#J!=-fP1R!eoAJ6F|MOA)0-;3f3Oh#>?bzA_ zi_ciXJy2J&Ivj8T<>pdfAKFE1zZI$Pp;WcURS<6WA=?E>x@gAn8+gyJ9X8C8Wp2|( zKf*6kCU0vms5#!27#oo7Dzkt1_2mF!_{L#p6pP7E?vcZ;=4%o9;FpSML8uA>oNII$ zUmsCOs<7RMYG^{n4${ViYR_Q#=RS4p(KUD1K7gkOS+>3z{_qDCESUk-)S_-qJ^Pq_ zRDV4dwJ@uM<

zTtnwBP$LcFY0_0Fk;?J`o?krXiEbkr6$)HZT4aB4E8~gog`n^p zyY1NJPygz)tW$(5o1w;Ka}_qnb0oV(3jMsxyji<`{yaK)xuG9FSu8L@>$6)c5-TyW z)G4klp9mDm)V#O5qJvXS-sRp7pBKzXKhQ(}fhL0MxQKKWgGs_ct8e$d)?IQs+N61A z;Xytd<7tcsyYw*X>W+UTEBaPAi<6XB!Z)-flnvQX3Cr0K}|Ev3BLl4rET9A^KT)W;m>`M%D%}wHLD5f(0n^{_o zQ^eHzSgph!ypV!dtYMq{X;1liwu)=*V5-vM^4LZe6`I;2W}-(2gtA4TgqqH_T?7Fj^1v%(2M;80%Zq!XWQD6rAad%yPsnE_qjH*&7}yXKu6V zSa17vaP>VN8<6On`{-FWhbF732>;6aM?J zhyZ>up>KcfL~2?BkJxg>L57f~cqzO0{J;Nq;?~RYs8hPmI!#a%34RI8W631LZ}PyB zf?Zvl30Q*uR;!479@T%sKwypoCNQ;@f_bYC>~CzA@+GrxKbHBqJ-mCoGoKtC-#yv@ z?mfI`_Q#LZJXT&D&eJ)MBI$n`s?B-wVeUGdGT)LvtWXw;2b`?h z2v*-VYlfzzKbTyvHyz+jtv7|9^8~^+5SSU`2C7U_Z&Wvy23bsBQ#}@oT33h z05uQ)3bx<{UYXUwJ2ZTcjFX8Z0?3ffy)}s-ha=O~>Lk$pKeCTDv*p2r{5g-?m7~!- zMKOOWk~w;Qs4lQ&J7q~vP2F~fZCgZdct~);s(6eWV&UPxWm{&Z;9WNKqA>7|(FP##}t;|VSrG{&W|rbvY^ebbW`f9hFq z>95ihxm?AngoQx?^0;jwSw4B;=&LApu2K;4{OESGJP?%MNh~Tc$D3vHEd_GngV`0Z zwtJv)%Mn4J6_gE8fr0!POz@{OySC1v>6ep%>GE2Sb&;lI2dm=xyO!=qa%k)VNkV_W zJ}Nc?H;fzmMs=*Xn6vk%@Nb!@yIyf~=$MECkHdOqQ0G(#cS$)liH6FThB#chWYp8# znj(xGdWz-M7w@#Gi^`g)2CC~lmivI}w@LHdhU|qb_bW%;Rpz;K9=1s1m3NR;qfHb1 zdUs2jf_Ik?%ViB!JxtaJ2YOcgt%-l!74c@55@E=18_Oe>doY^>(u7<!p2CSSct zpz5m16U&y$UG4NB;j$-#@R&waZxh>*l&zxmVz#X)9d4=YHWR4tiFdgo?rhf2@|`9v zvDjhK_Eh{~+?!OsRmqC0a(n*+{7d30-wsRniQoM0eqH0sDv6y&cefeJ7=8t&Ah6O$ zlf6VA0lkymL|}ij1Gx#l2E)MFy3bX-ntwrv(A3_oF}e|gD39*o@C_JQ`Kf7HHDA#- zHuCoSxy@dN_BMvCtp+M(rkgUCdPDHrZm7}1Llv0R`PSIEQ+F7h>Ut#Bk#z40tzaIW z@?4sZb{zEyakD8_ zg1a*wanM8FJN=NP@2zq}FTLQR7+0HMEi%3+OQ_~c`t0dlZB40SV}D!m^OR1vrfP0| z&zo7rl;(`5dzG(k!NN8hX$%{-YtzVp%X9)+bWtY1n-P;!tkR9f+4DAM9vjHM8ULaC#w zsqJl9y;ck|R@l&OgCr__lV;yZea=!fg}N@OEt;=H4044XZMUUV)UfIgPscwFPR<6`LwO3HCREPbAFY?%&fjY>7_kGk{~f)gf|XxS z(fJco=nsE$X?kR=k8_#`SSBKq{YhQ3AxX?vSs1zLB1<{%s{XVsui((%h%Wf3?|jm| z=aLzfOEs{gMt5UKO{z+@sfAtlze;-EC6k;M_Do;9np6SIZWO_UDm8Vzv$~f|Qi6di zlHz-@&np&&W4n=1w4zlhX=zf^U0urVbY~?|MSp)(0;q~DYWN-PF@M)rExFCF0wZew zSyNlQNUB6GRV-`ltN`APR+?8&XUmJMh|q5}p)v{t8tD&{E_$>ZNix{05L2Hg5gmV2 zy^FP$j<)ehd$9Z_rdoq*-i<)i^(rR+jHQt|pzGU*F8vSUN=%~q-yVK@*u$3~!u%+~ z7v~D-*JBW;@(%8Q0kca;f(Q-DY(iVxfcZ0o6aWAdliE-$0xV>aF%y#;Q4R)1NB{r; E0DIsB$^ZZW delta 2536 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 From fb4573aaa2c3362bbf0ef7156263b558d8e01b9f Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Tue, 21 Oct 2025 12:26:08 +0200 Subject: [PATCH 7/9] Updated pre-requisites with instructions to create a virtual environment --- .../simulator/creator_uielto_target_flash.js | 9 ++- gateway/esp32-rv/README.md | 48 ++++++++++++++- gateway/esp32-rv/gateway.py | 2 +- .../esp32-rv/problems/TROUBLESHOOTING_ARCH.md | 57 ++++++++++++++++++ gateway/esp32c2.zip | Bin 20778 -> 22723 bytes gateway/esp32c3.zip | Bin 20778 -> 22723 bytes gateway/esp32c6.zip | Bin 20778 -> 22723 bytes gateway/esp32h2.zip | Bin 20778 -> 22723 bytes gateway/esp32s2.zip | Bin 18542 -> 18542 bytes gateway/esp32s3.zip | Bin 18542 -> 18542 bytes 10 files changed, 110 insertions(+), 6 deletions(-) create mode 100644 gateway/esp32-rv/problems/TROUBLESHOOTING_ARCH.md diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index 995b278a4..77f52384e 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -699,7 +699,7 @@ ' ' + ' ' + ' ' + - ' ' + + ' ' + ' ' + ' ' + ' ' + @@ -714,7 +714,12 @@ '

' + ' How to change Python environment if you have another installed:' + ' ' + - 'sudo update-alternatives --set python3 /usr/bin/python3.9' + + 'python3.9 -m venv ~/.espressif/python_env/idf5.3_py3.9_env\n' + + 'source ~/.espressif/python_env/idf5.3_py3.9_env/bin/activate' + + ' ' + + ' Check and erase if you have newer python environment versions (by default it will choose the newer one):' + + ' ' + + 'rm -rf ~/.espressif/python_env/idf5.3_py3.10_en\n' + ' ' + ' ' + ' ' + diff --git a/gateway/esp32-rv/README.md b/gateway/esp32-rv/README.md index f849e2cd4..12c624737 100644 --- a/gateway/esp32-rv/README.md +++ b/gateway/esp32-rv/README.md @@ -1,3 +1,45 @@ -get_idf -idf.py set-target [esp32c3] -idf.py build +# CREATOR ESP-32 Driver + +By Elisa Utrilla Arroyo + +## Installation and execution + +1. Install [Python 3.9](https://www.python.org/downloads/release/python-3913/). + +- In Ubuntu: + ```bash + sudo apt install software-properties-common + sudo add-apt-repository ppa:deadsnakes/ppa + sudo apt install python3.9 python3.9-venv python3.9-distutils + ``` +- With [uv](https://docs.astral.sh/uv): + ```sh + uv python install 3.9 + ``` + +3. Install the ESP-IDF framework, following [espressif's documentation](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32/get-started/linux-macos-setup.html)To ensure Python 3.9 is used for the installation, first create a virtual environment in `~/.espressif/python_env/idf5.3_py3.9_en`, and activate it, before executing the `install.sh` script. + + ```bash + python3.9 -m venv ~/.espressif/python_env/idf5.3_py3.9_en + source ~/.espressif/python_env/idf5.3_py3.9_env/bin/activate + + + ``` + ⚠️ If you have a newer virtual environment version for espressif, by default it will go there. Erase the virtual environments that you are not using by doing (for example): + + ``` + rm -rf ~/.espressif/python_env/idf5.3_py3.10_en + rm -rf ~/.espressif/python_env/idf5.3_py3.13_env + ``` +4. Install the requirements and move variables: + + ``` + cd ~/esp/v5.3/esp-idf + ./install.sh + . ./export.sh + ``` +5. Execute the gateway web service: + + ``` + python3 gateway.py + ``` diff --git a/gateway/esp32-rv/gateway.py b/gateway/esp32-rv/gateway.py index 9e9044277..0c21f69e7 100755 --- a/gateway/esp32-rv/gateway.py +++ b/gateway/esp32-rv/gateway.py @@ -516,7 +516,7 @@ def start_gdbgui(req_data): return jsonify(req_data) logging.info("Starting GDBGUI...") - gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '-x', route, 'monitor'] + gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '--gdbinit', route, 'monitor'] sleep(5) try: process_holder['gdbgui'] = subprocess.run( diff --git a/gateway/esp32-rv/problems/TROUBLESHOOTING_ARCH.md b/gateway/esp32-rv/problems/TROUBLESHOOTING_ARCH.md new file mode 100644 index 000000000..32a8a7ede --- /dev/null +++ b/gateway/esp32-rv/problems/TROUBLESHOOTING_ARCH.md @@ -0,0 +1,57 @@ +# Troubleshooting +Logs are generated on the `openocd.log` file. + +Sometaimes, you can just unplug, replug and run again, or refresh the GDBGUI +page. If it shows another type of issue, please send it to the official page. +Feedback makes us grow :). + + +## Error: `gdb_exception_error` -- `libusb_bulk_write error: LIBUSB_ERROR_NO_DEVICE` + +This problem happens because the user doesn't have permission to write to +the JTAG USB device, located in `/dev/bus/usb/003/XXX` (where `XXX` is a +pseudo-random number). + +You can check this by doing: + +```sh +ls -lah /dev/bus/usb/003 +``` + +```sh +total 0 +drwxr-xr-x 2 root root 180 Oct 1 11:03 . +drwxr-xr-x 6 root root 120 Oct 1 10:36 .. +crw-rw-r-- 1 root root 189, 256 Oct 1 10:41 001 +... +crw-rw-r-- 1 root root 189, 256 Oct 1 10:41 022 +``` + +You can see the user and group are `root`. + +To change this, we can configure udev so that, when it mounts the JTAG +device it gives it the group permissions it typically gives to all other +devices (`uucp` for Arch, `dialout` for Ubuntu). + +> [!TIP] +> Obviously, you must make sure your user belongs to that group. + +> [!TIP] +> To see the device's id, run `lsusb`: +> +> ``` +> ... +> Bus 003 Device 022: ID 303a:1001 Espressif USB JTAG/serial debug unit +> ... +> ``` +> +> Therefore, the vendor id is `303a`, and the product id is `1001`. + +Create a new `/etc/udev/rules.d/99-Espressif.rules` file (with `sudo`!), containing: + +```udev +# Set default permisions when mounting Espressif USB JTAG/serial debug unit +# (set to `uucp' usergroup) + +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", GROUP="uucp" +``` diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index 7216b61f81bbacfb3a7b86b6738218c26e4020ff..eed34a4b98e1a9c6dfee16dcdd0beada77bc4f82 100644 GIT binary patch delta 7320 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 diff --git a/gateway/esp32c3.zip b/gateway/esp32c3.zip index f88aa226c9fd4682a3cbac5df1dbb84e10dc5580..84feeaf864e628198c53c7dcd9e8c46faab2b1b2 100644 GIT binary patch delta 7320 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 diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index 44bcad73219c84d3cd66eb1e4b8619ec952c107e..12aaca2ce0eb5a93ee542cb07b42a711969448ae 100644 GIT binary patch delta 7320 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 diff --git a/gateway/esp32h2.zip b/gateway/esp32h2.zip index 979f0bab02db7d5a0cbd715db5fa489fea4fcfd3..4ef946f9489c3e24bcb01ceda4c7727c894536af 100644 GIT binary patch delta 7320 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 diff --git a/gateway/esp32s2.zip b/gateway/esp32s2.zip index f1d38e65e728449416b1fbaea51523d9dda55704..433172538ca9752ff3ccbb36434fbe9e8e1c21ec 100644 GIT binary patch delta 96 zcmaDif$`l0#tHh&aZ%qV|J9S57+}miJNo;?w%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) fu*5fg8AdQe)G&Y<%*ZgQVrR~b`o8(8btex1BFHKp delta 96 zcmaDif$`l0#tHh&vOf1F|J9S57+}o&FaF-dw%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) fu*5fg8AdQe)G&Y<%*ZgQVrSkIesA+r>rNg3QEMxm diff --git a/gateway/esp32s3.zip b/gateway/esp32s3.zip index 32cb4e21d244bf9ba1cb3c5c763d86a7a5eaa7fa..7b4157b0cbfb869d80e716b32d461ab555202cbb 100644 GIT binary patch delta 96 zcmaDif$`l0#tHh&aZ%qV|J9S57+}miJNo;?w%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) fu*5fg8AdQe)G&Y<%*ZgQVrR~b`o8(8btex1BFHKp delta 96 zcmaDif$`l0#tHh&vOf1F|J9S57+}o&FaF-dw%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) fu*5fg8AdQe)G&Y<%*ZgQVrSkIesA+r>rNg3QEMxm From 0f959728d5c523036d84bd0d9a26f08bde2ee16d Mon Sep 17 00:00:00 2001 From: Diego Camarmas Date: Thu, 23 Oct 2025 18:17:56 +0200 Subject: [PATCH 8/9] Fixed messages and driver --- .../simulator/creator_uielto_target_flash.js | 32 ++++--- gateway/esp32-rv/gateway.py | 83 ++++++++++-------- gateway/esp32-rv/main/syscall/test_panic.c | 1 - gateway/esp32c2.zip | Bin 20712 -> 22723 bytes gateway/esp32c3.zip | Bin 20712 -> 22723 bytes gateway/esp32c6.zip | Bin 20712 -> 22723 bytes gateway/esp32h2.zip | Bin 20712 -> 22723 bytes gateway/esp32s2.zip | Bin 18542 -> 18542 bytes gateway/esp32s3.zip | Bin 18542 -> 18542 bytes 9 files changed, 70 insertions(+), 46 deletions(-) diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index b5c7a7a9c..7741945d5 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -285,9 +285,6 @@ if (JSON.stringify(data, null, 2).includes('No UART port found')) { show_notification('Error flashing: Not found UART port', 'danger'); } - if (JSON.stringify(data, null, 2).includes('cr_ functions are not supported in this mode')) { - show_notification('CREATino code in CREATOR module. Make sure the "Arduino Support" checkbox is selected', 'danger'); - } } ) ; //Google Analytics @@ -342,6 +339,9 @@ if (JSON.stringify(data, null, 2).includes('No UART port found')) { show_notification('Error: Not found UART port', 'danger'); } + if (JSON.stringify(data, null, 2).includes('No ELF file found')) { + show_notification('Error: Built proyect not found', 'danger'); + } } ) ; //Google Analytics @@ -361,9 +361,17 @@ } ; this_env = this; - gateway_remote_monitor(this.flash_url + "/debug", farg).then( function(data) { - this_env.debugging = false; - //show_notification(data, 'danger') ; + gateway_remote_monitor(this.flash_url + "/debug", farg).then( function(data) { + this_env.debugging = false; + if (JSON.stringify(data, null, 2).includes('No ELF file found in build directory')) { + show_notification('Error: Not found proyect to debug', 'danger'); + } + if (JSON.stringify(data, null, 2).includes('No JTAG found')) { + show_notification('Error: JTAG no connected. Check wire installment', 'danger'); + } + if (JSON.stringify(data, null, 2).includes('No UART found')) { + show_notification('Error: UART no connected. Check wire installment', 'danger'); + } } ) ; //Google Analytics @@ -691,7 +699,7 @@ ' ' + ' ' + ' ' + - ' ' + + ' ' + ' ' + ' ' + ' ' + @@ -706,7 +714,12 @@ '
' + ' How to change Python environment if you have another installed:' + ' ' + - 'sudo update-alternatives --set python3 /usr/bin/python3.9' + + 'python3.9 -m venv ~/.espressif/python_env/idf5.3_py3.9_env\n' + + 'source ~/.espressif/python_env/idf5.3_py3.9_env/bin/activate' + + ' ' + + ' Check and erase if you have newer python environment versions (by default it will choose the newer one):' + + ' ' + + 'rm -rf ~/.espressif/python_env/idf5.3_py3.10_en\n' + ' ' + ' ' + ' ' + @@ -741,7 +754,6 @@ ' ' + ' ' + ' ' + - ' Install Openocd
' + ' Install the GDB web interface: pip3 install gdbgui ' + '
' + '
' + @@ -1204,4 +1216,4 @@ return err.toString() + "\n"; } - } + } \ No newline at end of file diff --git a/gateway/esp32-rv/gateway.py b/gateway/esp32-rv/gateway.py index c211b12a2..0c21f69e7 100755 --- a/gateway/esp32-rv/gateway.py +++ b/gateway/esp32-rv/gateway.py @@ -43,14 +43,15 @@ def do_fullclean_request(request): req_data = request.get_json() target_device = req_data['target_port'] req_data['status'] = '' + error = 0 # flashing steps... - if error ==0: - do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'fullclean']) + if error == 0: + do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'fullclean']) if error == 0: req_data['status'] += 'Full clean done.\n' except Exception as e: req_data['status'] += str(e) + '\n' - return jsonify(req_data) + return jsonify(req_data) def do_eraseflash_request(request): """ Erase flash the target device """ @@ -59,6 +60,7 @@ def do_eraseflash_request(request): target_device = req_data['target_port'] req_data['status'] = '' # flashing steps... + error = 0 if error == 0: error = do_cmd_output(req_data, ['idf.py','-C', BUILD_PATH,'-p',target_device,'erase-flash']) if error == 0: @@ -115,7 +117,6 @@ def creator_build(file_in, file_out): fout.write("addi sp, sp, -8\n") fout.write("sw ra, 4(sp)\n") fout.write("sw a0, 0(sp)\n") - fout.write("jal ra, _rdcycle\n") fout.write("mv "+ data[1] +", a0\n") @@ -284,8 +285,16 @@ def do_monitor_request(request): kill_all_processes("gdbgui") process_holder.pop('gdbgui', None) - do_cmd(req_data, ['idf.py', '-p', target_device, 'monitor']) - + build_root = BUILD_PATH +'/build' + if check_uart_connection() != 0: + req_data['status'] += "No UART port found\n" + return jsonify(req_data) + if os.path.isdir(build_root) and os.listdir(build_root): + do_cmd(req_data, ['idf.py', '-p', target_device, 'monitor']) + else: + req_data['status'] += "No ELF file found in build directory.\n" + logging.error("No elf found.") + except Exception as e: req_data['status'] += str(e) + '\n' @@ -455,7 +464,7 @@ def kill_all_processes(process_name): if result.returncode != 0: logging.error(f"Error al intentar matar los procesos {process_name}. Salida: {result.stderr.strip()}") else: - logging.info(f"Todos los procesos '{process_name}' han sido eliminados.") + logging.debug(f"Todos los procesos '{process_name}' han sido eliminados.") return result.returncode @@ -476,7 +485,7 @@ def kill_all_processes(process_name): def start_openocd_thread(req_data): target_board = req_data['target_board'] script_board = './openocd_scripts/openscript_' + target_board + '.cfg' - logging.info(f"OpenOCD script: {script_board}") + logging.debug(f"OpenOCD script: {script_board}") try: thread = threading.Thread( target=monitor_openocd_output, @@ -502,32 +511,33 @@ def start_gdbgui(req_data): req_data['status'] += f"GDB route: {route} does not exist.\n" return jsonify(req_data) req_data['status'] = '' - if check_uart_connection: - logging.info("Starting GDBGUI...") - gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '-x', route, 'monitor'] - sleep(5) - try: - process_holder['gdbgui'] = subprocess.run( - gdbgui_cmd, - stdout=sys.stdout, - stderr=sys.stderr, - text=True - ) - if process_holder['gdbgui'].returncode != -9 and process_holder['gdbgui'].returncode != 0: - logging.error(f"Command failed with return code {process_holder['gdbgui'].returncode}") - - except subprocess.CalledProcessError as e: - logging.error("Failed to start GDBGUI: %s", e) - req_data['status'] += f"Error starting GDBGUI (code {e.returncode}): {e.stderr}\n" - return None - except Exception as e: - logging.error("Unexpected error in GDBGUI: %s", e) - req_data['status'] += f"Unexpected error starting GDBGUI: {e}\n" - return None - - req_data['status'] += f"Finished debug session: {e}\n" - else: - req_data['status'] += f"UART not connected: {e}\n" + if check_uart_connection(): + req_data['status'] += f"No UART found\n" + return jsonify(req_data) + + logging.info("Starting GDBGUI...") + gdbgui_cmd = ['idf.py', '-C', BUILD_PATH, 'gdbgui', '--gdbinit', route, 'monitor'] + sleep(5) + try: + process_holder['gdbgui'] = subprocess.run( + gdbgui_cmd, + stdout=sys.stdout, + stderr=sys.stderr, + text=True + ) + if process_holder['gdbgui'].returncode != -9 and process_holder['gdbgui'].returncode != 0: + logging.error(f"Command failed with return code {process_holder['gdbgui'].returncode}") + + except subprocess.CalledProcessError as e: + logging.error("Failed to start GDBGUI: %s", e) + req_data['status'] += f"Error starting GDBGUI (code {e.returncode}): {e.stderr}\n" + return None + except Exception as e: + logging.error("Unexpected error in GDBGUI: %s", e) + req_data['status'] += f"Unexpected error starting GDBGUI: {e}\n" + return None + + req_data['status'] += f"Finished debug session: {e}\n" return jsonify(req_data) @@ -556,7 +566,10 @@ def do_debug_request(request): logging.debug('Killing OpenOCD') kill_all_processes("openocd") process_holder.pop('openocd', None) - + # Check UART + if check_uart_connection(): + req_data['status'] += f"No UART found\n" + return jsonify(req_data) # Check if JTAG is connected if not check_jtag_connection(): req_data['status'] += "No JTAG found\n" diff --git a/gateway/esp32-rv/main/syscall/test_panic.c b/gateway/esp32-rv/main/syscall/test_panic.c index ae440bab8..9dc1242a7 100644 --- a/gateway/esp32-rv/main/syscall/test_panic.c +++ b/gateway/esp32-rv/main/syscall/test_panic.c @@ -159,7 +159,6 @@ int read_buffer_string(char *dest, int length){ } void read_string(char *dest, int length) { - int value = 0; int i = -1; int sum = 0; while (i == -1){ diff --git a/gateway/esp32c2.zip b/gateway/esp32c2.zip index 26147e1a4b96822e993239a61c0f4e35dda09b18..eed34a4b98e1a9c6dfee16dcdd0beada77bc4f82 100644 GIT binary patch delta 9853 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∨ivphg~+I@wPZjDso#R;yYQJVI`nj*dzU~fp& zbR!T!%N&XC>vM4`gt8F|dz}Zlk)5}ZD3m!;+Vl>kC<6vg2=T8gO&|LKrm>{TH&JN4~L?o{R_8sISZwT&41|pWn23^Zb zf?0z26m%ezX#gO58az;~0)f!~MN#7ZldMDqyb2Z30{$Ce3H6t-1bvq$Q2tM{@*nzO zzk8_*y!vnY|0i|%&u;(BXGsAc{E!iJtH4A2pX|r~YeAS3q@alVhX?sH9OM5yE&g}o u*FY(re^1B4$koil$cy360rGFd|K;#lQ3mQa`}+IT`S%Ng`~6q=llvc!WrPF( delta 7811 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 diff --git a/gateway/esp32c3.zip b/gateway/esp32c3.zip index 449dbf03b01d0993e0d4711a93cadb245e31489d..84feeaf864e628198c53c7dcd9e8c46faab2b1b2 100644 GIT binary patch delta 9853 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∨ivphg~+I@wPZjDso#R;yYQJVI`nj*dzU~fp& zbR!T!%N&XC>vM4`gt8F|dz}Zlk)5}ZD3m!;+Vl>kC<6vg2=T8gO&|LKrm>{TH&JN4~L?o{R_8sISZwT&41|pWn23^Zb zf?0z26m%ezX#gO58az;~0)f!~MN#7ZldMDqyb2Z30{$Ce3H6t-1bvq$Q2tM{@*nzO zzk8_*y!vnY|0i|%&u;(BXGsAc{E!iJtH4A2pX|r~YeAS3q@alVhX?sH9OM5yE&g}o u*FY(re^1B4$koil$cy360rGFd|K;#lQ3mQa`}+IT`S%Ng`~6q=llvcDyoBfg delta 7811 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 diff --git a/gateway/esp32c6.zip b/gateway/esp32c6.zip index 030c06300e9a6b8e83b9010376c00d43cc31222b..12aaca2ce0eb5a93ee542cb07b42a711969448ae 100644 GIT binary patch delta 9853 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∨ivphg~+I@wPZjDso#R;yYQJVI`nj*dzU~fp& zbR!T!%N&XC>vM4`gt8F|dz}Zlk)5}ZD3m!;+Vl>kC<6vg2=T8gO&|LKrm>{TH&JN4~L?o{R_8sISZwT&41|pWn23^Zb zf?0z26m%ezX#gO58az;~0)f!~MN#7ZldMDqyb2Z30{$Ce3H6t-1bvq$Q2tM{@*nzO zzk8_*y!vnY|0i|%&u;(BXGsAc{E!iJtH4A2pX|r~YeAS3q@alVhX?sH9OM5yE&g}o u*FY(re^1B4$koil$cy360rGFd|K;#lQ3mQa`}+IT`S%Ng`~6q=llvbQsf70c delta 7811 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 diff --git a/gateway/esp32h2.zip b/gateway/esp32h2.zip index 2880475f6f65b9a202d02e2c3d342e1f0a04b312..4ef946f9489c3e24bcb01ceda4c7727c894536af 100644 GIT binary patch delta 9853 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 diff --git a/gateway/esp32s2.zip b/gateway/esp32s2.zip index 890213714488b5183cca5c546a6e813365f280e2..433172538ca9752ff3ccbb36434fbe9e8e1c21ec 100644 GIT binary patch delta 96 zcmaDif$`l0#tHh&aZ%qV|J9S57+}miJNo;?w%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) fu*5fg8AdQe)G&Y<%*ZgQVrR~b`o8(8btex1BFHKp delta 96 zcmaDif$`l0#tHh&|GRHb{;MZ9F~FGF#_!t1w%s6VvkT(}9Wdj&E;A!kO%O<6a*+N) eu*5fg8AdQe)G&Y<%*ZgQVrS+DYJO_n$pZk-lqV Date: Fri, 24 Oct 2025 09:26:24 +0200 Subject: [PATCH 9/9] Fixes in pre-requisites --- components/simulator/creator_uielto_target_flash.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/components/simulator/creator_uielto_target_flash.js b/components/simulator/creator_uielto_target_flash.js index 77f52384e..0d9d5dff7 100644 --- a/components/simulator/creator_uielto_target_flash.js +++ b/components/simulator/creator_uielto_target_flash.js @@ -713,10 +713,10 @@ '
' + '
' + ' How to change Python environment if you have another installed:' + - ' ' + + '
' +
                     'python3.9 -m venv ~/.espressif/python_env/idf5.3_py3.9_env\n' +
                     'source ~/.espressif/python_env/idf5.3_py3.9_env/bin/activate' +
-                    '                                  ' +
+                    '                                  
' + ' Check and erase if you have newer python environment versions (by default it will choose the newer one):' + ' ' + 'rm -rf ~/.espressif/python_env/idf5.3_py3.10_en\n' + @@ -780,9 +780,13 @@ ' ' + ' ' + ' ' + + ' Install ESP-IDF dependencies inside the virtual environment:' + + '
' + + ' $HOME/esp-idf-v5.3.2/install.sh' + + '
' + ' Load the environment variable for your board with:' + '
' + - ' . $HOME/esp/esp-idf/export.sh' + + ' . $HOME/esp-idf-v5.3.2/export.sh' + '
' + '
' + ' Unzip the driver.zip file and change into the driver directory associated to your board with "cd <board>", for example:' +