diff --git a/cmd_parser.c b/cmd_parser.c index 68a01f4..41e4f3b 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -32,7 +32,9 @@ extern volatile __xdata uint8_t sfr_data[4]; extern __code uint8_t * __code greeting; extern __code uint8_t * __code hex; -extern __xdata uint8_t flash_buf[256]; +extern __xdata uint8_t flash_buf[512]; +extern __xdata uint32_t flash_addr; + __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; __xdata uint16_t vlan_ptr; __xdata uint8_t gpio_last_value[8] = { 0 }; @@ -495,7 +497,8 @@ void cmd_parser(void) __banked } if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'd') { print_string("\nDUMPING FLASH\n"); - flash_dump(0, 255); + flash_addr = 0; + flash_dump(255); } if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'j') { print_string("\nJEDEC ID\n"); @@ -510,7 +513,8 @@ void cmd_parser(void) __banked print_string("\nFLASH FAST MODE\n"); flash_init(1); print_string("\nNow dumping flash\n"); - flash_dump(0, 255); + flash_addr = 0; + flash_dump(255); } if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'e') { print_string("\nFLASH erase\n"); @@ -520,7 +524,8 @@ void cmd_parser(void) __banked print_string("\nFLASH write\n"); for (uint8_t i = 0; i < 20; i++) flash_buf[i] = greeting[i]; - flash_write_bytes(0x20000, flash_buf, 20); + flash_addr = 0x20000; + flash_write_bytes(flash_buf, 20); } if (cmd_compare(0, "port") && cmd_words_b[1] > 0) { print_string("\nPORT "); @@ -625,10 +630,12 @@ void execute_config(void) __banked __xdata uint32_t pos = CONFIG_START; __xdata uint16_t len_left = CONFIG_LEN; do { - flash_find_mark(pos, len_left, "\n"); + flash_addr = pos; + flash_find_mark("\n", len_left); if (mpos != 0xffff) { __xdata uint16_t len = len_left - mpos; - flash_read_bulk(&cmd_buffer[0], pos, len > SBUF_SIZE ? SBUF_SIZE : len); + flash_addr = pos; + flash_read_bulk(&cmd_buffer[0], len > SBUF_SIZE ? SBUF_SIZE : len); cmd_buffer[len > SBUF_SIZE ? SBUF_SIZE : len] = '\0'; len++; pos += len; diff --git a/httpd/httpd.c b/httpd/httpd.c index 6d9fe5d..4436458 100644 --- a/httpd/httpd.c +++ b/httpd/httpd.c @@ -17,6 +17,7 @@ extern __code struct f_data f_data[]; extern __code fcall_ptr f_calls[]; extern __code char * __code mime_strings[]; +extern __xdata uint32_t flash_addr; // Flash buffer to optimize flash writing speed, write_len is the current filling position extern __xdata uint8_t flash_buf[512]; @@ -34,7 +35,6 @@ __xdata uint8_t boundary[72]; __xdata uint8_t *content_type = 0; // Global variables holding POST state -__xdata uint32_t uptr; // Current flash write position __xdata uint16_t bindex; // Current index into the boundary __xdata uint16_t short_parsed; @@ -214,10 +214,10 @@ uint8_t stream_upload(__xdata uint16_t bptr) if (!boundary[bindex]) { s->tstate = TSTATE_NONE; print_string("len 2: "); print_short(write_len); write_char(' '); - flash_write_bytes(uptr, flash_buf, write_len); - uptr += write_len; + flash_write_bytes(flash_buf, write_len); write_len = 0; // TODO: This is a bit premature, what about a nice web-page saying the device will reset??? + print_string("Upload to flash done, will reset!\n"); reset_chip(); if (bptr >= uip_len) return 0; @@ -235,8 +235,7 @@ uint8_t stream_upload(__xdata uint16_t bptr) flash_buf[write_len++] = p[bptr++]; if (write_len >= 256) { print_string("len: "); print_short(write_len); write_char(' '); - flash_write_bytes(uptr, flash_buf, write_len); - uptr += write_len; + flash_write_bytes(flash_buf, write_len); write_len = 0; } bindex = 0; @@ -298,7 +297,7 @@ void handle_post(void) print_string("Have content octets\n"); p += 4; // Skip \r\n\r\n sequence at end of preamble of part - uptr = FIRMWARE_UPLOAD_START; + flash_addr = FIRMWARE_UPLOAD_START; bindex = 0; write_len = 0; stream_upload(p - uip_appdata); @@ -419,13 +418,15 @@ void httpd_appcall(void) if (f_data[entry].mime == mime_HTML) { print_string("MIME is html len is "); print_short(len_left); write_char('\n'); mpos = 0; - flash_find_mark(f_data[entry].start, len_left, "#{"); + flash_addr = f_data[entry].start; + flash_find_mark("#{", len_left); print_string("mpos: "); print_short(mpos); write_char('\n'); while (mpos != 0xffff) { print_string("Entry-len:"); print_short(len_left); write_char('\n'); mpos = len_left - mpos; print_string("l/pos: "); print_short(mpos); write_char('\n'); - flash_read_bulk(outbuf + slen, f_data[entry].start + f_data[entry].len - len_left, mpos + CMARK_S); // call marker is e.g. #{001} + flash_addr = f_data[entry].start + f_data[entry].len - len_left; + flash_read_bulk(outbuf + slen, mpos + CMARK_S); // call marker is e.g. #{001} slen += mpos; write_char('@'); write_char(outbuf[slen + 2]); write_char(outbuf[slen + 3]); write_char(outbuf[slen + 4]); fcall_ptr ptr = f_calls[(outbuf[slen + 2] - '0') * 100 + (outbuf[slen + 3]-'0') * 10 + outbuf[slen + 4] - '0']; @@ -436,15 +437,18 @@ void httpd_appcall(void) print_string("call done\n"); mpos += CMARK_S; len_left -= mpos; - flash_find_mark(f_data[entry].start + mpos, len_left, "#{"); + flash_addr = f_data[entry].start + mpos; + flash_find_mark("#{", len_left); print_string("mpos now: "); print_short(mpos); write_char('\n'); } print_string("At end mpos: "); print_short(mpos); write_char('\n'); - flash_read_bulk(outbuf + slen, f_data[entry].start + f_data[entry].len - len_left, len_left); + flash_addr = f_data[entry].start + f_data[entry].len - len_left; + flash_read_bulk(outbuf + slen, len_left); slen += len_left; } else { print_string("MIME: "); print_string(mime_strings[f_data[entry].mime]); write_char('\n'); - flash_read_bulk(outbuf + slen, f_data[entry].start, len_left); + flash_addr = f_data[entry].start; + flash_read_bulk(outbuf + slen, len_left); slen += len_left; } } diff --git a/rtl837x_flash.c b/rtl837x_flash.c index 471116f..674c735 100644 --- a/rtl837x_flash.c +++ b/rtl837x_flash.c @@ -10,6 +10,7 @@ __xdata uint8_t dio_enabled; __xdata uint8_t markbuf[16]; extern __xdata uint16_t mpos; +__xdata uint32_t flash_addr; // For the flash commands, see e.g. Windbond W25Q32JV datasheet #define CMD_WRITE_STATUS 0x01 @@ -36,7 +37,7 @@ void flash_configure_mmio(void) } SFR_FLASH_MODEB = 0x0; - SFR_FLASH_CMD_R = 0xb; // Default is Single IO + SFR_FLASH_CMD_R = CMD_FREAD; // Default is Single IO SFR_FLASH_DUMMYCYCLES = 8; } @@ -184,7 +185,7 @@ void flash_write_enable(void) } -void flash_dump(register uint32_t addr, register uint8_t len) +void flash_dump(uint8_t len) { short status; do { @@ -205,10 +206,10 @@ void flash_dump(register uint32_t addr, register uint8_t len) // Read 4 bytes SFR_FLASH_TCONF = 4; while (len) { - SFR_FLASH_ADDR16 = addr >> 16; - SFR_FLASH_ADDR8 = addr >> 8; - SFR_FLASH_ADDR0 = addr; - addr += 4; + SFR_FLASH_ADDR16 = flash_addr >> 16; + SFR_FLASH_ADDR8 = flash_addr >> 8; + SFR_FLASH_ADDR0 = flash_addr; + flash_addr += 4; SFR_FLASH_EXEC_GO = 1; while(SFR_FLASH_EXEC_BUSY); @@ -232,7 +233,7 @@ void flash_dump(register uint32_t addr, register uint8_t len) * Reads bulk data of length len from the flash memory starging at address src * and writes the data into a buffer pointed to by dst in XMEM */ -void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, register uint16_t len) +void flash_read_bulk(__xdata uint8_t *dst, register uint16_t len) { short status; do { @@ -252,10 +253,10 @@ void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, regist // Read 4 bytes SFR_FLASH_TCONF = 4; while (len) { - SFR_FLASH_ADDR16 = src >> 16; - SFR_FLASH_ADDR8 = src >> 8; - SFR_FLASH_ADDR0 = src; - src += 4; + SFR_FLASH_ADDR16 = flash_addr >> 16; + SFR_FLASH_ADDR8 = flash_addr >> 8; + SFR_FLASH_ADDR0 = flash_addr; + flash_addr += 4; SFR_FLASH_EXEC_GO = 1; while(SFR_FLASH_EXEC_BUSY); @@ -276,9 +277,9 @@ void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, regist } -void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t *mark) +void flash_find_mark(__code uint8_t *mark, __xdata uint16_t len) { - uint16_t status; + __xdata uint16_t status; do { status = flash_read_status(); } while (status & 0x1); @@ -294,9 +295,9 @@ void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t SFR_FLASH_DUMMYCYCLES = 8; // Add 8 dummy clocks after read? } - uint8_t i = 0; - uint8_t l = 0; - uint8_t k; + __xdata uint8_t i = 0; + __xdata uint8_t l = 0; + __xdata uint8_t k; // Calculate the length while (mark[i++]) @@ -310,10 +311,10 @@ void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t i = 0; SFR_FLASH_TCONF = 4; while (len) { - SFR_FLASH_ADDR16 = src >> 16; - SFR_FLASH_ADDR8 = src >> 8; - SFR_FLASH_ADDR0 = src; - src += 4; + SFR_FLASH_ADDR16 = flash_addr >> 16; + SFR_FLASH_ADDR8 = flash_addr >> 8; + SFR_FLASH_ADDR0 = flash_addr; + flash_addr += 4; SFR_FLASH_EXEC_GO = 1; while(SFR_FLASH_EXEC_BUSY); @@ -408,27 +409,27 @@ void flash_sector_erase(uint32_t addr) while (flash_read_status() & 0x1); flash_configure_mmio(); - } -void flash_write_bytes(__xdata uint32_t addr, __xdata uint8_t *ptr, uint16_t len) +void flash_write_bytes(__xdata uint8_t *ptr, __xdata uint16_t len) { - uint8_t exit_loop = 0; + __xdata uint8_t exit_loop = 0; + write_char('>'); print_long(flash_addr); write_char(':'); print_short(len); write_char('-'); print_byte(*ptr); write_char('\n'); while(1) { flash_write_enable(); SFR_FLASH_CMD = CMD_PAGE_PROGRAM; - SFR_FLASH_TCONF = 0x40 | 8 | 4; // Bytes written is is 4, 8 enables write, 0x40 is unkown + SFR_FLASH_TCONF = 0x40 | 8 | 4; // Bytes written is 4, 8 enables write, 0x40 is unknown // Last transfer? if (len < 5) { SFR_FLASH_TCONF = 8 | len; exit_loop = 1; } - SFR_FLASH_ADDR16 = addr >> 16; - SFR_FLASH_ADDR8 = addr >> 8; - SFR_FLASH_ADDR0 = addr; + SFR_FLASH_ADDR16 = flash_addr >> 16; + SFR_FLASH_ADDR8 = flash_addr >> 8; + SFR_FLASH_ADDR0 = flash_addr; SFR_FLASH_DATA0 = *ptr++; SFR_FLASH_DATA8 = *ptr++; SFR_FLASH_DATA16 = *ptr++; @@ -439,7 +440,7 @@ void flash_write_bytes(__xdata uint32_t addr, __xdata uint8_t *ptr, uint16_t len if (exit_loop) break; len -= 4; - addr += 4; + flash_addr += 4; } while (flash_read_status() & 0x1); diff --git a/rtl837x_flash.h b/rtl837x_flash.h index f891f97..de81bd2 100644 --- a/rtl837x_flash.h +++ b/rtl837x_flash.h @@ -4,11 +4,11 @@ void flash_init(uint8_t enable_dio); void flash_read_uid(void); void flash_write_enable(void); -void flash_dump(register uint32_t addr, register uint8_t len); +void flash_dump(register uint8_t len); void flash_read_jedecid(void); void flash_read_security(uint32_t addr, uint8_t len); void flash_sector_erase(uint32_t addr); -void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, register uint16_t len); -void flash_write_bytes(__xdata uint32_t addr, register __xdata uint8_t *ptr, register uint16_t len); -void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t *mark); +void flash_read_bulk(__xdata uint8_t *dst, __xdata uint16_t len); +void flash_write_bytes(__xdata uint8_t *ptr, __xdata uint16_t len); +void flash_find_mark( __code uint8_t *mark, __xdata uint16_t len); #endif diff --git a/rtlplayground.c b/rtlplayground.c index fe06a3d..d011dde 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -70,6 +70,8 @@ __xdata uint8_t sfr_data[4]; extern __xdata uint8_t cmd_buffer[SBUF_SIZE]; extern __xdata uint8_t gpio_last_value[8]; +extern __xdata uint32_t flash_addr; + __code uint8_t * __code greeting = "\nA minimal prompt to explore the RTL8372:\n"; __code uint8_t * __code hex = "0123456789abcdef"; @@ -1698,7 +1700,8 @@ void bootloader(void) flash_init(0); // Check update in progress and move blocks - flash_read_bulk(flash_buf, FIRMWARE_UPLOAD_START, 0x100); + flash_addr = FIRMWARE_UPLOAD_START; + flash_read_bulk(flash_buf, 0x100); if (flash_buf[0] == 0x00 && flash_buf[1] == 0x40) { print_string("Update in progress, moving firmware to start of FLASH!\n"); @@ -1708,11 +1711,13 @@ void bootloader(void) for (__xdata uint16_t i=0; i < 960; i++) { print_string("Writing block: "); print_short(dest); - flash_read_bulk(flash_buf, source, 0x200); + flash_addr = source; + flash_read_bulk(flash_buf, 0x200); write_char('\n'); if (!(i & 0x7)) flash_sector_erase(dest); - flash_write_bytes(dest, flash_buf, 0x200); + flash_addr = dest; + flash_write_bytes(flash_buf, 0x200); dest += 0x200; source += 0x200; }