OSDN Git Service

[WIP][v2.0] Loading from Srecord.
[openi2cradio/OpenI2CRadio.git] / eepromutil.c
index b48180f..dafb66e 100644 (file)
@@ -64,7 +64,7 @@ void save_eeprom(void)
     *p = 0;
     *sum = 0;
     // Magic word
-    writeword_eeprom(p, sum, 0x1298);
+    writeword_eeprom(p, sum, EEPROM_INTSET_MAGIC);
     // amfreq
     for(i = 0; i < sizeof(__radioset_t); i++) {
         writebyte_eeprom(p, sum, *q);
@@ -94,32 +94,32 @@ unsigned int calcsum_frequencies(__freqset_t *p, unsigned int start)
 /*
   * External I2C Map:
  *  0x0000
- *  0x00FF : User settings(Reserved not use)
+ *  0x01FF : User settings(Reserved not use)
  *  0x0100
- *  0x03ff : User bands
- *  0x0400
+ *  0x01ff : User bands
+ *  0x0200
  *  0x0fff : User frequencies ( 12*2*28 = 672chs Max.)
  *  0x1000- : Reserve.
  */
-char load_frequencies(unsigned int page, unsigned char check_only)
+int load_frequencies(unsigned int page, unsigned char check_only)
 {
 
     __freqset_t *p;
     unsigned int sum;
-    unsigned int addr = (page << 7) + 512;
+    unsigned int addr = (page << 7) + EEPROM_FREQSET_ADDR;
     unsigned char *q;
     unsigned char *r;
     unsigned char c;
     unsigned int i;
 
 //    if(addr > 0x0fff) return -1; // Address error
-
+    if(page > USER_MEMORY_BANKS) return -1; // Address Error
     p = &freqset_temp;
-    c = i2c_eeprom_burstread(0xa0, addr, (unsigned char *)p, sizeof(__freqset_t));
+    c = i2c_eeprom_burstread(I2CEEPROM_ADDR, addr, (unsigned char *)p, sizeof(__freqset_t));
     // Pass 1 Read OK?
     if(c == 0x00) return -2;
     // Pass 1 check magic
-    if(freqset_temp.magic != 0xfabc) return -3;
+    if(freqset_temp.magic != EEPROM_FREQSET_MAGIC) return -3;
     // Pass 2 check sum
     sum = calcsum_frequencies(&freqset_temp, 0xa5a5);
     if(sum != freqset_temp.checksum) return -4;
@@ -142,49 +142,47 @@ char load_frequencies(unsigned int page, unsigned char check_only)
 void save_frequencies(void)
 {
     unsigned char c;
-    unsigned int addr = (setup.pagenum <<7) + 512;
+    unsigned int addr = (setup.pagenum <<7) + EEPROM_FREQSET_ADDR;
     __freqset_t *p = &freqset;
     unsigned char i;
-    unsigned char flg;
-    unsigned char *q, *r;
     unsigned int sum;
 
-   // if(addr > 0x0fff) return;
+    if(setup.pagenum > USER_MEMORY_BANKS) return; // Address Error
     // Pass 0 Calc checksum
-    freqset.magic = 0xfabc;
+    freqset.magic = EEPROM_FREQSET_MAGIC;
     freqset.version = 0x0001;
     sum = calcsum_frequencies(&freqset, 0xa5a5);
     freqset.checksum = sum;
-    // Pass 1 check storaged page
-    if(load_frequencies(setup.pagenum, 0xff) < 0) {
-        // Sum ERROR = Force rewrite
-        c = i2c_eeprom_burstwrite(0xa0, addr, (unsigned char *)p, sizeof(__freqset_t));
-        return;
-    }
-    // Pass 2 compare
-    flg = 0x00;
-//    flg = 0xff;
-    q = (unsigned char *)(&freqset_temp);
-    r = (unsigned char *)(&freqset);
-    for(i = 0; i < sizeof(__freqset_t); i++) {
-        if(*q != *r) flg |= 0xff;
-        q++;
-        r++;
-    }
-    if(flg != 0x00){ // Changed
-        c = i2c_eeprom_burstwrite(0xa0, addr, (unsigned char *)p, sizeof(__freqset_t));
-        return;
-    }
-    // Not Need to read.
+    // Pass 1 write to rom.
+    c = i2c_eeprom_burstwrite(I2CEEPROM_ADDR, addr, (unsigned char *)p, sizeof(__freqset_t));
     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;
     unsigned int sum;
 
-    freqset_temp.magic = 0xfabc;
+    freqset_temp.magic = EEPROM_FREQSET_MAGIC;
     freqset_temp.version = 0x0001;
     for(i = 0; i < USER_MEMORY_NUM; i++){
         freqset_temp.memoryfreqs[i].band = AKC6955_BAND_MW2;
@@ -195,27 +193,101 @@ void format_frequencies(unsigned int page)
     sum = calcsum_frequencies(&freqset_temp, 0xa5a5);
     freqset_temp.checksum = sum;
 
-    i = i2c_eeprom_burstwrite(0xa0, (page << 7)+ 512, (unsigned char *)(&freqset_temp), sizeof(__freqset_t));
+    i = i2c_eeprom_burstwrite(I2CEEPROM_ADDR, (page << 7)+ EEPROM_FREQSET_ADDR, (unsigned char *)(&freqset_temp), sizeof(__freqset_t));
 }
 
 void check_frequencies(void)
 {
     unsigned int i;
     _CLS();
-    for(i = 0; i < 24; i++){
+    for(i = 0; i < USER_MEMORY_BANKS; i++){
         printstr("Check ExtROM:");
         print_numeric_nosupress(i, 2);
        _HOME();
         
         if(load_frequencies(i, 0xff) < 0){
-            printstr("Format:");
-            print_numeric_nosupress(i, 2);
+//            printstr("Format:");
+//            print_numeric_nosupress(i, 2);
             _HOME();
             format_frequencies(i);
         }
     }
+   if(load_userbands() < 0) {
+      format_userbands();
+   }
+}
+
+static unsigned int calcsum_userband(__userband_t_t *p, unsigned int start)
+{
+    unsigned int sum = start;
+    unsigned char *q = (unsigned char *)p;
+    unsigned char c;
+    unsigned char i;
+
+    for(i = 0; i < (sizeof(__userband_t_t) - 2); i++){
+        c = *q;
+        q++;
+        sum = sum + c;
+    }
+    return sum;
 }
 
+int load_userbands(void)
+{
+
+    __userband_t_t *p = &userband;
+    unsigned int sum;
+    unsigned int addr = EEPROM_BANDSET_ADDR;
+    unsigned char c;
+
+//    if(addr > 0x0fff) return -1; // Address error
+   c = i2c_eeprom_burstread(I2CEEPROM_ADDR, addr, (unsigned char *)p, sizeof(__userband_t_t));
+    // Pass 1 Read OK?
+   if(c == 0x00) return -2;
+    // Pass 1 check magic
+   if(p->magic != EEPROM_BANDSET_MAGIC) return -3;
+    // Pass 2 check sum
+   sum = calcsum_userband(p, 0x5a5a);
+   if(sum != p->checksum) return -4;
+   return 0;
+}
+
+void save_userbands(void)
+{
+    unsigned char c;
+    unsigned int addr = EEPROM_BANDSET_ADDR;
+    __userband_t_t *p = &userband;
+    unsigned char i;
+    unsigned int sum;
+
+    // Pass 0 Calc checksum
+    userband.magic = EEPROM_BANDSET_MAGIC;
+    userband.version = 0x0001;
+    sum = calcsum_userband(&userband, 0x5a5a);
+    userband.checksum = sum;
+    // Pass 1 write to rom.
+    c = i2c_eeprom_burstwrite(I2CEEPROM_ADDR, addr, (unsigned char *)p, sizeof(__userband_t_t));
+    return;
+}
+
+void format_userbands(void)
+{
+   unsigned char i;
+   for(i = 0; i < USER_BAND_NUM; i++) {
+       userband.am_usrbands[i].start = 0x19;
+        userband.am_usrbands[i].stop = 0x32;
+        userband.am_usrbands[i].freq = 5600; //(0x32 - (0x32-0x19) / 2 *32) * 5
+        userband.am_usrbands[i].mode3k = 0;
+        //
+       userband.fm_usrbands[i].start = 0x19;
+        userband.fm_usrbands[i].stop = 0x32;
+        userband.fm_usrbands[i].freq = 8600;
+        userband.fm_usrbands[i].mode3k = 0;
+   }
+   save_userbands(); // Re-init
+}
+
+
 unsigned char load_eeprom(void)
 {
     unsigned int p[1];
@@ -229,7 +301,7 @@ unsigned char load_eeprom(void)
     sum[0] = 0;
     // Magic word
     magic = readword_eeprom(p, sum);
-    if(magic != 0x1298) return 0x01; // NO MAGICWORD
+    if(magic != EEPROM_INTSET_MAGIC) return 0x01; // NO MAGICWORD
     // amfreq
     for(i = 0; i < sizeof(__radioset_t); i++ ){
         *q = readbyte_eeprom(p, sum);
@@ -244,39 +316,33 @@ unsigned char load_eeprom(void)
 /*
  * Check eeprom, and format/restore.
  */
+static void check_eeprom_sub(void)
+{
+ _CLS();
+ _LOCATE_0_0();
+ printstr("Formatting...  ");
+ format_eeprom(2,250);
+ _LOCATE_0_0();
+ printstr("Save defaults  ");
+ setdefault();
+ save_eeprom();
+}
+
+
 void check_eeprom(void)
 {
     unsigned char c;
-    unsigned int bank;
 
     switch(load_eeprom()) {
         case 0x01: // No magic-word
-            idle_time_ms(2000);
+//            idle_time_ms(2000);
             c = printhelp_2lines("EEPROM FORMAT", "Press any key");
-            _CLS();
-            _LOCATE(0,0);
-            printstr("Formatting...  ");
-            format_eeprom(2,250);
-            _LOCATE(0,0);
-            printstr("Save defaults  ");
-            setdefault();
-            save_eeprom();
-//            format_frequencies();
+            check_eeprom_sub();
             break;
         case 0x00: // Checksum error
-           idle_time_ms(2000);
+//           idle_time_ms(2000);
             c = printhelp_2lines("X-) Sum error", "Press any key");
-            c = pollkey_single();
-            _CLS();
-            _LOCATE(0,0);
-            printstr("Formatting...");
-            format_eeprom(2,250);
-//            writeword_eeprom(0, &sum, 0x1298);
-            _LOCATE(0,0);
-            printstr("Save defaults");
-            setdefault();
-            save_eeprom();
-//            format_frequencies();
+            check_eeprom_sub();
             break;
         case 0xff: // Success
             check_frequencies();