OSDN Git Service

[EEPROM] Remove tedious part in check_eeprom().
[openi2cradio/OpenI2CRadio.git] / eepromutil.c
index 9da0aa5..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"
@@ -75,6 +76,125 @@ void save_eeprom(void)
     eeprom_writebyte(*p + 1, sum[0] & 0xff);
 }
 
+
+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;
+    }
+    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;
+    }
+    return 0;
+}
+
+
+
+void save_frequencies(void)
+{
+    unsigned char c;
+    unsigned int addr = (setup.pagenum <<7) + 512;
+    __freqset_t *p = &freqset;
+    unsigned char i;
+    unsigned int sum;
+
+    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[1];
@@ -103,41 +223,43 @@ 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;
-        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);
 }