summaryrefslogtreecommitdiffstats
path: root/firmware/target/coldfire/iriver/h100
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2006-11-13 23:21:54 +0000
committerMichael Sevakis <jethead71@rockbox.org>2006-11-13 23:21:54 +0000
commitcc50c149e9452e7c8ea199fd72f7458ead96bad7 (patch)
tree78efc4e2c391f0cfcab8fe76777dab63070e64d9 /firmware/target/coldfire/iriver/h100
parentda55588fc7e0134decd4ba8cc573f507302a5664 (diff)
downloadrockbox-cc50c149e9452e7c8ea199fd72f7458ead96bad7.tar.gz
rockbox-cc50c149e9452e7c8ea199fd72f7458ead96bad7.zip
H100/General: HAL for S/PDIF and refinement/bufixes in optical output powering/source selection.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@11523 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/coldfire/iriver/h100')
-rw-r--r--firmware/target/coldfire/iriver/h100/power-h100.c25
-rw-r--r--firmware/target/coldfire/iriver/h100/spdif-h100.c83
2 files changed, 105 insertions, 3 deletions
diff --git a/firmware/target/coldfire/iriver/h100/power-h100.c b/firmware/target/coldfire/iriver/h100/power-h100.c
index 0714ab2d3f..9effeef7c8 100644
--- a/firmware/target/coldfire/iriver/h100/power-h100.c
+++ b/firmware/target/coldfire/iriver/h100/power-h100.c
@@ -22,6 +22,7 @@
#include "kernel.h"
#include "system.h"
#include "power.h"
+#include "spdif.h"
#ifdef CONFIG_TUNER
@@ -85,8 +86,23 @@ void spdif_power_enable(bool on)
and_l(~0x01000000, &GPIO1_OUT);
else
or_l(0x01000000, &GPIO1_OUT);
-}
+
+#ifndef BOOTLOADER
+ /* Make sure the feed is reset */
+ spdif_set_output_source(spdif_get_output_source(NULL), true);
#endif
+}
+
+bool spdif_powered(void)
+{
+ bool state = (GPIO1_READ & 0x01000000)?false:true;
+#ifdef SPDIF_POWER_INVERTED
+ return !state;
+#else
+ return state;
+#endif /* SPDIF_POWER_INVERTED */
+}
+#endif /* HAVE_SPDIF_POWER */
void ide_power_enable(bool on)
{
@@ -96,13 +112,11 @@ void ide_power_enable(bool on)
or_l(0x80000000, &GPIO_OUT);
}
-
bool ide_powered(void)
{
return (GPIO_OUT & 0x80000000)?false:true;
}
-
void power_off(void)
{
set_irq_level(HIGHEST_IRQ_LEVEL);
@@ -138,6 +152,11 @@ void spdif_power_enable(bool on)
{
(void)on;
}
+
+bool spdif_powered(void)
+{
+ return false;
+}
#endif
#endif /* SIMULATOR */
diff --git a/firmware/target/coldfire/iriver/h100/spdif-h100.c b/firmware/target/coldfire/iriver/h100/spdif-h100.c
new file mode 100644
index 0000000000..20e5bc3c45
--- /dev/null
+++ b/firmware/target/coldfire/iriver/h100/spdif-h100.c
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2006 by Michal Sevakis
+ * Based on the work of Thom Johansen
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include <stdbool.h>
+#include "config.h"
+#include "cpu.h"
+#include "power.h"
+#include "system.h"
+#include "audio.h"
+#include "spdif.h"
+
+static int spdif_source = AUDIO_SRC_PLAYBACK;
+static int spdif_on = false;
+
+/* Initialize the S/PDIF driver */
+void spdif_init(void)
+{
+ /* PHASECONFIG setup: gain = 3*2^13, source = EBUIN */
+ PHASECONFIG = (6 << 3) | (4 << 0);
+ spdif_set_output_source(AUDIO_SRC_PLAYBACK, true);
+}
+
+/* Return the S/PDIF frequency in herz - unrounded */
+unsigned long spdif_measure_frequency(void)
+{
+ /* The following formula is specified in MCF5249 user's manual section
+ * 17.6.1. The 128 divide is because of the fact that the SPDIF clock is
+ * the sample rate times 128.
+ */
+ return (unsigned long)((unsigned long long)FREQMEAS*CPU_FREQ /
+ ((1 << 15)*3*(1 << 13))/128);
+} /* spdif_measure_frequency */
+
+/* Set the S/PDIF audio feed */
+void spdif_set_output_source(int source, bool src_on)
+{
+ static const unsigned short ebu1_config[] =
+ {
+ /* SCLK2, TXSRC = PDOR3, validity, normal operation */
+ [AUDIO_SRC_PLAYBACK+1] = (7 << 12) | (3 << 8) | (1 << 5) | (5 << 2),
+ /* Input source is EBUin1, Feed-through monitoring */
+ [AUDIO_SRC_SPDIF+1] = (1 << 2),
+ /* SCLK2, TXSRC = IIS1recv, validity, normal operation */
+ [AUDIO_SRC_MIC+1] = (7 << 12) | (4 << 8) | (1 << 5) | (5 << 2),
+ [AUDIO_SRC_LINEIN+1] = (7 << 12) | (4 << 8) | (1 << 5) | (5 << 2),
+ [AUDIO_SRC_FMRADIO+1] = (7 << 12) | (4 << 8) | (1 << 5) | (5 << 2),
+ };
+
+ if ((unsigned)source >= ARRAYLEN(ebu1_config))
+ source = AUDIO_SRC_PLAYBACK;
+
+ EBU1CONFIG = 0x800; /* Reset before reprogram */
+
+ spdif_source = source;
+ spdif_on = spdif_powered() && src_on;
+
+ /* Tranceiver must be powered or else monitoring will be disabled */
+ EBU1CONFIG = spdif_on ? ebu1_config[source + 1] : 0;
+} /* spdif_set_output_source */
+
+/* Return the last set S/PDIF audio source */
+int spdif_get_output_source(bool *src_on)
+{
+ if (src_on != NULL)
+ *src_on = spdif_on;
+ return spdif_source;
+} /* spdif_get_output_source */