forked from len0rd/rockbox
Philips tuner prepared, new middle layer to abstract which tuner is used
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5289 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
566eae2e11
commit
8f8fbac1fd
12 changed files with 340 additions and 72 deletions
|
|
@ -98,6 +98,7 @@ int main(void)
|
|||
#include "power.h"
|
||||
#include "talk.h"
|
||||
#include "plugin.h"
|
||||
#include "radio.h"
|
||||
|
||||
/*#define AUTOROCK*/ /* define this to check for "autostart.rock" on boot */
|
||||
|
||||
|
|
@ -285,6 +286,9 @@ void init(void)
|
|||
global_settings.superbass);
|
||||
mpeg_init();
|
||||
talk_init();
|
||||
#ifdef CONFIG_TUNER
|
||||
radio_init();
|
||||
#endif
|
||||
|
||||
#ifdef AUTOROCK
|
||||
if (!usb_detect())
|
||||
|
|
|
|||
|
|
@ -47,6 +47,8 @@
|
|||
#include "sound_menu.h"
|
||||
#include "recording.h"
|
||||
#include "talk.h"
|
||||
#include "tuner.h"
|
||||
#include "hwcompat.h"
|
||||
|
||||
#ifdef CONFIG_TUNER
|
||||
|
||||
|
|
@ -66,24 +68,10 @@
|
|||
|
||||
#define MAX_FREQ (108000000)
|
||||
#define MIN_FREQ (87500000)
|
||||
#define PLL_FREQ_STEP 10000
|
||||
#define FREQ_STEP 100000
|
||||
|
||||
#define RADIO_FREQUENCY 0
|
||||
#define RADIO_MUTE 1
|
||||
#define RADIO_IF_MEASUREMENT 2
|
||||
#define RADIO_SENSITIVITY 3
|
||||
#define RADIO_FORCE_MONO 4
|
||||
|
||||
#define DEFAULT_IN1 0x100003 /* Mute */
|
||||
#define DEFAULT_IN2 0x140884 /* 5kHz, 7.2MHz crystal */
|
||||
|
||||
static int fm_in1 = DEFAULT_IN1;
|
||||
static int fm_in2 = DEFAULT_IN2;
|
||||
|
||||
static int curr_preset = -1;
|
||||
static int curr_freq;
|
||||
static int pll_cnt;
|
||||
|
||||
#define MAX_PRESETS 32
|
||||
static bool presets_loaded = false;
|
||||
|
|
@ -101,46 +89,31 @@ void radio_load_presets(void);
|
|||
bool handle_radio_presets(void);
|
||||
bool radio_menu(void);
|
||||
|
||||
void radio_set(int setting, int value)
|
||||
#if CONFIG_TUNER == S1A0903X01
|
||||
#define radio_set samsung_set
|
||||
#define radio_get samsung_get
|
||||
#elif CONFIG_TUNER == TEA5767
|
||||
#define radio_set philips_set
|
||||
#define radio_get philips_get
|
||||
#elif CONFIG_TUNER == (S1A0903X01 | TEA5767)
|
||||
void (*radio_set)(int setting, int value);
|
||||
int (*radio_get)(int setting);
|
||||
#endif
|
||||
|
||||
void radio_init(void)
|
||||
{
|
||||
switch(setting)
|
||||
#if CONFIG_TUNER == (S1A0903X01 | TEA5767)
|
||||
if (read_hw_mask() & TUNER_MODEL)
|
||||
{
|
||||
case RADIO_FREQUENCY:
|
||||
/* We add the standard Intermediate Frequency 10.7MHz
|
||||
** before calculating the divisor
|
||||
** The reference frequency is set to 50kHz, and the VCO
|
||||
** output is prescaled by 2.
|
||||
*/
|
||||
|
||||
pll_cnt = (value + 10700000) / (PLL_FREQ_STEP/2) / 2;
|
||||
|
||||
/* 0x100000 == FM mode
|
||||
** 0x000002 == Microprocessor controlled Mute
|
||||
*/
|
||||
fm_in1 = (fm_in1 & 0xfff00007) | (pll_cnt << 3);
|
||||
fmradio_set(1, fm_in1);
|
||||
break;
|
||||
|
||||
case RADIO_MUTE:
|
||||
fm_in1 = (fm_in1 & 0xfffffffe) | (value?1:0);
|
||||
fmradio_set(1, fm_in1);
|
||||
break;
|
||||
|
||||
case RADIO_IF_MEASUREMENT:
|
||||
fm_in1 = (fm_in1 & 0xfffffffb) | (value?4:0);
|
||||
fmradio_set(1, fm_in1);
|
||||
break;
|
||||
|
||||
case RADIO_SENSITIVITY:
|
||||
fm_in2 = (fm_in2 & 0xffff9fff) | ((value & 3) << 13);
|
||||
fmradio_set(2, fm_in2);
|
||||
break;
|
||||
|
||||
case RADIO_FORCE_MONO:
|
||||
fm_in2 = (fm_in2 & 0xfffffffb) | (value?0:4);
|
||||
fmradio_set(2, fm_in2);
|
||||
break;
|
||||
radio_set = philips_set;
|
||||
radio_get = philips_get;
|
||||
}
|
||||
else
|
||||
{
|
||||
radio_set = samsung_set;
|
||||
radio_get = samsung_get;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void radio_stop(void)
|
||||
|
|
@ -150,15 +123,7 @@ void radio_stop(void)
|
|||
|
||||
bool radio_hardware_present(void)
|
||||
{
|
||||
int val;
|
||||
|
||||
fmradio_set(2, 0x140885); /* 5kHz, 7.2MHz crystal, test mode 1 */
|
||||
val = fmradio_read(0);
|
||||
debug_fm_detection = val;
|
||||
if(val == 0x140885)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
return radio_get(RADIO_PRESENT);
|
||||
}
|
||||
|
||||
static int find_preset(int freq)
|
||||
|
|
@ -184,7 +149,6 @@ bool radio_screen(void)
|
|||
char buf[MAX_PATH];
|
||||
bool done = false;
|
||||
int button;
|
||||
int val;
|
||||
int freq;
|
||||
int i_freq;
|
||||
bool stereo = false;
|
||||
|
|
@ -247,9 +211,7 @@ bool radio_screen(void)
|
|||
|
||||
curr_freq = global_settings.last_frequency * FREQ_STEP + MIN_FREQ;
|
||||
|
||||
fmradio_set(1, DEFAULT_IN1);
|
||||
fmradio_set(2, DEFAULT_IN2);
|
||||
|
||||
radio_set(RADIO_INIT, 0);
|
||||
radio_set(RADIO_FREQUENCY, curr_freq);
|
||||
radio_set(RADIO_IF_MEASUREMENT, 0);
|
||||
radio_set(RADIO_SENSITIVITY, 0);
|
||||
|
|
@ -282,8 +244,7 @@ bool radio_screen(void)
|
|||
sleep(1);
|
||||
|
||||
/* Now check how close to the IF frequency we are */
|
||||
val = fmradio_read(3);
|
||||
i_freq = (val & 0x7ffff) / 80;
|
||||
i_freq = radio_get(RADIO_IF_MEASURED);
|
||||
|
||||
/* Stop searching if the IF frequency is close to 10.7MHz */
|
||||
if(i_freq > 1065 && i_freq < 1075)
|
||||
|
|
@ -474,8 +435,7 @@ bool radio_screen(void)
|
|||
{
|
||||
timeout = current_tick + HZ;
|
||||
|
||||
val = fmradio_read(3);
|
||||
stereo = ((val & 0x100000)?true:false) &
|
||||
stereo = radio_get(RADIO_STEREO) &&
|
||||
!global_settings.fm_force_mono;
|
||||
if(stereo != last_stereo_status)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
#define RADIO_H
|
||||
|
||||
#ifdef CONFIG_TUNER
|
||||
void radio_init(void);
|
||||
bool radio_screen(void);
|
||||
void radio_stop(void);
|
||||
bool radio_hardware_present(void);
|
||||
|
|
|
|||
|
|
@ -38,7 +38,14 @@ drivers/button.c
|
|||
drivers/dac.c
|
||||
drivers/fat.c
|
||||
#ifdef CONFIG_TUNER
|
||||
#if (CONFIG_TUNER & S1A0903X01)
|
||||
drivers/fmradio.c
|
||||
tuner_samsung.c
|
||||
#endif
|
||||
#if (CONFIG_TUNER & TEA5767)
|
||||
drivers/fmradio_i2c.c
|
||||
tuner_philips.c
|
||||
#endif
|
||||
#endif
|
||||
drivers/i2c.c
|
||||
#ifdef HAVE_LCD_CHARCELLS
|
||||
|
|
|
|||
41
firmware/drivers/fmradio_i2c.c
Normal file
41
firmware/drivers/fmradio_i2c.c
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
* Physical interface of the Philips TEA5767 in Archos Ondio
|
||||
*
|
||||
* Copyright (C) 2004 by Jörg Hohensohn
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "lcd.h"
|
||||
#include "sh7034.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "debug.h"
|
||||
#include "system.h"
|
||||
|
||||
#ifdef CONFIG_TUNER
|
||||
|
||||
/* reads 5 byte */
|
||||
void fmradio_i2c_read(unsigned char* p_data)
|
||||
{
|
||||
(void)p_data;
|
||||
}
|
||||
|
||||
/* writes 5 bytes */
|
||||
void fmradio_i2c_set(const unsigned char* p_data)
|
||||
{
|
||||
(void)p_data;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -41,7 +41,7 @@
|
|||
#define FIRMWARE_OFFSET_FILE_DATA 24
|
||||
|
||||
/* Define this if you have an FM Radio */
|
||||
#define CONFIG_TUNER TEA5767
|
||||
#define CONFIG_TUNER (S1A0903X01 | TEA5767) /* to be decided at runtime */
|
||||
|
||||
/* How to detect USB */
|
||||
#define USB_FMRECORDERSTYLE 1 /* like FM, on AN1 */
|
||||
|
|
|
|||
|
|
@ -22,9 +22,9 @@
|
|||
|
||||
/* symbolic names for multiple choice configurations: */
|
||||
|
||||
/* CONFIG_TUNER */
|
||||
#define S1A0903X01 0 /* Samsung */
|
||||
#define TEA5767 1 /* Philips */
|
||||
/* CONFIG_TUNER (note these are combineable bit-flags) */
|
||||
#define S1A0903X01 0x01 /* Samsung */
|
||||
#define TEA5767 0x02 /* Philips */
|
||||
|
||||
/* CONFIG_HWCODEC */
|
||||
#define MAS3587F 3587
|
||||
|
|
|
|||
26
firmware/export/fmradio_i2c.h
Normal file
26
firmware/export/fmradio_i2c.h
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
* Physical interface of the Philips TEA5767 in Archos Ondio
|
||||
*
|
||||
* Copyright (C) 2004 by Jörg Hohensohn
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef FMRADIO_I2C_H
|
||||
#define FMRADIO_I2C_H
|
||||
|
||||
void fmradio_i2c_read(unsigned char* p_data); /* reads 5 byte */
|
||||
void fmradio_i2c_set(const unsigned char* p_data); /* writes 5 bytes */
|
||||
|
||||
#endif
|
||||
|
|
@ -27,6 +27,7 @@
|
|||
#define USB_ACTIVE_HIGH 0x0100
|
||||
#define PR_ACTIVE_HIGH 0x0100
|
||||
#define LCD_CONTRAST_BIAS 0x0200
|
||||
#define TUNER_MODEL 0x0800
|
||||
|
||||
int read_rom_version(void);
|
||||
int read_hw_mask(void);
|
||||
|
|
|
|||
49
firmware/export/tuner.h
Normal file
49
firmware/export/tuner.h
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
* Tuner abstraction layer
|
||||
*
|
||||
* Copyright (C) 2004 Jörg Hohensohn
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef __TUNER_SAMSUNG_H__
|
||||
#define __TUNER_SAMSUNG_H__
|
||||
|
||||
/* settings to the tuner layer */
|
||||
#define RADIO_INIT 0
|
||||
#define RADIO_FREQUENCY 1
|
||||
#define RADIO_MUTE 2
|
||||
#define RADIO_IF_MEASUREMENT 3
|
||||
#define RADIO_SENSITIVITY 4
|
||||
#define RADIO_FORCE_MONO 5
|
||||
/* readback from the tuner layer */
|
||||
#define RADIO_PRESENT 0
|
||||
#define RADIO_IF_MEASURED 1
|
||||
#define RADIO_STEREO 2
|
||||
|
||||
#ifdef CONFIG_TUNER
|
||||
|
||||
#if (CONFIG_TUNER & S1A0903X01)
|
||||
void samsung_set(int setting, int value);
|
||||
int samsung_get(int setting);
|
||||
#endif
|
||||
|
||||
#if (CONFIG_TUNER & TEA5767)
|
||||
void philips_set(int setting, int value);
|
||||
int philips_get(int setting);
|
||||
#endif
|
||||
|
||||
#endif /* #ifdef CONFIG_TUNER */
|
||||
|
||||
#endif
|
||||
70
firmware/tuner_philips.c
Normal file
70
firmware/tuner_philips.c
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
* Tuner "middleware" for Philips TEA5767 chip
|
||||
*
|
||||
* Copyright (C) 2004 Jörg Hohensohn
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "tuner.h" /* tuner abstraction interface */
|
||||
#include "fmradio_i2c.h" /* physical interface driver */
|
||||
|
||||
/* FIXME: this is just a dummy */
|
||||
|
||||
/* tuner abstraction layer: set something to the tuner */
|
||||
void philips_set(int setting, int value)
|
||||
{
|
||||
(void)value;
|
||||
switch(setting)
|
||||
{
|
||||
case RADIO_INIT:
|
||||
break;
|
||||
|
||||
case RADIO_FREQUENCY:
|
||||
break;
|
||||
|
||||
case RADIO_MUTE:
|
||||
break;
|
||||
|
||||
case RADIO_IF_MEASUREMENT:
|
||||
break;
|
||||
|
||||
case RADIO_SENSITIVITY:
|
||||
break;
|
||||
|
||||
case RADIO_FORCE_MONO:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* tuner abstraction layer: read something from the tuner */
|
||||
int philips_get(int setting)
|
||||
{
|
||||
int val = -1;
|
||||
switch(setting)
|
||||
{
|
||||
case RADIO_PRESENT:
|
||||
val = 0; /* false */
|
||||
break;
|
||||
|
||||
case RADIO_IF_MEASURED:
|
||||
break;
|
||||
|
||||
case RADIO_STEREO:
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
109
firmware/tuner_samsung.c
Normal file
109
firmware/tuner_samsung.c
Normal file
|
|
@ -0,0 +1,109 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
* Tuner "middleware" for Samsung S1A0903X01 chip
|
||||
*
|
||||
* Copyright (C) 2003 Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "tuner.h" /* tuner abstraction interface */
|
||||
#include "fmradio.h" /* physical interface driver */
|
||||
|
||||
#define DEFAULT_IN1 0x100003 /* Mute */
|
||||
#define DEFAULT_IN2 0x140884 /* 5kHz, 7.2MHz crystal */
|
||||
#define PLL_FREQ_STEP 10000
|
||||
|
||||
int debug_fm_detection;
|
||||
static int fm_in1;
|
||||
static int fm_in2;
|
||||
|
||||
/* tuner abstraction layer: set something to the tuner */
|
||||
void samsung_set(int setting, int value)
|
||||
{
|
||||
switch(setting)
|
||||
{
|
||||
case RADIO_INIT:
|
||||
fm_in1 = DEFAULT_IN1;
|
||||
fm_in2 = DEFAULT_IN2;
|
||||
fmradio_set(1, fm_in1);
|
||||
fmradio_set(2, fm_in2);
|
||||
break;
|
||||
|
||||
case RADIO_FREQUENCY:
|
||||
{
|
||||
int pll_cnt;
|
||||
/* We add the standard Intermediate Frequency 10.7MHz
|
||||
** before calculating the divisor
|
||||
** The reference frequency is set to 50kHz, and the VCO
|
||||
** output is prescaled by 2.
|
||||
*/
|
||||
|
||||
pll_cnt = (value + 10700000) / (PLL_FREQ_STEP/2) / 2;
|
||||
|
||||
/* 0x100000 == FM mode
|
||||
** 0x000002 == Microprocessor controlled Mute
|
||||
*/
|
||||
fm_in1 = (fm_in1 & 0xfff00007) | (pll_cnt << 3);
|
||||
fmradio_set(1, fm_in1);
|
||||
break;
|
||||
}
|
||||
|
||||
case RADIO_MUTE:
|
||||
fm_in1 = (fm_in1 & 0xfffffffe) | (value?1:0);
|
||||
fmradio_set(1, fm_in1);
|
||||
break;
|
||||
|
||||
case RADIO_IF_MEASUREMENT:
|
||||
fm_in1 = (fm_in1 & 0xfffffffb) | (value?4:0);
|
||||
fmradio_set(1, fm_in1);
|
||||
break;
|
||||
|
||||
case RADIO_SENSITIVITY:
|
||||
fm_in2 = (fm_in2 & 0xffff9fff) | ((value & 3) << 13);
|
||||
fmradio_set(2, fm_in2);
|
||||
break;
|
||||
|
||||
case RADIO_FORCE_MONO:
|
||||
fm_in2 = (fm_in2 & 0xfffffffb) | (value?0:4);
|
||||
fmradio_set(2, fm_in2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* tuner abstraction layer: read something from the tuner */
|
||||
int samsung_get(int setting)
|
||||
{
|
||||
int val = -1;
|
||||
switch(setting)
|
||||
{
|
||||
case RADIO_PRESENT:
|
||||
fmradio_set(2, 0x140885); /* 5kHz, 7.2MHz crystal, test mode 1 */
|
||||
val = fmradio_read(0);
|
||||
debug_fm_detection = val;
|
||||
val = (val == 0x140885);
|
||||
break;
|
||||
|
||||
case RADIO_IF_MEASURED:
|
||||
val = fmradio_read(3);
|
||||
val = (val & 0x7ffff) / 80; /* convert to kHz */
|
||||
break;
|
||||
|
||||
case RADIO_STEREO:
|
||||
val = fmradio_read(3);
|
||||
val = ((val & 0x100000) ? true : false);
|
||||
}
|
||||
return val;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue