summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2007-04-14 00:49:35 +0000
committerChristian Gmeiner <christian.gmeiner@gmail.com>2007-04-14 00:49:35 +0000
commitca6f4abcf17a84d52646a8a6b305ab1011efe6d0 (patch)
tree5c349f157024d96f38ede356bcd39bf9796154cd /firmware
parent17c93f9be0e2a322d8f42410f98629fb5e161742 (diff)
* make it louder - inspired by FS #6911
* disable some unneeded stuff -> save power * remove some unneeded functions * shadow registers, so we dont need to do so much i2c traffic git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13150 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/drivers/as3514.c110
-rw-r--r--firmware/export/as3514.h5
2 files changed, 63 insertions, 52 deletions
diff --git a/firmware/drivers/as3514.c b/firmware/drivers/as3514.c
index f7eb0bd0ec..672087dbd0 100644
--- a/firmware/drivers/as3514.c
+++ b/firmware/drivers/as3514.c
@@ -10,6 +10,7 @@
* Driver for AS3514 audio codec
*
* Copyright (c) 2007 Daniel Ankers
+ * Copyright (c) 2007 Christian Gmeiner
*
* 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.
@@ -32,11 +33,29 @@
#include "buffer.h"
#include "audio.h"
#include "backlight.h"
+#include "logf.h"
#include "as3514.h"
#include "i2s.h"
#include "i2c-pp.h"
+/* Shadow registers */
+int as3514_regs[0x1D];
+
+/*
+ * little helper method to set register values.
+ * With the help of as3514_regs, we minimize i2c
+ * traffic.
+ */
+static void as3514_write(int reg, int value)
+{
+ if (pp_i2c_send(AS3514_I2C_ADDR, reg, value) != 2)
+ {
+ DEBUGF("as3514 error reg=0x%x", reg);
+ }
+ as3514_regs[reg] = value;
+}
+
/* convert tenth of dB volume to master volume register value */
int tenthdb2master(int db)
{
@@ -73,7 +92,10 @@ void audiohw_reset(void);
/*
* Initialise the PP I2C and I2S.
*/
-int audiohw_init(void) {
+int audiohw_init(void)
+{
+ unsigned int i;
+
/* reset I2C */
i2c_init();
@@ -100,11 +122,18 @@ int audiohw_init(void) {
i2s_reset();
/* Set ADC off, mixer on, DAC on, line out off, line in off, mic off */
- pp_i2c_send(AS3514_I2C_ADDR, AUDIOSET1, 0x60); /* Turn on DAC and mixer */
- pp_i2c_send(AS3514_I2C_ADDR, PLLMODE, 0x04);
- pp_i2c_send(AS3514_I2C_ADDR, DAC_L, 0x50); /* DAC mute off, -16.5dB gain */
- pp_i2c_send(AS3514_I2C_ADDR, DAC_R, 0x10); /* DAC -16.5dB gain to prevent overloading
- the headphone amp */
+ as3514_write(AUDIOSET1, 0x60); /* Turn on DAC and mixer */
+ as3514_write(AUDIOSET3, 0x5); /* Set HPCM off, ZCU off*/
+ as3514_write(HPH_OUT_R, 0xc0 | 0x16); /* set vol and set speaker over-current to 0 */
+ as3514_write(HPH_OUT_L, 0x40 | 0x16); /* set default vol for headphone */
+ as3514_write(PLLMODE, 0x04);
+
+ /* read all reg values */
+ for (i = 0; i < sizeof(as3514_regs); i++)
+ {
+ as3514_regs[i] = i2c_readbyte(AS3514_I2C_ADDR, i);
+ }
+
return 0;
}
@@ -120,11 +149,11 @@ void audiohw_enable_output(bool enable)
/* reset the I2S controller into known state */
i2s_reset();
- pp_i2c_send(AS3514_I2C_ADDR, HPH_OUT_L, 0xc0); /* Mute on, power on */
+ as3514_write(HPH_OUT_L, 0xc0); /* Mute off, power on */
audiohw_mute(0);
} else {
audiohw_mute(1);
- pp_i2c_send(AS3514_I2C_ADDR, HPH_OUT_L, 0x80); /* Mute on, power off */
+ as3514_write(HPH_OUT_L, 0x80); /* Mute on, power off */
}
}
@@ -132,16 +161,22 @@ int audiohw_set_master_vol(int vol_l, int vol_r)
{
vol_l &= 0x1f;
vol_r &= 0x1f;
- pp_i2c_send(AS3514_I2C_ADDR, HPH_OUT_R, vol_r);
- pp_i2c_send(AS3514_I2C_ADDR, HPH_OUT_L, 0x40 | vol_l);
+
+ /* we are controling dac volume instead of headphone volume,
+ as the volume is bigger.
+ HDP: 1.07 dB gain
+ DAC: 6 dB gain
+ */
+ as3514_write(DAC_R, vol_r);
+ as3514_write(DAC_L, 0x40 | vol_l);
return 0;
}
int audiohw_set_lineout_vol(int vol_l, int vol_r)
{
- pp_i2c_send(AS3514_I2C_ADDR, LINE_OUT_R, vol_r);
- pp_i2c_send(AS3514_I2C_ADDR, LINE_OUT_L, 0x40 | vol_l);
+ as3514_write(LINE_OUT_R, vol_r);
+ as3514_write(LINE_OUT_L, 0x40 | vol_l);
return 0;
}
@@ -154,27 +189,16 @@ int audiohw_set_mixer_vol(int channel1, int channel2)
return 0;
}
-/* We are using Linear bass control */
-void audiohw_set_bass(int value)
-{
- (void)value;
-}
-
-void audiohw_set_treble(int value)
-{
- (void)value;
-}
-
int audiohw_mute(int mute)
{
int curr;
- curr = i2c_readbyte(AS3514_I2C_ADDR, HPH_OUT_L);
+ curr = as3514_regs[HPH_OUT_L];
if (mute)
{
- pp_i2c_send(AS3514_I2C_ADDR, HPH_OUT_L, curr | 0x80);
+ as3514_write(HPH_OUT_L, curr | 0x80);
} else {
- pp_i2c_send(AS3514_I2C_ADDR, HPH_OUT_L, curr & ~(0x80));
+ as3514_write(HPH_OUT_L, curr & ~(0x80));
}
return 0;
@@ -183,47 +207,39 @@ int audiohw_mute(int mute)
/* Nice shutdown of WM8758 codec */
void audiohw_close(void)
{
+ /* mute headphones */
audiohw_mute(1);
-}
-/* Change the order of the noise shaper, 5th order is recommended above 32kHz */
-void audiohw_set_nsorder(int order)
-{
- (void)order;
+ /* mute mixer */
+ as3514_write(AUDIOSET1, 0x0);
+
+ /* turn off everything */
+ as3514_write(AUDIOSET1, 0x0);
}
void audiohw_set_sample_rate(int sampling_control)
{
(void)sampling_control;
- /* TODO: Implement this by adjusting the I2S Master clock */
}
void audiohw_enable_recording(bool source_mic)
{
(void)source_mic;
- /* TODO */
}
-void audiohw_disable_recording(void) {
- /* TODO */
+void audiohw_disable_recording(void)
+{
+ int curr;
}
-void audiohw_set_recvol(int left, int right, int type) {
-
+void audiohw_set_recvol(int left, int right, int type)
+{
(void)left;
(void)right;
(void)type;
}
-void audiohw_set_monitor(int enable) {
-
- (void)enable;
-}
-
-void audiohw_set_equalizer_band(int band, int freq, int bw, int gain)
+void audiohw_set_monitor(int enable)
{
- (void)band;
- (void)freq;
- (void)bw;
- (void)gain;
+ (void)enable;
}
diff --git a/firmware/export/as3514.h b/firmware/export/as3514.h
index 3261765f7f..260dbe096e 100644
--- a/firmware/export/as3514.h
+++ b/firmware/export/as3514.h
@@ -31,11 +31,8 @@ extern void audiohw_enable_output(bool enable);
extern int audiohw_set_master_vol(int vol_l, int vol_r);
extern int audiohw_set_lineout_vol(int vol_l, int vol_r);
extern int audiohw_set_mixer_vol(int channel1, int channel2);
-extern void audiohw_set_bass(int value);
-extern void audiohw_set_treble(int value);
extern int audiohw_mute(int mute);
extern void audiohw_close(void);
-extern void audiohw_set_nsorder(int order);
extern void audiohw_set_sample_rate(int sampling_control);
extern void audiohw_enable_recording(bool source_mic);
@@ -43,8 +40,6 @@ extern void audiohw_disable_recording(void);
extern void audiohw_set_recvol(int left, int right, int type);
extern void audiohw_set_monitor(int enable);
-extern void audiohw_set_equalizer_band(int band, int freq, int bw, int gain);
-
/* Register Descriptions */
#define LINE_OUT_R 0x00
#define LINE_OUT_L 0x01