mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-12-10 21:55:10 -05:00
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:
parent
311595c60c
commit
802b57ccd7
8 changed files with 121 additions and 4 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
44
firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
Normal file
44
firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
Normal 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
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue