summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
authorAndrew Ryabinin <ryabinin.a.a@gmail.com>2013-04-15 09:51:22 +0400
committerAndrew Ryabinin <ryabinin.a.a@gmail.com>2013-05-06 14:09:24 +0400
commitfa4e1baa83a5f3f28f98b5b744b7692be9fb4fca (patch)
treedbb558d0e36b25031131d0c1e62f8c1ff8238470 /firmware/drivers
parent3fd25dcbed6ef964b828698facf6cc15189441ca (diff)
downloadrockbox-fa4e1baa83a5f3f28f98b5b744b7692be9fb4fca.zip
rockbox-fa4e1baa83a5f3f28f98b5b744b7692be9fb4fca.tar.gz
rockbox-fa4e1baa83a5f3f28f98b5b744b7692be9fb4fca.tar.bz2
rockbox-fa4e1baa83a5f3f28f98b5b744b7692be9fb4fca.tar.xz
Introduce HiFi E.T MA9 port.
Change-Id: I79aadc958fd5222f26f91ed127f8c6fb2c465dc2
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/audio/df1704.c115
-rw-r--r--firmware/drivers/pca9555.c64
2 files changed, 179 insertions, 0 deletions
diff --git a/firmware/drivers/audio/df1704.c b/firmware/drivers/audio/df1704.c
new file mode 100644
index 0000000..b0b9d7b
--- /dev/null
+++ b/firmware/drivers/audio/df1704.c
@@ -0,0 +1,115 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2013 Andrew Ryabinin
+ *
+ * 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 "system.h"
+#include "df1704.h"
+#include "config.h"
+#include "audio.h"
+#include "audiohw.h"
+
+static void df1704_write_reg(const int reg, const unsigned int value)
+{
+ int i;
+
+ df1704_set_ml_dir(0);
+ df1704_set_ml(1);
+ df1704_set_md(1);
+ df1704_set_mc(1);
+
+ for (i = (1<<15); i; i >>= 1) {
+ udelay(40);
+ df1704_set_mc(0);
+
+ if ((reg|value) & i) {
+ df1704_set_md(1);
+ } else {
+ df1704_set_md(0);
+ }
+
+ udelay(40);
+ df1704_set_mc(1);
+ }
+
+ df1704_set_ml(0);
+ udelay(130);
+ df1704_set_ml(1);
+ udelay(130);
+ df1704_set_ml_dir(1);
+}
+
+static int vol_tenthdb2hw(const int tdb)
+{
+ if (tdb < DF1704_VOLUME_MIN) {
+ return 0;
+ } else if (tdb > DF1704_VOLUME_MAX) {
+ return 0xff;
+ } else {
+ return (tdb/5+0xff);
+ }
+}
+
+
+void df1704_init(void)
+{
+ df1704_write_reg(DF1704_MODE(2),
+ DF1704_OW_24 |
+ DF1704_IW_16_I2S |
+ DF1704_DEM_OFF |
+ DF1704_MUTE_OFF);
+ df1704_write_reg(DF1704_MODE(3),
+ DF1704_CKO_HALF |
+ DF1704_SRO_SHARP|
+ DF1704_LRP_H |
+ DF1704_I2S_ON);
+}
+
+void df1704_mute(void)
+{
+ df1704_write_reg(DF1704_MODE(2),
+ DF1704_OW_24 |
+ DF1704_IW_16_I2S |
+ DF1704_DEM_OFF |
+ DF1704_MUTE_ON);
+}
+
+void df1704_unmute(void)
+{
+ df1704_write_reg(DF1704_MODE(2),
+ DF1704_OW_24 |
+ DF1704_IW_16_I2S |
+ DF1704_DEM_OFF |
+ DF1704_MUTE_OFF);
+}
+
+void audiohw_preinit(void)
+{
+}
+
+void audiohw_set_frequency(int fsel)
+{
+ (void)fsel;
+}
+
+void audiohw_set_volume(int vol_l, int vol_r)
+{
+ df1704_write_reg(DF1704_MODE(0), DF1704_LDL_ON|vol_tenthdb2hw(vol_l));
+ df1704_write_reg(DF1704_MODE(1), DF1704_LDR_ON|vol_tenthdb2hw(vol_r));
+}
diff --git a/firmware/drivers/pca9555.c b/firmware/drivers/pca9555.c
new file mode 100644
index 0000000..78326f3
--- /dev/null
+++ b/firmware/drivers/pca9555.c
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2013 Andrew Ryabinin
+ *
+ * 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 "i2c-rk27xx.h"
+#include "pca9555.h"
+#include "system.h"
+
+static unsigned short pca9555_out_ports;
+static unsigned short pca9555_config = 0xffff;
+
+unsigned short pca9555_read_input(void)
+{
+ unsigned short ret;
+ i2c_read(PCA9555_I2C_ADDR, PCA9555_IN_CMD, sizeof(ret), (void*)&ret);
+ return letoh16(ret);
+}
+
+unsigned short pca9555_read_output(void)
+{
+ return pca9555_out_ports;
+}
+
+unsigned short pca9555_read_config(void)
+{
+ return pca9555_config;
+}
+
+void pca9555_write_output(const unsigned short data, const unsigned short mask)
+{
+ unsigned short le_data = htole16((data&mask) | (pca9555_out_ports&~(mask)));
+ i2c_write(PCA9555_I2C_ADDR, PCA9555_OUT_CMD, sizeof(le_data), (void*)&le_data);
+ pca9555_out_ports = letoh16(le_data);
+}
+
+void pca9555_write_config(const unsigned short data, const unsigned short mask)
+{
+ unsigned short le_data = htole16((data&mask) | (pca9555_config&~(mask)));
+ i2c_write(PCA9555_I2C_ADDR, PCA9555_CFG_CMD, sizeof(le_data), (void*)&le_data);
+ pca9555_config = letoh16(le_data);
+}
+
+
+void pca9555_init(void)
+{
+ pca9555_target_init();
+}