#include "shell_strutl.h"
#include "uart_termio.h"
#include "term_shell.h"
+#include "eeprom_util.h"
unsigned char cmd_shellstr[127];
static char xarg1[66];
static char xarg2[66];
static char xarg3[66];
+static unsigned char tmparea[256];
#define SHELL_CMD_NONE -1
#define SHELL_CMD_NOTFOUND -2
{
}
-static unsigned char put_hexline(unsigned char *dat, unsigned int addr, unsigned char len)
+static unsigned char put_hexline(unsigned char *dat, unsigned long addr, unsigned char len)
{
unsigned char l;
l = str_bin2hex((unsigned char *)shell_strbuf, dat, addr, len);
uart_term_putstr("\n--- END---\n");
}
+
+
+static void save_hex_page(unsigned char *p, unsigned int len, unsigned long baseaddr)
+{
+ unsigned int pp;
+ unsigned int l = len;
+ for(pp = 0; pp < len; pp += 16){
+ if(l > 16) {
+ put_hexline(&p[pp], pp + baseaddr, 16);
+ l -= 16;
+ } else {
+ put_hexline(&p[pp], pp + baseaddr, l);
+ break;
+ }
+ }
+}
+
+
+void shell_memcpy(unsigned char *to, unsigned char *from, unsigned char len)
+{
+ unsigned char l;
+ for(l = 0; l < len; l++) to[l] = from[l];
+}
+
+
+static char wait_for_sheader(unsigned char *file, unsigned char retry)
+{
+ unsigned char _try = 0;
+ char stat;
+
+ 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);
+ if(stat == TERM_OK) break;
+ _try++;
+ } while(_try <= retry);
+ return stat;
+}
+
+static unsigned long load_hex_page(unsigned char *p, unsigned int len)
+{
+ char stat;
+ unsigned char l;
+ unsigned long addr;
+
+ 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
+ p += l;
+ len -= l;
+ }
+ return addr + l;
+}
+/*
+ * Load from S record.
+ */
+static void load_from_term(unsigned char *p)
+{
+ unsigned char slen = shell_gettok(xarg1, p);
+ unsigned long addr = 0;
+ unsigned char *pv;
+ unsigned char len;
+ unsigned char fbuf[128];
+ char 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;
+ len = sizeof(__radioset_t);
+ pv = &tmparea;
+ addr = load_hex_page(pv, len);
+ if(addr == 0xffffffff) goto _loaderr;
+ if((addr & 0xffff0000) != 0) goto _addrerr;
+ 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;
+
+_loaderr:
+ uart_term_putstr("\nERR: LOAD Error\n");
+ return;
+_addrerr:
+ uart_term_putstr("\nERR: Address Error\n");
+ return;
+_fileerr:
+ uart_term_putstr("\nERR: Not correct filename\n");
+ return;
+}
+
/*
* Save ROM as S record.
*/
unsigned char slen;
unsigned int len;
unsigned int pp;
- long i;
int addr;
unsigned char *pv;
+ unsigned long base;
slen = shell_gettok(xarg1, p);
addr = 0;
put_hexheader("INT_EEPROM");
len = sizeof(__radioset_t);
pv = &setup;
- for(pp = 0; pp < sizeof(__radioset_t); pp += 16){
- if(len > 16) {
- put_hexline(&pv[pp], pp, 16);
- len -= 16;
- } else {
- put_hexline(&pv[pp], pp, len);
- }
- }
+ save_hex_page(pv, len, 0);
put_hexfooter();
} else if(shell_strcmp(xarg1, "FTBL") > 0) { // External EEPROM, Freq TBL
put_hexheader("EXT_FREQTBL");
+ base = 0x100000;
+ for(pp = 0; pp < USER_MEMORY_BANKS; pp++) {
+ if(load_frequencies(pp, 0xff) != 0) break; // Error
+ save_hex_page((unsigned char *)(&freqset_temp), sizeof(__freqset_t), base + (pp << 9)) ;
+ }
put_hexfooter();
} else if(shell_strcmp(xarg1, "BAND") > 0) { // band
put_hexheader("EXT_BANDTBL");
uart_term_putstr(" -- Print status.\n");
break;
case 3:
- uart_term_putstr("\nLOAD direction [S]\n");
+ uart_term_putstr("\nLOAD section [S]\n");
uart_term_putstr(" -- Load settings from terminal.\n");
uart_term_putstr(" Arg2: if 'S' then Save to internal EEPROM.\n");
break;
case 4:
uart_term_putstr("\nSAVE section\n");
uart_term_putstr(" -- Save settings to terminal.\n");
+ uart_term_putstr(" section :\n");
+ uart_term_putstr(" INT : Internal EEPROM\n");
+ uart_term_putstr(" FTBL : Freq table");
+ uart_term_putstr(" FREQ num : Save user freq #num.");
+ uart_term_putstr(" BAND : Save user band table.");
break;
case 5:
uart_term_putstr("\nFM\n");
case 2:
term_printstatus(pool);
break;
+ case 3:
+ load_from_term(pool);
+ break;
case 4:
save_to_term(pool);
break;