#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#if defined(__SDCC)
#include <sdcc-lib.h>
#include <pic18fregs.h> /* ONLY FOR PIC18x */
-#include <signal.h>
#include <delay.h>
+#else
+#include <xc.h>
+#endif
+#include <signal.h>
#include "commondef.h"
#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 = (char *)(&setup);
+ *p = 0;
+ *sum = 0;
// Magic word
- writeword_eeprom(p, &sum, 0x1298);
- p+= 2;
- // amfreq
- writeword_eeprom(p, &sum, amfreq);
- p+= 2;
+ writeword_eeprom(p, sum, 0x1298);
// amfreq
- writeword_eeprom(p, &sum, fmfreq);
- p+= 2;
-
- 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++;
-
- 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 < sizeof(__radioset_t); i++) {
+ writebyte_eeprom(p, sum, *q);
+ q++;
}
- 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;
+
+ // Write checksum
+ eeprom_writebyte(*p, sum[0] >> 8);
+ 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;
}
- for(i = 0; i < 19; i++){
- writeword_eeprom(p , &sum, amfreq_bank[i]);
- p += 2;
+ 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(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;
+ // 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;
}
- for(i = 0; i < 8; i++){
- writeword_eeprom(p , &sum, fmfreq_bank[i]);
- p += 2;
+ 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(I2CEEPROM_ADDR, 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(I2CEEPROM_ADDR, (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);
+ }
}
- writebyte_eeprom(p, &sum, threshold);
- p++;
- writebyte_eeprom(p, &sum, lowboost);
- p++;
- writebyte_eeprom(p, &sum, stereo);
- p++;
- // Write checksum
- eeprom_writebyte(p, sum >> 8);
- eeprom_writebyte(p + 1, sum & 0xff);
}
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 *)(&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++;
-
- 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 < 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;
+ for(i = 0; i < sizeof(__radioset_t); i++ ){
+ *q = readbyte_eeprom(p, sum);
+ q++;
}
- 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 = readbyte_eeprom(p , &sum);
- p++;
- lowboost = readbyte_eeprom(p , &sum);
- p++;
- stereo = readbyte_eeprom(p , &sum);
- p++;
- // Write checksum
- magic = (eeprom_readbyte(p) << 8) + eeprom_readbyte(p+1);
+ magic = (eeprom_readbyte(p[0]) << 8) + eeprom_readbyte(p[0] + 1);
- p+= 2;
- 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
- setdefault();
break;
}
-
+ valinit();
+ check_frequencies();
+ load_frequencies(setup.pagenum, 0);
}