4 * Copyright (C) 2013-06-10 K.Ohta <whatisthis.sowhat ai gmail.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2,
10 * or (at your option) any later version.
11 * This library / program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this library; see the file COPYING. If not, write to the
18 * Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21 * As a special exception, if you link this(includeed from sdcc) library
22 * with other files, some of which are compiled with SDCC,
23 * to produce an executable, this library does not by itself cause
24 * the resulting executable to be covered by the GNU General Public License.
25 * This exception does not however invalidate any other reasons why
26 * the executable file might be covered by the GNU General Public License.
35 #include <pic18fregs.h> /* ONLY FOR PIC18x */
42 #include "commondef.h"
47 #include "lcd_acm1602.h"
55 void save_eeprom(void)
58 unsigned int sum = 0x0000;
65 writeword_eeprom(p, &sum, 0x1298);
67 writeword_eeprom(p, &sum, amfreq);
69 writeword_eeprom(p, &sum, fmfreq);
71 writebyte_eeprom(p, &sum, amband);
72 writebyte_eeprom(p, &sum, fmband);
73 writebyte_eeprom(p, &sum, fm);
74 writebyte_eeprom(p, &sum, am_mode3k);
75 writebyte_eeprom(p, &sum, am_userbandnum);
76 writebyte_eeprom(p, &sum, fm_userbandnum);
78 for(j = 0; j < USER_BAND_NUM; j++){
79 q = (unsigned char *)&am_usrbands[j];
80 for(i = 0; i < sizeof(_userband_t); i++){
81 writebyte_eeprom(p, &sum, *q);
85 for(j = 0; j < USER_BAND_NUM; j++){
86 q = (unsigned char *)&fm_usrbands[j];
87 for(i = 0; i < sizeof(_userband_t); i++){
88 writebyte_eeprom(p, &sum, *q);
92 amfreq_bank[amband] = amfreq;
93 fmfreq_bank[fmband] = fmfreq;
95 for(i = 0; i < 19; i++){
96 writeword_eeprom(p , &sum, amfreq_bank[i]);
98 for(i = 0; i < 8; i++){
99 writeword_eeprom(p , &sum, fmfreq_bank[i]);
102 writebyte_eeprom(p, &sum, threshold_amcnr);
103 writebyte_eeprom(p, &sum, threshold_fmcnr);
104 writebyte_eeprom(p, &sum, threshold_width);
105 writebyte_eeprom(p, &sum, threshold_fmstereo);
106 writebyte_eeprom(p, &sum, lowboost);
107 writebyte_eeprom(p, &sum, stereo);
109 writebyte_eeprom(p, &sum, volume);
110 writebyte_eeprom(p, &sum, prevolume);
111 writebyte_eeprom(p, &sum, fmbandwidth);
112 writeword_eeprom(p, &sum, backlight_long);
113 writeword_eeprom(p, &sum, ui_idlecount);
114 writebyte_eeprom(p, &sum, backlight_level);
117 eeprom_writebyte(*p, sum >> 8);
118 eeprom_writebyte(*p + 1, sum & 0xff);
121 unsigned char load_eeprom(void)
133 magic = readword_eeprom(p, sum);
134 if(magic != 0x1298) return 0x01; // NO MAGICWORD
136 amfreq = readword_eeprom(p, sum);
138 fmfreq = readword_eeprom(p, sum);
139 amband = readbyte_eeprom(p, sum);
140 fmband = readbyte_eeprom(p, sum);
141 fm = readbyte_eeprom(p, sum);
142 am_mode3k = readbyte_eeprom(p, sum);
143 am_userbandnum = readbyte_eeprom(p, sum);
144 fm_userbandnum = readbyte_eeprom(p, sum);
145 for(j = 0; j < USER_BAND_NUM; j++){
146 q = (unsigned char *)&am_usrbands[j];
147 for(i = 0; i < sizeof(_userband_t); i++){
148 *q = readbyte_eeprom(p, sum);
151 if(am_usrbands[j].mode3k != 0){
152 am_userband_freq[j].start = am_usrbands[j].start * 96;
153 am_userband_freq[j].end = am_usrbands[j].stop * 96;
155 am_userband_freq[j].start = am_usrbands[j].start * 160;
156 am_userband_freq[j].end = am_usrbands[j].stop * 160;
159 for(j = 0; j < USER_BAND_NUM; j++){
160 q = (unsigned char *)&fm_usrbands[j];
161 for(i = 0; i < sizeof(_userband_t); i++){
162 *q = readbyte_eeprom(p, sum);
165 fm_userband_freq[j].start = fm_usrbands[j].start * 80 + 3000;
166 fm_userband_freq[j].end = fm_usrbands[j].stop * 80 + 3000;
168 amfreq = amfreq_bank[amband];
169 fmfreq = fmfreq_bank[fmband];
170 for(i = 0; i < 19; i++){
171 amfreq_bank[i] = readword_eeprom(p , sum);
173 for(i = 0; i < 8; i++){
174 fmfreq_bank[i] = readword_eeprom(p , sum);
176 threshold_amcnr = readbyte_eeprom(p, sum);
177 threshold_fmcnr = readbyte_eeprom(p, sum);
178 threshold_width = readbyte_eeprom(p, sum);
179 threshold_fmstereo = readbyte_eeprom(p, sum);
180 lowboost = readbyte_eeprom(p , sum);
181 stereo = readbyte_eeprom(p , sum);
182 volume = readbyte_eeprom(p, sum);
183 prevolume = readbyte_eeprom(p, sum);
184 fmbandwidth = readbyte_eeprom(p, sum);
185 backlight_long = readword_eeprom(p, sum);
186 ui_idlecount = readword_eeprom(p, sum);
187 backlight_level = readbyte_eeprom(p, sum);
189 magic = (eeprom_readbyte(p[0]) << 8) + eeprom_readbyte(p[0] + 1);
191 if(sum[0] != magic) return 0x00;
196 * Check eeprom, and format/restore.
198 void check_eeprom(void)
201 switch(load_eeprom()) {
202 case 0x01: // No magic-word
204 c = printhelp_2lines("EEPROM FORMAT", "Press any key");
207 printstr("Formatting... ");
208 format_eeprom(2,250);
210 printstr("Save defaults ");
214 case 0x00: // Checksum error
216 c = printhelp_2lines("X-) Sum error", "Press any key");
217 c = pollkey_single();
220 printstr("Formatting...");
221 format_eeprom(2,250);
222 // writeword_eeprom(0, &sum, 0x1298);
224 printstr("Save defaults");
228 case 0xff: // Success
231 default: // Unknown error