#include "akc6955.h"
#include "i2c_io.h"
#include "idle.h"
+#include "power.h"
#include "commondef.h"
+#include "menu.h"
-void akc6955_writecmd(unsigned char reg, unsigned char data)
-{
-// OPENASMASTER();
-#ifdef __SDCC
- i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
- I2C_START();
- i2c_writechar(0x20);
- //delay1ktcy(8);
- i2c_writechar(reg);
- //delay1ktcy(8);
- i2c_writechar(data);
- //delay1ktcy(8);
- I2C_STOP();
- // delay1ktcy(8);
- i2c_close();
- delay100tcy(2);
-// CLOSEASMASTER();
-#else
- OpenI2C(MASTER, SLEW_OFF);
- StartI2C();
- WriteI2C(0x20);
- //delay1ktcy(8);
- WriteI2C(reg);
- //delay1ktcy(8);
- WriteI2C(data);
- //delay1ktcy(8);
- StopI2C();
- // delay1ktcy(8);
- CloseI2C();
-// CLOSEASMASTER();
-#endif // i2c_idle();
-}
-
-unsigned char akc6955_readcmd(unsigned char reg)
-{
- unsigned char c;
- // OPENASMASTER();
-#ifdef __SDCC
- i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
-#else
- OpenI2C(MASTER, SLEW_OFF);
-#endif
- // i2c_idle();
-// delay1ktcy(8);
-#ifdef __SDCC
- I2C_START();
- i2c_writechar(0x20);
- // delay1ktcy(8);
- i2c_writechar(reg);
- // delay1ktcy(8);
- I2C_STOP();
- delay100tcy(2);
- I2C_START();
- i2c_writechar(0x21);
- // delay1ktcy(8);
- c = i2c_readchar();
- I2C_ACK();
- I2C_STOP();
- // delay1ktcy(8);
- i2c_close();
-#else
- StartI2C();
- WriteI2C(0x20);
- // delay1ktcy(8);
- WriteI2C(reg);
- // delay1ktcy(8);
- StopI2C();
- __delay_us(13);
- StartI2C();
- WriteI2C(0x21);
- // delay1ktcy(8);
- c = ReadI2C();
- AckI2C();
- StopI2C();
- // delay1ktcy(8);
- CloseI2C();
-#endif
- // CLOSEASMASTER();
- return c;
-}
-
-void akc6955_chg_fm(unsigned char f)
+void akc6955_chg_fm(unsigned char f, unsigned int freq)
{
__bitops_t b;
b.byte = akc6955_readcmd(AKC6955_POWER);
+ b.b6 = 0;
if(f != 0){
-// b |= 0x40;
b.b6 = 1;
- } else {
- b.b6 = 0;
+ akc6955_set_fmband(setup.fmband);
+ akc6955_writecmd(AKC6955_POWER, b.byte);
+ akc6955_set_freq(freq);
+ return;
}
akc6955_writecmd(AKC6955_POWER, b.byte);
+ akc6955_set_amband(setup.amband);
+ akc6955_set_freq(freq);
+
}
unsigned char akc6955_get_fm(void)
void akc6955_set_amband(unsigned char band)
{
unsigned char b;
+ unsigned char c;
+
+ c = RFAMP_SW;
+ if((band < AKC6955_BAND_SW1) || (band == AKC6955_BAND_MW4)) {
+ c = RFAMP_MWLW;
+ }
+ rfamp_power(c);
b = akc6955_readcmd(AKC6955_BAND);
b &= 0x07; // extract FM
b = b | ((band & 0x1f) << 3);
akc6955_writecmd(AKC6955_BAND, b);
+ akc6955_do_tune();
}
void akc6955_set_fmband(unsigned char band)
{
unsigned char b;
+ rfamp_power(RFAMP_FM);
b = akc6955_readcmd(AKC6955_BAND);
b &= 0xf8; // extract AM
b = b | (band & 0x07);
akc6955_writecmd(AKC6955_BAND, b);
+ akc6955_do_tune();
}
-unsigned char akc6955_get_amband(void)
+unsigned char akc6955_get_band(void)
{
- unsigned char b;
- b = akc6955_readcmd(AKC6955_BAND);
- b = (b & 0xf8) >> 3;
- return b;
+ return akc6955_readcmd(AKC6955_BAND);
}
-unsigned char akc6955_get_fmband(void)
-{
- unsigned char b;
- b = akc6955_readcmd(AKC6955_BAND);
- b = b & 0x07;
- return b;
-}
-#if 1
void akc6955_set_power(unsigned char on)
{
__bitops_t b;
b.byte = akc6955_readcmd(AKC6955_POWER);
+ b.b7 = 0;
if(on != 0){
b.b7 = 1;
- } else {
- b.b7 = 0;
}
akc6955_writecmd(AKC6955_POWER, b.byte);
}
-#endif
void akc6955_do_tune(void)
{
__bitops_t b;
b.byte = akc6955_readcmd(AKC6955_POWER);
b.b5 = 0; // Tun = '0'
+ b.b4 = 0; // Force abort scan.
akc6955_writecmd(AKC6955_POWER, b.byte);
- // Need sleep?
+ idle_time_ms(1);
+ // Need sleep?-> Need! this sequence re fer from reference code.
b.b5= 1; // Tun = '1'
akc6955_writecmd(AKC6955_POWER, b.byte);
+ idle_time_ms(1);
+ b.b5 = 0;
+ akc6955_writecmd(AKC6955_POWER, b.byte);
+ idle_time_ms(8);
}
unsigned char akc6955_tune(void)
}
-unsigned int akc6955_mode3k(unsigned char flag)
+void akc6955_mode3k(unsigned char flag)
{
__bitops_t b;
b.byte = akc6955_readcmd(AKC6955_CH_HI);
+ b.b5 = 0;
if(flag != 0){
b.b5 = 1;
- } else {
- b.b5 = 1;
}
akc6955_writecmd(AKC6955_CH_HI, b.byte);
akc6955_do_tune();
_AKC6955_WAIT_62_5MS();
- return akc6955_get_freq();
}
void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
__bitops_t f;
__bitops_t b;
unsigned int i = ch;
+ unsigned char comp;
+ do { // Wait for before completed
+ comp = akc6955_chk_donescan();
+ idle_time_35ms();
+ } while(comp == 0x00);
f.byte = akc6955_readcmd(AKC6955_POWER);
- if(f.b6){
- band = 0;
- // AM
- } else {
- band = akc6955_get_amband();
+ band = 0;
+ if(!f.b6){
+ akc6955_get_amband(band);
}
- if(band == 2){
+ if(band == AKC6955_BAND_MW2){
// BAND=AM && MW2
i = ch / 3; // On MW2, Channnel must be multiple of 3.
i = i * 3; // i = (i/3) * 3
if(i > 0x1fff) i = 0x1fff;
//i = ch & 0x1fff;
+ b.byte = i & 0xff;
+ akc6955_writecmd(AKC6955_CH_LO, b.byte);
+
b.byte = i >> 8;
b.b6 = 1;
if(mode_3k != 0){
}
akc6955_writecmd(AKC6955_CH_HI, b.byte);
- b.byte = i & 0xff;
- akc6955_writecmd(AKC6955_CH_LO, b.byte);
akc6955_do_tune();
}
b.byte = akc6955_readcmd(AKC6955_POWER);
b.b3 = 0;
b.b4 = 0;
+ b.b5 = 0;
+ akc6955_writecmd(AKC6955_POWER, b.byte);
+ b.b5 = 1; // Tune 0->1.
+ idle_time_35ms();
+ akc6955_writecmd(AKC6955_POWER, b.byte);
+ idle_time_35ms();
if(up != 0) {
b.b3= 1;
}
- akc6955_writecmd(AKC6955_POWER, b.byte); // Falldown seek bit to '0'.
b.b4 = 1;
akc6955_writecmd(AKC6955_POWER, b.byte); // Raise seek bit to '1'.
}
unsigned char akc6955_chk_donescan(void)
{
- unsigned char b;
- b = akc6955_readcmd(AKC6955_RCH_HI) & 0x40;
- return b;
+ __bitops_t b;
+ b.byte = akc6955_readcmd(AKC6955_RCH_HI);
+ if(b.b6){
+ return 0xff;
+ }
+ return 0;
}
+unsigned int akc6955_get_channel(void)
+{
+ unsigned char h, l;
+ unsigned int u;
+ l = akc6955_readcmd(AKC6955_RCH_LO) ;
+ h = akc6955_readcmd(AKC6955_RCH_HI) & 0x1f;
+ u = (h << 8) | l;
+ return u;
+}
/*
* Get AM/FM Frequency: ret = KHz at AM, 10KHz @FM.
*/
unsigned int akc6955_get_freq(void)
{
- unsigned char h, l;
__bitops_t f, b;
unsigned int i;
unsigned int freq;
+ unsigned char band;
-// b = akc6955_readcmd(AKC6955_CNR_AM) & 0x80;
- l = akc6955_readcmd(AKC6955_RCH_LO) ;
- h = akc6955_readcmd(AKC6955_RCH_HI) & 0x1f;
f.byte = akc6955_readcmd(AKC6955_POWER);
- i = l + (h << 8);
+ i = akc6955_get_channel();
if(f.b6){ // 25KHz
freq = (i * 5) / 2 + 3000; // freq' = 25*i[KHz] = (25 / 10) *i [10KHz]
- // = 2.5i[10KHz]
- // freq = freq' + 30MHz = freq' + 3000[10KHz]
} else { // 5K
b.byte = akc6955_readcmd(AKC6955_CH_HI);
- if(b.b5) { // 5KHz
- freq = i * 3; // freq = 5*i[KHz] = (4+1)*i[KHz]
- } else { // 3KHz
- freq = i * 5; // freq = 3i[KHz] = (2+1)i[KHz]
- }
+ akc6955_get_amband(band);
+ freq = i * 5;
+ if((band == AKC6955_BAND_MW2) || (b.b5)){
+ freq = i * 3;
+ }
}
return freq;
}
__bitops_t f;
__bitops_t mode3k;
unsigned char band;
+ unsigned int start, stop;
f.byte = akc6955_readcmd(AKC6955_POWER);
if(f.b6) { // FM
- band = akc6955_get_fmband();
- if(freq < fmbands[band].start) freq = fmbands[band].start;
- if(freq >= fmbands[band].end) freq = fmbands[band].end - 1;
+ 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;
+ } else {
+ start = fmbands[band].start;
+ stop = fmbands[band].end;
+ }
ch = freq - 3000;
- ch = (ch * 4) / 10;
+ ch = (ch << 2) / 10;
} else {
- band = akc6955_get_amband();
- if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
- if(freq < ambands[band].start) freq = ambands[band].start;
- if(freq >= ambands[band].end) freq = ambands[band].end - 1;
+ 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;
+ } else {
+ start = ambands[band].start;
+ stop = ambands[band].end;
+ }
mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
- if(mode3k.b7){
+ if(band == AKC6955_BAND_MW2) {
+ ch = (freq / 9) * 3; // See datasheet.
+ } else if(band == AKC6955_BAND_MW3) {
+ ch = freq / 5;
+ } else if(mode3k.b7){
ch = freq / 3;
} else {
ch = freq / 5;
}
}
- akc6955_set_tune(mode3k.byte, ch);
+ if(freq < start) freq = start;
+ if(freq >= stop) freq = stop - 1;
+ akc6955_set_tune(mode3k.b7, ch);
}
void akc6955_set_userband(unsigned char start, unsigned char stop, unsigned int ch, unsigned char mode3k)
return level;
}
+
// Get diff. unit = 100Hz.
int akc6955_get_diff(void)
{
return n; // 10n
}
-unsigned int akc6955_up_freq(unsigned int step)
+void akc6955_up_freq(unsigned int step)
{
unsigned int freq;
- __bitops_t f;
- unsigned char band;
+ __bitops_t mode3k;
- f.byte = akc6955_readcmd(AKC6955_POWER);
- freq = akc6955_get_freq();
+ freq = akc6955_get_channel();
freq += step;
- if(f.b6){
- band = akc6955_get_fmband();
- if(band >= AKC6955_BAND_FMEND) band = AKC6955_BAND_FMEND - 1;
- if(freq >= fmbands[band].end) freq = fmbands[band].end - 1;
- } else {
- band = akc6955_get_amband();
- if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
- if(freq >= ambands[band].end) freq = ambands[band].end - 1;
- }
- akc6955_set_freq(freq);
- return akc6955_get_freq();
+ mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
+ akc6955_set_tune(mode3k.b7, freq);
}
-unsigned int akc6955_down_freq(unsigned int step)
+void akc6955_down_freq(unsigned int step)
{
unsigned int freq;
- __bitops_t f;
- unsigned char band;
+ __bitops_t mode3k;
- freq = akc6955_get_freq();
- if(freq <= step) return freq;
+ freq = akc6955_get_channel();
+ if(freq <= step) return;
freq -= step;
-
- f.byte = akc6955_readcmd(AKC6955_POWER);
- if(f.b6 == 0){
- band = akc6955_get_amband();
- if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
- if(freq < ambands[band].start) freq = ambands[band].start;
- } else {
- band = akc6955_get_fmband();
- if(band >= AKC6955_BAND_FMEND) band = AKC6955_BAND_FMEND - 1;
- if(freq < fmbands[band].start) freq = fmbands[band].start;
- }
- akc6955_set_freq(freq);
- return akc6955_get_freq();
+ mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
+ akc6955_set_tune(mode3k.b7, freq);
}
+
void akc6955_setvolumemode(unsigned char flag)
{
__bitops_t c;
__bitops_t c;
c.byte = akc6955_readcmd(AKC6955_VOLUME);
- c.b0 = 0;
- if(flag != 0) {
- c.b0 = 1; //
+ c.b0 = 1;
+ if(flag == 0) {
+ c.b0 = 0; //
}
akc6955_writecmd(AKC6955_VOLUME, c.byte);
}
{
__bitops_t c;
c.byte = akc6955_readcmd(AKC6955_VOLUME);
- c.b1 = 0;
- if(flag != 0) {
- c.b1 = 1;
+ c.b1 = 1;
+ if(flag == 0) {
+ c.b1 = 0;
}
akc6955_writecmd(AKC6955_VOLUME, c.byte);
}
{
__bitops_t c;
c.byte = akc6955_readcmd(AKC6955_STEREO);
- c.b3 = 0;
- if(flag != 0) {
- c.b3 = 1;
+ c.b3 = 1;
+ if(flag == 0) {
+ c.b3 = 0;
}
akc6955_writecmd(AKC6955_STEREO, c.byte);
}
return batt;
}
+void akc6955_set_thresh_fmstereo(unsigned char a)
+{
+ unsigned char b;
+ a = a & 0x03;
+ setup.threshold_fmstereo = a;
+ b = akc6955_readcmd(AKC6955_THRESH) & 0xfc;
+ akc6955_writecmd(AKC6955_THRESH, a | b);
+}
+
+void akc6955_set_thresh_width(unsigned char a)
+{
+ unsigned char b;
+ a = a & 0x03;
+ setup.threshold_width = a;
+ a = a << 2; // << 2
+ b = akc6955_readcmd(AKC6955_THRESH) & 0xf3;;
+ akc6955_writecmd(AKC6955_THRESH, a | b);
+}
+
+void akc6955_set_thresh_amcnr(unsigned char a)
+{
+ unsigned char b;
+ a = a & 0x03;
+ setup.threshold_amcnr = a;
+ a = a << 4; // << 4
+ b = akc6955_readcmd(AKC6955_THRESH) & 0xcf;
+ akc6955_writecmd(AKC6955_THRESH, a | b);
+}
+
+void akc6955_set_thresh_fmcnr(unsigned char a)
+{
+ unsigned char b;
+ a = a & 0x03;
+ setup.threshold_fmcnr = a;
+ a = a << 6; // << 4
+ b = akc6955_readcmd(AKC6955_THRESH) & 0x3f;
+ akc6955_writecmd(AKC6955_THRESH, a | b);
+}