summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-03-31 21:57:53 +0200
committerMarcin Bukat <marcin.bukat@gmail.com>2013-04-11 11:18:23 +0200
commita924df8d6ddfa4372ce6b49c312e1da1ffceb2ad (patch)
treec5d977120d5dc629d9778c4ee7ab84284458503e
parentf49e75053198cc24aff92e9045795e011fa25083 (diff)
downloadrockbox-a924df8d6ddfa4372ce6b49c312e1da1ffceb2ad.tar.gz
rockbox-a924df8d6ddfa4372ce6b49c312e1da1ffceb2ad.zip
rk27xx: implement radio support
Change-Id: I59d3905e9b2a3df8aa235e424c7a6e0eff6d73e9 Reviewed-on: http://gerrit.rockbox.org/427 Reviewed-by: Marcin Bukat <marcin.bukat@gmail.com> Tested-by: Marcin Bukat <marcin.bukat@gmail.com>
-rw-r--r--apps/keymaps/keymap-rk27xx-generic.c19
-rw-r--r--firmware/SOURCES2
-rw-r--r--firmware/drivers/audio/rk27xx_codec.c18
-rw-r--r--firmware/export/config/rk27generic.h4
-rw-r--r--firmware/target/arm/rk27xx/audio-rk27xx.c52
-rw-r--r--firmware/target/arm/rk27xx/rk27generic/fmradio-i2c-rk27generic.c39
-rw-r--r--firmware/target/arm/rk27xx/rk27generic/power-rk27generic.c6
7 files changed, 136 insertions, 4 deletions
diff --git a/apps/keymaps/keymap-rk27xx-generic.c b/apps/keymaps/keymap-rk27xx-generic.c
index a709df6156..7a4545b246 100644
--- a/apps/keymaps/keymap-rk27xx-generic.c
+++ b/apps/keymaps/keymap-rk27xx-generic.c
@@ -66,7 +66,21 @@ static const struct button_mapping button_context_wps[] = {
66 LAST_ITEM_IN_LIST 66 LAST_ITEM_IN_LIST
67}; /* button_context_wps */ 67}; /* button_context_wps */
68 68
69#ifdef CONFIG_TUNER
70static const struct button_mapping button_context_radio[] = {
71 { ACTION_FM_MENU, BUTTON_M|BUTTON_REPEAT, BUTTON_NONE },
72 { ACTION_FM_PLAY, BUTTON_PLAY|BUTTON_REL, BUTTON_PLAY },
73 { ACTION_FM_STOP, BUTTON_PLAY|BUTTON_REPEAT, BUTTON_NONE },
74 { ACTION_SETTINGS_INC, BUTTON_VOL|BUTTON_FF, BUTTON_NONE },
75 { ACTION_SETTINGS_INCREPEAT, BUTTON_VOL|BUTTON_FF|BUTTON_REPEAT, BUTTON_NONE },
76 { ACTION_SETTINGS_DEC, BUTTON_VOL|BUTTON_REW, BUTTON_NONE },
77 { ACTION_SETTINGS_DECREPEAT, BUTTON_VOL|BUTTON_REW|BUTTON_REPEAT,BUTTON_NONE },
69 78
79 { ACTION_FM_EXIT, BUTTON_M|BUTTON_REL, BUTTON_M },
80
81 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS)
82}; /* button_context_radio */
83#endif
70 84
71/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */ 85/* get_context_mapping returns a pointer to one of the above defined arrays depending on the context */
72const struct button_mapping* get_context_mapping(int context) 86const struct button_mapping* get_context_mapping(int context)
@@ -77,7 +91,10 @@ const struct button_mapping* get_context_mapping(int context)
77 return button_context_standard; 91 return button_context_standard;
78 case CONTEXT_WPS: 92 case CONTEXT_WPS:
79 return button_context_wps; 93 return button_context_wps;
80 94#ifdef CONFIG_TUNER
95 case CONTEXT_FM:
96 return button_context_radio;
97#endif
81 case CONTEXT_TREE: 98 case CONTEXT_TREE:
82 case CONTEXT_LIST: 99 case CONTEXT_LIST:
83 case CONTEXT_MAINMENU: 100 case CONTEXT_MAINMENU:
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 8ba45af533..92b2f5f87b 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -1509,6 +1509,7 @@ target/arm/s5l8702/ipod6g/piezo-ipod6g.c
1509#endif 1509#endif
1510 1510
1511#if CONFIG_CPU == RK27XX 1511#if CONFIG_CPU == RK27XX
1512target/arm/rk27xx/audio-rk27xx.c
1512target/arm/rk27xx/kernel-rk27xx.c 1513target/arm/rk27xx/kernel-rk27xx.c
1513target/arm/rk27xx/system-rk27xx.c 1514target/arm/rk27xx/system-rk27xx.c
1514target/arm/rk27xx/backlight-rk27xx.c 1515target/arm/rk27xx/backlight-rk27xx.c
@@ -1532,6 +1533,7 @@ target/arm/rk27xx/rk27generic/button-rk27generic.c
1532target/arm/rk27xx/rk27generic/powermgmt-rk27generic.c 1533target/arm/rk27xx/rk27generic/powermgmt-rk27generic.c
1533target/arm/rk27xx/rk27generic/power-rk27generic.c 1534target/arm/rk27xx/rk27generic/power-rk27generic.c
1534target/arm/rk27xx/rk27generic/lcd-rk27generic.c 1535target/arm/rk27xx/rk27generic/lcd-rk27generic.c
1536target/arm/rk27xx/rk27generic/fmradio-i2c-rk27generic.c
1535#endif 1537#endif
1536 1538
1537#if CONFIG_CPU == JZ4732 1539#if CONFIG_CPU == JZ4732
diff --git a/firmware/drivers/audio/rk27xx_codec.c b/firmware/drivers/audio/rk27xx_codec.c
index cfb98a9227..462565e8aa 100644
--- a/firmware/drivers/audio/rk27xx_codec.c
+++ b/firmware/drivers/audio/rk27xx_codec.c
@@ -55,12 +55,14 @@ static int codec_read(uint8_t reg, uint8_t *val)
55} 55}
56#endif 56#endif
57 57
58static uint8_t cr1_sel = DACSEL;
59
58static void audiohw_mute(bool mute) 60static void audiohw_mute(bool mute)
59{ 61{
60 if (mute) 62 if (mute)
61 codec_write(CR1, SB_MICBIAS|DAC_MUTE|DACSEL); 63 codec_write(CR1, SB_MICBIAS|DAC_MUTE|cr1_sel);
62 else 64 else
63 codec_write(CR1, SB_MICBIAS|DACSEL); 65 codec_write(CR1, SB_MICBIAS|cr1_sel);
64} 66}
65 67
66/* public functions */ 68/* public functions */
@@ -109,7 +111,7 @@ void audiohw_postinit(void)
109 udelay(1000); 111 udelay(1000);
110 112
111 /* power up output stage */ 113 /* power up output stage */
112 codec_write(PMR1, SB_ADC|SB_IN1|SB_IN2|SB_MIC|SB_IND); 114 codec_write(PMR1, SB_ADC|SB_MIC|SB_IND);
113 115
114 sleep(HZ/10); 116 sleep(HZ/10);
115 GPIO_PDDR |= (1<<7); /* PD7 high */ 117 GPIO_PDDR |= (1<<7); /* PD7 high */
@@ -159,5 +161,15 @@ void audiohw_set_master_vol(int vol_l, int vol_r)
159 161
160 codec_write(CGR9, vol_r); 162 codec_write(CGR9, vol_r);
161 codec_write(CGR8, vol_l); 163 codec_write(CGR8, vol_l);
164 codec_write(CGR5, vol_r);
165 codec_write(CGR4, vol_l);
166 codec_write(CGR3, vol_r);
167 codec_write(CGR2, vol_l);
162 } 168 }
163} 169}
170
171void audiohw_set_monitor(bool enable)
172{
173 cr1_sel = enable ? BYPASS1|BYPASS2 : DACSEL;
174 codec_write(CR1, cr1_sel|SB_MICBIAS);
175}
diff --git a/firmware/export/config/rk27generic.h b/firmware/export/config/rk27generic.h
index 10fbd451e4..9a4326358f 100644
--- a/firmware/export/config/rk27generic.h
+++ b/firmware/export/config/rk27generic.h
@@ -13,6 +13,7 @@
13/* Define bitmask of input sources - recordable bitmask can be defined 13/* Define bitmask of input sources - recordable bitmask can be defined
14 explicitly if different */ 14 explicitly if different */
15/* #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FM) */ 15/* #define INPUT_SRC_CAPS (SRC_CAP_MIC | SRC_CAP_FM) */
16#define INPUT_SRC_CAPS SRC_CAP_FMRADIO
16 17
17/* define the bitmask of hardware sample rates */ 18/* define the bitmask of hardware sample rates */
18#define HW_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11 \ 19#define HW_SAMPR_CAPS (SAMPR_CAP_44 | SAMPR_CAP_22 | SAMPR_CAP_11 \
@@ -106,6 +107,9 @@
106/* Define the type of audio codec */ 107/* Define the type of audio codec */
107#define HAVE_RK27XX_CODEC 108#define HAVE_RK27XX_CODEC
108 109
110#define CONFIG_TUNER TEA5767
111#define CONFIG_TUNER_XTAL 32768
112
109/* #define HAVE_PCM_DMA_ADDRESS */ 113/* #define HAVE_PCM_DMA_ADDRESS */
110 114
111/* Define this for LCD backlight available */ 115/* Define this for LCD backlight available */
diff --git a/firmware/target/arm/rk27xx/audio-rk27xx.c b/firmware/target/arm/rk27xx/audio-rk27xx.c
new file mode 100644
index 0000000000..76be4a907a
--- /dev/null
+++ b/firmware/target/arm/rk27xx/audio-rk27xx.c
@@ -0,0 +1,52 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2013 by Amaury Pouly
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#include "system.h"
23#include "audiohw.h"
24#include "audio.h"
25
26static int input_source = AUDIO_SRC_PLAYBACK;
27static unsigned input_flags = 0;
28static int output_source = AUDIO_SRC_PLAYBACK;
29
30static void select_audio_path(void)
31{
32 if(input_source == AUDIO_SRC_PLAYBACK)
33 audiohw_set_monitor(false);
34 else
35 audiohw_set_monitor(true);
36}
37
38void audio_input_mux(int source, unsigned flags)
39{
40 (void) source;
41 (void) flags;
42 input_source = source;
43 input_flags = flags;
44 select_audio_path();
45}
46
47void audio_set_output_source(int source)
48{
49 (void) source;
50 output_source = source;
51 select_audio_path();
52}
diff --git a/firmware/target/arm/rk27xx/rk27generic/fmradio-i2c-rk27generic.c b/firmware/target/arm/rk27xx/rk27generic/fmradio-i2c-rk27generic.c
new file mode 100644
index 0000000000..4ab171cd5a
--- /dev/null
+++ b/firmware/target/arm/rk27xx/rk27generic/fmradio-i2c-rk27generic.c
@@ -0,0 +1,39 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2013 by Amaury Pouly
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
22#include "config.h"
23#include "system.h"
24#include "fmradio_i2c.h"
25#include "i2c-rk27xx.h"
26
27void fmradio_i2c_init(void)
28{
29}
30
31int fmradio_i2c_write(unsigned char address, const unsigned char* buf, int count)
32{
33 return i2c_write(address, -1, count, buf);
34}
35
36int fmradio_i2c_read(unsigned char address, unsigned char* buf, int count)
37{
38 return i2c_read(address, -1, count, buf);
39}
diff --git a/firmware/target/arm/rk27xx/rk27generic/power-rk27generic.c b/firmware/target/arm/rk27xx/rk27generic/power-rk27generic.c
index 68594d0f0e..d3feb41597 100644
--- a/firmware/target/arm/rk27xx/rk27generic/power-rk27generic.c
+++ b/firmware/target/arm/rk27xx/rk27generic/power-rk27generic.c
@@ -38,6 +38,12 @@ void power_init(void)
38 GPIO_PCCON |= (1<<0); 38 GPIO_PCCON |= (1<<0);
39} 39}
40 40
41bool tuner_power(bool status)
42{
43 (void) status;
44 return true;
45}
46
41unsigned int power_input_status(void) 47unsigned int power_input_status(void)
42{ 48{
43 return (usb_detect() == USB_INSERTED) ? POWER_INPUT_MAIN_CHARGER : POWER_INPUT_NONE; 49 return (usb_detect() == USB_INSERTED) ? POWER_INPUT_MAIN_CHARGER : POWER_INPUT_NONE;