OSDN Git Service

[Schematic][Libs] Update EC12E2420801.
[openi2cradio/OpenI2CRadio.git] / akc6955.c
index 24f3581..e1110f3 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
 #include "power.h"
 #include "commondef.h"
 #include "menu.h"
+#include "ui.h"
+
+unsigned char akc6955_readcmd(unsigned char reg)
+{
+   return i2c_read_byte(AKC6955_ADDRESS, reg);
+}
+
+void akc6955_writecmd(unsigned char reg,unsigned char data)
+{
+    i2c_send_byte(AKC6955_ADDRESS, reg, data);
+}
+
+unsigned char akc6955_get_band(void)
+{
+    return akc6955_readcmd(AKC6955_BAND);
+}
+
+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)
@@ -99,12 +125,6 @@ void akc6955_set_fmband(unsigned char band)
     akc6955_do_tune();
 }
 
-unsigned char akc6955_get_band(void)
-{
-    return akc6955_readcmd(AKC6955_BAND);
-}
-
-
 void akc6955_set_power(unsigned char on)
 {
     __bitops_t b;
@@ -119,9 +139,9 @@ void akc6955_set_power(unsigned char on)
 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.
+    b.byte = akc6955_readcmd(AKC6955_POWER) & 0b11001111;
+//    b.b5 = 0; // Tun = '0'
+//    b.b4 = 0; // Force abort scan.
     akc6955_writecmd(AKC6955_POWER, b.byte);
     idle_time_ms(1);
     // Need sleep?-> Need! this sequence re                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 fer from reference code.
@@ -159,44 +179,52 @@ void akc6955_mode3k(unsigned char flag)
     akc6955_do_tune();
 }
 
+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_set_tune(unsigned char mode_3k, unsigned int ch)
 {
     unsigned char band;
-    __bitops_t f;
+    unsigned char f;
     __bitops_t b;
     unsigned int i = ch;
-    unsigned char comp;
     unsigned int start, stop;
+    unsigned char q;
 
-    do { // Wait for before completed
-        comp = akc6955_chk_donescan();
+    while(akc6955_chk_donescan() == 0) { // Wait for before completed
         idle_time_35ms();
-    } while(comp == 0x00);
-    f.byte = akc6955_readcmd(AKC6955_POWER);
+    }
+    f = akc6955_get_fm();
     band = 0;
-    if(!f.b6){
-        akc6955_get_amband(band);
-        start = ambands[band].start;
-        stop  = ambands[band].end;
+    if(f == 0){
+        band = akc6955_get_amband();
         if(band == AKC6955_BAND_AMUSER){
             start = userband.am_usrbands[setup.am_userbandnum].start * 32;
             stop = userband.am_usrbands[setup.am_userbandnum].stop * 32;
         } else {
             if(mode_3k != 0) {
-               start = start / 3; // See datasheet.
-               stop = stop / 3;
+                q = 3;
             } else {
-                start = start / 5;
-                stop = stop / 5;
+                q = 5;
             }
+            start = ambands[band].start / q;
+            stop  = ambands[band].end / q;
         }
     } else {
-        akc6955_get_fmband(band);
-        start = ((fmbands[band].start - 3000) * 2) / 5;
-        stop = ((fmbands[band].end - 3000) * 2) / 5;;
+        band = akc6955_get_fmband();
         if(band == AKC6955_BAND_FMUSER){
             start = userband.fm_usrbands[setup.fm_userbandnum].start * 32;
             stop = userband.fm_usrbands[setup.fm_userbandnum].stop * 32;
+        } else {
+            start = ((fmbands[band].start - 3000) * 2) / 5;
+            stop = ((fmbands[band].end - 3000) * 2) / 5;;
         }
     }
     if(i > stop) i = stop; // ADD
@@ -218,42 +246,44 @@ void akc6955_set_tune(unsigned char mode_3k, unsigned int ch)
 void akc6955_do_scan(unsigned char up)
 {
     __bitops_t b;
+    unsigned char c;
 
     //20130823 Need wait for scan/tune completed w/o SDCC 3.3.x.
 #ifndef __SDCC
     while(akc6955_chk_donescan() == 0)
     {
-        idle_time_ms(5);
+        if(pollkey_single_timeout(1, 0) == charcode_a) return;  // 23ms, if 'A' Abort.
     }
 #endif
-    b.byte = akc6955_readcmd(AKC6955_POWER);
-    b.b3 = 0;
-    b.b4 = 0;
+    b.byte = akc6955_readcmd(AKC6955_POWER) & 0b11000111;
+
+//    b.b3 = 0;
+ //   b.b4 = 0;
 // 20130823 : Is this collect?
 #ifdef __SDCC
-     b.b5 = 0;
+//     b.b5 = 0;
     akc6955_writecmd(AKC6955_POWER, b.byte);
-    idle_time_ms(35);
+    idle_time_35ms();
 #endif
 
     b.b5 = 1; // Tune 0->1.
     akc6955_writecmd(AKC6955_POWER, b.byte);
-    idle_time_ms(35);
+    idle_time_35ms();
 
     b.b4 = 1;
     if(up != 0) {
         b.b3= 1;
     }
     akc6955_writecmd(AKC6955_POWER, b.byte); // Raise seek bit to '1'.
-    idle_time_ms(35);
+    idle_time_35ms();
 }
 
 void akc6955_abort_scan(void)
 {
-    unsigned char b;
-    b = akc6955_readcmd(AKC6955_POWER);
-    b &= 0xef;
-    akc6955_writecmd(AKC6955_POWER, b); // Falldown seek bit to '0'.
+    __bitops_t b;
+    b.byte = akc6955_readcmd(AKC6955_POWER);
+    b.b4 = 0;
+    akc6955_writecmd(AKC6955_POWER, b.byte); // Falldown seek bit to '0'.
 }
 
 void akc6955_set_scanrate_fm(unsigned char rate)
@@ -266,10 +296,10 @@ void akc6955_set_scanrate_fm(unsigned char rate)
 
 unsigned char akc6955_get_scanrate_fm(void)
 {
-    unsigned char c;
-    c = akc6955_readcmd(AKC6955_SPACE);
-    c = (c & 0x30) >> 4;
-   return c;
+//    unsigned char c;
+//    c = akc6955_readcmd(AKC6955_SPACE);
+//    c = (c & 0x30) >> 4;
+   return (akc6955_readcmd(AKC6955_SPACE) & 0x30) >> 4;
 }
 
 unsigned char akc6955_chk_donescan(void)
@@ -288,8 +318,8 @@ unsigned int akc6955_get_channel(void)
     unsigned int u;
     l = akc6955_readcmd(AKC6955_RCH_LO) ;
     h = akc6955_readcmd(AKC6955_RCH_HI) & 0x1f;
-    u = (h << 8) | l;
-    return u;
+    return  (h << 8) | l;
+//    return u;
 }
 
 /*
@@ -297,22 +327,26 @@ unsigned int akc6955_get_channel(void)
  */
 unsigned int akc6955_get_freq(void)
 {
-    __bitops_t f, b;
+    __bitops_t b;
     unsigned int i;
     unsigned int freq;
     unsigned char band;
+    unsigned char q;
+    unsigned char f;
 
-    f.byte = akc6955_readcmd(AKC6955_POWER);
+    f = akc6955_get_fm();
     i = akc6955_get_channel();
-    if(f.b6){ // 25KHz
-        freq = (i * 5) / 2 + 3000; // freq' = 25*i[KHz] = (25 / 10) *i [10KHz]
+    if(f != 0){ // 25KHz
+        freq = i * 2 + i / 2 + 3000; // freq' = 25*i[KHz] = (25 / 10) *i [10KHz]
     } else { // 5K
        b.byte = akc6955_readcmd(AKC6955_CH_HI);
-       akc6955_get_amband(band);
-       freq = i * 5;
-       if((band == AKC6955_BAND_MW2) || (b.b5)){
-           freq = i * 3;
+       band = akc6955_get_amband();
+       if((band == AKC6955_BAND_MW2) || (band == AKC6955_BAND_LW) || (b.b5)){
+           q = 3;
+       } else {
+           q = 5;
        }
+       freq = i * q;
     }
     return freq;
 }
@@ -320,39 +354,39 @@ unsigned int akc6955_get_freq(void)
 void akc6955_set_freq(unsigned int freq)
 {
     unsigned int ch;
-    __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;
-        ch = ((freq - 3000) * 4) / 10;
+    unsigned char q;
+    unsigned char f;
+
+    f = akc6955_get_fm();
+    if(f != 0) { // FM
+       band = akc6955_get_fmband();
+       //        band &= 7;
+       ch = ((freq - 3000) * 2) / 5;
     } else {
-        akc6955_get_amband(band);
-//        if(band >= AKC6955_BAND_AMEND) band = AKC6955_BAND_AMEND - 1;
+        band = akc6955_get_amband();
         mode3k.byte = akc6955_readcmd(AKC6955_CNR_AM);
-        if(band == AKC6955_BAND_MW2) {
-            ch = (freq / 9) * 3; // See datasheet.
-        } else  if(mode3k.b7){
-            ch = freq / 3;
+        if((band == AKC6955_BAND_MW2) || (band == AKC6955_BAND_LW) || (mode3k.b7)){
+            q = 3;
+            mode3k.b7 = 1;
         } else {
-            ch = freq / 5;
+            q = 5;
+            mode3k.b7 = 0;
         }
+        ch = freq / q;
     }
     akc6955_set_tune(mode3k.b7, ch);
 }
 
 void akc6955_set_userband(unsigned char start, unsigned char stop, unsigned int ch, unsigned char mode3k)
 {
-    __bitops_t f;
+    unsigned char f;
 
-    f.byte = akc6955_readcmd(AKC6955_POWER);
+    f = akc6955_get_fm();
     akc6955_writecmd(AKC6955_UCH_ST, start);
     akc6955_writecmd(AKC6955_UCH_EN, stop);
-    if(f.b6){
+    if(f != 0){
         akc6955_set_fmband(AKC6955_BAND_FMUSER);
     } else {
         akc6955_set_amband(AKC6955_BAND_AMUSER);
@@ -363,10 +397,10 @@ void akc6955_set_userband(unsigned char start, unsigned char stop, unsigned int
 
 unsigned char akc6955_get_cnr(void)
 {
-    __bitops_t f;
+    unsigned char f;
     __bitops_t b;
-    f.byte = akc6955_readcmd(AKC6955_POWER);
-    if(f.b6) { // FM
+    f = akc6955_get_fm();
+    if(f != 0) { // FM
         b.byte = akc6955_readcmd(AKC6955_CNR_FM);
     } else { // AM
         b.byte = akc6955_readcmd(AKC6955_CNR_AM);
@@ -377,30 +411,29 @@ unsigned char akc6955_get_cnr(void)
 
 int akc6955_read_level(void)
 {
-    __bitops_t f;
+    unsigned char f;
     unsigned char rflevel, iflevel;
     unsigned char b;
     int rssi;
-    unsigned int freq;
+    unsigned char band;
     int totallevel;
     int level;
 
-    f.byte = akc6955_readcmd(AKC6955_POWER);
+    f = akc6955_get_fm();
     b =  akc6955_readcmd(AKC6955_PGALEVEL);
     rflevel = (b & 0xe0) >> 5;
     iflevel = (b & 0x1c) >> 2;
     totallevel = rflevel + iflevel;
 
     rssi = (int)(akc6955_readcmd(AKC6955_RSSI) & 0x7f);
-    // totallevel = rssi + 6*totallevel;
     level = (int)(totallevel * 6 + rssi);
-    if(f.b6){
+    if(f != 0){
         level = 103 - level; // totallevel * 6
     } else {
-        freq = akc6955_get_freq();
-        if(freq > 2560) { // ASSUME SW
+        band = akc6955_get_amband();
+        if((band >= AKC6955_BAND_SW1) && (band <= AKC6955_BAND_AMUSER)) { // SW
             level = 103 - level;
-        } else { // ASSUME MW,LW
+        } else { //  MW,LW
             level = 123 - level;
         }
     }
@@ -412,7 +445,7 @@ int akc6955_read_level(void)
 int akc6955_get_diff(void)
 {
     __bitops_t diff;
-    __bitops_t f;
+    unsigned char f;
     int n;
 
     diff.byte = akc6955_readcmd(AKC6955_FDNUM);
@@ -424,8 +457,8 @@ int akc6955_get_diff(void)
         n = (int)diff.byte;
     }
 
-    f.byte = akc6955_readcmd(AKC6955_POWER);
-    if(f.b6) { // FM
+    f = akc6955_get_fm();
+    if(f != 0) { // FM
         return n * 10;
     }
     return n; // 10n
@@ -434,26 +467,29 @@ int akc6955_get_diff(void)
 void akc6955_up_freq(unsigned int step)
 {
     unsigned int freq;
-    __bitops_t mode3k;
+//    __bitops_t mode3k;
+    unsigned char mode3k;
 
     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);
+    mode3k = akc6955_get_mode3k();
+    akc6955_set_tune(mode3k, freq);
 }
 
 
 void akc6955_down_freq(unsigned int step)
 {
     unsigned int freq;
-    __bitops_t mode3k;
-    unsigned int start;
+    unsigned char mode3k;
 
     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);
+    mode3k = akc6955_get_mode3k();
+    akc6955_set_tune(mode3k, freq);
 }
 
 void akc6955_setvolumemode(unsigned char flag)
@@ -503,9 +539,9 @@ void akc6955_set_prevolume(unsigned char level)
 unsigned char akc6955_get_prevolume(void)
 {
     unsigned char c;
-    c = akc6955_readcmd(AKC6955_PRE) & 0x0c;
-    c >>= 2;
-    return c;
+//    c = akc6955_readcmd(AKC6955_PRE) & 0x0c;
//   c >>= 2;
+    return (akc6955_readcmd(AKC6955_PRE) & 0x0c) >> 2;
 }
 
 
@@ -554,9 +590,9 @@ void akc6955_set_stereomode(unsigned char mode)
 
 unsigned char akc6955_get_stereo(void)
 {
-    unsigned char c;
-    c = akc6955_readcmd(AKC6955_RCH_HI) & 0x80;
-    return c;
//   unsigned char c;
+//    c = akc6955_readcmd(AKC6955_RCH_HI) & 0x80;
+    return akc6955_readcmd(AKC6955_RCH_HI) & 0x80;
 }
 
 /*
@@ -573,6 +609,23 @@ unsigned int akc6955_get_battery(void)
     return batt;
 }
 
+/*
+ * Misc
+ */
+void akc6955_set_fmbandwidth(unsigned char bw)
+{
+   unsigned char c = akc6955_readcmd(AKC6955_STEREO);
+   c = (c & 0xfc) | (bw & 0x03);
+   akc6955_writecmd(AKC6955_STEREO, c);
+}
+
+unsigned char akc6955_get_fmbandwidth(void)
+{
+    return (akc6955_readcmd(AKC6955_STEREO) & 0x03);
+}
+
+
+
 void akc6955_set_thresh_fmstereo(unsigned char a)
 {
     unsigned char b;