summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBertrik Sikken <bertrik@sikken.nl>2011-06-04 20:18:10 +0000
committerBertrik Sikken <bertrik@sikken.nl>2011-06-04 20:18:10 +0000
commit1c22bbb1c2b49633ea04c2ccb9afd5e2efc2357b (patch)
tree738bd3184424248bdcc51329108ca83f18fb4370
parent92afc96cc8940be30d257a7a2bafb45271137dc7 (diff)
downloadrockbox-1c22bbb1c2b49633ea04c2ccb9afd5e2efc2357b.tar.gz
rockbox-1c22bbb1c2b49633ea04c2ccb9afd5e2efc2357b.zip
FS#12094 - RDA5802 tuner: clean up register 0x4 handling, drop implicitly enabled soft-mute by Stephan Grossklass and me
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29959 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/drivers/tuner/rda5802.c42
1 files changed, 23 insertions, 19 deletions
diff --git a/firmware/drivers/tuner/rda5802.c b/firmware/drivers/tuner/rda5802.c
index 27166c5e43..f0f449cdf5 100644
--- a/firmware/drivers/tuner/rda5802.c
+++ b/firmware/drivers/tuner/rda5802.c
@@ -44,7 +44,9 @@
44#define SYSCONFIG1 0x4 44#define SYSCONFIG1 0x4
45#define SYSCONFIG2 0x5 45#define SYSCONFIG2 0x5
46#define SYSCONFIG3 0x6 46#define SYSCONFIG3 0x6
47 47#define SYSCONFIG4 0x7 /* undocumented */
48#define SYSCONFIG5 0x8 /* undocumented */
49#define SYSCONFIG6 0x9 /* undocumented */
48#define READCHAN 0xA 50#define READCHAN 0xA
49#define STATUSRSSI 0xB 51#define STATUSRSSI 0xB
50#define IDENT 0xC 52#define IDENT 0xC
@@ -76,7 +78,7 @@
76 78
77/* SYSCONFIG1 (0x4) */ 79/* SYSCONFIG1 (0x4) */
78#define SYSCONFIG1_DE (0x1 << 11) 80#define SYSCONFIG1_DE (0x1 << 11)
79 #define SYSCONFIG1_SMUTE (0x1 << 9) 81 #define SYSCONFIG1_SOFTMUTE_EN (0x1 << 9)
80 82
81/* SYSCONFIG2 (0x5) */ 83/* SYSCONFIG2 (0x5) */
82#define SYSCONFIG2_VOLUME (0xF << 0) 84#define SYSCONFIG2_VOLUME (0xF << 0)
@@ -92,21 +94,25 @@
92 #define STATUSRSSI_RSSIr(x) (((x) & STATUSRSSI_RSSI) >> 9) 94 #define STATUSRSSI_RSSIr(x) (((x) & STATUSRSSI_RSSI) >> 9)
93#define STATUSRSSI_FM_TRUE (0x1 << 8) 95#define STATUSRSSI_FM_TRUE (0x1 << 8)
94 96
95static const uint16_t initvals[16] = {
96 0x0000, 0x0000, 0xC401, 0x1B80,
97 0x0400, 0x866F, 0x8000, 0x4712,
98 0x5EC6, 0x0000, 0x406E, 0x2D80,
99 0x5803, 0x5804, 0x5804, 0x5804
100};
101
102static bool tuner_present = false; 97static bool tuner_present = false;
103static uint16_t cache[16]; 98
99static uint16_t cache[16] = {
100 [POWERCFG] = 0xC401, /* DHIZ, DMUTE, CLK_DIRECT_MODE, ENABLE */
101 [CHANNEL] = 0x0000, /* - */
102 [SYSCONFIG1] = 0x0200, /* SYSCONFIG1_SOFTMUTE_EN */
103 [SYSCONFIG2] = 0x867F, /* INT_MODE (def), SEEKTH=1100b, LNA_PORT_SEL=LNAN,
104 LNA_ICSEL=3.0mA, VOLUME=max */
105 [SYSCONFIG3] = 0x8000, /* I2S slave mode */
106 [SYSCONFIG4] = 0x4712, /* undocumented, affects stereo blend */
107 [SYSCONFIG5] = 0x5EC6, /* undocumented */
108 [SYSCONFIG6] = 0x0000 /* undocumented */
109};
104 110
105/* reads <len> registers from radio at offset 0x0A into cache */ 111/* reads <len> registers from radio at offset 0x0A into cache */
106static void rda5802_read(int len) 112static void rda5802_read(int len)
107{ 113{
108 int i; 114 int i;
109 unsigned char buf[128]; 115 unsigned char buf[sizeof(cache)];
110 unsigned char *ptr = buf; 116 unsigned char *ptr = buf;
111 uint16_t data; 117 uint16_t data;
112 118
@@ -122,7 +128,7 @@ static void rda5802_read(int len)
122static void rda5802_write(int len) 128static void rda5802_write(int len)
123{ 129{
124 int i; 130 int i;
125 unsigned char buf[64]; 131 unsigned char buf[sizeof(cache)];
126 unsigned char *ptr = buf; 132 unsigned char *ptr = buf;
127 uint16_t data; 133 uint16_t data;
128 134
@@ -186,14 +192,14 @@ void rda5802_init(void)
186 if (rda5802_detect()) { 192 if (rda5802_detect()) {
187 tuner_present = true; 193 tuner_present = true;
188 194
189 // soft-reset 195 /* soft-reset */
190 rda5802_write_reg(POWERCFG, POWERCFG_SOFT_RESET); 196 rda5802_write_set(POWERCFG, POWERCFG_SOFT_RESET);
191 rda5802_write(1); 197 rda5802_write(1);
198 rda5802_write_clear(POWERCFG, POWERCFG_SOFT_RESET);
192 sleep(HZ * 10 / 1000); 199 sleep(HZ * 10 / 1000);
193 200
194 // write initialisation values 201 /* write initialisation values */
195 memcpy(cache, initvals, sizeof(cache)); 202 rda5802_write(8);
196 rda5802_write(14);
197 sleep(HZ * 70 / 1000); 203 sleep(HZ * 70 / 1000);
198 } 204 }
199} 205}
@@ -284,8 +290,6 @@ int rda5802_set(int setting, int value)
284 case RADIO_MUTE: 290 case RADIO_MUTE:
285 rda5802_write_masked(POWERCFG, value ? 0 : POWERCFG_DMUTE, 291 rda5802_write_masked(POWERCFG, value ? 0 : POWERCFG_DMUTE,
286 POWERCFG_DMUTE); 292 POWERCFG_DMUTE);
287 rda5802_write_masked(SYSCONFIG1, (3 << 9), (3 << 9));
288 rda5802_write_set(SYSCONFIG2, SYSCONFIG2_VOLUME);
289 rda5802_write_cache(); 293 rda5802_write_cache();
290 break; 294 break;
291 295