summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Arigo <markarigo@gmail.com>2009-02-13 03:49:17 +0000
committerMark Arigo <markarigo@gmail.com>2009-02-13 03:49:17 +0000
commit802b57ccd7676a9f619e93a4d326cf6f524f2079 (patch)
tree111cb07148c0956e353f012041ea0e9be1b0ba0d
parent311595c60cb8a720e93205218042101b65830b29 (diff)
downloadrockbox-802b57ccd7676a9f619e93a4d326cf6f524f2079.zip
rockbox-802b57ccd7676a9f619e93a4d326cf6f524f2079.tar.gz
rockbox-802b57ccd7676a9f619e93a4d326cf6f524f2079.tar.bz2
rockbox-802b57ccd7676a9f619e93a4d326cf6f524f2079.tar.xz
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
-rw-r--r--apps/keymaps/keymap-hdd1630.c17
-rw-r--r--firmware/SOURCES1
-rw-r--r--firmware/drivers/tuner/tea5767.c7
-rwxr-xr-xfirmware/export/config-hdd1630.h6
-rw-r--r--firmware/export/i2c-pp.h1
-rw-r--r--firmware/target/arm/i2c-pp.c30
-rw-r--r--firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c44
-rwxr-xr-xfirmware/target/arm/philips/hdd1630/power-hdd1630.c19
8 files changed, 121 insertions, 4 deletions
diff --git a/apps/keymaps/keymap-hdd1630.c b/apps/keymaps/keymap-hdd1630.c
index e4a74cb..6b38983 100644
--- a/apps/keymaps/keymap-hdd1630.c
+++ b/apps/keymaps/keymap-hdd1630.c
@@ -269,6 +269,19 @@ static const struct button_mapping button_context_keyboard[] = {
LAST_ITEM_IN_LIST
}; /* 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)
{
switch (context)
@@ -312,6 +325,10 @@ const struct button_mapping* get_context_mapping(int context)
return button_context_pitchscreen;
case CONTEXT_KEYBOARD:
return button_context_keyboard;
+#if CONFIG_TUNER
+ case CONTEXT_FM:
+ return button_context_radio;
+#endif
}
return button_context_standard;
}
diff --git a/firmware/SOURCES b/firmware/SOURCES
index dd3569a..321a267 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -555,6 +555,7 @@ target/arm/i2s-pp.c
target/arm/adc-pp5020.c
target/arm/philips/hdd1630/backlight-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/power-hdd1630.c
target/arm/philips/hdd1630/powermgmt-hdd1630.c
diff --git a/firmware/drivers/tuner/tea5767.c b/firmware/drivers/tuner/tea5767.c
index 2d18a0f..0950345 100644
--- a/firmware/drivers/tuner/tea5767.c
+++ b/firmware/drivers/tuner/tea5767.c
@@ -28,7 +28,12 @@
#include "fmradio.h"
#include "fmradio_i2c.h" /* physical interface driver */
+#if defined(PHILIPS_HDD1630)
+#define I2C_ADR 0x60
+#else
#define I2C_ADR 0xC0
+#endif
+
static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
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(3, (1<<5), rd->band);
break;
- }
+ }
case RADIO_FORCE_MONO:
tea5767_set_clear(2, 0x08, value);
break;
diff --git a/firmware/export/config-hdd1630.h b/firmware/export/config-hdd1630.h
index 6aed356..605a045 100755
--- a/firmware/export/config-hdd1630.h
+++ b/firmware/export/config-hdd1630.h
@@ -12,7 +12,7 @@
#define CONFIG_STORAGE STORAGE_ATA
/* define this if you have recording possibility */
-/* #define HAVE_RECORDING */
+#define HAVE_RECORDING
/* Define bitmask of input sources - recordable bitmask can be defined
explicitly if different */
@@ -99,8 +99,8 @@
/* TODO: #define AB_REPEAT_ENABLE 1 */
/* FM Tuner */
-/* #define CONFIG_TUNER TEA5767 */
-/* #define CONFIG_TUNER_XTAL 32768 */
+#define CONFIG_TUNER TEA5767
+#define CONFIG_TUNER_XTAL 32768
/* define this if you have a disk storage, i.e. something
that needs spinups and can cause skips when shaked */
diff --git a/firmware/export/i2c-pp.h b/firmware/export/i2c-pp.h
index d5eff90..230b6bb 100644
--- a/firmware/export/i2c-pp.h
+++ b/firmware/export/i2c-pp.h
@@ -56,5 +56,6 @@ void i2c_init(void);
int i2c_readbyte(unsigned int dev_addr, int addr);
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_sendbytes(unsigned int dev_addr, int len, const unsigned char *data);
#endif
diff --git a/firmware/target/arm/i2c-pp.c b/firmware/target/arm/i2c-pp.c
index 175e2ef..4471340 100644
--- a/firmware/target/arm/i2c-pp.c
+++ b/firmware/target/arm/i2c-pp.c
@@ -196,6 +196,29 @@ int i2c_readbyte(unsigned int dev_addr, int addr)
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 retval;
@@ -234,7 +257,14 @@ void i2c_init(void)
#if CONFIG_I2C == I2C_PP5020
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);
+#endif
#elif CONFIG_I2C == I2C_PP5024
#if defined(SANSA_E200) || defined(PHILIPS_SA9200)
/* Sansa OF sets this to 0x20 first, communicates with the AS3514
diff --git a/firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c b/firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
new file mode 100644
index 0000000..c27ba5d
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
@@ -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
diff --git a/firmware/target/arm/philips/hdd1630/power-hdd1630.c b/firmware/target/arm/philips/hdd1630/power-hdd1630.c
index 4e7172e..22e11c8 100755
--- a/firmware/target/arm/philips/hdd1630/power-hdd1630.c
+++ b/firmware/target/arm/philips/hdd1630/power-hdd1630.c
@@ -39,6 +39,13 @@ void power_init(void)
/* charger inserted bit */
GPIOE_ENABLE |= 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)
@@ -77,3 +84,15 @@ void power_off(void)
GPIOB_OUTPUT_VAL &= ~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