From de870b3ee049262f984254305c7a062a1cdf3026 Mon Sep 17 00:00:00 2001 From: Bertrik Sikken Date: Thu, 11 Nov 2010 21:13:29 +0000 Subject: Signal strength meter for FM radio - FS#8151 by Przemysław Hołubowski MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28559 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/tuner/lv24020lp.c | 22 ++++++++++++++++++++++ firmware/drivers/tuner/rda5802.c | 22 ++++++++++++++++++++++ firmware/drivers/tuner/si4700.c | 18 +++++++++++++++++- firmware/drivers/tuner/tea5760uk.c | 17 +++++++++++++++++ firmware/drivers/tuner/tea5767.c | 16 ++++++++++++++++ 5 files changed, 94 insertions(+), 1 deletion(-) (limited to 'firmware/drivers/tuner') diff --git a/firmware/drivers/tuner/lv24020lp.c b/firmware/drivers/tuner/lv24020lp.c index 0228888309..590ca9641e 100644 --- a/firmware/drivers/tuner/lv24020lp.c +++ b/firmware/drivers/tuner/lv24020lp.c @@ -35,6 +35,10 @@ static struct mutex tuner_mtx; +/* define RSSI range */ +#define RSSI_MIN 5 +#define RSSI_MAX 75 + /* define to enable tuner logging */ #undef SANYO_TUNER_LOG_FILE #undef SANYO_TUNER_LOGF @@ -966,6 +970,8 @@ int lv24020lp_set(int setting, int value) int lv24020lp_get(int setting) { int val = -1; + const unsigned char fst[7] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f}; + unsigned char fst_ndx, fs; mutex_lock(&tuner_mtx); @@ -994,6 +1000,22 @@ int lv24020lp_get(int setting) break; } + case RADIO_RSSI: + fs = RSS_FS(lv24020lp_read(RADIO_STAT)); + for(fst_ndx=0; fst_ndx<7; fst_ndx++) + if(fs == fst[fst_ndx]) + break; + val = 75 - 10*fst_ndx; + break; + + case RADIO_RSSI_MIN: + val = RSSI_MIN; + break; + + case RADIO_RSSI_MAX: + val = RSSI_MAX; + break; + default: val = lv24020lp_debug_info(setting); } diff --git a/firmware/drivers/tuner/rda5802.c b/firmware/drivers/tuner/rda5802.c index 43dffe2355..82dc0bbcb9 100644 --- a/firmware/drivers/tuner/rda5802.c +++ b/firmware/drivers/tuner/rda5802.c @@ -34,6 +34,10 @@ #define I2C_ADR 0x20 +/* define RSSI range */ +#define RSSI_MIN 0 +#define RSSI_MAX 70 + /** Registers and bits **/ #define POWERCFG 0x2 #define CHANNEL 0x3 @@ -263,6 +267,12 @@ static bool rda5802_st(void) return (rda5802_read_reg(READCHAN) & READCHAN_ST); } +static int rda5802_rssi(void) +{ + uint16_t status = rda5802_read_reg(STATUSRSSI); + return STATUSRSSI_RSSIr(status); +} + /* tuner abstraction layer: set something to the tuner */ int rda5802_set(int setting, int value) { @@ -323,6 +333,18 @@ int rda5802_get(int setting) case RADIO_STEREO: val = rda5802_st(); break; + + case RADIO_RSSI: + val = rda5802_rssi(); + break; + + case RADIO_RSSI_MIN: + val = RSSI_MIN; + break; + + case RADIO_RSSI_MAX: + val = RSSI_MAX; + break; } return val; diff --git a/firmware/drivers/tuner/si4700.c b/firmware/drivers/tuner/si4700.c index dfc0e46caf..4747357037 100644 --- a/firmware/drivers/tuner/si4700.c +++ b/firmware/drivers/tuner/si4700.c @@ -50,6 +50,10 @@ extern int si4700_st(void); #define I2C_ADR 0x20 +/* define RSSI range */ +#define RSSI_MIN 0 +#define RSSI_MAX 70 + /** Registers and bits - "x" denotes Si4702/03 only (so they say) **/ #define DEVICEID 0x0 #define CHIPID 0x1 @@ -197,7 +201,7 @@ extern int si4700_st(void); #define STATUSRSSI_BLERA (0x3 << 9) /* x */ #define STATUSRSSI_ST (0x1 << 8) #define STATUSRSSI_RSSI (0xff << 0) - #define STATUSRSSI_RSSIr(x) ((x) & 0xff) +#define STATUSRSSI_RSSIr(x) ((x) & 0xff) /* READCHAN (0xB) */ #define READCHAN_BLERB (0x3 << 14) /* x */ @@ -481,6 +485,18 @@ int si4700_get(int setting) case RADIO_STEREO: val = si4700_st(); break; + + case RADIO_RSSI: + val = STATUSRSSI_RSSIr(si4700_read_reg(STATUSRSSI)); + break; + + case RADIO_RSSI_MIN: + val = RSSI_MIN; + break; + + case RADIO_RSSI_MAX: + val = RSSI_MAX; + break; } return val; diff --git a/firmware/drivers/tuner/tea5760uk.c b/firmware/drivers/tuner/tea5760uk.c index 20234e28ed..c1dff598b3 100644 --- a/firmware/drivers/tuner/tea5760uk.c +++ b/firmware/drivers/tuner/tea5760uk.c @@ -30,6 +30,10 @@ #define I2C_ADR 0x22 +/* define RSSI range */ +#define RSSI_MIN 4 +#define RSSI_MAX 46 + static bool tuner_present = false; static unsigned char write_bytes[7] = { 0x00, /* INTREG LSB */ @@ -138,6 +142,19 @@ int tea5760_get(int setting) case RADIO_STEREO: val = read_bytes[9] >> 2; break; + + case RADIO_RSSI: + val = (read_bytes[9] >> 4) & 0x0F; + val = 4 + (28 * val + 5) / 10; + break; + + case RADIO_RSSI_MIN: + val = RSSI_MIN; + break; + + case RADIO_RSSI_MAX: + val = RSSI_MAX; + break; } return val; diff --git a/firmware/drivers/tuner/tea5767.c b/firmware/drivers/tuner/tea5767.c index 67aa808f23..3f3af68602 100644 --- a/firmware/drivers/tuner/tea5767.c +++ b/firmware/drivers/tuner/tea5767.c @@ -34,6 +34,10 @@ #define I2C_ADR 0xC0 #endif +/* define RSSI range */ +#define RSSI_MIN 10 +#define RSSI_MAX 55 + static bool tuner_present = true; static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; @@ -132,6 +136,18 @@ int tea5767_get(int setting) case RADIO_STEREO: val = read_bytes[2] >> 7; break; + + case RADIO_RSSI: + val = 10 + 3*(read_bytes[3] >> 4); + break; + + case RADIO_RSSI_MIN: + val = RSSI_MIN; + break; + + case RADIO_RSSI_MAX: + val = RSSI_MAX; + break; } return val; -- cgit v1.2.3