diff options
| author | Andrew Ryabinin <ryabinin.a.a@gmail.com> | 2013-04-15 09:51:22 +0400 |
|---|---|---|
| committer | Andrew Ryabinin <ryabinin.a.a@gmail.com> | 2013-05-06 14:09:24 +0400 |
| commit | fa4e1baa83a5f3f28f98b5b744b7692be9fb4fca (patch) | |
| tree | dbb558d0e36b25031131d0c1e62f8c1ff8238470 /firmware/drivers | |
| parent | 3fd25dcbed6ef964b828698facf6cc15189441ca (diff) | |
| download | rockbox-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.c | 115 | ||||
| -rw-r--r-- | firmware/drivers/pca9555.c | 64 |
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(); +} |