OSDN Git Service

[USERFERQ] Store userbands to external EEPROM.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 24 Sep 2013 21:15:16 +0000 (06:15 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Tue, 24 Sep 2013 21:15:16 +0000 (06:15 +0900)
akc6955.c
akc6955.h
eeprom_util.h
eepromutil.c
menu.h
menu_defs.c
menu_userband.c
ui_updown.c

index 52e99c9..55f79d6 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
@@ -313,8 +313,8 @@ void akc6955_set_freq(unsigned int freq)
         akc6955_get_fmband(band);
 //        band &= 7;
         if(band == AKC6955_BAND_FMUSER){
-            start = setup.fm_usrbands[setup.fm_userbandnum].start * 32;
-            stop = setup.fm_usrbands[setup.fm_userbandnum].stop * 32;
+            start = userband.fm_usrbands[setup.fm_userbandnum].start * 32;
+            stop = userband.fm_usrbands[setup.fm_userbandnum].stop * 32;
         } else {
             start = fmbands[band].start;
             stop = fmbands[band].end;
@@ -325,8 +325,8 @@ void akc6955_set_freq(unsigned int freq)
         akc6955_get_amband(band);
 //        if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
         if(band == AKC6955_BAND_AMUSER){
-            start = setup.am_usrbands[setup.am_userbandnum].start * 32;
-            stop = setup.am_usrbands[setup.am_userbandnum].stop * 32;
+            start = userband.am_usrbands[setup.am_userbandnum].start * 32;
+            stop = userband.am_usrbands[setup.am_userbandnum].stop * 32;
         } else {
             start = ambands[band].start;
             stop = ambands[band].end;
index feb81af..143627f 100644 (file)
--- a/akc6955.h
+++ b/akc6955.h
@@ -112,7 +112,7 @@ extern "C" {
 /*
  * Band defines
  */
-    typedef struct {
+typedef struct {
     unsigned int start;
     unsigned int end;
 } banddesc;
index 709381f..df5d073 100644 (file)
@@ -63,7 +63,19 @@ extern void format_frequencies(unsigned int page);
 extern void check_frequencies(void);
 extern void save_frequencies(void);
 extern char load_frequencies(unsigned int page, unsigned char check_only);
+extern char load_userbands(void);
+extern void save_userbands(void);
+extern void format_userbands(void);   
+/*
+ * Constants
+ */
+#define EEPROM_INTSET_MAGIC 0x1298
+#define EEPROM_FREQSET_MAGIC 0xfabc
+#define EEPROM_BANDSET_MAGIC 0xfd0f
 
+#define EEPROM_SET_ADDR 0x0000
+#define EEPROM_BANDSET_ADDR 0x0100
+#define EEPROM_FREQSET_ADDR 0x0200   
 
 #ifdef __cplusplus
 }
index bea80a3..9fe5616 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,10 +94,10 @@ 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.
  */
@@ -106,7 +106,7 @@ char 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;
@@ -119,7 +119,7 @@ char load_frequencies(unsigned int page, unsigned char check_only)
     // 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,14 +142,14 @@ 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 int sum;
 
     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;
@@ -163,7 +163,7 @@ 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;
@@ -174,7 +174,7 @@ void format_frequencies(unsigned int page)
     sum = calcsum_frequencies(&freqset_temp, 0xa5a5);
     freqset_temp.checksum = sum;
 
-    i = i2c_eeprom_burstwrite(I2CEEPROM_ADDR, (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)
@@ -187,14 +187,88 @@ void check_frequencies(void)
        _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;
+}
+
+char 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_FREQSET_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 = 1216; //0x32 - (0x32-0x19) / 2 *32
+        userband.am_usrbands[i].mode3k = 0;
+   }
+   for(i = 0; i < USER_BAND_NUM; i++) {
+       userband.fm_usrbands[i].start = 0x19;
+        userband.fm_usrbands[i].stop = 0x32;
+        userband.fm_usrbands[i].freq = 1216; //0x32 - (0x32-0x19) / 2 *32
+        userband.fm_usrbands[i].mode3k = 0;
+   }
+}
+
+
 unsigned char load_eeprom(void)
 {
     unsigned int p[1];
@@ -208,7 +282,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);
diff --git a/menu.h b/menu.h
index 70adcb4..3889854 100644 (file)
--- a/menu.h
+++ b/menu.h
 #ifdef __cplusplus
 extern "C" {
 #endif
-#define USER_BAND_NUM 3
-    typedef struct {
-        unsigned char mode3k; // mode3k if am
-        unsigned char start;
-        unsigned char stop;
-        unsigned int freq;
-    } _userband_t;
+
     
 #define USER_MEMORY_NUM 28
 #define USER_MEMORY_BANKS 24
@@ -99,10 +93,8 @@ typedef struct {
     unsigned char threshold_fmcnr; // Reg 0x08
     unsigned char threshold_width; // Reg 0x08
     unsigned char threshold_fmstereo; // Reg 0x08
-    _userband_t am_usrbands[USER_BAND_NUM];
-    _userband_t fm_usrbands[USER_BAND_NUM];
-    banddesc am_userband_freq[USER_BAND_NUM];
-    banddesc fm_userband_freq[USER_BAND_NUM];
+//    banddesc am_userband_freq[USER_BAND_NUM];
+//    banddesc fm_userband_freq[USER_BAND_NUM];
     unsigned char stereo;
     unsigned char volume;
     unsigned char prevolume;
@@ -113,15 +105,31 @@ typedef struct {
     unsigned int ui_idlecount;
     unsigned int memorynum;
     unsigned char fm_tunepitch;
-//    _memoryfreq_t memoryfreqs[USER_MEMORY_NUM];
     unsigned int pagenum;
-   
 } __radioset_t;
 
+typedef struct {
+        unsigned char mode3k; // mode3k if am
+        unsigned char start;
+        unsigned char stop;
+        unsigned int freq;
+        unsigned char reserve[3];
+} _userband_t;
+
+#define USER_BAND_NUM 10
+typedef struct {
+    unsigned int magic;
+    unsigned int version;
+    _userband_t am_usrbands[USER_BAND_NUM];
+    _userband_t fm_usrbands[USER_BAND_NUM];
+    unsigned int checksum;
+} __userband_t_t;
+   
 
     extern __radioset_t setup;
     extern __freqset_t freqset;
     extern __freqset_t freqset_temp;
+    extern __userband_t_t userband;
     extern unsigned char scanflag;
 
     extern unsigned char stereoflag;
index 27257f6..1fa3206 100644 (file)
@@ -89,6 +89,7 @@ const banddesc fmbands[8] = {
 __radioset_t setup;
 __freqset_t freqset;
 __freqset_t freqset_temp;
+__userband_t_t userband;
 unsigned char scanflag;
 
 
@@ -112,12 +113,12 @@ void setdefault(void)
     setup.threshold_fmstereo = 0;
     setup.threshold_width = 0;
     for(i = 0; i < USER_BAND_NUM; i++){
-        setup.am_usrbands[i].start = 0x19;
-        setup.am_usrbands[i].stop  = 0x32;
+        userband.am_usrbands[i].start = 0x19;
+        userband.am_usrbands[i].stop  = 0x32;
     }
     for(i = 0; i < USER_BAND_NUM; i++){
-        setup.fm_usrbands[i].start = 0x19;
-        setup.fm_usrbands[i].stop  = 0x32;
+        userband.fm_usrbands[i].start = 0x19;
+        userband.fm_usrbands[i].stop  = 0x32;
     }
     for(i =0; i < AKC6955_BAND_AMEND; i++){
       setup.amfreq_bank[i] = ((ambands[i].end - ambands[i].start) / 2) + ambands[i].start;
index 15bf293..c55d4cd 100644 (file)
@@ -45,9 +45,9 @@ void call_userband(unsigned char num)
 
     if(num >= USER_BAND_NUM) return;
 
-    p = &(setup.am_usrbands[num]);
+    p = &(userband.am_usrbands[num]);
     if(setup.fm != 0){
-        p = &(setup.fm_usrbands[num]);
+        p = &(userband.fm_usrbands[num]);
     }
     freq = p->freq;
     start = p->start;
@@ -96,8 +96,8 @@ void set_userband(void)
     if(c >= USER_BAND_NUM) return;
 
     if(setup.fm != 0){
-        from = setup.fm_usrbands[c].start * 80 + 3000; // 32*25/10
-        to = setup.fm_usrbands[c].stop * 80 + 3000;
+        from = userband.fm_usrbands[c].start * 80 + 3000; // 32*25/10
+        to = userband.fm_usrbands[c].stop * 80 + 3000;
         _CLS();
         _LOCATE(0,0);
         printstr("FM#");
@@ -110,16 +110,16 @@ void set_userband(void)
         printstr(" To:  ");
         to = read_numeric(to, 5, 7, 1);
         if((to & 0x80000000) != 0) goto _l0;
-        setup.fm_usrbands[c].start = (from - 3000) / 80;
-        setup.fm_usrbands[c].stop = (to - 3000) / 80;
-        setup.fm_usrbands[c].freq = from;
+        userband.fm_usrbands[c].start = (from - 3000) / 80;
+        userband.fm_usrbands[c].stop = (to - 3000) / 80;
+        userband.fm_usrbands[c].freq = from;
         setup.fm_userbandnum = c;
     } else {
-        mode3k = setup.am_usrbands[c].mode3k;
+        mode3k = userband.am_usrbands[c].mode3k;
         pp = 96; // 3*32
         if(mode3k == 0) pp = 160; // 5*32
-        from = setup.am_usrbands[c].start * pp;
-        to = setup.am_usrbands[c].stop * pp;
+        from = userband.am_usrbands[c].start * pp;
+        to = userband.am_usrbands[c].stop * pp;
         _CLS();
         _LOCATE(0,0);
         printstr("AM#");
@@ -147,10 +147,10 @@ void set_userband(void)
         printstr(" To:  ");
         to = read_numeric(to, 5, 7, 1);
         if((to & 0x80000000) != 0) goto _l0;
-        setup.am_usrbands[c].start = from / pp;
-        setup.am_usrbands[c].stop = to  / pp;
-        setup.am_usrbands[c].mode3k = mode3k;
-        setup.am_usrbands[c].freq = from;
+        userband.am_usrbands[c].start = from / pp;
+        userband.am_usrbands[c].stop = to  / pp;
+        userband.am_usrbands[c].mode3k = mode3k;
+        userband.am_usrbands[c].freq = from;
         setup.am_userbandnum = c;
     }
     call_userband(c);
index a0e203a..6f3bbbb 100644 (file)
@@ -83,7 +83,7 @@ static void setband_updown(unsigned char updown)
     if(setup.fm == 0){  // MW
         band = setup.amband + 1;
         if(setup.amband == AKC6955_BAND_AMUSER){
-            setup.am_usrbands[setup.am_userbandnum].freq = setup.amfreq;
+            userband.am_usrbands[setup.am_userbandnum].freq = setup.amfreq;
         }
         setup.amfreq_bank[setup.amband] = setup.amfreq;
         if(updown == 0) { // down
@@ -116,7 +116,7 @@ static void setband_updown(unsigned char updown)
         setfreq_updown_amsub();
     } else { // FM
         if(setup.fmband == AKC6955_BAND_FMUSER){
-            setup.fm_usrbands[setup.fm_userbandnum].freq = setup.fmfreq;
+            userband.fm_usrbands[setup.fm_userbandnum].freq = setup.fmfreq;
         }
         band = setup.fmband + 1;
         setup.fmfreq_bank[setup.fmband] = setup.fmfreq;