#include "eeprom_util.h"
-unsigned char cmd_shellstr[127];
-static char shell_strbuf[127];
+unsigned char cmd_shellstr[130];
+static char shell_strbuf[130];
static char xarg1[66];
static char xarg2[66];
static char xarg3[66];
put_hexline(&p[pp], pp + baseaddr, l);
break;
}
+ idle_time_ms(100); // Line wait.
}
}
static char wait_for_sheader(unsigned char *file, unsigned char retry)
{
unsigned char _try = 0;
- char stat;
-
+ unsigned char _err = 0;
+ int stat;
+ file[0] = '\0';
+
do {
shell_strbuf[0] = '\0';
- uart_term_getstr(shell_strbuf, 1000, 0); // With Echo, timeout=100Sec.
- uart_term_putstr(shell_strbuf);
- stat = str_shexheader(shell_strbuf, file);
+ uart_term_getstr(shell_strbuf, 100, 0); // With Echo, timeout=10Sec.
+ stat = search_head_s(shell_strbuf);
+ if(stat < 0) {
+ _err++;
+ if(_err > 100) return -1; // Error
+ continue;
+ }
+ _err = 0;
+ stat = str_shexheader(&shell_strbuf[stat], file);
if(stat == TERM_OK) break;
_try++;
} while(_try <= retry);
return stat;
}
-static unsigned long load_hex_page(unsigned char *p, unsigned int len)
+static unsigned long load_hex_page(unsigned char *p, unsigned long *addr, unsigned int len)
{
- char stat;
+ int stat;
unsigned char l;
- unsigned long addr;
-
+ unsigned long a;
+ unsigned char __err = 0;
+ unsigned long bytes = 0;
+ int pos;
+ unsigned char sbuf[20];
+
while(len > 0){
- uart_term_getstr(shell_strbuf, 100, 0); // With Echo, timeout=10Sec.
- stat = str_shex2bin(shell_strbuf, p, &addr, &l);
- uart_term_putstr(shell_strbuf);
- if(stat < 0) return 0xffffffff; // Some error
- if(l < len) return addr + l; // End addr
+_l0:
+
+ shell_strbuf[0] = '\0';
+ uart_term_getstr(shell_strbuf, 1000, 0); // Without Echo, timeout=100Sec.
+
+ stat = search_head_s(shell_strbuf);
+ if(stat < 0) {
+ __err++;
+ if(__err > 100) {
+ return 0xffffffff; // Error
+ }
+ ClrWdt();
+ idle_time_ms(10);
+ goto _l0;
+ }
+ __err = 0;
+ pos = stat;
+ stat = str_shex2bin(&shell_strbuf[stat], p, &a, &l);
+ if(stat == TERM_SRECEND) {
+ return bytes; // Return head
+ }
+
+ if(stat != TERM_OK) {
+ return 0xffffffff; // Some error
+ }
+
+ bytes += l;
+ *addr = a;
+ if(l >= len) break; // End addr
p += l;
len -= l;
}
- return addr + l;
+ return bytes;
}
/*
* Load from S record.
unsigned char slen = shell_gettok(xarg1, p);
unsigned long addr = 0;
unsigned char *pv;
- unsigned char len;
+ unsigned int len;
unsigned char fbuf[128];
- char stat;
+ unsigned long l;
+ int stat;
if(shell_strcmp(xarg1, "INT") > 0) { // Internal EEPROM
uart_term_putstr("\nPls. start internal eeprom data...\n");
+
stat = wait_for_sheader(fbuf, 10);
+
if(stat != TERM_OK) goto _loaderr;
- if(shell_strcmp(fbuf, "INT_EEPRPOM") < 0) goto _fileerr;
+ if(shell_strcmp(fbuf, "INT_EEPROM") < 0) goto _fileerr;
len = sizeof(__radioset_t);
- pv = &tmparea;
- addr = load_hex_page(pv, len);
- if(addr == 0xffffffff) goto _loaderr;
- if((addr & 0xffff0000) != 0) goto _addrerr;
+ pv = tmparea;
+// pv = &setup;
+ l = load_hex_page(pv, &addr, len);
+ if(l == 0xffffffff) goto _loaderr;
+ if(addr >= 255) goto _loaderr; // Too large
+
shell_memcpy((unsigned char *)(&setup) , &tmparea, len);
setup_akc6955(); // DO!
} else if(shell_strcmp(xarg1, "FTBL") > 0) { // External EEPROM, Freq TBL
} else if(shell_strcmp(xarg1, "BAND") > 0) { // band
}
_OK:
+
uart_term_putstr("\nOK.\n");
return;
break;
case 15: // Exit
uart_term_putstr("\nBye... (^^)/~~\n");
- uart_init();
- return SHELL_CMD_OK;
- break;
+ goto _l0;
+ break;
default:
uart_term_putstr("\n?? CMD Error\n");
break;
}
} while(1);
+_l0:
+ uart_init();
return SHELL_CMD_OK;
}