mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Reducing IMEM footprint in flash routines
This commit is contained in:
+13
-6
@@ -32,7 +32,9 @@ extern volatile __xdata uint8_t sfr_data[4];
|
|||||||
extern __code uint8_t * __code greeting;
|
extern __code uint8_t * __code greeting;
|
||||||
extern __code uint8_t * __code hex;
|
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 uint8_t vlan_names[VLAN_NAMES_SIZE];
|
||||||
__xdata uint16_t vlan_ptr;
|
__xdata uint16_t vlan_ptr;
|
||||||
__xdata uint8_t gpio_last_value[8] = { 0 };
|
__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') {
|
if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'd') {
|
||||||
print_string("\nDUMPING FLASH\n");
|
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') {
|
if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'j') {
|
||||||
print_string("\nJEDEC ID\n");
|
print_string("\nJEDEC ID\n");
|
||||||
@@ -510,7 +513,8 @@ void cmd_parser(void) __banked
|
|||||||
print_string("\nFLASH FAST MODE\n");
|
print_string("\nFLASH FAST MODE\n");
|
||||||
flash_init(1);
|
flash_init(1);
|
||||||
print_string("\nNow dumping flash\n");
|
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') {
|
if (cmd_compare(0, "flash") && cmd_words_b[1] > 0 && cmd_buffer[cmd_words_b[1]] == 'e') {
|
||||||
print_string("\nFLASH erase\n");
|
print_string("\nFLASH erase\n");
|
||||||
@@ -520,7 +524,8 @@ void cmd_parser(void) __banked
|
|||||||
print_string("\nFLASH write\n");
|
print_string("\nFLASH write\n");
|
||||||
for (uint8_t i = 0; i < 20; i++)
|
for (uint8_t i = 0; i < 20; i++)
|
||||||
flash_buf[i] = greeting[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) {
|
if (cmd_compare(0, "port") && cmd_words_b[1] > 0) {
|
||||||
print_string("\nPORT ");
|
print_string("\nPORT ");
|
||||||
@@ -625,10 +630,12 @@ void execute_config(void) __banked
|
|||||||
__xdata uint32_t pos = CONFIG_START;
|
__xdata uint32_t pos = CONFIG_START;
|
||||||
__xdata uint16_t len_left = CONFIG_LEN;
|
__xdata uint16_t len_left = CONFIG_LEN;
|
||||||
do {
|
do {
|
||||||
flash_find_mark(pos, len_left, "\n");
|
flash_addr = pos;
|
||||||
|
flash_find_mark("\n", len_left);
|
||||||
if (mpos != 0xffff) {
|
if (mpos != 0xffff) {
|
||||||
__xdata uint16_t len = len_left - mpos;
|
__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';
|
cmd_buffer[len > SBUF_SIZE ? SBUF_SIZE : len] = '\0';
|
||||||
len++;
|
len++;
|
||||||
pos += len;
|
pos += len;
|
||||||
|
|||||||
+15
-11
@@ -17,6 +17,7 @@
|
|||||||
extern __code struct f_data f_data[];
|
extern __code struct f_data f_data[];
|
||||||
extern __code fcall_ptr f_calls[];
|
extern __code fcall_ptr f_calls[];
|
||||||
extern __code char * __code mime_strings[];
|
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
|
// Flash buffer to optimize flash writing speed, write_len is the current filling position
|
||||||
extern __xdata uint8_t flash_buf[512];
|
extern __xdata uint8_t flash_buf[512];
|
||||||
@@ -34,7 +35,6 @@ __xdata uint8_t boundary[72];
|
|||||||
__xdata uint8_t *content_type = 0;
|
__xdata uint8_t *content_type = 0;
|
||||||
|
|
||||||
// Global variables holding POST state
|
// 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 bindex; // Current index into the boundary
|
||||||
|
|
||||||
__xdata uint16_t short_parsed;
|
__xdata uint16_t short_parsed;
|
||||||
@@ -214,10 +214,10 @@ uint8_t stream_upload(__xdata uint16_t bptr)
|
|||||||
if (!boundary[bindex]) {
|
if (!boundary[bindex]) {
|
||||||
s->tstate = TSTATE_NONE;
|
s->tstate = TSTATE_NONE;
|
||||||
print_string("len 2: "); print_short(write_len); write_char(' ');
|
print_string("len 2: "); print_short(write_len); write_char(' ');
|
||||||
flash_write_bytes(uptr, flash_buf, write_len);
|
flash_write_bytes(flash_buf, write_len);
|
||||||
uptr += write_len;
|
|
||||||
write_len = 0;
|
write_len = 0;
|
||||||
// TODO: This is a bit premature, what about a nice web-page saying the device will reset???
|
// 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();
|
reset_chip();
|
||||||
if (bptr >= uip_len)
|
if (bptr >= uip_len)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -235,8 +235,7 @@ uint8_t stream_upload(__xdata uint16_t bptr)
|
|||||||
flash_buf[write_len++] = p[bptr++];
|
flash_buf[write_len++] = p[bptr++];
|
||||||
if (write_len >= 256) {
|
if (write_len >= 256) {
|
||||||
print_string("len: "); print_short(write_len); write_char(' ');
|
print_string("len: "); print_short(write_len); write_char(' ');
|
||||||
flash_write_bytes(uptr, flash_buf, write_len);
|
flash_write_bytes(flash_buf, write_len);
|
||||||
uptr += write_len;
|
|
||||||
write_len = 0;
|
write_len = 0;
|
||||||
}
|
}
|
||||||
bindex = 0;
|
bindex = 0;
|
||||||
@@ -298,7 +297,7 @@ void handle_post(void)
|
|||||||
print_string("Have content octets\n");
|
print_string("Have content octets\n");
|
||||||
p += 4; // Skip \r\n\r\n sequence at end of preamble of part
|
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;
|
bindex = 0;
|
||||||
write_len = 0;
|
write_len = 0;
|
||||||
stream_upload(p - uip_appdata);
|
stream_upload(p - uip_appdata);
|
||||||
@@ -419,13 +418,15 @@ void httpd_appcall(void)
|
|||||||
if (f_data[entry].mime == mime_HTML) {
|
if (f_data[entry].mime == mime_HTML) {
|
||||||
print_string("MIME is html len is "); print_short(len_left); write_char('\n');
|
print_string("MIME is html len is "); print_short(len_left); write_char('\n');
|
||||||
mpos = 0;
|
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');
|
print_string("mpos: "); print_short(mpos); write_char('\n');
|
||||||
while (mpos != 0xffff) {
|
while (mpos != 0xffff) {
|
||||||
print_string("Entry-len:"); print_short(len_left); write_char('\n');
|
print_string("Entry-len:"); print_short(len_left); write_char('\n');
|
||||||
mpos = len_left - mpos;
|
mpos = len_left - mpos;
|
||||||
print_string("l/pos: "); print_short(mpos); write_char('\n');
|
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;
|
slen += mpos;
|
||||||
write_char('@'); write_char(outbuf[slen + 2]); write_char(outbuf[slen + 3]); write_char(outbuf[slen + 4]);
|
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'];
|
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");
|
print_string("call done\n");
|
||||||
mpos += CMARK_S;
|
mpos += CMARK_S;
|
||||||
len_left -= mpos;
|
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("mpos now: "); print_short(mpos); write_char('\n');
|
||||||
}
|
}
|
||||||
print_string("At end mpos: "); 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;
|
slen += len_left;
|
||||||
} else {
|
} else {
|
||||||
print_string("MIME: "); print_string(mime_strings[f_data[entry].mime]); write_char('\n');
|
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;
|
slen += len_left;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+29
-28
@@ -10,6 +10,7 @@
|
|||||||
__xdata uint8_t dio_enabled;
|
__xdata uint8_t dio_enabled;
|
||||||
__xdata uint8_t markbuf[16];
|
__xdata uint8_t markbuf[16];
|
||||||
extern __xdata uint16_t mpos;
|
extern __xdata uint16_t mpos;
|
||||||
|
__xdata uint32_t flash_addr;
|
||||||
|
|
||||||
// For the flash commands, see e.g. Windbond W25Q32JV datasheet
|
// For the flash commands, see e.g. Windbond W25Q32JV datasheet
|
||||||
#define CMD_WRITE_STATUS 0x01
|
#define CMD_WRITE_STATUS 0x01
|
||||||
@@ -36,7 +37,7 @@ void flash_configure_mmio(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
SFR_FLASH_MODEB = 0x0;
|
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;
|
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;
|
short status;
|
||||||
do {
|
do {
|
||||||
@@ -205,10 +206,10 @@ void flash_dump(register uint32_t addr, register uint8_t len)
|
|||||||
// Read 4 bytes
|
// Read 4 bytes
|
||||||
SFR_FLASH_TCONF = 4;
|
SFR_FLASH_TCONF = 4;
|
||||||
while (len) {
|
while (len) {
|
||||||
SFR_FLASH_ADDR16 = addr >> 16;
|
SFR_FLASH_ADDR16 = flash_addr >> 16;
|
||||||
SFR_FLASH_ADDR8 = addr >> 8;
|
SFR_FLASH_ADDR8 = flash_addr >> 8;
|
||||||
SFR_FLASH_ADDR0 = addr;
|
SFR_FLASH_ADDR0 = flash_addr;
|
||||||
addr += 4;
|
flash_addr += 4;
|
||||||
|
|
||||||
SFR_FLASH_EXEC_GO = 1;
|
SFR_FLASH_EXEC_GO = 1;
|
||||||
while(SFR_FLASH_EXEC_BUSY);
|
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
|
* 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
|
* 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;
|
short status;
|
||||||
do {
|
do {
|
||||||
@@ -252,10 +253,10 @@ void flash_read_bulk(register __xdata uint8_t *dst, __xdata uint32_t src, regist
|
|||||||
// Read 4 bytes
|
// Read 4 bytes
|
||||||
SFR_FLASH_TCONF = 4;
|
SFR_FLASH_TCONF = 4;
|
||||||
while (len) {
|
while (len) {
|
||||||
SFR_FLASH_ADDR16 = src >> 16;
|
SFR_FLASH_ADDR16 = flash_addr >> 16;
|
||||||
SFR_FLASH_ADDR8 = src >> 8;
|
SFR_FLASH_ADDR8 = flash_addr >> 8;
|
||||||
SFR_FLASH_ADDR0 = src;
|
SFR_FLASH_ADDR0 = flash_addr;
|
||||||
src += 4;
|
flash_addr += 4;
|
||||||
|
|
||||||
SFR_FLASH_EXEC_GO = 1;
|
SFR_FLASH_EXEC_GO = 1;
|
||||||
while(SFR_FLASH_EXEC_BUSY);
|
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 {
|
do {
|
||||||
status = flash_read_status();
|
status = flash_read_status();
|
||||||
} while (status & 0x1);
|
} 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?
|
SFR_FLASH_DUMMYCYCLES = 8; // Add 8 dummy clocks after read?
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t i = 0;
|
__xdata uint8_t i = 0;
|
||||||
uint8_t l = 0;
|
__xdata uint8_t l = 0;
|
||||||
uint8_t k;
|
__xdata uint8_t k;
|
||||||
|
|
||||||
// Calculate the length
|
// Calculate the length
|
||||||
while (mark[i++])
|
while (mark[i++])
|
||||||
@@ -310,10 +311,10 @@ void flash_find_mark(__xdata uint32_t src, register uint16_t len, __code uint8_t
|
|||||||
i = 0;
|
i = 0;
|
||||||
SFR_FLASH_TCONF = 4;
|
SFR_FLASH_TCONF = 4;
|
||||||
while (len) {
|
while (len) {
|
||||||
SFR_FLASH_ADDR16 = src >> 16;
|
SFR_FLASH_ADDR16 = flash_addr >> 16;
|
||||||
SFR_FLASH_ADDR8 = src >> 8;
|
SFR_FLASH_ADDR8 = flash_addr >> 8;
|
||||||
SFR_FLASH_ADDR0 = src;
|
SFR_FLASH_ADDR0 = flash_addr;
|
||||||
src += 4;
|
flash_addr += 4;
|
||||||
|
|
||||||
SFR_FLASH_EXEC_GO = 1;
|
SFR_FLASH_EXEC_GO = 1;
|
||||||
while(SFR_FLASH_EXEC_BUSY);
|
while(SFR_FLASH_EXEC_BUSY);
|
||||||
@@ -408,27 +409,27 @@ void flash_sector_erase(uint32_t addr)
|
|||||||
while (flash_read_status() & 0x1);
|
while (flash_read_status() & 0x1);
|
||||||
|
|
||||||
flash_configure_mmio();
|
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) {
|
while(1) {
|
||||||
flash_write_enable();
|
flash_write_enable();
|
||||||
SFR_FLASH_CMD = CMD_PAGE_PROGRAM;
|
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?
|
// Last transfer?
|
||||||
if (len < 5) {
|
if (len < 5) {
|
||||||
SFR_FLASH_TCONF = 8 | len;
|
SFR_FLASH_TCONF = 8 | len;
|
||||||
exit_loop = 1;
|
exit_loop = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SFR_FLASH_ADDR16 = addr >> 16;
|
SFR_FLASH_ADDR16 = flash_addr >> 16;
|
||||||
SFR_FLASH_ADDR8 = addr >> 8;
|
SFR_FLASH_ADDR8 = flash_addr >> 8;
|
||||||
SFR_FLASH_ADDR0 = addr;
|
SFR_FLASH_ADDR0 = flash_addr;
|
||||||
SFR_FLASH_DATA0 = *ptr++;
|
SFR_FLASH_DATA0 = *ptr++;
|
||||||
SFR_FLASH_DATA8 = *ptr++;
|
SFR_FLASH_DATA8 = *ptr++;
|
||||||
SFR_FLASH_DATA16 = *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)
|
if (exit_loop)
|
||||||
break;
|
break;
|
||||||
len -= 4;
|
len -= 4;
|
||||||
addr += 4;
|
flash_addr += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (flash_read_status() & 0x1);
|
while (flash_read_status() & 0x1);
|
||||||
|
|||||||
+4
-4
@@ -4,11 +4,11 @@
|
|||||||
void flash_init(uint8_t enable_dio);
|
void flash_init(uint8_t enable_dio);
|
||||||
void flash_read_uid(void);
|
void flash_read_uid(void);
|
||||||
void flash_write_enable(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_jedecid(void);
|
||||||
void flash_read_security(uint32_t addr, uint8_t len);
|
void flash_read_security(uint32_t addr, uint8_t len);
|
||||||
void flash_sector_erase(uint32_t addr);
|
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_read_bulk(__xdata uint8_t *dst, __xdata uint16_t len);
|
||||||
void flash_write_bytes(__xdata uint32_t addr, register __xdata uint8_t *ptr, register uint16_t len);
|
void flash_write_bytes(__xdata uint8_t *ptr, __xdata uint16_t len);
|
||||||
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);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+8
-3
@@ -70,6 +70,8 @@ __xdata uint8_t sfr_data[4];
|
|||||||
extern __xdata uint8_t cmd_buffer[SBUF_SIZE];
|
extern __xdata uint8_t cmd_buffer[SBUF_SIZE];
|
||||||
extern __xdata uint8_t gpio_last_value[8];
|
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 greeting = "\nA minimal prompt to explore the RTL8372:\n";
|
||||||
__code uint8_t * __code hex = "0123456789abcdef";
|
__code uint8_t * __code hex = "0123456789abcdef";
|
||||||
|
|
||||||
@@ -1698,7 +1700,8 @@ void bootloader(void)
|
|||||||
flash_init(0);
|
flash_init(0);
|
||||||
|
|
||||||
// Check update in progress and move blocks
|
// 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) {
|
if (flash_buf[0] == 0x00 && flash_buf[1] == 0x40) {
|
||||||
print_string("Update in progress, moving firmware to start of FLASH!\n");
|
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++) {
|
for (__xdata uint16_t i=0; i < 960; i++) {
|
||||||
print_string("Writing block: ");
|
print_string("Writing block: ");
|
||||||
print_short(dest);
|
print_short(dest);
|
||||||
flash_read_bulk(flash_buf, source, 0x200);
|
flash_addr = source;
|
||||||
|
flash_read_bulk(flash_buf, 0x200);
|
||||||
write_char('\n');
|
write_char('\n');
|
||||||
if (!(i & 0x7))
|
if (!(i & 0x7))
|
||||||
flash_sector_erase(dest);
|
flash_sector_erase(dest);
|
||||||
flash_write_bytes(dest, flash_buf, 0x200);
|
flash_addr = dest;
|
||||||
|
flash_write_bytes(flash_buf, 0x200);
|
||||||
dest += 0x200;
|
dest += 0x200;
|
||||||
source += 0x200;
|
source += 0x200;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user