summaryrefslogtreecommitdiff
path: root/firmware/drivers/tuner
diff options
context:
space:
mode:
authorBertrik Sikken <bertrik@sikken.nl>2010-11-11 21:13:29 +0000
committerBertrik Sikken <bertrik@sikken.nl>2010-11-11 21:13:29 +0000
commitde870b3ee049262f984254305c7a062a1cdf3026 (patch)
treef9636eb3e4634ac223a0c5a6dadeb4e1a25b61db /firmware/drivers/tuner
parentb787c0dd05ef4ddd6727a86b06d2491be8600f07 (diff)
downloadrockbox-de870b3ee049262f984254305c7a062a1cdf3026.tar.gz
rockbox-de870b3ee049262f984254305c7a062a1cdf3026.zip
Signal strength meter for FM radio - FS#8151 by Przemysław Hołubowski
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28559 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers/tuner')
-rw-r--r--firmware/drivers/tuner/lv24020lp.c22
-rw-r--r--firmware/drivers/tuner/rda5802.c22
-rw-r--r--firmware/drivers/tuner/si4700.c18
-rw-r--r--firmware/drivers/tuner/tea5760uk.c17
-rw-r--r--firmware/drivers/tuner/tea5767.c16
5 files changed, 94 insertions, 1 deletions
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 @@
35 35
36static struct mutex tuner_mtx; 36static struct mutex tuner_mtx;
37 37
38/* define RSSI range */
39#define RSSI_MIN 5
40#define RSSI_MAX 75
41
38/* define to enable tuner logging */ 42/* define to enable tuner logging */
39#undef SANYO_TUNER_LOG_FILE 43#undef SANYO_TUNER_LOG_FILE
40#undef SANYO_TUNER_LOGF 44#undef SANYO_TUNER_LOGF
@@ -966,6 +970,8 @@ int lv24020lp_set(int setting, int value)
966int lv24020lp_get(int setting) 970int lv24020lp_get(int setting)
967{ 971{
968 int val = -1; 972 int val = -1;
973 const unsigned char fst[7] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f};
974 unsigned char fst_ndx, fs;
969 975
970 mutex_lock(&tuner_mtx); 976 mutex_lock(&tuner_mtx);
971 977
@@ -994,6 +1000,22 @@ int lv24020lp_get(int setting)
994 break; 1000 break;
995 } 1001 }
996 1002
1003 case RADIO_RSSI:
1004 fs = RSS_FS(lv24020lp_read(RADIO_STAT));
1005 for(fst_ndx=0; fst_ndx<7; fst_ndx++)
1006 if(fs == fst[fst_ndx])
1007 break;
1008 val = 75 - 10*fst_ndx;
1009 break;
1010
1011 case RADIO_RSSI_MIN:
1012 val = RSSI_MIN;
1013 break;
1014
1015 case RADIO_RSSI_MAX:
1016 val = RSSI_MAX;
1017 break;
1018
997 default: 1019 default:
998 val = lv24020lp_debug_info(setting); 1020 val = lv24020lp_debug_info(setting);
999 } 1021 }
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 @@
34 34
35#define I2C_ADR 0x20 35#define I2C_ADR 0x20
36 36
37/* define RSSI range */
38#define RSSI_MIN 0
39#define RSSI_MAX 70
40
37/** Registers and bits **/ 41/** Registers and bits **/
38#define POWERCFG 0x2 42#define POWERCFG 0x2
39#define CHANNEL 0x3 43#define CHANNEL 0x3
@@ -263,6 +267,12 @@ static bool rda5802_st(void)
263 return (rda5802_read_reg(READCHAN) & READCHAN_ST); 267 return (rda5802_read_reg(READCHAN) & READCHAN_ST);
264} 268}
265 269
270static int rda5802_rssi(void)
271{
272 uint16_t status = rda5802_read_reg(STATUSRSSI);
273 return STATUSRSSI_RSSIr(status);
274}
275
266/* tuner abstraction layer: set something to the tuner */ 276/* tuner abstraction layer: set something to the tuner */
267int rda5802_set(int setting, int value) 277int rda5802_set(int setting, int value)
268{ 278{
@@ -323,6 +333,18 @@ int rda5802_get(int setting)
323 case RADIO_STEREO: 333 case RADIO_STEREO:
324 val = rda5802_st(); 334 val = rda5802_st();
325 break; 335 break;
336
337 case RADIO_RSSI:
338 val = rda5802_rssi();
339 break;
340
341 case RADIO_RSSI_MIN:
342 val = RSSI_MIN;
343 break;
344
345 case RADIO_RSSI_MAX:
346 val = RSSI_MAX;
347 break;
326 } 348 }
327 349
328 return val; 350 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);
50 50
51#define I2C_ADR 0x20 51#define I2C_ADR 0x20
52 52
53/* define RSSI range */
54#define RSSI_MIN 0
55#define RSSI_MAX 70
56
53/** Registers and bits - "x" denotes Si4702/03 only (so they say) **/ 57/** Registers and bits - "x" denotes Si4702/03 only (so they say) **/
54#define DEVICEID 0x0 58#define DEVICEID 0x0
55#define CHIPID 0x1 59#define CHIPID 0x1
@@ -197,7 +201,7 @@ extern int si4700_st(void);
197#define STATUSRSSI_BLERA (0x3 << 9) /* x */ 201#define STATUSRSSI_BLERA (0x3 << 9) /* x */
198#define STATUSRSSI_ST (0x1 << 8) 202#define STATUSRSSI_ST (0x1 << 8)
199#define STATUSRSSI_RSSI (0xff << 0) 203#define STATUSRSSI_RSSI (0xff << 0)
200 #define STATUSRSSI_RSSIr(x) ((x) & 0xff) 204#define STATUSRSSI_RSSIr(x) ((x) & 0xff)
201 205
202/* READCHAN (0xB) */ 206/* READCHAN (0xB) */
203#define READCHAN_BLERB (0x3 << 14) /* x */ 207#define READCHAN_BLERB (0x3 << 14) /* x */
@@ -481,6 +485,18 @@ int si4700_get(int setting)
481 case RADIO_STEREO: 485 case RADIO_STEREO:
482 val = si4700_st(); 486 val = si4700_st();
483 break; 487 break;
488
489 case RADIO_RSSI:
490 val = STATUSRSSI_RSSIr(si4700_read_reg(STATUSRSSI));
491 break;
492
493 case RADIO_RSSI_MIN:
494 val = RSSI_MIN;
495 break;
496
497 case RADIO_RSSI_MAX:
498 val = RSSI_MAX;
499 break;
484 } 500 }
485 501
486 return val; 502 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 @@
30 30
31#define I2C_ADR 0x22 31#define I2C_ADR 0x22
32 32
33/* define RSSI range */
34#define RSSI_MIN 4
35#define RSSI_MAX 46
36
33static bool tuner_present = false; 37static bool tuner_present = false;
34static unsigned char write_bytes[7] = { 38static unsigned char write_bytes[7] = {
35 0x00, /* INTREG LSB */ 39 0x00, /* INTREG LSB */
@@ -138,6 +142,19 @@ int tea5760_get(int setting)
138 case RADIO_STEREO: 142 case RADIO_STEREO:
139 val = read_bytes[9] >> 2; 143 val = read_bytes[9] >> 2;
140 break; 144 break;
145
146 case RADIO_RSSI:
147 val = (read_bytes[9] >> 4) & 0x0F;
148 val = 4 + (28 * val + 5) / 10;
149 break;
150
151 case RADIO_RSSI_MIN:
152 val = RSSI_MIN;
153 break;
154
155 case RADIO_RSSI_MAX:
156 val = RSSI_MAX;
157 break;
141 } 158 }
142 159
143 return val; 160 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 @@
34#define I2C_ADR 0xC0 34#define I2C_ADR 0xC0
35#endif 35#endif
36 36
37/* define RSSI range */
38#define RSSI_MIN 10
39#define RSSI_MAX 55
40
37static bool tuner_present = true; 41static bool tuner_present = true;
38static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; 42static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
39 43
@@ -132,6 +136,18 @@ int tea5767_get(int setting)
132 case RADIO_STEREO: 136 case RADIO_STEREO:
133 val = read_bytes[2] >> 7; 137 val = read_bytes[2] >> 7;
134 break; 138 break;
139
140 case RADIO_RSSI:
141 val = 10 + 3*(read_bytes[3] >> 4);
142 break;
143
144 case RADIO_RSSI_MIN:
145 val = RSSI_MIN;
146 break;
147
148 case RADIO_RSSI_MAX:
149 val = RSSI_MAX;
150 break;
135 } 151 }
136 152
137 return val; 153 return val;