OSDN Git Service

[UART] Load via S-Record is okay. Setting is 57600bps, 8N1, but some of noise (bit7...
[openi2cradio/OpenI2CRadio.git] / term_shell.c
index 65f2cdf..8be9569 100644 (file)
@@ -46,8 +46,8 @@
 #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];
@@ -190,6 +190,7 @@ static void save_hex_page(unsigned char *p, unsigned int len, unsigned long base
                 put_hexline(&p[pp], pp + baseaddr, l);
                 break;
             }
+          idle_time_ms(100); // Line wait.
         }
 }
 
@@ -204,35 +205,71 @@ void shell_memcpy(unsigned char *to, unsigned char *from, unsigned char len)
 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.
@@ -242,26 +279,32 @@ 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 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;
 
@@ -510,14 +553,15 @@ char term_shell(unsigned int timeout)
                 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;
 }