forked from len0rd/rockbox
Sansa Clip+: add RDS support
Based on a patch by Amaury Pouly which was based on a patch from Ryan Hitchman. I mainly moved the code for polling into the tuner driver so it can be reused by other targets. I added the CONFIG parameter for the polling frequency (in ticks) to save energy. Also, I did some minor cleanups. Change-Id: I95a62e7e1e42c62dbf47ecb27a3b312a42be62aa
This commit is contained in:
parent
701d4ba77e
commit
de0346065b
6 changed files with 76 additions and 2 deletions
|
@ -587,12 +587,67 @@ void si4700_rds_process(void)
|
|||
if (tuner_powered())
|
||||
{
|
||||
si4700_read_reg(RDSD);
|
||||
#if (CONFIG_RDS & RDS_CFG_POLL)
|
||||
/* we need to keep track of the ready bit because it stays set for 80ms
|
||||
* and we must avoid processing it twice */
|
||||
|
||||
static bool old_rdsr = false;
|
||||
bool rdsr = (cache[STATUSRSSI] & STATUSRSSI_RDSR);
|
||||
if (rdsr && !old_rdsr)
|
||||
rds_process(&cache[RDSA]);
|
||||
old_rdsr = rdsr;
|
||||
#else
|
||||
rds_process(&cache[RDSA]);
|
||||
#endif /* !(CONFIG_RDS & RDS_CFG_POLL) */
|
||||
}
|
||||
|
||||
mutex_unlock(&fmr_mutex);
|
||||
}
|
||||
#endif /* (CONFIG_RDS & RDS_CFG_ISR) */
|
||||
|
||||
#if (CONFIG_RDS & RDS_CFG_POLL)
|
||||
static struct event_queue rds_queue;
|
||||
static uint32_t rds_stack[DEFAULT_STACK_SIZE / sizeof(uint32_t)];
|
||||
|
||||
enum {
|
||||
Q_POWERUP,
|
||||
};
|
||||
|
||||
static void NORETURN_ATTR rds_thread(void)
|
||||
{
|
||||
/* start up frozen */
|
||||
int timeout = TIMEOUT_BLOCK;
|
||||
struct queue_event ev;
|
||||
|
||||
while (true) {
|
||||
queue_wait_w_tmo(&rds_queue, &ev, timeout);
|
||||
switch (ev.id) {
|
||||
case Q_POWERUP:
|
||||
/* power up: timeout after 1 tick, else block indefinitely */
|
||||
timeout = ev.data ? CONFIG_RDS_POLL_TICKS : TIMEOUT_BLOCK;
|
||||
break;
|
||||
case SYS_TIMEOUT:;
|
||||
/* Captures RDS data and processes it */
|
||||
si4700_rds_process();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* true after full radio power up, and false before powering down */
|
||||
void si4700_rds_powerup(bool on)
|
||||
{
|
||||
queue_post(&rds_queue, Q_POWERUP, on);
|
||||
}
|
||||
|
||||
/* One-time RDS init at startup */
|
||||
void si4700_rds_init(void)
|
||||
{
|
||||
queue_init(&rds_queue, false);
|
||||
create_thread(rds_thread, rds_stack, sizeof(rds_stack), 0, "rds"
|
||||
IF_PRIO(, PRIORITY_PLAYBACK) IF_COP(, CPU));
|
||||
}
|
||||
#endif /* !(CONFIG_RDS & RDS_CFG_POLL) */
|
||||
|
||||
#endif /* HAVE_RDS_CAP */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue