New ML support - external flash W25X20CL - upgrade is working!!! (hardcoded to german)
+print test (LT_PRINT_TEST)
This commit is contained in:
parent
c0946d8f04
commit
ebd8375313
5 changed files with 117 additions and 60 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
#include <inttypes.h>
|
||||
#include "config.h"
|
||||
#include "spi.h"
|
||||
|
||||
|
||||
|
||||
#define W25X20CL_STATUS_BUSY 0x01
|
||||
|
|
Loading…
Reference in a new issue