1
0
Fork 0
forked from len0rd/rockbox

FM Radio mishmash: Make a quieter screen for the SWCODEC targets esp. for the benefit of x5; I wasn't sure if it was good to alter timeouts for HW codec. Simplify things and prepare for eventual scanning and tuning changes (which should help quiet x5 down even more). Make things behave themselves better in general. Enable SWCODEC FM Recording menu and screen for sim as a bonus.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12804 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2007-03-16 14:40:40 +00:00
parent a91a35be74
commit a2ee6a6681
7 changed files with 455 additions and 343 deletions

View file

@ -2074,7 +2074,6 @@ static bool dbg_fm_radio(void)
while(1)
{
int row = 0;
unsigned long regs;
lcd_clear_display();
fm_detected = radio_hardware_present();
@ -2083,16 +2082,31 @@ static bool dbg_fm_radio(void)
lcd_puts(0, row++, buf);
#if (CONFIG_TUNER & S1A0903X01)
regs = samsung_get(RADIO_ALL);
snprintf(buf, sizeof buf, "Samsung regs: %08lx", regs);
snprintf(buf, sizeof buf, "Samsung regs: %08X",
samsung_get(RADIO_ALL));
lcd_puts(0, row++, buf);
#endif
#if (CONFIG_TUNER & TEA5767)
regs = philips_get(RADIO_ALL);
snprintf(buf, sizeof buf, "Philips regs: %08lx", regs);
lcd_puts(0, row++, buf);
#endif
{
struct philips_dbg_info info;
philips_dbg_info(&info);
snprintf(buf, sizeof buf, "Philips regs:");
lcd_puts(0, row++, buf);
snprintf(buf, sizeof buf, " Read: %02X %02X %02X %02X %02X",
(unsigned)info.read_regs[0], (unsigned)info.read_regs[1],
(unsigned)info.read_regs[2], (unsigned)info.read_regs[3],
(unsigned)info.read_regs[4]);
lcd_puts(0, row++, buf);
snprintf(buf, sizeof buf, " Write: %02X %02X %02X %02X %02X",
(unsigned)info.write_regs[0], (unsigned)info.write_regs[1],
(unsigned)info.write_regs[2], (unsigned)info.write_regs[3],
(unsigned)info.write_regs[4]);
lcd_puts(0, row++, buf);
}
#endif
lcd_update();
if (action_userabort(HZ))

File diff suppressed because it is too large Load diff

View file

@ -50,8 +50,14 @@ struct fm_region_setting
int freq_max;
int freq_step;
#if (CONFIG_TUNER & TEA5767)
int deemphasis; /* 0: 50us, 1: 75us */
int band; /* 0: europe, 1: japan (BL in TEA spec)*/
char deemphasis; /* 0: 50us, 1: 75us */
char band; /* 0: europe, 1: japan (BL in TEA spec)*/
/* Note: "region" parameter is just for display atm and is not compiled. */
#define FM_REGION_ENTRY(region, fmin, fmax, fstep, deemph, band) \
{ fmin, fmax, fstep, deemph, band }
#else
#define FM_REGION_ENTRY(region, fmin, fmax, fstep, deemph, band) \
{ fmin, fmax, fstep }
#endif
};

View file

@ -20,34 +20,81 @@
#ifndef __TUNER_SAMSUNG_H__
#define __TUNER_SAMSUNG_H__
#include "hwcompat.h"
/* settings to the tuner layer */
#define RADIO_ALL -1 /* debug */
#define RADIO_SLEEP 0
#define RADIO_FREQUENCY 1
#define RADIO_MUTE 2
#define RADIO_IF_MEASUREMENT 3
#define RADIO_SENSITIVITY 4
#define RADIO_FORCE_MONO 5
#define RADIO_SCAN_FREQUENCY 6
#if (CONFIG_TUNER & TEA5767)
#define RADIO_SET_DEEMPHASIS 6
#define RADIO_SET_BAND 7
#define RADIO_SET_DEEMPHASIS 7
#define RADIO_SET_BAND 8
#endif
/* readback from the tuner layer */
#define RADIO_PRESENT 0
#define RADIO_TUNED 1
#define RADIO_STEREO 2
#define RADIO_ALL 3 /* debug */
#if CONFIG_TUNER
#if (CONFIG_TUNER & S1A0903X01)
void samsung_set(int setting, int value);
int samsung_get(int setting);
#ifdef SIMULATOR
int radio_set(int setting, int value);
int radio_get(int setting);
#else
#if CONFIG_TUNER == S1A0903X01 /* FM recorder */
#define radio_set samsung_set
#define radio_get samsung_get
#elif CONFIG_TUNER == TEA5767 /* iRiver, iAudio */
#define radio_set philips_set
#define radio_get philips_get
#elif CONFIG_TUNER == (S1A0903X01 | TEA5767) /* OndioFM */
#define radio_set _radio_set
#define radio_get _radio_get
int (*_radio_set)(int setting, int value);
int (*_radio_get)(int setting);
#endif
#endif
#if (CONFIG_TUNER & S1A0903X01)
int samsung_set(int setting, int value);
int samsung_get(int setting);
#endif /* CONFIG_TUNER & S1A0903X01 */
#if (CONFIG_TUNER & TEA5767)
void philips_set(int setting, int value);
struct philips_dbg_info
{
unsigned char read_regs[5];
unsigned char write_regs[5];
};
int philips_set(int setting, int value);
int philips_get(int setting);
void philips_dbg_info(struct philips_dbg_info *info);
#endif /* CONFIG_TUNER & TEA5767 */
/* Just inline here since only radio screen needs this atm and
there's no tuner.c. */
static inline void tuner_init(void)
{
#ifndef SIMULATOR
#if CONFIG_TUNER == (S1A0903X01 | TEA5767)
if (read_hw_mask() & TUNER_MODEL)
{
_radio_set = philips_set;
_radio_get = philips_get;
}
else
{
_radio_set = samsung_set;
_radio_get = samsung_get;
}
#endif
#endif
}
#endif /* #if CONFIG_TUNER */

View file

@ -29,7 +29,7 @@
static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
/* tuner abstraction layer: set something to the tuner */
void philips_set(int setting, int value)
int philips_set(int setting, int value)
{
switch(setting)
{
@ -60,6 +60,11 @@ void philips_set(int setting, int value)
}
break;
case RADIO_SCAN_FREQUENCY:
philips_set(RADIO_FREQUENCY, value);
sleep(HZ/30);
return philips_get(RADIO_TUNED);
case RADIO_MUTE:
write_bytes[0] = (write_bytes[0] & 0x7F) | (value ? 0x80 : 0);
break;
@ -75,9 +80,10 @@ void philips_set(int setting, int value)
case RADIO_SET_BAND:
write_bytes[3] = (write_bytes[3] & ~(1<<5)) | (value ? (1<<5) : 0);
default:
return;
return -1;
}
fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
return 1;
}
/* tuner abstraction layer: read something from the tuner */
@ -106,13 +112,12 @@ int philips_get(int setting)
case RADIO_STEREO:
val = read_bytes[2] >> 7;
break;
case RADIO_ALL: /* debug query */
val = read_bytes[0] << 24
| read_bytes[1] << 16
| read_bytes[2] << 8
| read_bytes[3];
break;
}
return val;
}
void philips_dbg_info(struct philips_dbg_info *info)
{
fmradio_i2c_read(I2C_ADR, info->read_regs, 5);
memcpy(info->write_regs, write_bytes, 5);
}

View file

@ -21,6 +21,7 @@
#include <stdbool.h>
#include <stdlib.h>
#include "config.h"
#include "kernel.h"
#include "tuner.h" /* tuner abstraction interface */
#include "fmradio.h" /* physical interface driver */
#include "mpeg.h"
@ -34,8 +35,10 @@ static int fm_in1;
static int fm_in2;
/* tuner abstraction layer: set something to the tuner */
void samsung_set(int setting, int value)
int samsung_set(int setting, int value)
{
int val = 1;
switch(setting)
{
case RADIO_SLEEP:
@ -90,6 +93,16 @@ void samsung_set(int setting, int value)
break;
}
case RADIO_SCAN_FREQUENCY:
/* Tune in and delay */
samsung_set(RADIO_FREQUENCY, value);
sleep(1);
/* Start IF measurement */
samsung_set(RADIO_IF_MEASUREMENT, 1);
sleep(1);
val = samsung_get(RADIO_TUNED);
break;
case RADIO_MUTE:
fm_in1 = (fm_in1 & 0xfffffffe) | (value?1:0);
fmradio_set(1, fm_in1);
@ -109,7 +122,11 @@ void samsung_set(int setting, int value)
fm_in2 = (fm_in2 & 0xfffffffb) | (value?0:4);
fmradio_set(2, fm_in2);
break;
default:
val = -1;
}
return val;
}
/* tuner abstraction layer: read something from the tuner */

View file

@ -26,7 +26,7 @@
static int frequency = 0;
static bool mono = false;
void radio_set(int setting, int value)
int radio_set(int setting, int value)
{
switch(setting)
{
@ -37,6 +37,10 @@ void radio_set(int setting, int value)
frequency = value;
break;
case RADIO_SCAN_FREQUENCY:
frequency = value;
break;
case RADIO_MUTE:
break;
@ -45,8 +49,10 @@ void radio_set(int setting, int value)
break;
default:
return;
return -1;
}
return 1;
}
int radio_get(int setting)