summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/export/config/samsungypr0.h2
-rw-r--r--firmware/export/config/samsungypr1.h2
-rw-r--r--firmware/target/hosted/samsungypr/radio-ypr.c59
3 files changed, 4 insertions, 59 deletions
diff --git a/firmware/export/config/samsungypr0.h b/firmware/export/config/samsungypr0.h
index e29ea6a974..520eb08d01 100644
--- a/firmware/export/config/samsungypr0.h
+++ b/firmware/export/config/samsungypr0.h
@@ -105,6 +105,8 @@
105#define CONFIG_TUNER SI4700 105#define CONFIG_TUNER SI4700
106#define HAVE_TUNER_PWR_CTRL 106#define HAVE_TUNER_PWR_CTRL
107#define HAVE_RDS_CAP 107#define HAVE_RDS_CAP
108#define CONFIG_RDS (RDS_CFG_POLL | RDS_CFG_PROCESS)
109#define CONFIG_RDS_POLL_TICKS 4
108 110
109/* Define this for FM radio input available */ 111/* Define this for FM radio input available */
110#define HAVE_FMRADIO_IN 112#define HAVE_FMRADIO_IN
diff --git a/firmware/export/config/samsungypr1.h b/firmware/export/config/samsungypr1.h
index d091e3ed1e..50abfa323e 100644
--- a/firmware/export/config/samsungypr1.h
+++ b/firmware/export/config/samsungypr1.h
@@ -150,6 +150,8 @@
150#define CONFIG_TUNER SI4700 150#define CONFIG_TUNER SI4700
151#define HAVE_TUNER_PWR_CTRL 151#define HAVE_TUNER_PWR_CTRL
152#define HAVE_RDS_CAP 152#define HAVE_RDS_CAP
153#define CONFIG_RDS (RDS_CFG_POLL | RDS_CFG_PROCESS)
154#define CONFIG_RDS_POLL_TICKS 4
153 155
154/* Define this for FM radio input available */ 156/* Define this for FM radio input available */
155#define HAVE_FMRADIO_IN 157#define HAVE_FMRADIO_IN
diff --git a/firmware/target/hosted/samsungypr/radio-ypr.c b/firmware/target/hosted/samsungypr/radio-ypr.c
index 42d485231d..ef7fb84aa0 100644
--- a/firmware/target/hosted/samsungypr/radio-ypr.c
+++ b/firmware/target/hosted/samsungypr/radio-ypr.c
@@ -126,62 +126,3 @@ int fmradio_i2c_read(unsigned char address, unsigned char* buf, int count)
126 (void)address; 126 (void)address;
127 return read(radio_dev, buf, count); 127 return read(radio_dev, buf, count);
128} 128}
129
130#ifdef HAVE_RDS_CAP
131
132/* Register we are going to poll */
133#define STATUSRSSI (0xA)
134#define STATUSRSSI_RDSR (0x1 << 15)
135
136/* Low-level RDS Support */
137static struct event_queue rds_queue;
138static uint32_t rds_stack[DEFAULT_STACK_SIZE / sizeof(uint32_t)];
139
140enum {
141 Q_POWERUP,
142};
143
144static void NORETURN_ATTR rds_thread(void)
145{
146 /* start up frozen */
147 int timeout = TIMEOUT_BLOCK;
148 struct queue_event ev;
149 bool rds_rdy = false;
150 struct si4700_dbg_info radio_regs;
151
152 while (true) {
153 queue_wait_w_tmo(&rds_queue, &ev, timeout);
154 switch (ev.id) {
155 case Q_POWERUP:
156 /* power up: timeout after 1 tick, else block indefinitely */
157 timeout = ev.data ? 1 : TIMEOUT_BLOCK;
158 break;
159 case SYS_TIMEOUT:
160 /* Captures RDS data and processes it */
161 si4700_dbg_info(&radio_regs);
162 bool rdsr = radio_regs.regs[STATUSRSSI] & STATUSRSSI_RDSR;
163 if (rdsr != rds_rdy) {
164 rds_rdy = rdsr;
165 if (rdsr) {
166 si4700_rds_process();
167 }
168 }
169 break;
170 }
171 }
172}
173
174/* true after full radio power up, and false before powering down */
175void si4700_rds_powerup(bool on)
176{
177 queue_post(&rds_queue, Q_POWERUP, on);
178}
179
180/* One-time RDS init at startup */
181void si4700_rds_init(void)
182{
183 queue_init(&rds_queue, false);
184 create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds"
185 IF_PRIO(, PRIORITY_PLAYBACK) IF_COP(, CPU));
186}
187#endif /* HAVE_RDS_CAP */