diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 08cfae29..3694df28 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -50,7 +50,7 @@ #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif -#include "WString.h" +//#include "WString.h" #ifdef AT90USB #ifdef BTENABLED diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4d3cb9e8..7cab97eb 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -996,35 +996,95 @@ void erase_eeprom_section(uint16_t offset, uint16_t bytes) #include "bootapp.h" -void __test() +void __test(uint8_t lang) { + uint8_t cnt = lang_get_count(); + printf_P(PSTR("cnt=%d lang=%d\n"), cnt, lang); + if ((lang < 2) || (lang > cnt)) return; + cli(); - boot_app_magic = 0x55aa55aa; + boot_app_magic = BOOT_APP_MAGIC; boot_app_flags = BOOT_APP_FLG_USER0; - boot_reserved = 0x00; + boot_reserved = lang << 4; wdt_enable(WDTO_15MS); while(1); } #ifdef W25X20CL +#define W25X20CL_BLOCK 1024 + void upgrade_sec_lang_from_external_flash() { - if ((boot_app_magic == 0x55aa55aa) && (boot_app_flags & BOOT_APP_FLG_USER0)) + if ((boot_app_magic == BOOT_APP_MAGIC) && (boot_app_flags & BOOT_APP_FLG_USER0)) { - fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,1) "TEST %d"), boot_reserved); - boot_reserved++; - if (boot_reserved < 4) + uint8_t lang = boot_reserved >> 4; + uint8_t state = boot_reserved & 0xf; + + fprintf_P(lcdout, PSTR(ESC_H(1,3) "lang=%1hhd state=%1hhx"), lang, state); + delay(1000); + state++; + boot_reserved = state | (lang << 4); + if (state < 15) { - _delay_ms(1000); cli(); wdt_enable(WDTO_15MS); while(1); } +/* fprintf_P(lcdout, PSTR(ESC_2J "UPGRADE START")); + delay(1000); + fprintf_P(lcdout, PSTR(ESC_H(1,1) "lang=%hhd state=%hhd"), lang, state); + delay(1000);*/ +/* + lang_table_header_t header; + uint32_t src_addr = 0x00000; + if (lang_get_header(lang, &header, &src_addr)) + { + uint16_t dst_addr = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + uint16_t size = W25X20CL_BLOCK * state; + src_addr += size; + dst_addr += size; + state++; + boot_reserved = state | (lang << 4); + if (size < header.size) + { + fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,0) "Copying lang #%hhd" ESC_H(1,1) "size 0x%04x"), lang, size); + size = header.size - size; + if (size > W25X20CL_BLOCK) size = W25X20CL_BLOCK; + +// delay(1000); +// cli(); +// wdt_enable(WDTO_15MS); +// while(1); + cli(); + w25x20cl_rd_data(src_addr, (uint8_t*)0x0800, 256); + bootapp_ram2flash(0x0800, dst_addr, 256); + } +*/ +/* + + + +// header.size - (4096*state); + + fprintf_P(lcdout, PSTR(ESC_2J ESC_H(1,0) "Copying lang #%hhd" ESC_H(1,1) "state %hhd" ESC_H(1,2) "offs: %08lx" ESC_H(1,3) "remain %04x"), lang, state, offset, remain); + state++; + boot_reserved = state | (lang << 4); + if (state < 4) + { + _delay_ms(1000); + cli(); + wdt_enable(WDTO_15MS); + while(1); + }*/ +// } } boot_app_flags &= ~BOOT_APP_FLG_USER0; } + +#ifdef DEBUG_W25X20CL + uint8_t lang_xflash_enum_codes(uint16_t* codes) { lang_table_header_t header; @@ -1044,7 +1104,7 @@ uint8_t lang_xflash_enum_codes(uint16_t* codes) printf_P(_n(" _lt_size = 0x%04x (%d)\n"), header.size, header.size); printf_P(_n(" _lt_count = 0x%04x (%d)\n"), header.count, header.count); printf_P(_n(" _lt_chsum = 0x%04x\n"), header.checksum); - printf_P(_n(" _lt_code = 0x%04x\n"), header.code); + printf_P(_n(" _lt_code = 0x%04x (%c%c)\n"), header.code, header.code >> 8, header.code & 0xff); printf_P(_n(" _lt_resv1 = 0x%08lx\n"), header.reserved1); addr += header.size; @@ -1061,6 +1121,8 @@ void list_sec_lang_from_external_flash() printf_P(_n("XFlash lang count = %hhd\n"), count); } +#endif //DEBUG_W25X20CL + #endif //W25X20CL @@ -1069,16 +1131,20 @@ void list_sec_lang_from_external_flash() // are initialized by the main() routine provided by the Arduino framework. void setup() { + lcd_init(); + fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream + #ifdef NEW_SPI spi_init(); #endif //NEW_SPI - lcd_init(); - fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream - - upgrade_sec_lang_from_external_flash(); - lcd_splash(); + + if (w25x20cl_init()) + upgrade_sec_lang_from_external_flash(); + else + kill(_i("External SPI flash W25X20CL not responding.")); + setup_killpin(); setup_powerhold(); @@ -1369,21 +1435,17 @@ void setup() // If they differ, an update procedure may need to be performed. At the end of this block, the current firmware version // is being written into the EEPROM, so the update procedure will be triggered only once. - spi_setup(TMC2130_SPCR, TMC2130_SPSR); - puts_P(_n("w25x20cl init: ")); - if (w25x20cl_ini()) - { - uint8_t uid[8]; // 64bit unique id - w25x20cl_rd_uid(uid); - puts_P(_n("OK, UID=")); - for (uint8_t i = 0; i < 8; i ++) - printf_P(PSTR("%02hhx"), uid[i]); - putchar('\n'); - list_sec_lang_from_external_flash(); - } - else - puts_P(_n("NG!\n")); +#ifdef DEBUG_W25X20CL + W25X20CL_SPI_ENTER(); + uint8_t uid[8]; // 64bit unique id + w25x20cl_rd_uid(uid); + puts_P(_n("W25X20CL UID=")); + for (uint8_t i = 0; i < 8; i ++) + printf_P(PSTR("%02hhx"), uid[i]); + putchar('\n'); + list_sec_lang_from_external_flash(); +#endif //DEBUG_W25X20CL lang_selected = eeprom_read_byte((uint8_t*)EEPROM_LANG); if (lang_selected >= LANG_NUM) @@ -1393,12 +1455,13 @@ void setup() } lang_select(lang_selected); +//#ifdef DEBUG_SEC_LANG + uint16_t sec_lang_code = lang_get_code(1); printf_P(_n("SEC_LANG_CODE=0x%04x (%c%c)\n"), sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); -#ifdef DEBUG_SEC_LANG - lang_print_sec_lang(uartout); -#endif //DEBUG_SEC_LANG +// lang_print_sec_lang(uartout); +//#endif //DEBUG_SEC_LANG if (eeprom_read_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE) == 255) { eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); @@ -2224,7 +2287,7 @@ void homeaxis(int axis, uint8_t cnt, uint8_t* pstep) #ifdef TMC2130 if (READ(Z_TMC2130_DIAG) != 0) { //Z crash FORCE_HIGH_POWER_END; - kill(MSG_BED_LEVELING_FAILED_POINT_LOW); + kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); return; } #endif //TMC2130 @@ -2240,7 +2303,7 @@ void homeaxis(int axis, uint8_t cnt, uint8_t* pstep) #ifdef TMC2130 if (READ(Z_TMC2130_DIAG) != 0) { //Z crash FORCE_HIGH_POWER_END; - kill(MSG_BED_LEVELING_FAILED_POINT_LOW); + kill(_T(MSG_BED_LEVELING_FAILED_POINT_LOW)); return; } #endif //TMC2130 @@ -5004,7 +5067,7 @@ Sigma_Exit: setWatch(); break; case 112: // M112 -Emergency Stop - kill("", 3); + kill(_n(""), 3); break; case 140: // M140 set bed temp if (code_seen('S')) setTargetBed(code_value()); @@ -7387,7 +7450,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s if( (millis() - previous_millis_cmd) > max_inactive_time ) if(max_inactive_time) - kill("", 4); + kill(_n(""), 4); if(stepper_inactive_time) { if( (millis() - previous_millis_cmd) > stepper_inactive_time ) { diff --git a/Firmware/bootapp.c b/Firmware/bootapp.c index 00d31248..8eb5b52d 100644 --- a/Firmware/bootapp.c +++ b/Firmware/bootapp.c @@ -20,12 +20,12 @@ void bootapp_print_vars() void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) { cli(); - boot_app_magic = 0x55aa55aa; + boot_app_magic = BOOT_APP_MAGIC; boot_app_flags |= BOOT_APP_FLG_COPY; uint16_t ui; for (ui = 0; ui < size; ui++) { uint8_t uc = ram_array[ui+rptr]; - if (pgm_readbyte(ui+fptr) & uc != uc) + if (pgm_read_byte(ui+fptr) & uc != uc) { boot_app_flags |= BOOT_APP_FLG_ERASE; break; diff --git a/Firmware/bootapp.h b/Firmware/bootapp.h index dc0006e4..3d6d521f 100644 --- a/Firmware/bootapp.h +++ b/Firmware/bootapp.h @@ -20,6 +20,8 @@ #define BOOT_APP_FLG_USER0 0x80 +#define BOOT_APP_MAGIC 0x55aa55aa + #if defined(__cplusplus) extern "C" { diff --git a/Firmware/config.h b/Firmware/config.h index 9902349f..a9172429 100644 --- a/Firmware/config.h +++ b/Firmware/config.h @@ -19,7 +19,12 @@ #define TMC2130_SPSR SPI_SPSR(TMC2130_SPI_RATE) //W25X20CL configuration +//pinout: #define W25X20CL_PIN_CS 32 +//spi: +#define W25X20CL_SPI_RATE 0 // fosc/4 = 4MHz +#define W25X20CL_SPCR SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0) +#define W25X20CL_SPSR SPI_SPSR(W25X20CL_SPI_RATE) //LANG - Multi-language support //#define LANG_MODE 0 // primary language only diff --git a/Firmware/language.c b/Firmware/language.c index 3c068b14..e83f7edf 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -97,10 +97,36 @@ uint8_t lang_get_count() #endif //W25X20CL } +uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset) +{ + if (lang == LANG_ID_PRI) return 0; //primary lang not supported for this function +#ifdef W25X20CL + if (lang == LANG_ID_SEC) + { + uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + memcpy_P(header, ui, sizeof(lang_table_header_t)); //read table header from progmem + if (offset) *offset = ui; + return (header == LANG_MAGIC)?1:0; //return 1 if magic valid + } + uint32_t addr = 0x00000; //start of xflash + lang--; + while (1) + { + w25x20cl_rd_data(addr, header, sizeof(lang_table_header_t)); //read table header from xflash + if (header->magic != LANG_MAGIC) break; //break if not valid + if (offset) *offset = addr; + if (--lang == 0) return 1; + addr += header->size; //calc address of next table + } + return 0; +#else //W25X20CL +#endif //W25X20CL +} + uint16_t lang_get_code(uint8_t lang) { -#ifdef W25X20CL if (lang == LANG_ID_PRI) return LANG_CODE_EN; //primary lang = EN +#ifdef W25X20CL if (lang == LANG_ID_SEC) { uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer diff --git a/Firmware/language.h b/Firmware/language.h index 24cc510d..d7bf53e0 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -108,6 +108,7 @@ extern uint8_t lang_select(uint8_t lang); //get total number of languages (primary + all in xflash) extern uint8_t lang_get_count(); +extern uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* offset); extern uint16_t lang_get_code(uint8_t lang); extern const char* lang_get_name_by_code(uint16_t code); diff --git a/Firmware/messages.c b/Firmware/messages.c index b931e643..e6ab5221 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -119,3 +119,4 @@ const char MSG_Z_MAX[] PROGMEM_N1 = "z_max: "; ////c=0 r=0 const char MSG_Z_MIN[] PROGMEM_N1 = "z_min: "; ////c=0 r=0 const char MSG_ZPROBE_OUT[] PROGMEM_N1 = "Z probe out. bed"; ////c=0 r=0 const char MSG_ZPROBE_ZOFFSET[] PROGMEM_N1 = "Z Offset"; ////c=0 r=0 +const char MSG_TMC_OVERTEMP[] PROGMEM_N1 = "TMC DRIVER OVERTEMP"; ////c=0 r=0 diff --git a/Firmware/messages.h b/Firmware/messages.h index f5910e9e..0b5b9b09 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -116,3 +116,4 @@ extern const char MSG_Z_MAX[]; extern const char MSG_Z_MIN[]; extern const char MSG_ZPROBE_OUT[]; extern const char MSG_ZPROBE_ZOFFSET[]; +extern const char MSG_TMC_OVERTEMP[]; diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index e0cacb99..83ead13b 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -832,7 +832,7 @@ static float analog2temp(int raw, uint8_t e) { SERIAL_ERROR_START; SERIAL_ERROR((int)e); SERIAL_ERRORLNPGM(" - Invalid extruder number !"); - kill("", 6); + kill(PSTR(""), 6); return 0.0; } #ifdef HEATER_0_USES_MAX6675 diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index 01ee8fa2..b55beb9b 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -5,6 +5,7 @@ #include "tmc2130.h" #include "LiquidCrystal_Prusa.h" #include "ultralcd.h" +#include "language.h" #ifndef NEW_SPI #include #else //NEW_SPI @@ -386,7 +387,6 @@ bool tmc2130_wait_standstill_xy(int timeout) void tmc2130_check_overtemp() { - const static char TMC_OVERTEMP_MSG[] PROGMEM = "TMC DRIVER OVERTEMP "; static uint32_t checktime = 0; if (millis() - checktime > 1000 ) { @@ -397,11 +397,11 @@ void tmc2130_check_overtemp() tmc2130_rd(i, TMC2130_REG_DRV_STATUS, &drv_status); if (drv_status & ((uint32_t)1 << 26)) { // BIT 26 - over temp prewarning ~120C (+-20C) - SERIAL_ERRORRPGM(TMC_OVERTEMP_MSG); + SERIAL_ERRORRPGM(MSG_TMC_OVERTEMP); SERIAL_ECHOLN(i); for (int j = 0; j < 4; j++) tmc2130_wr(j, TMC2130_REG_CHOPCONF, 0x00010000); - kill(TMC_OVERTEMP_MSG); + kill(MSG_TMC_OVERTEMP); } } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0b803b55..eeb01fe1 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5657,11 +5657,13 @@ void lcd_confirm_print() } -extern void __test(); +extern void __test(uint8_t lang); static void lcd_test_menu() { - __test(); + __test(3); + lcd_update_enable(true); + lcd_return_to_status(); } static void lcd_main_menu() @@ -5833,7 +5835,7 @@ static void lcd_main_menu() #endif MENU_ITEM(submenu, _i("Support"), lcd_support_menu);////MSG_SUPPORT c=0 r=0 -// MENU_ITEM(submenu, _i("Test"), lcd_test_menu);////MSG_SUPPORT c=0 r=0 + MENU_ITEM(submenu, _i("Test"), lcd_test_menu);////MSG_SUPPORT c=0 r=0 END_MENU(); diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index 856b5ab0..8d3a975d 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -149,6 +149,7 @@ //#define DEBUG_BUILD //#define DEBUG_SEC_LANG //secondary language debug output at startup +//#define DEBUG_W25X20CL //debug external spi flash #ifdef DEBUG_BUILD //#define _NO_ASM #define DEBUG_DCODES //D codes diff --git a/Firmware/w25x20cl.c b/Firmware/w25x20cl.c index 04f0d402..611897fe 100644 --- a/Firmware/w25x20cl.c +++ b/Firmware/w25x20cl.c @@ -36,17 +36,18 @@ //#define _SPI_TX swspi_tx //#define _SPI_RX swspi_rx -#define _SPI_TX(b) spi_txrx(b) -#define _SPI_RX() spi_txrx(0xff) +#define _SPI_TX(b) spi_txrx(b) +#define _SPI_RX() spi_txrx(0xff) int w25x20cl_mfrid_devid(void); -int8_t w25x20cl_ini(void) +int8_t w25x20cl_init(void) { PIN_OUT(W25X20CL_PIN_CS); _CS_HIGH(); + W25X20CL_SPI_ENTER(); if (!w25x20cl_mfrid_devid()) return 0; return 1; } diff --git a/Firmware/w25x20cl.h b/Firmware/w25x20cl.h index 72a0ddde..21294a21 100644 --- a/Firmware/w25x20cl.h +++ b/Firmware/w25x20cl.h @@ -6,20 +6,21 @@ #include "config.h" -#define W25_STATUS_BUSY 0x01 -#define W25_STATUS_WEL 0x02 -#define W25_STATUS_BP0 0x04 -#define W25_STATUS_BP1 0x08 -#define W25_STATUS_TB 0x20 -#define W25_STATUS_SRP 0x80 +#define W25X20CL_STATUS_BUSY 0x01 +#define W25X20CL_STATUS_WEL 0x02 +#define W25X20CL_STATUS_BP0 0x04 +#define W25X20CL_STATUS_BP1 0x08 +#define W25X20CL_STATUS_TB 0x20 +#define W25X20CL_STATUS_SRP 0x80 +#define W25X20CL_SPI_ENTER() spi_setup(W25X20CL_SPCR, W25X20CL_SPSR) #if defined(__cplusplus) extern "C" { #endif //defined(__cplusplus) -extern int8_t w25x20cl_ini(void); +extern int8_t w25x20cl_init(void); extern void w25x20cl_enable_wr(void); extern void w25x20cl_disable_wr(void); extern uint8_t w25x20cl_rd_status_reg(void);