OSDN Git Service

[EEPROM] Remove tedious part in check_eeprom().
[openi2cradio/OpenI2CRadio.git] / eepromutil.c
index c833d5d..4a9f3b3 100644 (file)
@@ -43,6 +43,7 @@
 #include "iodef.h"
 #include "idle.h"
 #include "i2c_io.h"
+#include "i2c_eeprom.h"
 #include "akc6955.h"
 #include "lcd_acm1602.h"
 #include "ui.h"
 
 void save_eeprom(void)
 {
-    unsigned int p = 0;
-    unsigned int sum = 0x0000;
-    unsigned char i;
+    unsigned int p[1];
+    unsigned int sum[1];
+        unsigned char i;
     unsigned char j;
-    unsigned char *q;
+    unsigned char *q = (char *)(&setup);
 
+    *p = 0;
+    *sum = 0;
     // Magic word
-    writeword_eeprom(p, &sum, 0x1298);
-    p+= 2;
+    writeword_eeprom(p, sum, 0x1298);
     // amfreq
-    writeword_eeprom(p, &sum, amfreq);
-    p+= 2;
-    // amfreq
-    writeword_eeprom(p, &sum, fmfreq);
-    p+= 2;
+    for(i = 0; i < sizeof(__radioset_t); i++) {
+        writebyte_eeprom(p, sum, *q);
+        q++;
+    }
 
-    writebyte_eeprom(p, &sum, amband);
-    p++;
-    writebyte_eeprom(p, &sum, fmband);
-    p++;
-    writebyte_eeprom(p, &sum, fm);
-    p++;
-    writebyte_eeprom(p, &sum, am_mode3k);
-    p++;
-    writebyte_eeprom(p, &sum, am_userbandnum);
-    p++;
-    writebyte_eeprom(p, &sum, fm_userbandnum);
-    p++;
+    // Write checksum
+    eeprom_writebyte(*p, sum[0] >> 8);
+    eeprom_writebyte(*p + 1, sum[0] & 0xff);
+}
 
-#if 0
-    for(i = 0 ; i < USER_BAND_NUM; i++){
-        writebyte_eeprom(p, &sum, am_usrbands[i].mode3k);
-        writebyte_eeprom(p + 1, &sum, am_usrbands[i].start);
-        writebyte_eeprom(p + 2, &sum, am_usrbands[i].stop);
-        writeword_eeprom(p + 3, &sum, am_usrbands[i].freq);
-        p += 5;
-    }
-    for(i = 0 ; i < USER_BAND_NUM; i++){
-        writebyte_eeprom(p, &sum, fm_usrbands[i].mode3k);
-        writebyte_eeprom(p + 1, &sum, fm_usrbands[i].start);
-        writebyte_eeprom(p + 2, &sum, fm_usrbands[i].stop);
-        writeword_eeprom(p + 3, &sum, fm_usrbands[i].freq);
-        p += 5;
-    }
-#else
-    for(j = 0; j < USER_BAND_NUM; j++){
-        q = (unsigned char *)&am_usrbands[j];
-        for(i = 0; i < sizeof(_userband_t); i++){
-            writebyte_eeprom(p, &sum, *q);
-            p++;
-            q++;
-        }
+
+unsigned int calcsum_frequencies(__freqset_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(__freqset_t) - 2); i++){
+        c = *q;
+        q++;
+        sum = sum + c;
     }
-    for(j = 0; j < USER_BAND_NUM; j++){
-        q = (unsigned char *)&fm_usrbands[j];
-        for(i = 0; i < sizeof(_userband_t); i++){
-            writebyte_eeprom(p, &sum, *q);
-            p++;
+    return sum;
+}
+/*
+  * External I2C Map:
+ *  0x0000
+ *  0x00FF : User settings(Reserved not use)
+ *  0x0100
+ *  0x03ff : User bands
+ *  0x0400
+ *  0x0fff : User frequencies ( 12*2*28 = 672chs Max.)
+ *  0x1000- : Reserve.
+ */
+char load_frequencies(unsigned int page, unsigned char check_only)
+{
+
+    __freqset_t *p;
+    unsigned int sum;
+    unsigned int addr = (page << 7) + 512;
+    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));
+    // Pass 1 Read OK?
+    if(c == 0x00) return -2;
+    // Pass 1 check magic
+    if(freqset_temp.magic != 0xfabc) return -3;
+    // Pass 2 check sum
+    sum = calcsum_frequencies(&freqset_temp, 0xa5a5);
+    if(sum != freqset_temp.checksum) return -4;
+    // Move from
+    if(check_only == 0x00){
+        q = (unsigned char *)(&freqset_temp);
+        r = (unsigned char *)(&freqset);
+        for(i = 0; i < sizeof(__freqset_t); i++){
+            *r = *q;
             q++;
+            r++;
         }
+        setup.pagenum = page;
     }
-#endif
-    amfreq_bank[amband] = amfreq;
-    fmfreq_bank[fmband] = fmfreq;
+    return 0;
+}
 
-    for(i = 0; i < 19; i++){
-        writeword_eeprom(p    , &sum, amfreq_bank[i]);
-        p += 2;
-    }
-    for(i = 0; i < 8; i++){
-        writeword_eeprom(p    , &sum, fmfreq_bank[i]);
-        p += 2;
-    }
 
-    writebyte_eeprom(p, &sum, threshold_amcnr);
-    p++;
-    writebyte_eeprom(p, &sum, threshold_fmcnr);
-    p++;
-    writebyte_eeprom(p, &sum, threshold_width);
-    p++;
-    writebyte_eeprom(p, &sum, threshold_fmstereo);
-    p++;
-    writebyte_eeprom(p, &sum, lowboost);
-    p++;
-    writebyte_eeprom(p, &sum, stereo);
-    p++;
 
-    writebyte_eeprom(p, &sum, volume);
-    p++;
-    writebyte_eeprom(p, &sum, prevolume);
-    p++;
-    writebyte_eeprom(p, &sum, fmbandwidth);
-    p++;
-    writeword_eeprom(p, &sum, backlight_long);
-    p += 2;
-    writeword_eeprom(p, &sum, ui_idlecount);
-    p += 2;
-    writebyte_eeprom(p, &sum, backlight_level);
-    p += 1;
+void save_frequencies(void)
+{
+    unsigned char c;
+    unsigned int addr = (setup.pagenum <<7) + 512;
+    __freqset_t *p = &freqset;
+    unsigned char i;
+    unsigned int sum;
 
-    // Write checksum
-    eeprom_writebyte(p, sum >> 8);
-    eeprom_writebyte(p + 1, sum & 0xff);
+    if(setup.pagenum > USER_MEMORY_BANKS) return; // Address Error
+    // Pass 0 Calc checksum
+    freqset.magic = 0xfabc;
+    freqset.version = 0x0001;
+    sum = calcsum_frequencies(&freqset, 0xa5a5);
+    freqset.checksum = sum;
+    // Pass 1 write to rom.
+    c = i2c_eeprom_burstwrite(0xa0, addr, (unsigned char *)p, sizeof(__freqset_t));
+    return;
+}
+
+void format_frequencies(unsigned int page)
+{
+    unsigned char i;
+    unsigned int sum;
+
+    freqset_temp.magic = 0xfabc;
+    freqset_temp.version = 0x0001;
+    for(i = 0; i < USER_MEMORY_NUM; i++){
+        freqset_temp.memoryfreqs[i].band = AKC6955_BAND_MW2;
+        freqset_temp.memoryfreqs[i].fm = 0;
+        freqset_temp.memoryfreqs[i].freq = 594;
+    }
+    freqset_temp.pagenum = 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));
+}
+
+void check_frequencies(void)
+{
+    unsigned int i;
+    _CLS();
+    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);
+            _HOME();
+            format_frequencies(i);
+        }
+    }
 }
 
 unsigned char load_eeprom(void)
 {
-    unsigned int p = 0;
-    unsigned int sum = 0x0000;
+    unsigned int p[1];
+    unsigned int sum[1];
     unsigned char i;
-    unsigned char *q;
+    unsigned char *q = (unsigned char *)(&setup);
     unsigned char j;
     unsigned int magic;
 
+    p[0] = 0;
+    sum[0] = 0;
     // Magic word
-    magic = readword_eeprom(p, &sum);
+    magic = readword_eeprom(p, sum);
     if(magic != 0x1298) return 0x01; // NO MAGICWORD
-    p+= 2;
     // amfreq
-    amfreq = readword_eeprom(p, &sum);
-    p+= 2;
-    // fmfreq
-    fmfreq = readword_eeprom(p, &sum);
-    p+= 2;
-
-    amband = readbyte_eeprom(p, &sum);
-    p++;
-    fmband = readbyte_eeprom(p, &sum);
-    p++;
-    fm = readbyte_eeprom(p, &sum);
-    p++;
-    am_mode3k = readbyte_eeprom(p, &sum);
-    p++;
-    am_userbandnum = readbyte_eeprom(p, &sum);
-    p++;
-    fm_userbandnum = readbyte_eeprom(p, &sum);
-    p++;
-#if 0
-    for(i = 0 ; i < USER_BAND_NUM; i++){
-        am_usrbands[i].mode3k = readbyte_eeprom(p, &sum);
-        am_usrbands[i].start  = readbyte_eeprom(p + 1, &sum);
-        am_usrbands[i].stop   = readbyte_eeprom(p + 2, &sum);
-        am_usrbands[i].freq   = readword_eeprom(p + 3, &sum);
-        p += 5;
+    for(i = 0; i < sizeof(__radioset_t); i++ ){
+        *q = readbyte_eeprom(p, sum);
+        q++;
     }
-    for(i = 0 ; i < USER_BAND_NUM; i++){
-        fm_usrbands[i].mode3k = readbyte_eeprom(p, &sum);
-        fm_usrbands[i].start  = readbyte_eeprom(p + 1, &sum);
-        fm_usrbands[i].stop   = readbyte_eeprom(p + 2, &sum);
-        fm_usrbands[i].freq   = readword_eeprom(p + 3, &sum);
-        p += 5;
-    }
-#else
-    for(j = 0; j < USER_BAND_NUM; j++){
-        q = (unsigned char *)&am_usrbands[j];
-        for(i = 0; i < sizeof(_userband_t); i++){
-            *q = readbyte_eeprom(p, &sum);
-            p++;
-            q++;
-        }
-        if(am_usrbands[j].mode3k != 0){
-            am_userband_freq[j].start = am_usrbands[j].start * 96;
-            am_userband_freq[j].end   = am_usrbands[j].stop  * 96;
-        } else {
-            am_userband_freq[j].start = am_usrbands[j].start * 160;
-            am_userband_freq[j].end   = am_usrbands[j].stop  * 160;
-        }
-    }
-    for(j = 0; j < USER_BAND_NUM; j++){
-        q = (unsigned char *)&fm_usrbands[j];
-        for(i = 0; i < sizeof(_userband_t); i++){
-            *q = readbyte_eeprom(p, &sum);
-            p++;
-            q++;
-        }
-        fm_userband_freq[j].start = fm_usrbands[j].start * 80 + 3000;
-        fm_userband_freq[j].end   = fm_usrbands[j].stop * 80 + 3000;
-    }
-#endif
-    amfreq = amfreq_bank[amband];
-    fmfreq = fmfreq_bank[fmband];
-    for(i = 0; i < 19; i++){
-        amfreq_bank[i] = readword_eeprom(p    , &sum);
-        p += 2;
-    }
-    for(i = 0; i < 8; i++){
-        fmfreq_bank[i] = readword_eeprom(p    , &sum);
-        p += 2;
-    }
-    threshold_amcnr = readbyte_eeprom(p, &sum);
-    p++;
-    threshold_fmcnr = readbyte_eeprom(p, &sum);
-    p++;
-    threshold_width = readbyte_eeprom(p, &sum);
-    p++;
-    threshold_fmstereo = readbyte_eeprom(p, &sum);
-    p++;
-    lowboost = readbyte_eeprom(p    , &sum);
-    p++;
-    stereo = readbyte_eeprom(p    , &sum);
-    p++;
-    volume = readbyte_eeprom(p, &sum);
-    p++;
-    prevolume = readbyte_eeprom(p, &sum);
-    p++;
-    fmbandwidth = readbyte_eeprom(p, &sum);
-    p++;
-    backlight_long = readword_eeprom(p, &sum);
-    p += 2;
-    ui_idlecount = readword_eeprom(p, &sum);
-    p += 2;
-    backlight_level = readbyte_eeprom(p, &sum);
-    p += 1;
-     // Write checksum
-    magic = (eeprom_readbyte(p) << 8) + eeprom_readbyte(p+1);
+    magic = (eeprom_readbyte(p[0]) << 8) + eeprom_readbyte(p[0] + 1);
 
-    if(sum != magic) return 0x00;
+    if(sum[0] != magic) return 0x00;
     return 0xff;
 }
 
 /*
  * 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;
-        switch(load_eeprom()) {
+
+    switch(load_eeprom()) {
         case 0x01: // No magic-word
             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();
+            check_eeprom_sub();
             break;
         case 0x00: // Checksum error
            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();
+            check_eeprom_sub();
             break;
         case 0xff: // Success
+            check_frequencies();
+            load_frequencies(setup.pagenum, 0);
             return;
             break;
         default: // Unknown error
             break;
     }
     valinit();
+    check_frequencies();
+    load_frequencies(setup.pagenum, 0);
 }