diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4ca05d18..e23ca37e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -977,6 +977,12 @@ void list_sec_lang_from_external_flash() #endif //(LANG_MODE != 0) +static void w25x20cl_err_msg() +{ + lcd_puts_P(_n(ESC_2J ESC_H(0,0) "External SPI flash" ESC_H(0,1) "W25X20CL is not res-" + ESC_H(0,2) "ponding. Language" ESC_H(0,3) "switch unavailable.")); +} + // "Setup" function is called by the Arduino framework on startup. // Before startup, the Timers-functions (PWM)/Analog RW and HardwareSerial provided by the Arduino-code // are initialized by the main() routine provided by the Arduino framework. @@ -993,21 +999,25 @@ void setup() spi_init(); lcd_splash(); - Sound_Init(); // also guarantee "SET_OUTPUT(BEEPER)" + Sound_Init(); // also guarantee "SET_OUTPUT(BEEPER)" #ifdef W25X20CL - if (!w25x20cl_init()) - kill(_i("External SPI flash W25X20CL not responding.")); - // Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory. - optiboot_w25x20cl_enter(); -#endif - + bool w25x20cl_success = w25x20cl_init(); + if (w25x20cl_success) + { + optiboot_w25x20cl_enter(); #if (LANG_MODE != 0) //secondary language support -#ifdef W25X20CL - if (w25x20cl_init()) - update_sec_lang_from_external_flash(); -#endif //W25X20CL + update_sec_lang_from_external_flash(); #endif //(LANG_MODE != 0) + } + else + { + w25x20cl_err_msg(); + } +#else + const bool w25x20cl_success = true; +#endif //W25X20CL + setup_killpin(); setup_powerhold(); @@ -1213,12 +1223,17 @@ void setup() tp_init(); // Initialize temperature loop - lcd_splash(); // we need to do this again, because tp_init() kills lcd + if (w25x20cl_success) lcd_splash(); // we need to do this again, because tp_init() kills lcd + else + { + w25x20cl_err_msg(); + printf_P(_n("W25X20CL not responding.\n")); + } plan_init(); // Initialize planner; factory_reset(); - lcd_encoder_diff=0; + lcd_encoder_diff=0; #ifdef TMC2130 uint8_t silentMode = eeprom_read_byte((uint8_t*)EEPROM_SILENT); diff --git a/Firmware/lcd.h b/Firmware/lcd.h index 12935188..9f3eb5c1 100644 --- a/Firmware/lcd.h +++ b/Firmware/lcd.h @@ -64,23 +64,17 @@ extern void lcd_print(long, int = 10); extern void lcd_print(unsigned long, int = 10); extern void lcd_print(double, int = 2); +//! @brief Clear screen #define ESC_2J "\x1b[2J" #define ESC_25h "\x1b[?25h" #define ESC_25l "\x1b[?25l" +//! @brief Set cursor to +//! @param c column +//! @param r row #define ESC_H(c,r) "\x1b["#r";"#c"H" - - - - - - - - - - #define LCD_UPDATE_INTERVAL 100 #define LCD_TIMEOUT_TO_STATUS 30000ul //!< Generic timeout to status screen in ms, when no user action. #define LCD_TIMEOUT_TO_STATUS_BABYSTEP_Z 90000ul //!< Specific timeout for lcd_babystep_z screen in ms. diff --git a/Firmware/optiboot_w25x20cl.cpp b/Firmware/optiboot_w25x20cl.cpp index dad697ea..e84bf639 100644 --- a/Firmware/optiboot_w25x20cl.cpp +++ b/Firmware/optiboot_w25x20cl.cpp @@ -1,3 +1,4 @@ +//! @file // Based on the OptiBoot project // https://github.com/Optiboot/optiboot // Licence GLP 2 or later. @@ -97,6 +98,7 @@ static const char entry_magic_cfm [] PROGMEM = "w25x20cl_cfm\n"; struct block_t; extern struct block_t *block_buffer; +//! @brief Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory. void optiboot_w25x20cl_enter() { if (boot_app_flags & BOOT_APP_FLG_USER0) return;