diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2017-01-30 09:52:05 -0500 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2017-02-11 22:19:32 -0500 |
commit | fc9695eb47732e1c189e2f033dbd55e5c346e8c4 (patch) | |
tree | 550830e9af67f47e3eb87587770b25d22110f57a /firmware/target/arm | |
parent | 6436c6e749ab04fbd5d97804a6a1c3b3122b326d (diff) | |
download | rockbox-fc9695eb47732e1c189e2f033dbd55e5c346e8c4.tar.gz rockbox-fc9695eb47732e1c189e2f033dbd55e5c346e8c4.zip |
Improve radio RDS driver and framework
* Remove unused bits like the radio event and simplify basic
radio interface. It can be more self-contained with rds.h only
required by radio and tuner code.
* Add post-processing to text a-la Silicon Labs AN243. The chip's
error correction can only do so much; additional checks are highly
recommended. Simply testing for two identical messages in a row
is extremely effective and I've never seen corrupted text since
doing that, even with mediocre reception.
Groups segments must arrive in order, not randomly; logic change
only accepts them in order, starting at 0.
Time readout was made a bit better but really we'd need to use
verbose mode and ensure that no errors were seen during receiving
of time and more checks would be need to have a stable PI. The
text is the important bit anyway.
* Time out of stale text.
* Text is no longer updated until a complete group has been
received, as is specified in the standard. Perhaps go back to
scrolling text lines in the radio screen?
* Add proper character conversion to UTF-8. Only the default G0
table for the moment. The other two could be added in.
* Add variants "RDS_CFG_PROCESS" and "RDS_CFG_PUSH" to allow
the option for processed RDS data to be pushed to the driver and
still do proper post-processing (only text conversion for now for
the latter).
Change-Id: I4d83f8b2e89a209a5096d15ec266477318c66925
Diffstat (limited to 'firmware/target/arm')
3 files changed, 23 insertions, 50 deletions
diff --git a/firmware/target/arm/as3525/fmradio-i2c-as3525.c b/firmware/target/arm/as3525/fmradio-i2c-as3525.c index ebe7ebeffd..5b629f5ad4 100644 --- a/firmware/target/arm/as3525/fmradio-i2c-as3525.c +++ b/firmware/target/arm/as3525/fmradio-i2c-as3525.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include "generic_i2c.h" | 35 | #include "generic_i2c.h" |
36 | #include "fmradio_i2c.h" | 36 | #include "fmradio_i2c.h" |
37 | #include "thread.h" | 37 | #include "thread.h" |
38 | #include "rds.h" | ||
39 | 38 | ||
40 | #if defined(SANSA_CLIP) || defined(SANSA_C200V2) | 39 | #if defined(SANSA_CLIP) || defined(SANSA_C200V2) |
41 | #define I2C_SCL_GPIO(x) GPIOB_PIN(x) | 40 | #define I2C_SCL_GPIO(x) GPIOB_PIN(x) |
@@ -203,13 +202,9 @@ void tuner_isr(void) | |||
203 | /* Captures RDS data and processes it */ | 202 | /* Captures RDS data and processes it */ |
204 | static void NORETURN_ATTR rds_thread(void) | 203 | static void NORETURN_ATTR rds_thread(void) |
205 | { | 204 | { |
206 | uint16_t rds_data[4]; | ||
207 | |||
208 | while (true) { | 205 | while (true) { |
209 | semaphore_wait(&rds_sema, TIMEOUT_BLOCK); | 206 | semaphore_wait(&rds_sema, TIMEOUT_BLOCK); |
210 | if (si4700_rds_read_raw(rds_data) && rds_process(rds_data)) { | 207 | si4700_rds_process(); |
211 | si4700_rds_set_event(); | ||
212 | } | ||
213 | } | 208 | } |
214 | } | 209 | } |
215 | 210 | ||
@@ -233,7 +228,6 @@ void si4700_rds_powerup(bool on) | |||
233 | void si4700_rds_init(void) | 228 | void si4700_rds_init(void) |
234 | { | 229 | { |
235 | semaphore_init(&rds_sema, 1, 0); | 230 | semaphore_init(&rds_sema, 1, 0); |
236 | rds_init(); | ||
237 | create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds" | 231 | create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds" |
238 | IF_PRIO(, PRIORITY_REALTIME) IF_COP(, CPU)); | 232 | IF_PRIO(, PRIORITY_REALTIME) IF_COP(, CPU)); |
239 | } | 233 | } |
diff --git a/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c b/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c index bc4a83665d..5d146c4846 100644 --- a/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c +++ b/firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include "system.h" | 23 | #include "system.h" |
24 | #include "kernel.h" | 24 | #include "kernel.h" |
25 | #include "pinctrl-imx233.h" | 25 | #include "pinctrl-imx233.h" |
26 | #include "rds.h" | ||
27 | #include "si4700.h" | 26 | #include "si4700.h" |
28 | 27 | ||
29 | /** | 28 | /** |
@@ -52,13 +51,11 @@ static void stc_rds_callback(int bank, int pin, intptr_t user) | |||
52 | /* Captures RDS data and processes it */ | 51 | /* Captures RDS data and processes it */ |
53 | static void NORETURN_ATTR rds_thread(void) | 52 | static void NORETURN_ATTR rds_thread(void) |
54 | { | 53 | { |
55 | uint16_t rds_data[4]; | ||
56 | |||
57 | while(true) | 54 | while(true) |
58 | { | 55 | { |
59 | semaphore_wait(&rds_sema, TIMEOUT_BLOCK); | 56 | semaphore_wait(&rds_sema, TIMEOUT_BLOCK); |
60 | if(si4700_rds_read_raw(rds_data) && rds_process(rds_data)) | 57 | si4700_rds_process(); |
61 | si4700_rds_set_event(); | 58 | |
62 | /* renable callback */ | 59 | /* renable callback */ |
63 | imx233_pinctrl_setup_irq(2, 27, true, true, false, &stc_rds_callback, 0); | 60 | imx233_pinctrl_setup_irq(2, 27, true, true, false, &stc_rds_callback, 0); |
64 | } | 61 | } |
@@ -86,7 +83,6 @@ void si4700_rds_powerup(bool on) | |||
86 | void si4700_rds_init(void) | 83 | void si4700_rds_init(void) |
87 | { | 84 | { |
88 | semaphore_init(&rds_sema, 1, 0); | 85 | semaphore_init(&rds_sema, 1, 0); |
89 | rds_init(); | ||
90 | create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds" | 86 | create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds" |
91 | IF_PRIO(, PRIORITY_REALTIME) IF_COP(, CPU)); | 87 | IF_PRIO(, PRIORITY_REALTIME) IF_COP(, CPU)); |
92 | } | 88 | } |
diff --git a/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c b/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c index ee91b99c0f..5b0c71110d 100644 --- a/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c +++ b/firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include "gpio-target.h" | 29 | #include "gpio-target.h" |
30 | #include "i2c-imx31.h" | 30 | #include "i2c-imx31.h" |
31 | #include "fmradio_i2c.h" | 31 | #include "fmradio_i2c.h" |
32 | #include "rds.h" | ||
33 | #include "tuner.h" | 32 | #include "tuner.h" |
34 | 33 | ||
35 | static struct i2c_node si4700_i2c_node = | 34 | static struct i2c_node si4700_i2c_node = |
@@ -128,60 +127,44 @@ bool si4700_st(void) | |||
128 | 127 | ||
129 | 128 | ||
130 | /* Low-level RDS Support */ | 129 | /* Low-level RDS Support */ |
131 | |||
132 | /* Transfer descriptor for RDS async operations */ | ||
133 | static struct si4700_i2c_transfer_desc | ||
134 | { | ||
135 | struct i2c_transfer_desc xfer; | ||
136 | unsigned char regbuf[32]; | ||
137 | } si4700_xfer = | ||
138 | { | ||
139 | .xfer = { .node = &si4700_i2c_node } | ||
140 | }; | ||
141 | |||
142 | static bool int_restore; | 130 | static bool int_restore; |
143 | 131 | ||
144 | static void si4700_rds_read_raw_callback(struct i2c_transfer_desc *xfer) | 132 | /* Called after I2C read cycle completes */ |
133 | static void si4700_rds_read_raw_async_callback(struct i2c_transfer_desc *xfer) | ||
145 | { | 134 | { |
146 | struct si4700_i2c_transfer_desc *xf = | ||
147 | (struct si4700_i2c_transfer_desc *)xfer; | ||
148 | |||
149 | if (xfer->rxcount == 0) | 135 | if (xfer->rxcount == 0) |
150 | { | 136 | si4700_rds_process(); |
151 | uint16_t rds_data[4]; | ||
152 | si4700_rds_read_raw_async_complete(xf->regbuf, rds_data); | ||
153 | |||
154 | if (rds_process(rds_data)) | ||
155 | si4700_rds_set_event(); | ||
156 | } | ||
157 | /* else read didn't finish */ | 137 | /* else read didn't finish */ |
158 | 138 | ||
159 | if (int_restore) | 139 | if (int_restore) |
160 | gpio_int_enable(SI4700_EVENT_ID); | 140 | gpio_int_enable(SI4700_EVENT_ID); |
161 | } | 141 | } |
162 | 142 | ||
163 | /* Callback from si4700_rds_read_raw to execute the read */ | 143 | /* Called to read registers from ISR context */ |
164 | void si4700_read_raw_async(int count) | 144 | void si4700_rds_read_raw_async(unsigned char *buf, int count) |
165 | { | 145 | { |
166 | si4700_xfer.xfer.txdata = NULL; | 146 | /* transfer descriptor for RDS async operations */ |
167 | si4700_xfer.xfer.txcount = 0; | 147 | static struct i2c_transfer_desc xfer = { .node = &si4700_i2c_node }; |
168 | si4700_xfer.xfer.rxdata = si4700_xfer.regbuf; | 148 | |
169 | si4700_xfer.xfer.rxcount = count; | 149 | xfer.txdata = NULL; |
170 | si4700_xfer.xfer.callback = si4700_rds_read_raw_callback; | 150 | xfer.txcount = 0; |
171 | si4700_xfer.xfer.next = NULL; | 151 | xfer.rxdata = buf; |
172 | 152 | xfer.rxcount = count; | |
173 | i2c_transfer(&si4700_xfer.xfer); | 153 | xfer.callback = si4700_rds_read_raw_async_callback; |
154 | xfer.next = NULL; | ||
155 | |||
156 | i2c_transfer(&xfer); | ||
174 | } | 157 | } |
175 | 158 | ||
176 | /* RDS GPIO interrupt handler - start RDS data read */ | 159 | /* RDS GPIO interrupt handler - start RDS data read */ |
177 | void INT_SI4700_RDS(void) | 160 | void INT_SI4700_RDS(void) |
178 | { | 161 | { |
179 | /* mask and clear the interrupt */ | 162 | /* mask and clear the interrupt until we're done */ |
180 | gpio_int_disable(SI4700_EVENT_ID); | 163 | gpio_int_disable(SI4700_EVENT_ID); |
181 | gpio_int_clear(SI4700_EVENT_ID); | 164 | gpio_int_clear(SI4700_EVENT_ID); |
182 | 165 | ||
183 | /* read the RDS data */ | 166 | /* tell radio driver about it */ |
184 | si4700_rds_read_raw_async(); | 167 | si4700_rds_interrupt(); |
185 | } | 168 | } |
186 | 169 | ||
187 | /* Called with on=true after full radio power up, and with on=false before | 170 | /* Called with on=true after full radio power up, and with on=false before |
@@ -197,5 +180,5 @@ void si4700_rds_powerup(bool on) | |||
197 | /* One-time RDS init at startup */ | 180 | /* One-time RDS init at startup */ |
198 | void si4700_rds_init(void) | 181 | void si4700_rds_init(void) |
199 | { | 182 | { |
200 | rds_init(); | 183 | /* nothing to do */ |
201 | } | 184 | } |