FM radio for Philips HDD1630. Volume was very faint unless recording was enabled, so do that too.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19996 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Mark Arigo 2009-02-13 03:49:17 +00:00
parent 311595c60c
commit 802b57ccd7
8 changed files with 121 additions and 4 deletions

View file

@ -269,6 +269,19 @@ static const struct button_mapping button_context_keyboard[] = {
LAST_ITEM_IN_LIST LAST_ITEM_IN_LIST
}; /* button_context_keyboard */ }; /* button_context_keyboard */
#if CONFIG_TUNER
static const struct button_mapping button_context_radio[] = {
{ ACTION_FM_MENU, BUTTON_MENU | BUTTON_REL, BUTTON_MENU },
{ ACTION_FM_MODE, BUTTON_MENU | BUTTON_REPEAT, BUTTON_MENU },
{ ACTION_FM_PRESET, BUTTON_VIEW, BUTTON_NONE },
{ ACTION_FM_PLAY, BUTTON_SELECT | BUTTON_REL, BUTTON_SELECT },
{ ACTION_FM_STOP, BUTTON_SELECT | BUTTON_REPEAT, BUTTON_SELECT },
{ ACTION_FM_EXIT, BUTTON_POWER, BUTTON_NONE },
LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS)
};
#endif
const struct button_mapping* get_context_mapping(int context) const struct button_mapping* get_context_mapping(int context)
{ {
switch (context) switch (context)
@ -312,6 +325,10 @@ const struct button_mapping* get_context_mapping(int context)
return button_context_pitchscreen; return button_context_pitchscreen;
case CONTEXT_KEYBOARD: case CONTEXT_KEYBOARD:
return button_context_keyboard; return button_context_keyboard;
#if CONFIG_TUNER
case CONTEXT_FM:
return button_context_radio;
#endif
} }
return button_context_standard; return button_context_standard;
} }

View file

@ -555,6 +555,7 @@ target/arm/i2s-pp.c
target/arm/adc-pp5020.c target/arm/adc-pp5020.c
target/arm/philips/hdd1630/backlight-hdd1630.c target/arm/philips/hdd1630/backlight-hdd1630.c
target/arm/philips/hdd1630/button-hdd1630.c target/arm/philips/hdd1630/button-hdd1630.c
target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
target/arm/philips/hdd1630/lcd-hdd1630.c target/arm/philips/hdd1630/lcd-hdd1630.c
target/arm/philips/hdd1630/power-hdd1630.c target/arm/philips/hdd1630/power-hdd1630.c
target/arm/philips/hdd1630/powermgmt-hdd1630.c target/arm/philips/hdd1630/powermgmt-hdd1630.c

View file

@ -28,7 +28,12 @@
#include "fmradio.h" #include "fmradio.h"
#include "fmradio_i2c.h" /* physical interface driver */ #include "fmradio_i2c.h" /* physical interface driver */
#if defined(PHILIPS_HDD1630)
#define I2C_ADR 0x60
#else
#define I2C_ADR 0xC0 #define I2C_ADR 0xC0
#endif
static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
static void tea5767_set_clear(int byte, unsigned char bits, int set) static void tea5767_set_clear(int byte, unsigned char bits, int set)
@ -87,7 +92,7 @@ int tea5767_set(int setting, int value)
tea5767_set_clear(4, (1<<6), rd->deemphasis); tea5767_set_clear(4, (1<<6), rd->deemphasis);
tea5767_set_clear(3, (1<<5), rd->band); tea5767_set_clear(3, (1<<5), rd->band);
break; break;
} }
case RADIO_FORCE_MONO: case RADIO_FORCE_MONO:
tea5767_set_clear(2, 0x08, value); tea5767_set_clear(2, 0x08, value);
break; break;

View file

@ -12,7 +12,7 @@
#define CONFIG_STORAGE STORAGE_ATA #define CONFIG_STORAGE STORAGE_ATA
/* define this if you have recording possibility */ /* define this if you have recording possibility */
/* #define HAVE_RECORDING */ #define HAVE_RECORDING
/* Define bitmask of input sources - recordable bitmask can be defined /* Define bitmask of input sources - recordable bitmask can be defined
explicitly if different */ explicitly if different */
@ -99,8 +99,8 @@
/* TODO: #define AB_REPEAT_ENABLE 1 */ /* TODO: #define AB_REPEAT_ENABLE 1 */
/* FM Tuner */ /* FM Tuner */
/* #define CONFIG_TUNER TEA5767 */ #define CONFIG_TUNER TEA5767
/* #define CONFIG_TUNER_XTAL 32768 */ #define CONFIG_TUNER_XTAL 32768
/* define this if you have a disk storage, i.e. something /* define this if you have a disk storage, i.e. something
that needs spinups and can cause skips when shaked */ that needs spinups and can cause skips when shaked */

View file

@ -56,5 +56,6 @@ void i2c_init(void);
int i2c_readbyte(unsigned int dev_addr, int addr); int i2c_readbyte(unsigned int dev_addr, int addr);
int pp_i2c_send(unsigned int addr, int data0, int data1); int pp_i2c_send(unsigned int addr, int data0, int data1);
int i2c_readbytes(unsigned int dev_addr, int addr, int len, unsigned char *data); int i2c_readbytes(unsigned int dev_addr, int addr, int len, unsigned char *data);
int i2c_sendbytes(unsigned int dev_addr, int len, const unsigned char *data);
#endif #endif

View file

@ -196,6 +196,29 @@ int i2c_readbyte(unsigned int dev_addr, int addr)
return (int)data; return (int)data;
} }
int i2c_sendbytes(unsigned int addr, int len, const unsigned char *data)
{
int i, n;
mutex_lock(&i2c_mtx);
i = 0;
while (len > 0)
{
n = (len < 4) ? len : 4;
if (pp_i2c_send_bytes(addr, n, (unsigned char *)(data + i)) < 0)
break;
len -= n;
i += n;
}
mutex_unlock(&i2c_mtx);
return i;
}
int pp_i2c_send(unsigned int addr, int data0, int data1) int pp_i2c_send(unsigned int addr, int data0, int data1)
{ {
int retval; int retval;
@ -234,7 +257,14 @@ void i2c_init(void)
#if CONFIG_I2C == I2C_PP5020 #if CONFIG_I2C == I2C_PP5020
outl(0x0, 0x600060a4); outl(0x0, 0x600060a4);
#if defined(PHILIPS_HDD1630)
outl(inl(0x600060a4) | 0x20, 0x600060a4);
outl(inl(0x7000c020) | 0x3, 0x7000c020);
outl(0x55, 0x7000c02c);
outl(0x54, 0x7000c030);
#else
outl(0x80 | (0 << 8), 0x600060a4); outl(0x80 | (0 << 8), 0x600060a4);
#endif
#elif CONFIG_I2C == I2C_PP5024 #elif CONFIG_I2C == I2C_PP5024
#if defined(SANSA_E200) || defined(PHILIPS_SA9200) #if defined(SANSA_E200) || defined(PHILIPS_SA9200)
/* Sansa OF sets this to 0x20 first, communicates with the AS3514 /* Sansa OF sets this to 0x20 first, communicates with the AS3514

View file

@ -0,0 +1,44 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id:$
*
* Copyright (C) 2009 by Mark Arigo
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "config.h"
#if (CONFIG_TUNER & TEA5767)
#include "i2c-pp.h"
#include "fmradio_i2c.h"
/* The TEA5767 uses 5 bytes, but the pp-i2c will only read/write 4 bytes
at a time. The tuner doesn't like it when the i2c resets to send the 5th
byte. So, we can only read/write the first 4 bytes. Luckily, on read,
the 5th byte is reserved and on write we only use that for the deemphasis
bit (which we'll have to ignore). This is what the OF appears to do too. */
int fmradio_i2c_write(unsigned char address, const unsigned char* buf, int count)
{
(void)count;
return i2c_sendbytes(address, 4, buf);
}
int fmradio_i2c_read(unsigned char address, unsigned char* buf, int count)
{
(void)count;
return i2c_readbytes(address, -1, 4, buf);
}
#endif

View file

@ -39,6 +39,13 @@ void power_init(void)
/* charger inserted bit */ /* charger inserted bit */
GPIOE_ENABLE |= 0x20; GPIOE_ENABLE |= 0x20;
GPIOE_INPUT_VAL |= 0x20; GPIOE_INPUT_VAL |= 0x20;
#if CONFIG_TUNER
/* fm antenna? */
GPIOE_ENABLE |= 0x40;
GPIOE_OUTPUT_EN |= 0x40;
GPIOE_OUTPUT_VAL &= ~0x40; /* off */
#endif
} }
unsigned int power_input_status(void) unsigned int power_input_status(void)
@ -77,3 +84,15 @@ void power_off(void)
GPIOB_OUTPUT_VAL &= ~0x80; GPIOB_OUTPUT_VAL &= ~0x80;
GPIOB_OUTPUT_EN |= 0x80; GPIOB_OUTPUT_EN |= 0x80;
} }
#if CONFIG_TUNER
bool tuner_power(bool status)
{
if (status)
GPIOE_OUTPUT_VAL |= 0x40;
else
GPIOE_OUTPUT_VAL &= ~0x40;
return status;
}
#endif