diff options
Diffstat (limited to 'firmware/drivers/tuner/rda5802.c')
-rw-r--r-- | firmware/drivers/tuner/rda5802.c | 42 |
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 | ||
95 | static 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 | |||
102 | static bool tuner_present = false; | 97 | static bool tuner_present = false; |
103 | static uint16_t cache[16]; | 98 | |
99 | static 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 */ |
106 | static void rda5802_read(int len) | 112 | static 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) | |||
122 | static void rda5802_write(int len) | 128 | static 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 | ||