OSDN Git Service

[Doc] GITLOG to v1.0beta1.1.
[openi2cradio/OpenI2CRadio.git] / akc6955.c
index ef14a36..181cea9 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
 #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)
@@ -148,60 +74,63 @@ 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)
@@ -215,19 +144,17 @@ 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)
@@ -236,16 +163,19 @@ 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
@@ -253,6 +183,9 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     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){
@@ -260,8 +193,6 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     }
     akc6955_writecmd(AKC6955_CH_HI, b.byte);
 
-    b.byte = i & 0xff;
-    akc6955_writecmd(AKC6955_CH_LO, b.byte);
     akc6955_do_tune();
 }
 
@@ -272,10 +203,15 @@ void akc6955_do_scan(unsigned char up)
     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'.
 }
@@ -298,38 +234,45 @@ void akc6955_set_scanrate_fm(unsigned char rate)
 
 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;
 }
@@ -340,27 +283,45 @@ void akc6955_set_freq(unsigned int 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)
@@ -425,6 +386,7 @@ int akc6955_read_level(void)
     return level;
 }
 
+
 // Get diff. unit = 100Hz.
 int akc6955_get_diff(void)
 {
@@ -448,52 +410,30 @@ 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;
@@ -552,9 +492,9 @@ void akc6955_setphase(unsigned char flag)
     __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);
 }
@@ -563,9 +503,9 @@ void akc6955_setline(unsigned char flag)
 {
     __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);
 }
@@ -574,9 +514,9 @@ void akc6955_set_lowboost(unsigned char flag)
 {
     __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);
 }
@@ -611,3 +551,41 @@ unsigned int akc6955_get_battery(void)
     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);
+}