OSDN Git Service

[v1.0][Doc] v1.0(.0) Release.
[openi2cradio/OpenI2CRadio.git] / akc6955.c
index 181cea9..6bba528 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
 #include "menu.h"
 
 
+unsigned char akc6955_get_amband(void)
+{
+   return akc6955_get_band() >> 3;
+}
+
+unsigned char akc6955_get_fmband(void)
+{
+   return akc6955_get_band() & 0x07;
+}
+
 void akc6955_chg_fm(unsigned char f, unsigned int freq)
 {
     __bitops_t b;
@@ -143,10 +153,23 @@ unsigned char akc6955_tune(void)
     return 0;
 }
 
+unsigned char akc6955_get_mode3k(void)
+{
+    __bitops_t c;
+    c.byte = akc6955_readcmd(AKC6955_CNR_AM);
+    if(c.b7) {
+        return 0xff;
+    }
+    return 0;
+}
+
 
 void akc6955_mode3k(unsigned char flag)
 {
     __bitops_t b;
+    b.byte = akc6955_readcmd(AKC6955_CH_LO);
+    akc6955_writecmd(AKC6955_CH_LO, b.byte);
+
     b.byte = akc6955_readcmd(AKC6955_CH_HI);
     b.b5 = 0;
     if(flag != 0){
@@ -154,7 +177,6 @@ void akc6955_mode3k(unsigned char flag)
     }
     akc6955_writecmd(AKC6955_CH_HI, b.byte);
     akc6955_do_tune();
-    _AKC6955_WAIT_62_5MS();
 }
 
 void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
@@ -164,33 +186,63 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
     __bitops_t b;
     unsigned int i = ch;
     unsigned char comp;
+    unsigned int start;
+    unsigned int stop;
+    unsigned int q;
 
     do { // Wait for before completed
         comp = akc6955_chk_donescan();
         idle_time_35ms();
     } while(comp == 0x00);
+   
     f.byte = akc6955_readcmd(AKC6955_POWER);
-    band = 0;
-    if(!f.b6){
-        akc6955_get_amband(band);
-    }
-
-    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(!f.b6){ // AM
+       band = akc6955_get_amband(); 
+       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
+         mode_3k = 0xff;
+         q = 3;
+       } else if(mode_3k != 0) {
+         q = 3;
+       } else {
+         q = 5;
+       }
+       
+        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 / q;
+           stop = ambands[band].end / q;
+       }
+    } else {
+       band = akc6955_get_fmband(); 
+        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 - 3000) * 4) / 10;
+           stop =  ((fmbands[band].end - 3000) * 4)  / 10;
+       }
     }
+   
     if(i > 0x1fff) i = 0x1fff;
-    //i = ch & 0x1fff;
+    if(i > stop) i = stop;
+    if(i < start) i = start;
 
     b.byte = i & 0xff;
     akc6955_writecmd(AKC6955_CH_LO, b.byte);
 
     b.byte = i >> 8;
     b.b6 = 1;
-    if(mode_3k != 0){
+    if((setup.fm == 0) && (mode_3k != 0)){
         b.b5 = 1; // Mode 3K ON
+    } else {
+       b.b5 = 0;
     }
+
     akc6955_writecmd(AKC6955_CH_HI, b.byte);
 
     akc6955_do_tune();
@@ -199,21 +251,34 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
 void akc6955_do_scan(unsigned char up)
 {
     __bitops_t b;
- //   akc6955_do_tune();
+
+    //20130823 Need wait for scan/tune completed w/o SDCC 3.3.x.
+#ifndef __SDCC
+    while(akc6955_chk_donescan() == 0)
+    {
+        idle_time_ms(5);
+    }
+#endif
     b.byte = akc6955_readcmd(AKC6955_POWER);
     b.b3 = 0;
     b.b4 = 0;
-    b.b5 = 0;
+// 20130823 : Is this collect?
+#ifdef __SDCC
+     b.b5 = 0;
     akc6955_writecmd(AKC6955_POWER, b.byte);
+    idle_time_ms(35);
+#endif
+
     b.b5 = 1; // Tune 0->1.
-    idle_time_35ms();
     akc6955_writecmd(AKC6955_POWER, b.byte);
-    idle_time_35ms();
+    idle_time_ms(35);
+
+    b.b4 = 1;
     if(up != 0) {
         b.b3= 1;
     }
-    b.b4 = 1;
     akc6955_writecmd(AKC6955_POWER, b.byte); // Raise seek bit to '1'.
+    idle_time_ms(35);
 }
 
 void akc6955_abort_scan(void)
@@ -232,6 +297,14 @@ void akc6955_set_scanrate_fm(unsigned char rate)
     akc6955_writecmd(AKC6955_SPACE, c);
 }
 
+unsigned char akc6955_get_scanrate_fm(void)
+{
+    unsigned char c;
+    c = akc6955_readcmd(AKC6955_SPACE);
+    c = (c & 0x30) >> 4;
+   return c;
+}
+
 unsigned char akc6955_chk_donescan(void)
 {
     __bitops_t b;
@@ -268,7 +341,7 @@ unsigned int akc6955_get_freq(void)
         freq = (i * 5) / 2 + 3000; // freq' = 25*i[KHz] = (25 / 10) *i [10KHz]
     } else { // 5K
        b.byte = akc6955_readcmd(AKC6955_CH_HI);
-       akc6955_get_amband(band);
+       band = akc6955_get_amband();
        freq = i * 5;
        if((band == AKC6955_BAND_MW2) || (b.b5)){
            freq = i * 3;
@@ -283,31 +356,14 @@ 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
-        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;
-        }
+        band = akc6955_get_fmband();
         ch = freq - 3000;
         ch = (ch << 2) / 10;
     } else {
-        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;
-        }
+        band = akc6955_get_amband();
         mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
         if(band == AKC6955_BAND_MW2) {
             ch = (freq / 9) * 3; // See datasheet.
@@ -319,8 +375,6 @@ void akc6955_set_freq(unsigned int freq)
             ch = freq / 5;
         }
     }
-    if(freq <  start) freq = start;
-    if(freq >= stop)   freq = stop - 1;
     akc6955_set_tune(mode3k.b7, ch);
 }
 
@@ -417,8 +471,9 @@ void akc6955_up_freq(unsigned int step)
 
     freq = akc6955_get_channel();
     freq += step;
-    mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
-    akc6955_set_tune(mode3k.b7, freq);
+//    mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
+//    akc6955_set_tune(mode3k.b7, freq);
+    akc6955_set_tune(setup.am_mode3k, freq);
 }
 
 
@@ -430,8 +485,9 @@ void akc6955_down_freq(unsigned int step)
     freq = akc6955_get_channel();
     if(freq <= step) return;
     freq -= step;
-    mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
-    akc6955_set_tune(mode3k.b7, freq);
+//    mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
+//    akc6955_set_tune(mode3k.b7, freq);
+    akc6955_set_tune(setup.am_mode3k, freq);
 }
 
 void akc6955_setvolumemode(unsigned char flag)