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.tar.gz
rockbox-802b57ccd7676a9f619e93a4d326cf6f524f2079.zip
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 e4a74cba0e..6b38983d08 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[] = {
269 LAST_ITEM_IN_LIST 269 LAST_ITEM_IN_LIST
270}; /* button_context_keyboard */ 270}; /* button_context_keyboard */
271 271
272#if CONFIG_TUNER
273static const struct button_mapping button_context_radio[] = {
274 { ACTION_FM_MENU, BUTTON_MENU | BUTTON_REL, BUTTON_MENU },
275 { ACTION_FM_MODE, BUTTON_MENU | BUTTON_REPEAT, BUTTON_MENU },
276 { ACTION_FM_PRESET, BUTTON_VIEW, BUTTON_NONE },
277 { ACTION_FM_PLAY, BUTTON_SELECT | BUTTON_REL, BUTTON_SELECT },
278 { ACTION_FM_STOP, BUTTON_SELECT | BUTTON_REPEAT, BUTTON_SELECT },
279 { ACTION_FM_EXIT, BUTTON_POWER, BUTTON_NONE },
280
281 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS)
282};
283#endif
284
272const struct button_mapping* get_context_mapping(int context) 285const struct button_mapping* get_context_mapping(int context)
273{ 286{
274 switch (context) 287 switch (context)
@@ -312,6 +325,10 @@ const struct button_mapping* get_context_mapping(int context)
312 return button_context_pitchscreen; 325 return button_context_pitchscreen;
313 case CONTEXT_KEYBOARD: 326 case CONTEXT_KEYBOARD:
314 return button_context_keyboard; 327 return button_context_keyboard;
328#if CONFIG_TUNER
329 case CONTEXT_FM:
330 return button_context_radio;
331#endif
315 } 332 }
316 return button_context_standard; 333 return button_context_standard;
317} 334}
diff --git a/firmware/SOURCES b/firmware/SOURCES
index dd3569ac13..321a26721b 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -555,6 +555,7 @@ target/arm/i2s-pp.c
555target/arm/adc-pp5020.c 555target/arm/adc-pp5020.c
556target/arm/philips/hdd1630/backlight-hdd1630.c 556target/arm/philips/hdd1630/backlight-hdd1630.c
557target/arm/philips/hdd1630/button-hdd1630.c 557target/arm/philips/hdd1630/button-hdd1630.c
558target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
558target/arm/philips/hdd1630/lcd-hdd1630.c 559target/arm/philips/hdd1630/lcd-hdd1630.c
559target/arm/philips/hdd1630/power-hdd1630.c 560target/arm/philips/hdd1630/power-hdd1630.c
560target/arm/philips/hdd1630/powermgmt-hdd1630.c 561target/arm/philips/hdd1630/powermgmt-hdd1630.c
diff --git a/firmware/drivers/tuner/tea5767.c b/firmware/drivers/tuner/tea5767.c
index 2d18a0fdf7..09503455f3 100644
--- a/firmware/drivers/tuner/tea5767.c
+++ b/firmware/drivers/tuner/tea5767.c
@@ -28,7 +28,12 @@
28#include "fmradio.h" 28#include "fmradio.h"
29#include "fmradio_i2c.h" /* physical interface driver */ 29#include "fmradio_i2c.h" /* physical interface driver */
30 30
31#if defined(PHILIPS_HDD1630)
32#define I2C_ADR 0x60
33#else
31#define I2C_ADR 0xC0 34#define I2C_ADR 0xC0
35#endif
36
32static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; 37static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
33 38
34static void tea5767_set_clear(int byte, unsigned char bits, int set) 39static void tea5767_set_clear(int byte, unsigned char bits, int set)
@@ -87,7 +92,7 @@ int tea5767_set(int setting, int value)
87 tea5767_set_clear(4, (1<<6), rd->deemphasis); 92 tea5767_set_clear(4, (1<<6), rd->deemphasis);
88 tea5767_set_clear(3, (1<<5), rd->band); 93 tea5767_set_clear(3, (1<<5), rd->band);
89 break; 94 break;
90 } 95 }
91 case RADIO_FORCE_MONO: 96 case RADIO_FORCE_MONO:
92 tea5767_set_clear(2, 0x08, value); 97 tea5767_set_clear(2, 0x08, value);
93 break; 98 break;
diff --git a/firmware/export/config-hdd1630.h b/firmware/export/config-hdd1630.h
index 6aed356e11..605a0453ed 100755
--- a/firmware/export/config-hdd1630.h
+++ b/firmware/export/config-hdd1630.h
@@ -12,7 +12,7 @@
12#define CONFIG_STORAGE STORAGE_ATA 12#define CONFIG_STORAGE STORAGE_ATA
13 13
14/* define this if you have recording possibility */ 14/* define this if you have recording possibility */
15/* #define HAVE_RECORDING */ 15#define HAVE_RECORDING
16 16
17/* Define bitmask of input sources - recordable bitmask can be defined 17/* Define bitmask of input sources - recordable bitmask can be defined
18 explicitly if different */ 18 explicitly if different */
@@ -99,8 +99,8 @@
99/* TODO: #define AB_REPEAT_ENABLE 1 */ 99/* TODO: #define AB_REPEAT_ENABLE 1 */
100 100
101/* FM Tuner */ 101/* FM Tuner */
102/* #define CONFIG_TUNER TEA5767 */ 102#define CONFIG_TUNER TEA5767
103/* #define CONFIG_TUNER_XTAL 32768 */ 103#define CONFIG_TUNER_XTAL 32768
104 104
105/* define this if you have a disk storage, i.e. something 105/* define this if you have a disk storage, i.e. something
106 that needs spinups and can cause skips when shaked */ 106 that needs spinups and can cause skips when shaked */
diff --git a/firmware/export/i2c-pp.h b/firmware/export/i2c-pp.h
index d5eff90c43..230b6bbdc9 100644
--- a/firmware/export/i2c-pp.h
+++ b/firmware/export/i2c-pp.h
@@ -56,5 +56,6 @@ void i2c_init(void);
56int i2c_readbyte(unsigned int dev_addr, int addr); 56int i2c_readbyte(unsigned int dev_addr, int addr);
57int pp_i2c_send(unsigned int addr, int data0, int data1); 57int pp_i2c_send(unsigned int addr, int data0, int data1);
58int i2c_readbytes(unsigned int dev_addr, int addr, int len, unsigned char *data); 58int i2c_readbytes(unsigned int dev_addr, int addr, int len, unsigned char *data);
59int i2c_sendbytes(unsigned int dev_addr, int len, const unsigned char *data);
59 60
60#endif 61#endif
diff --git a/firmware/target/arm/i2c-pp.c b/firmware/target/arm/i2c-pp.c
index 175e2effd1..44713407df 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)
196 return (int)data; 196 return (int)data;
197} 197}
198 198
199int i2c_sendbytes(unsigned int addr, int len, const unsigned char *data)
200{
201 int i, n;
202
203 mutex_lock(&i2c_mtx);
204
205 i = 0;
206 while (len > 0)
207 {
208 n = (len < 4) ? len : 4;
209
210 if (pp_i2c_send_bytes(addr, n, (unsigned char *)(data + i)) < 0)
211 break;
212
213 len -= n;
214 i += n;
215 }
216
217 mutex_unlock(&i2c_mtx);
218
219 return i;
220}
221
199int pp_i2c_send(unsigned int addr, int data0, int data1) 222int pp_i2c_send(unsigned int addr, int data0, int data1)
200{ 223{
201 int retval; 224 int retval;
@@ -234,7 +257,14 @@ void i2c_init(void)
234 257
235#if CONFIG_I2C == I2C_PP5020 258#if CONFIG_I2C == I2C_PP5020
236 outl(0x0, 0x600060a4); 259 outl(0x0, 0x600060a4);
260#if defined(PHILIPS_HDD1630)
261 outl(inl(0x600060a4) | 0x20, 0x600060a4);
262 outl(inl(0x7000c020) | 0x3, 0x7000c020);
263 outl(0x55, 0x7000c02c);
264 outl(0x54, 0x7000c030);
265#else
237 outl(0x80 | (0 << 8), 0x600060a4); 266 outl(0x80 | (0 << 8), 0x600060a4);
267#endif
238#elif CONFIG_I2C == I2C_PP5024 268#elif CONFIG_I2C == I2C_PP5024
239#if defined(SANSA_E200) || defined(PHILIPS_SA9200) 269#if defined(SANSA_E200) || defined(PHILIPS_SA9200)
240 /* Sansa OF sets this to 0x20 first, communicates with the AS3514 270 /* 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 0000000000..c27ba5d462
--- /dev/null
+++ b/firmware/target/arm/philips/hdd1630/fmradio_i2c-hdd1630.c
@@ -0,0 +1,44 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id:$
9 *
10 * Copyright (C) 2009 by Mark Arigo
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "config.h"
22
23#if (CONFIG_TUNER & TEA5767)
24#include "i2c-pp.h"
25#include "fmradio_i2c.h"
26
27/* The TEA5767 uses 5 bytes, but the pp-i2c will only read/write 4 bytes
28 at a time. The tuner doesn't like it when the i2c resets to send the 5th
29 byte. So, we can only read/write the first 4 bytes. Luckily, on read,
30 the 5th byte is reserved and on write we only use that for the deemphasis
31 bit (which we'll have to ignore). This is what the OF appears to do too. */
32
33int fmradio_i2c_write(unsigned char address, const unsigned char* buf, int count)
34{
35 (void)count;
36 return i2c_sendbytes(address, 4, buf);
37}
38
39int fmradio_i2c_read(unsigned char address, unsigned char* buf, int count)
40{
41 (void)count;
42 return i2c_readbytes(address, -1, 4, buf);
43}
44#endif
diff --git a/firmware/target/arm/philips/hdd1630/power-hdd1630.c b/firmware/target/arm/philips/hdd1630/power-hdd1630.c
index 4e7172ef6f..22e11c803a 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)
39 /* charger inserted bit */ 39 /* charger inserted bit */
40 GPIOE_ENABLE |= 0x20; 40 GPIOE_ENABLE |= 0x20;
41 GPIOE_INPUT_VAL |= 0x20; 41 GPIOE_INPUT_VAL |= 0x20;
42
43#if CONFIG_TUNER
44 /* fm antenna? */
45 GPIOE_ENABLE |= 0x40;
46 GPIOE_OUTPUT_EN |= 0x40;
47 GPIOE_OUTPUT_VAL &= ~0x40; /* off */
48#endif
42} 49}
43 50
44unsigned int power_input_status(void) 51unsigned int power_input_status(void)
@@ -77,3 +84,15 @@ void power_off(void)
77 GPIOB_OUTPUT_VAL &= ~0x80; 84 GPIOB_OUTPUT_VAL &= ~0x80;
78 GPIOB_OUTPUT_EN |= 0x80; 85 GPIOB_OUTPUT_EN |= 0x80;
79} 86}
87
88#if CONFIG_TUNER
89bool tuner_power(bool status)
90{
91 if (status)
92 GPIOE_OUTPUT_VAL |= 0x40;
93 else
94 GPIOE_OUTPUT_VAL &= ~0x40;
95
96 return status;
97}
98#endif