summaryrefslogtreecommitdiff
path: root/firmware/target/arm
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm')
-rw-r--r--firmware/target/arm/as3525/fmradio-i2c-as3525.c8
-rw-r--r--firmware/target/arm/imx233/sansa-fuzeplus/fmradio-i2c-fuzeplus.c8
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/fmradio-i2c-gigabeat-s.c57
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 */
204static void NORETURN_ATTR rds_thread(void) 203static 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)
233void si4700_rds_init(void) 228void 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 */
53static void NORETURN_ATTR rds_thread(void) 52static 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)
86void si4700_rds_init(void) 83void 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
35static struct i2c_node si4700_i2c_node = 34static 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 */
133static 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
142static bool int_restore; 130static bool int_restore;
143 131
144static void si4700_rds_read_raw_callback(struct i2c_transfer_desc *xfer) 132/* Called after I2C read cycle completes */
133static 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 */
164void si4700_read_raw_async(int count) 144void 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 */
177void INT_SI4700_RDS(void) 160void 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 */
198void si4700_rds_init(void) 181void si4700_rds_init(void)
199{ 182{
200 rds_init(); 183 /* nothing to do */
201} 184}