From ebd837531349b79704caa583242407d384849639 Mon Sep 17 00:00:00 2001 From: Robert Pelnar Date: Sat, 9 Jun 2018 17:49:41 +0200 Subject: [PATCH] New ML support - external flash W25X20CL - upgrade is working!!! (hardcoded to german) +print test (LT_PRINT_TEST) --- Firmware/MarlinSerial.h | 2 +- Firmware/Marlin_main.cpp | 167 ++++++++++++++++++++++++++------------- Firmware/bootapp.c | 5 +- Firmware/language.c | 1 + Firmware/w25x20cl.h | 2 + 5 files changed, 117 insertions(+), 60 deletions(-) diff --git a/Firmware/MarlinSerial.h b/Firmware/MarlinSerial.h index 81743475..d596708e 100644 --- a/Firmware/MarlinSerial.h +++ b/Firmware/MarlinSerial.h @@ -216,7 +216,7 @@ class MarlinSerial //: public Stream static void print(unsigned long, int = DEC); static void print(double, int = 2); - static void println(const String &s); +// static void println(const String &s); static void println(const char[]); static void println(char, int = BYTE); static void println(unsigned char, int = BYTE); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 7cab97eb..9f486f39 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -967,7 +967,7 @@ void show_fw_version_warnings() { lcd_print_at_PGM(0, 3, PSTR(FW_REPOSITORY)); lcd_wait_for_click(); break; - default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8 +// default: lcd_show_fullscreen_message_and_wait_P(_i("WARNING: This is an unofficial, unsupported build. Use at your own risk!")); break;////MSG_FW_VERSION_UNKNOWN c=20 r=8 } lcd_update_enable(true); } @@ -1012,7 +1012,9 @@ void __test(uint8_t lang) #ifdef W25X20CL -#define W25X20CL_BLOCK 1024 +// language upgrade from external flash +#define LANGBOOT_BLOCKSIZE 0x0400 +#define LANGBOOT_RAMBUFFER 0x0800 void upgrade_sec_lang_from_external_flash() { @@ -1020,64 +1022,24 @@ void upgrade_sec_lang_from_external_flash() { 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) +// lang_table_header_t header; +// uint32_t src_addr = 0x00000; +// if (lang_get_header(lang, &header, &src_addr)) { - 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_H(1,3) "lng=%1hhd sta=%1hhx %04x"), lang, state, SP); + delay(1000); + boot_reserved = (state+1) | (lang << 4); + if ((state * 0x1000) < 0x211c) { - 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); + for (uint16_t i = 0; i < 0x1000; i++) + ram_array[0x800 + i] = 0xee; + uint16_t size = 0x211c - state * 0x1000; + if (size > 0x1000) size = 0x1000; + w25x20cl_rd_data(0x25ba + state * 0x1000, (uint8_t*)0x0800, size); + bootapp_ram2flash(0x0800, 0x0500 + state * 0x1000, size); } -*/ -/* - - - -// 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; } @@ -1171,6 +1133,96 @@ void setup() SERIAL_ECHO_START; printf_P(PSTR(" " FW_VERSION_FULL "\n")); + lang_table_header_t header; + uint32_t src_addr = 0x00000; + if (lang_get_header(3, &header, &src_addr)) + { +//this is comparsion of some printing-methods regarding to flash space usage and code size/readability +#define LT_PRINT_TEST 2 +// flash usage +// total p.test +//0 252718 t+c text code +//1 253142 424 170 254 +//2 253040 322 164 158 +//3 253248 530 135 395 +#if (LT_PRINT_TEST==1) //not optimized printf + printf_P(_n(" _src_addr = 0x%08lx\n"), src_addr); + printf_P(_n(" _lt_magic = 0x%08lx %S\n"), header.magic, (header.magic==LANG_MAGIC)?_n("OK"):_n("NA")); + 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 (%c%c)\n"), header.code, header.code >> 8, header.code & 0xff); + printf_P(_n(" _lt_resv1 = 0x%08lx\n"), header.reserved1); +#elif (LT_PRINT_TEST==2) //optimized printf + printf_P( + _n( + " _src_addr = 0x%08lx\n" + " _lt_magic = 0x%08lx %S\n" + " _lt_size = 0x%04x (%d)\n" + " _lt_count = 0x%04x (%d)\n" + " _lt_chsum = 0x%04x\n" + " _lt_code = 0x%04x (%c%c)\n" + " _lt_resv1 = 0x%08lx\n" + ), + src_addr, + header.magic, (header.magic==LANG_MAGIC)?_n("OK"):_n("NA"), + header.size, header.size, + header.count, header.count, + header.checksum, + header.code, header.code >> 8, header.code & 0xff, + header.reserved1 + ); +#elif (LT_PRINT_TEST==3) //arduino print/println (leading zeros not solved) + MYSERIAL.print(" _src_addr = 0x"); + MYSERIAL.println(src_addr, 16); + MYSERIAL.print(" _lt_magic = 0x"); + MYSERIAL.print(header.magic, 16); + MYSERIAL.println((header.magic==LANG_MAGIC)?" OK":" NA"); + MYSERIAL.print(" _lt_size = 0x"); + MYSERIAL.print(header.size, 16); + MYSERIAL.print(" ("); + MYSERIAL.print(header.size, 10); + MYSERIAL.println(")"); + MYSERIAL.print(" _lt_count = 0x"); + MYSERIAL.print(header.count, 16); + MYSERIAL.print(" ("); + MYSERIAL.print(header.count, 10); + MYSERIAL.println(")"); + MYSERIAL.print(" _lt_chsum = 0x"); + MYSERIAL.println(header.checksum, 16); + MYSERIAL.print(" _lt_code = 0x"); + MYSERIAL.print(header.code, 16); + MYSERIAL.print(" ("); + MYSERIAL.print((char)(header.code >> 8), 0); + MYSERIAL.print((char)(header.code & 0xff), 0); + MYSERIAL.println(")"); + MYSERIAL.print(" _lt_resv1 = 0x"); + MYSERIAL.println(header.reserved1, 16); +#endif //(LT_PRINT_TEST==) +#undef LT_PRINT_TEST + +#if 0 + w25x20cl_rd_data(0x25ba, (uint8_t*)&block_buffer, 1024); + for (uint16_t i = 0; i < 1024; i++) + { + if ((i % 16) == 0) printf_P(_n("%04x:"), 0x25ba+i); + printf_P(_n(" %02x"), ((uint8_t*)&block_buffer)[i]); + if ((i % 16) == 15) putchar('\n'); + } +#endif +#if 1 + for (uint16_t i = 0; i < 1024*10; i++) + { + if ((i % 16) == 0) printf_P(_n("%04x:"), 0x500+i); + printf_P(_n(" %02x"), pgm_read_byte((uint8_t*)(0x500+i))); + if ((i % 16) == 15) putchar('\n'); + } +#endif + } + else + printf_P(_n("lang_get_header failed!\n")); + + #if 0 SERIAL_ECHOLN("Reading eeprom from 0 to 100: start"); for (int i = 0; i < 4096; ++i) { @@ -1458,7 +1510,8 @@ void setup() //#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); + uint16_t ui = ((((uint16_t)&_SEC_LANG) + 0x00ff) & 0xff00); //table pointer + printf_P(_n("lang_selected=%d\nlang_table=0x%04x\nSEC_LANG_CODE=0x%04x (%c%c)\n"), lang_selected, ui, sec_lang_code, sec_lang_code >> 8, sec_lang_code & 0xff); // lang_print_sec_lang(uartout); //#endif //DEBUG_SEC_LANG diff --git a/Firmware/bootapp.c b/Firmware/bootapp.c index 8eb5b52d..4b68ad07 100644 --- a/Firmware/bootapp.c +++ b/Firmware/bootapp.c @@ -22,7 +22,8 @@ void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) cli(); boot_app_magic = BOOT_APP_MAGIC; boot_app_flags |= BOOT_APP_FLG_COPY; - uint16_t ui; for (ui = 0; ui < size; ui++) + boot_app_flags |= BOOT_APP_FLG_ERASE; +/* uint16_t ui; for (ui = 0; ui < size; ui++) { uint8_t uc = ram_array[ui+rptr]; if (pgm_read_byte(ui+fptr) & uc != uc) @@ -30,7 +31,7 @@ void bootapp_ram2flash(uint16_t rptr, uint16_t fptr, uint16_t size) boot_app_flags |= BOOT_APP_FLG_ERASE; break; } - } + }*/ boot_copy_size = (uint16_t)size; boot_src_addr = (uint32_t)rptr; boot_dst_addr = (uint32_t)fptr; diff --git a/Firmware/language.c b/Firmware/language.c index e83f7edf..6003fe7a 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -112,6 +112,7 @@ uint8_t lang_get_header(uint8_t lang, lang_table_header_t* header, uint32_t* off lang--; while (1) { + W25X20CL_SPI_ENTER(); 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; diff --git a/Firmware/w25x20cl.h b/Firmware/w25x20cl.h index 21294a21..8a0ed0ac 100644 --- a/Firmware/w25x20cl.h +++ b/Firmware/w25x20cl.h @@ -4,6 +4,8 @@ #include #include "config.h" +#include "spi.h" + #define W25X20CL_STATUS_BUSY 0x01