Browse Source

New ML support - external flash W25X20CL - upgrade is working!!! (hardcoded to german)
+print test (LT_PRINT_TEST)

Robert Pelnar 6 years ago
parent
commit
ebd8375313
5 changed files with 117 additions and 60 deletions
  1. 1 1
      Firmware/MarlinSerial.h
  2. 110 57
      Firmware/Marlin_main.cpp
  3. 3 2
      Firmware/bootapp.c
  4. 1 0
      Firmware/language.c
  5. 2 0
      Firmware/w25x20cl.h

+ 1 - 1
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);

+ 110 - 57
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)
-		{
-			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))
+//		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

+ 3 - 2
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;

+ 1 - 0
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;

+ 2 - 0
Firmware/w25x20cl.h

@@ -4,6 +4,8 @@
 
 #include <inttypes.h>
 #include "config.h"
+#include "spi.h"
+
 
 
 #define W25X20CL_STATUS_BUSY   0x01