OSDN Git Service

[WIP][v2.0] Loading from Srecord.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 11 Nov 2013 06:37:08 +0000 (15:37 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Mon, 11 Nov 2013 06:37:08 +0000 (15:37 +0900)
eeprom_util.h
eepromutil.c
shell_strutl.c
term_shell.c
uart_termio.c

index f2a6522..c114f12 100644 (file)
@@ -62,6 +62,7 @@ extern "C" {
    extern void format_frequencies(unsigned int page);
    extern void check_frequencies(void);
    extern void save_frequencies(void);
+   extern char save_frequencies_page(unsigned char page);
    extern int load_frequencies(unsigned int page, unsigned char check_only);
    extern int load_userbands(void);
    extern void save_userbands(void);
index 833a427..dafb66e 100644 (file)
@@ -158,6 +158,25 @@ void save_frequencies(void)
     return;
 }
 
+char save_frequencies_page(unsigned char page)
+{
+    unsigned char c;
+    unsigned int addr = (page <<7) + EEPROM_FREQSET_ADDR;
+    __freqset_t *p = &freqset_temp;
+    unsigned char i;
+    unsigned int sum;
+
+    if(page > USER_MEMORY_BANKS) return -3; // Address Error
+    // Pass 0 Calc checksum
+    if(p->magic != EEPROM_FREQSET_MAGIC) return -1; // Data error
+    sum = calcsum_frequencies(p, 0xa5a5);
+    if(p->checksum != sum) return -2; // Sum error
+    // Pass 1 write to rom.
+    c = i2c_eeprom_burstwrite(I2CEEPROM_ADDR, addr, (unsigned char *)p, sizeof(__freqset_t));
+    return 0;
+}
+
+
 void format_frequencies(unsigned int page)
 {
     unsigned char i;
index ac95f47..accd770 100644 (file)
@@ -64,13 +64,14 @@ unsigned char check_eol(unsigned char *p)
         switch(c){
             case '\0':
             case '\n':
+            case '\r':
                 return 0xff;
                 break;
             default:
                 break;
         }
-        if(c < '0') return 0xff;
-        if(c > 'F') return 0xff;
+//        if(c < '0') return 0xff;
+//        if(c > 'F') return 0xff;
     }
     return 0;
 }
@@ -101,7 +102,7 @@ char str_shexheader(unsigned char *s, unsigned char *file)
     unsigned char c;
     unsigned char bytes;
     unsigned int i;
-    if(check_eol(s) != 0) return TERM_NULL;
+//    if(check_eol(s) != 0) return TERM_NULL;
 
     if((s[0] != 'S') || (s[1] != '0')) return TERM_NONSREC;
 
@@ -165,7 +166,7 @@ char str_shex2bin(unsigned char *s, unsigned char *p, unsigned long *addr, unsig
             p[pp] = c;
             i += 2;
             pp++;
-             bytes--;
+            bytes--;
         }
         if(migrate_hex(&s[i]) == 0) return TERM_SUMERR;
         c = hex2byte(&s[i]);
@@ -196,8 +197,22 @@ char str_shex2bin(unsigned char *s, unsigned char *p, unsigned long *addr, unsig
 
 void bin2hex(char *s, unsigned char v)
 {
-    s[0] = v >> 4;
-    s[1] = v & 0x0f;
+    unsigned char c;
+    c = v >> 4;
+    if(c > 9) {
+        c = c - 10 + 'A';
+    } else {
+        c = c + '0';
+    }
+    s[0] = c;
+
+    c = v & 0x0f;
+    if(c > 9) {
+        c = c - 10 + 'A';
+    } else {
+        c = c + '0';
+    }
+    s[1] = c;
     s[2] = 0x00;
 }
 
@@ -214,7 +229,7 @@ unsigned char str_bin2hex(unsigned char *s, unsigned char *p, unsigned long addr
     s[0] = 'S';
     s[1] = '2';
     if(len > 254) len = 254;
-    i = len + 1;
+    i = len + 4; //HEX
     sum = i;
     bin2hex(&s[2], i);
 
index 11abd3f..65f2cdf 100644 (file)
@@ -43,6 +43,7 @@
 #include "shell_strutl.h"
 #include "uart_termio.h"
 #include "term_shell.h"
+#include "eeprom_util.h"
 
 
 unsigned char cmd_shellstr[127];
@@ -50,6 +51,7 @@ static char shell_strbuf[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
@@ -151,7 +153,7 @@ static void term_poweron(char *p)
 {
 }
 
-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);
@@ -174,6 +176,106 @@ static void put_hexfooter(void)
     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.
  */
@@ -182,9 +284,9 @@ static void save_to_term(unsigned char *p)
     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;
@@ -193,17 +295,15 @@ static void save_to_term(unsigned char *p)
         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");
@@ -250,13 +350,18 @@ static void cmd_printhelp(char cmdnum)
             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");
@@ -391,6 +496,9 @@ char term_shell(unsigned int timeout)
             case 2:
                 term_printstatus(pool);
                 break;
+            case 3:
+                load_from_term(pool);
+                break;
             case 4:
                 save_to_term(pool);
                 break;
index 524aada..1af1c8e 100644 (file)
@@ -83,7 +83,7 @@ void uart_term_getstr(unsigned char *s, unsigned int timeout, unsigned char echo
             } else {
                 s[i] = c;
                 i++;
-                if((c == '\t') || (c == '\n')) break; // TAB OR CR
+                if((c == '\t') || (c == '\n') || (c == '\r')) break; // TAB OR CR
                 if(i >= 128) break;
             }
            tim = 0;