#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);
}