Advertising
- Miscellany
- Wednesday, August 30th, 2006 at 10:14:43am MDT
- Index: firmware/SOURCES
- ===================================================================
- RCS file: /cvsroot/rockbox/firmware/SOURCES,v
- retrieving revision 1.108
- diff -u -r1.108 SOURCES
- --- firmware/SOURCES 30 Aug 2006 08:22:29 -0000 1.108
- +++ firmware/SOURCES 30 Aug 2006 16:02:08 -0000
- @@ -201,10 +201,13 @@
- drivers/uda1380.c
- #elif defined(HAVE_WM8975) && !defined(SIMULATOR)
- drivers/wm8975.c
- +drivers/wmcodec-pp.c
- #elif defined(HAVE_WM8758) && !defined(SIMULATOR)
- drivers/wm8758.c
- +drivers/wmcodec-pp.c
- #elif (defined(HAVE_WM8731) || defined(HAVE_WM8721)) && !defined(SIMULATOR)
- drivers/wm8731l.c
- +drivers/wmcodec-pp.c
- #elif defined(HAVE_TLV320) && !defined(SIMULATOR)
- drivers/tlv320.c
- #endif
- Index: firmware/drivers/wm8731l.c
- ===================================================================
- RCS file: /cvsroot/rockbox/firmware/drivers/wm8731l.c,v
- retrieving revision 1.6
- diff -u -r1.6 wm8731l.c
- --- firmware/drivers/wm8731l.c 30 Aug 2006 00:35:46 -0000 1.6
- +++ firmware/drivers/wm8731l.c 30 Aug 2006 16:02:08 -0000
- @@ -39,32 +39,19 @@
- #include "i2c-pp5002.h"
- #include "wm8731l.h"
- -#include "pcf50605.h"
- #define IPOD_PCM_LEVEL 0x65 /* -6dB */
- -void wm8731_write(int reg, int data)
- -{
- -/* Todo: Since the ipod_i2c_* functions also work on H10 and possibly other PP
- - targets, these functions should probably be renamed */
- -#if defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
- - /* The H10's audio codec uses an I2C address of 0x1b */
- - ipod_i2c_send(0x1b, (reg<<1) | ((data&0x100)>>8),data&0xff);
- -#else
- - /* The iPod's audio codecs use an I2C address of 0x1a */
- - ipod_i2c_send(0x1a, (reg<<1) | ((data&0x100)>>8),data&0xff);
- -#endif
- -}
- int wmcodec_mute(int mute)
- {
- if (mute)
- {
- /* Set DACMU = 1 to soft-mute the audio DACs. */
- - wm8731_write(DACCTRL, 0x8);
- + wmcodec_write(DACCTRL, 0x8);
- } else {
- /* Set DACMU = 0 to soft-un-mute the audio DACs. */
- - wm8731_write(DACCTRL, 0x0);
- + wmcodec_write(DACCTRL, 0x0);
- }
- return 0;
- @@ -75,110 +62,12 @@
- {
- /* set active to 0x0 or 0x1 */
- if (active) {
- - wm8731_write(ACTIVECTRL, 0x01);
- + wmcodec_write(ACTIVECTRL, 0x01);
- } else {
- - wm8731_write(ACTIVECTRL, 0x00);
- + wmcodec_write(ACTIVECTRL, 0x00);
- }
- }
- -/*
- - * Reset the I2S BIT.FORMAT I2S, 16bit, FIFO.FORMAT 32bit
- - */
- -static void i2s_reset(void)
- -{
- -#if CONFIG_CPU == PP5020
- - /* I2S soft reset */
- - outl(inl(0x70002800) | 0x80000000, 0x70002800);
- - outl(inl(0x70002800) & ~0x80000000, 0x70002800);
- -
- - /* BIT.FORMAT [11:10] = I2S (default) */
- - outl(inl(0x70002800) & ~0xc00, 0x70002800);
- - /* BIT.SIZE [9:8] = 16bit (default) */
- - outl(inl(0x70002800) & ~0x300, 0x70002800);
- -
- - /* FIFO.FORMAT [6:4] = 32 bit LSB */
- - /* since BIT.SIZ < FIFO.FORMAT low 16 bits will be 0 */
- - outl(inl(0x70002800) | 0x30, 0x70002800);
- -
- - /* RX_ATN_LVL=1 == when 12 slots full */
- - /* TX_ATN_LVL=1 == when 12 slots empty */
- - outl(inl(0x7000280c) | 0x33, 0x7000280c);
- -
- - /* Rx.CLR = 1, TX.CLR = 1 */
- - outl(inl(0x7000280c) | 0x1100, 0x7000280c);
- -#elif CONFIG_CPU == PP5002
- - /* I2S device reset */
- - outl(inl(0xcf005030) | 0x80, 0xcf005030);
- - outl(inl(0xcf005030) & ~0x80, 0xcf005030);
- -
- - /* I2S controller enable */
- - outl(inl(0xc0002500) | 0x1, 0xc0002500);
- -
- - /* BIT.FORMAT [11:10] = I2S (default) */
- - /* BIT.SIZE [9:8] = 24bit */
- - /* FIFO.FORMAT = 24 bit LSB */
- -
- - /* reset DAC and ADC fifo */
- - outl(inl(0xc000251c) | 0x30000, 0xc000251c);
- -#endif
- -}
- -
- -/*
- - * Initialise the WM8975 for playback via headphone and line out.
- - * Note, I'm using the WM8750 datasheet as its apparently close.
- - */
- -int wmcodec_init(void) {
- - /* reset I2C */
- - i2c_init();
- -
- -#if CONFIG_CPU == PP5020
- - /* normal outputs for CDI and I2S pin groups */
- - outl(inl(0x70000020) & ~0x300, 0x70000020);
- -
- - /*mini2?*/
- - outl(inl(0x70000010) & ~0x3000000, 0x70000010);
- - /*mini2?*/
- -
- - /* device reset */
- - outl(inl(0x60006004) | 0x800, 0x60006004);
- - outl(inl(0x60006004) & ~0x800, 0x60006004);
- -
- - /* device enable */
- - outl(inl(0x6000600C) | 0x807, 0x6000600C);
- -
- - /* enable external dev clock clocks */
- - outl(inl(0x6000600c) | 0x2, 0x6000600c);
- -
- - /* external dev clock to 24MHz */
- - outl(inl(0x70000018) & ~0xc, 0x70000018);
- -#else
- - /* device reset */
- - outl(inl(0xcf005030) | 0x80, 0xcf005030);
- - outl(inl(0xcf005030) & ~0x80, 0xcf005030);
- -
- - /* device enable */
- - outl(inl(0xcf005000) | 0x80, 0xcf005000);
- -
- - /* GPIO D06 enable for output */
- - outl(inl(0xcf00000c) | 0x40, 0xcf00000c);
- - outl(inl(0xcf00001c) & ~0x40, 0xcf00001c);
- - /* bits 11,10 == 01 */
- - outl(inl(0xcf004040) | 0x400, 0xcf004040);
- - outl(inl(0xcf004040) & ~0x800, 0xcf004040);
- -
- - outl(inl(0xcf004048) & ~0x1, 0xcf004048);
- -
- - outl(inl(0xcf000004) & ~0xf, 0xcf000004);
- - outl(inl(0xcf004044) & ~0xf, 0xcf004044);
- -
- - /* C03 = 0 */
- - outl(inl(0xcf000008) | 0x8, 0xcf000008);
- - outl(inl(0xcf000018) | 0x8, 0xcf000018);
- - outl(inl(0xcf000028) & ~0x8, 0xcf000028);
- -#endif
- -
- - return 0;
- -}
- /* Silently enable / disable audio output */
- void wmcodec_enable_output(bool enable)
- @@ -188,36 +77,36 @@
- /* reset the I2S controller into known state */
- i2s_reset();
- - wm8731_write(RESET, 0x0); /*Reset*/
- + wmcodec_write(RESET, 0x0); /*Reset*/
- codec_set_active(0x0);
- #ifdef HAVE_WM8721
- /* DACSEL=1 */
- - wm8731_write(0x4, 0x10);
- + wmcodec_write(0x4, 0x10);
- #elif defined HAVE_WM8731
- /* DACSEL=1, BYPASS=1 */
- - wm8731_write(0x4, 0x18);
- + wmcodec_write(0x4, 0x18);
- #endif
- /* set power register to POWEROFF=0 on OUTPD=0, DACPD=0 */
- - wm8731_write(PWRMGMT, 0x67);
- + wmcodec_write(PWRMGMT, 0x67);
- /* BCLKINV=0(Dont invert BCLK) MS=1(Enable Master) LRSWAP=0 LRP=0 */
- /* IWL=00(16 bit) FORMAT=10(I2S format) */
- - wm8731_write(AINTFCE, 0x42);
- + wmcodec_write(AINTFCE, 0x42);
- wmcodec_set_sample_rate(WM8731L_44100HZ);
- /* set the volume to -6dB */
- - wm8731_write(LOUTVOL, IPOD_PCM_LEVEL);
- - wm8731_write(ROUTVOL, 0x100 | IPOD_PCM_LEVEL);
- + wmcodec_write(LOUTVOL, IPOD_PCM_LEVEL);
- + wmcodec_write(ROUTVOL, 0x100 | IPOD_PCM_LEVEL);
- /* ACTIVE=1 */
- codec_set_active(1);
- /* 5. Set DACMU = 0 to soft-un-mute the audio DACs. */
- - wm8731_write(DACCTRL, 0x0);
- + wmcodec_write(DACCTRL, 0x0);
- wmcodec_mute(0);
- } else {
- @@ -233,8 +122,8 @@
- /* 0110000 == -73dB */
- /* 0101111 == mute (0x2f) */
- - wm8731_write(LOUTVOL, vol_l);
- - wm8731_write(ROUTVOL, vol_r);
- + wmcodec_write(LOUTVOL, vol_l);
- + wmcodec_write(ROUTVOL, vol_r);
- return 0;
- }
- @@ -261,22 +150,22 @@
- void wmcodec_close(void)
- {
- /* set DACMU=1 DEEMPH=0 */
- - wm8731_write(DACCTRL, 0x8);
- + wmcodec_write(DACCTRL, 0x8);
- /* ACTIVE=0 */
- codec_set_active(0x0);
- /* line in mute left & right*/
- - wm8731_write(LINVOL, 0x100 | 0x80);
- + wmcodec_write(LINVOL, 0x100 | 0x80);
- /* set DACSEL=0, MUTEMIC=1 */
- - wm8731_write(0x4, 0x2);
- + wmcodec_write(0x4, 0x2);
- /* set POWEROFF=0 OUTPD=0 DACPD=1 */
- - wm8731_write(PWRMGMT, 0x6f);
- + wmcodec_write(PWRMGMT, 0x6f);
- /* set POWEROFF=1 OUTPD=1 DACPD=1 */
- - wm8731_write(PWRMGMT, 0xff);
- + wmcodec_write(PWRMGMT, 0xff);
- }
- /* Change the order of the noise shaper, 5th order is recommended above 32kHz */
- @@ -288,7 +177,7 @@
- void wmcodec_set_sample_rate(int sampling_control)
- {
- codec_set_active(0x0);
- - wm8731_write(SAMPCTRL, sampling_control);
- + wmcodec_write(SAMPCTRL, sampling_control);
- codec_set_active(0x1);
- }
- Index: firmware/drivers/wm8758.c
- ===================================================================
- RCS file: /cvsroot/rockbox/firmware/drivers/wm8758.c,v
- retrieving revision 1.11
- diff -u -r1.11 wm8758.c
- --- firmware/drivers/wm8758.c 15 Aug 2006 09:38:13 -0000 1.11
- +++ firmware/drivers/wm8758.c 30 Aug 2006 16:02:08 -0000
- @@ -37,9 +37,7 @@
- #include "buffer.h"
- #include "audio.h"
- -#include "i2c-pp5020.h"
- #include "wm8758.h"
- -#include "pcf50605.h"
- void wmcodec_reset(void);
- @@ -48,67 +46,6 @@
- //#define BASSCTRL 0x
- //#define TREBCTRL 0x0b
- -/*
- - * Reset the I2S BIT.FORMAT I2S, 16bit, FIFO.FORMAT 32bit
- - */
- -static void i2s_reset(void)
- -{
- - /* PP502x */
- -
- - /* I2S soft reset */
- - outl(inl(0x70002800) | 0x80000000, 0x70002800);
- - outl(inl(0x70002800) & ~0x80000000, 0x70002800);
- -
- - /* BIT.FORMAT [11:10] = I2S (default) */
- - outl(inl(0x70002800) & ~0xc00, 0x70002800);
- - /* BIT.SIZE [9:8] = 16bit (default) */
- - outl(inl(0x70002800) & ~0x300, 0x70002800);
- -
- - /* FIFO.FORMAT [6:4] = 32 bit LSB */
- - /* since BIT.SIZ < FIFO.FORMAT low 16 bits will be 0 */
- - outl(inl(0x70002800) | 0x30, 0x70002800);
- -
- - /* RX_ATN_LVL=1 == when 12 slots full */
- - /* TX_ATN_LVL=1 == when 12 slots empty */
- - outl(inl(0x7000280c) | 0x33, 0x7000280c);
- -
- - /* Rx.CLR = 1, TX.CLR = 1 */
- - outl(inl(0x7000280c) | 0x1100, 0x7000280c);
- -}
- -
- -void wm8758_write(int reg, int data)
- -{
- - ipod_i2c_send(0x1a, (reg<<1) | ((data&0x100)>>8),data&0xff);
- -}
- -
- -/*
- - * Initialise the WM8758 for playback via headphone and line out.
- - * Note, I'm using the WM8750 datasheet as its apparently close.
- - */
- -int wmcodec_init(void) {
- - /* normal outputs for CDI and I2S pin groups */
- - outl(inl(0x70000020) & ~0x300, 0x70000020);
- -
- - /*mini2?*/
- - outl(inl(0x70000010) & ~0x3000000, 0x70000010);
- - /*mini2?*/
- -
- - /* device reset */
- - outl(inl(0x60006004) | 0x800, 0x60006004);
- - outl(inl(0x60006004) & ~0x800, 0x60006004);
- -
- - /* device enable */
- - outl(inl(0x6000600C) | 0x807, 0x6000600C);
- -
- - /* enable external dev clock clocks */
- - outl(inl(0x6000600c) | 0x2, 0x6000600c);
- -
- - /* external dev clock to 24MHz */
- - outl(inl(0x70000018) & ~0xc, 0x70000018);
- -
- - return 0;
- -}
- -
- /* Silently enable / disable audio output */
- void wmcodec_enable_output(bool enable)
- {
- @@ -119,23 +56,23 @@
- /* TODO: Review the power-up sequence to prevent pops */
- - wm8758_write(RESET, 0x1ff); /*Reset*/
- + wmcodec_write(RESET, 0x1ff); /*Reset*/
- - wm8758_write(PWRMGMT1, 0x2b);
- - wm8758_write(PWRMGMT2, 0x180);
- - wm8758_write(PWRMGMT3, 0x6f);
- + wmcodec_write(PWRMGMT1, 0x2b);
- + wmcodec_write(PWRMGMT2, 0x180);
- + wmcodec_write(PWRMGMT3, 0x6f);
- - wm8758_write(AINTFCE, 0x10);
- - wm8758_write(CLKCTRL, 0x49);
- + wmcodec_write(AINTFCE, 0x10);
- + wmcodec_write(CLKCTRL, 0x49);
- - wm8758_write(OUTCTRL, 1);
- + wmcodec_write(OUTCTRL, 1);
- /* The iPod can handle multiple frequencies, but fix at 44.1KHz
- for now */
- wmcodec_set_sample_rate(WM8758_44100HZ);
- - wm8758_write(LOUTMIX,0x1); /* Enable mixer */
- - wm8758_write(ROUTMIX,0x1); /* Enable mixer */
- + wmcodec_write(LOUTMIX,0x1); /* Enable mixer */
- + wmcodec_write(ROUTMIX,0x1); /* Enable mixer */
- wmcodec_mute(0);
- } else {
- wmcodec_mute(1);
- @@ -145,8 +82,8 @@
- int wmcodec_set_master_vol(int vol_l, int vol_r)
- {
- /* OUT1 */
- - wm8758_write(LOUT1VOL, 0x080 | vol_l);
- - wm8758_write(ROUT1VOL, 0x180 | vol_r);
- + wmcodec_write(LOUT1VOL, 0x080 | vol_l);
- + wmcodec_write(ROUT1VOL, 0x180 | vol_r);
- return 0;
- }
- @@ -154,8 +91,8 @@
- int wmcodec_set_lineout_vol(int vol_l, int vol_r)
- {
- /* OUT2 */
- - wm8758_write(LOUT2VOL, vol_l);
- - wm8758_write(ROUT2VOL, 0x100 | vol_r);
- + wmcodec_write(LOUT2VOL, vol_l);
- + wmcodec_write(ROUT2VOL, 0x100 | vol_r);
- return 0;
- }
- @@ -178,7 +115,7 @@
- if ((value >= -6) && (value <= 9)) {
- /* We use linear bass control with 130Hz cutoff */
- - wm8758_write(BASSCTRL, regvalues[value+6]);
- + wmcodec_write(BASSCTRL, regvalues[value+6]);
- }
- #endif
- }
- @@ -192,7 +129,7 @@
- if ((value >= -6) && (value <= 9)) {
- /* We use a 8Khz cutoff */
- - wm8758_write(TREBCTRL, regvalues[value+6]);
- + wmcodec_write(TREBCTRL, regvalues[value+6]);
- }
- #endif
- @@ -203,10 +140,10 @@
- if (mute)
- {
- /* Set DACMU = 1 to soft-mute the audio DACs. */
- - wm8758_write(DACCTRL, 0x40);
- + wmcodec_write(DACCTRL, 0x40);
- } else {
- /* Set DACMU = 0 to soft-un-mute the audio DACs. */
- - wm8758_write(DACCTRL, 0x0);
- + wmcodec_write(DACCTRL, 0x0);
- }
- return 0;
- @@ -217,11 +154,11 @@
- {
- wmcodec_mute(1);
- - wm8758_write(PWRMGMT3, 0x0);
- + wmcodec_write(PWRMGMT3, 0x0);
- - wm8758_write(PWRMGMT1, 0x0);
- + wmcodec_write(PWRMGMT1, 0x0);
- - wm8758_write(PWRMGMT2, 0x40);
- + wmcodec_write(PWRMGMT2, 0x40);
- }
- /* Change the order of the noise shaper, 5th order is recommended above 32kHz */
- @@ -237,19 +174,19 @@
- (void)sampling_control;
- /* set clock div */
- - wm8758_write(CLKCTRL, 1 | (0 << 2) | (2 << 5));
- + wmcodec_write(CLKCTRL, 1 | (0 << 2) | (2 << 5));
- /* setup PLL for MHZ=11.2896 */
- - wm8758_write(PLLN, (1 << 4) | 0x7);
- - wm8758_write(PLLK1, 0x21);
- - wm8758_write(PLLK2, 0x161);
- - wm8758_write(PLLK3, 0x26);
- + wmcodec_write(PLLN, (1 << 4) | 0x7);
- + wmcodec_write(PLLK1, 0x21);
- + wmcodec_write(PLLK2, 0x161);
- + wmcodec_write(PLLK3, 0x26);
- /* set clock div */
- - wm8758_write(CLKCTRL, 1 | (1 << 2) | (2 << 5) | (1 << 8));
- + wmcodec_write(CLKCTRL, 1 | (1 << 2) | (2 << 5) | (1 << 8));
- /* set srate */
- - wm8758_write(SRATECTRL, (0 << 1));
- + wmcodec_write(SRATECTRL, (0 << 1));
- }
- void wmcodec_enable_recording(bool source_mic)
- @@ -286,14 +223,14 @@
- eq |= 12 - gain;
- if (band == 0) {
- - wm8758_write(EQ1, eq | 0x100); /* Always apply EQ to the DAC path */
- + wmcodec_write(EQ1, eq | 0x100); /* Always apply EQ to the DAC path */
- } else if (band == 1) {
- - wm8758_write(EQ2, eq);
- + wmcodec_write(EQ2, eq);
- } else if (band == 2) {
- - wm8758_write(EQ3, eq);
- + wmcodec_write(EQ3, eq);
- } else if (band == 3) {
- - wm8758_write(EQ4, eq);
- + wmcodec_write(EQ4, eq);
- } else if (band == 4) {
- - wm8758_write(EQ5, eq);
- + wmcodec_write(EQ5, eq);
- }
- }
- Index: firmware/drivers/wm8975.c
- ===================================================================
- RCS file: /cvsroot/rockbox/firmware/drivers/wm8975.c,v
- retrieving revision 1.7
- diff -u -r1.7 wm8975.c
- --- firmware/drivers/wm8975.c 22 Mar 2006 13:04:49 -0000 1.7
- +++ firmware/drivers/wm8975.c 30 Aug 2006 16:02:08 -0000
- @@ -37,77 +37,12 @@
- #include "buffer.h"
- #include "audio.h"
- -#include "i2c-pp5020.h"
- #include "wm8975.h"
- -#include "pcf50605.h"
- void wmcodec_reset(void);
- #define IPOD_PCM_LEVEL 0x65 /* -6dB */
- -/*
- - * Reset the I2S BIT.FORMAT I2S, 16bit, FIFO.FORMAT 32bit
- - */
- -static void i2s_reset(void)
- -{
- - /* PP502x */
- -
- - /* I2S soft reset */
- - outl(inl(0x70002800) | 0x80000000, 0x70002800);
- - outl(inl(0x70002800) & ~0x80000000, 0x70002800);
- -
- - /* BIT.FORMAT [11:10] = I2S (default) */
- - outl(inl(0x70002800) & ~0xc00, 0x70002800);
- - /* BIT.SIZE [9:8] = 16bit (default) */
- - outl(inl(0x70002800) & ~0x300, 0x70002800);
- -
- - /* FIFO.FORMAT [6:4] = 32 bit LSB */
- - /* since BIT.SIZ < FIFO.FORMAT low 16 bits will be 0 */
- - outl(inl(0x70002800) | 0x30, 0x70002800);
- -
- - /* RX_ATN_LVL=1 == when 12 slots full */
- - /* TX_ATN_LVL=1 == when 12 slots empty */
- - outl(inl(0x7000280c) | 0x33, 0x7000280c);
- -
- - /* Rx.CLR = 1, TX.CLR = 1 */
- - outl(inl(0x7000280c) | 0x1100, 0x7000280c);
- -}
- -
- -void wm8975_write(int reg, int data)
- -{
- - ipod_i2c_send(0x1a, (reg<<1) | ((data&0x100)>>8),data&0xff);
- -}
- -
- -/*
- - * Initialise the WM8975 for playback via headphone and line out.
- - * Note, I'm using the WM8750 datasheet as its apparently close.
- - */
- -int wmcodec_init(void) {
- - /* reset I2C */
- - i2c_init();
- -
- - /* normal outputs for CDI and I2S pin groups */
- - outl(inl(0x70000020) & ~0x300, 0x70000020);
- -
- - /*mini2?*/
- - outl(inl(0x70000010) & ~0x3000000, 0x70000010);
- - /*mini2?*/
- -
- - /* device reset */
- - outl(inl(0x60006004) | 0x800, 0x60006004);
- - outl(inl(0x60006004) & ~0x800, 0x60006004);
- -
- - /* device enable */
- - outl(inl(0x6000600C) | 0x807, 0x6000600C);
- -
- - /* enable external dev clock clocks */
- - outl(inl(0x6000600c) | 0x2, 0x6000600c);
- -
- - /* external dev clock to 24MHz */
- - outl(inl(0x70000018) & ~0xc, 0x70000018);
- -
- - return 0;
- -}
- /* Silently enable / disable audio output */
- void wmcodec_enable_output(bool enable)
- @@ -124,39 +59,39 @@
- * and Headphone outputs are all OFF (DACMU = 1 Power
- * Management registers 1 and 2 are all zeros).
- */
- - wm8975_write(RESET, 0x1ff); /*Reset*/
- - wm8975_write(RESET, 0x0);
- + wmcodec_write(RESET, 0x1ff); /*Reset*/
- + wmcodec_write(RESET, 0x0);
- /* 2. Enable Vmid and VREF. */
- - wm8975_write(PWRMGMT1, 0xc0); /*Pwr Mgmt(1)*/
- + wmcodec_write(PWRMGMT1, 0xc0); /*Pwr Mgmt(1)*/
- /* 3. Enable DACs as required. */
- - wm8975_write(PWRMGMT2, 0x180); /*Pwr Mgmt(2)*/
- + wmcodec_write(PWRMGMT2, 0x180); /*Pwr Mgmt(2)*/
- /* 4. Enable line and / or headphone output buffers as required. */
- - wm8975_write(PWRMGMT2, 0x1f8); /*Pwr Mgmt(2)*/
- + wmcodec_write(PWRMGMT2, 0x1f8); /*Pwr Mgmt(2)*/
- /* BCLKINV=0(Dont invert BCLK) MS=1(Enable Master) LRSWAP=0 LRP=0 */
- /* IWL=00(16 bit) FORMAT=10(I2S format) */
- - wm8975_write(AINTFCE, 0x42);
- + wmcodec_write(AINTFCE, 0x42);
- /* The iPod can handle multiple frequencies, but fix at 44.1KHz for now */
- wmcodec_set_sample_rate(WM8975_44100HZ);
- /* set the volume to -6dB */
- - wm8975_write(LOUT1VOL, IPOD_PCM_LEVEL);
- - wm8975_write(ROUT1VOL,0x100 | IPOD_PCM_LEVEL);
- - wm8975_write(LOUT1VOL, IPOD_PCM_LEVEL);
- - wm8975_write(ROUT1VOL,0x100 | IPOD_PCM_LEVEL);
- + wmcodec_write(LOUT1VOL, IPOD_PCM_LEVEL);
- + wmcodec_write(ROUT1VOL,0x100 | IPOD_PCM_LEVEL);
- + wmcodec_write(LOUT1VOL, IPOD_PCM_LEVEL);
- + wmcodec_write(ROUT1VOL,0x100 | IPOD_PCM_LEVEL);
- - wm8975_write(LOUTMIX1, 0x150); /* Left out Mix(def) */
- - wm8975_write(LOUTMIX2, 0x50);
- + wmcodec_write(LOUTMIX1, 0x150); /* Left out Mix(def) */
- + wmcodec_write(LOUTMIX2, 0x50);
- - wm8975_write(ROUTMIX1, 0x50); /* Right out Mix(def) */
- - wm8975_write(ROUTMIX2, 0x150);
- + wmcodec_write(ROUTMIX1, 0x50); /* Right out Mix(def) */
- + wmcodec_write(ROUTMIX2, 0x150);
- - wm8975_write(MOUTMIX1, 0x0); /* Mono out Mix */
- - wm8975_write(MOUTMIX2, 0x0);
- + wmcodec_write(MOUTMIX1, 0x0); /* Mono out Mix */
- + wmcodec_write(MOUTMIX2, 0x0);
- wmcodec_mute(0);
- } else {
- @@ -173,8 +108,8 @@
- /* 0101111 == mute (0x2f) */
- /* OUT1 */
- - wm8975_write(LOUT1VOL, vol_l);
- - wm8975_write(ROUT1VOL, 0x100 | vol_r);
- + wmcodec_write(LOUT1VOL, vol_l);
- + wmcodec_write(ROUT1VOL, 0x100 | vol_r);
- return 0;
- }
- @@ -182,8 +117,8 @@
- int wmcodec_set_lineout_vol(int vol_l, int vol_r)
- {
- /* OUT2 */
- - wm8975_write(LOUT2VOL, vol_l);
- - wm8975_write(ROUT2VOL, 0x100 | vol_r);
- + wmcodec_write(LOUT2VOL, vol_l);
- + wmcodec_write(ROUT2VOL, 0x100 | vol_r);
- return 0;
- }
- @@ -203,7 +138,7 @@
- if ((value >= -6) && (value <= 9)) {
- /* We use linear bass control with 130Hz cutoff */
- - wm8975_write(BASSCTRL, regvalues[value+6]);
- + wmcodec_write(BASSCTRL, regvalues[value+6]);
- }
- }
- @@ -213,7 +148,7 @@
- if ((value >= -6) && (value <= 9)) {
- /* We use a 8Khz cutoff */
- - wm8975_write(TREBCTRL, regvalues[value+6]);
- + wmcodec_write(TREBCTRL, regvalues[value+6]);
- }
- }
- @@ -222,10 +157,10 @@
- if (mute)
- {
- /* Set DACMU = 1 to soft-mute the audio DACs. */
- - wm8975_write(DACCTRL, 0x8);
- + wmcodec_write(DACCTRL, 0x8);
- } else {
- /* Set DACMU = 0 to soft-un-mute the audio DACs. */
- - wm8975_write(DACCTRL, 0x0);
- + wmcodec_write(DACCTRL, 0x0);
- }
- return 0;
- @@ -235,13 +170,13 @@
- void wmcodec_close(void)
- {
- /* 1. Set DACMU = 1 to soft-mute the audio DACs. */
- - wm8975_write(DACCTRL, 0x8);
- + wmcodec_write(DACCTRL, 0x8);
- /* 2. Disable all output buffers. */
- - wm8975_write(PWRMGMT2, 0x0); /*Pwr Mgmt(2)*/
- + wmcodec_write(PWRMGMT2, 0x0); /*Pwr Mgmt(2)*/
- /* 3. Switch off the power supplies. */
- - wm8975_write(PWRMGMT1, 0x0); /*Pwr Mgmt(1)*/
- + wmcodec_write(PWRMGMT1, 0x0); /*Pwr Mgmt(1)*/
- }
- /* Change the order of the noise shaper, 5th order is recommended above 32kHz */
- @@ -253,7 +188,7 @@
- /* Note: Disable output before calling this function */
- void wmcodec_set_sample_rate(int sampling_control) {
- - wm8975_write(0x08, sampling_control);
- + wmcodec_write(0x08, sampling_control);
- }
- Index: firmware/drivers/wmcodec-pp.c
- ===================================================================
- RCS file: firmware/drivers/wmcodec-pp.c
- diff -N firmware/drivers/wmcodec-pp.c
- --- /dev/null 1 Jan 1970 00:00:00 -0000
- +++ firmware/drivers/wmcodec-pp.c 30 Aug 2006 16:02:08 -0000
- @@ -0,0 +1,157 @@
- +/***************************************************************************
- + * __________ __ ___.
- + * Open \______ \ ____ ____ | | _\_ |__ _______ ___
- + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
- + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
- + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
- + * \/ \/ \/ \/ \/
- + * $Id: wm8975.c,v 1.7 2006-03-22 13:04:49 preglow Exp $
- + *
- + * Driver for WM8975 audio codec
- + *
- + * Based on code from the ipodlinux project - http://ipodlinux.org/
- + * Adapted for Rockbox in December 2005
- + *
- + * Original file: linux/arch/armnommu/mach-ipod/audio.c
- + *
- + * Copyright (c) 2003-2005 Bernard Leach (leachbj@bouncycastle.org)
- + *
- + * 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 "lcd.h"
- +#include "cpu.h"
- +#include "kernel.h"
- +#include "thread.h"
- +#include "power.h"
- +#include "debug.h"
- +#include "system.h"
- +#include "sprintf.h"
- +#include "button.h"
- +#include "string.h"
- +#include "file.h"
- +#include "buffer.h"
- +#include "audio.h"
- +
- +#if CONFIG_CPU == PP5020
- +#include "i2c-pp5020.h"
- +#elif CONFIG_CPU == PP5002
- +#include "i2c-pp5002.h"
- +#endif
- +
- +/*
- + * Reset the I2S BIT.FORMAT I2S, 16bit, FIFO.FORMAT 32bit
- + */
- +void i2s_reset(void)
- +{
- +#if CONFIG_CPU == PP5020
- + /* I2S soft reset */
- + outl(inl(0x70002800) | 0x80000000, 0x70002800);
- + outl(inl(0x70002800) & ~0x80000000, 0x70002800);
- +
- + /* BIT.FORMAT [11:10] = I2S (default) */
- + outl(inl(0x70002800) & ~0xc00, 0x70002800);
- + /* BIT.SIZE [9:8] = 16bit (default) */
- + outl(inl(0x70002800) & ~0x300, 0x70002800);
- +
- + /* FIFO.FORMAT [6:4] = 32 bit LSB */
- + /* since BIT.SIZ < FIFO.FORMAT low 16 bits will be 0 */
- + outl(inl(0x70002800) | 0x30, 0x70002800);
- +
- + /* RX_ATN_LVL=1 == when 12 slots full */
- + /* TX_ATN_LVL=1 == when 12 slots empty */
- + outl(inl(0x7000280c) | 0x33, 0x7000280c);
- +
- + /* Rx.CLR = 1, TX.CLR = 1 */
- + outl(inl(0x7000280c) | 0x1100, 0x7000280c);
- +#elif CONFIG_CPU == PP5002
- + /* I2S device reset */
- + outl(inl(0xcf005030) | 0x80, 0xcf005030);
- + outl(inl(0xcf005030) & ~0x80, 0xcf005030);
- +
- + /* I2S controller enable */
- + outl(inl(0xc0002500) | 0x1, 0xc0002500);
- +
- + /* BIT.FORMAT [11:10] = I2S (default) */
- + /* BIT.SIZE [9:8] = 24bit */
- + /* FIFO.FORMAT = 24 bit LSB */
- +
- + /* reset DAC and ADC fifo */
- + outl(inl(0xc000251c) | 0x30000, 0xc000251c);
- +#endif
- +}
- +
- +/*
- + * Initialise the WM8975 for playback via headphone and line out.
- + * Note, I'm using the WM8750 datasheet as its apparently close.
- + */
- +int wmcodec_init(void) {
- + /* reset I2C */
- + i2c_init();
- +
- +#if CONFIG_CPU == PP5020
- + /* normal outputs for CDI and I2S pin groups */
- + outl(inl(0x70000020) & ~0x300, 0x70000020);
- +
- + /*mini2?*/
- + outl(inl(0x70000010) & ~0x3000000, 0x70000010);
- + /*mini2?*/
- +
- + /* device reset */
- + outl(inl(0x60006004) | 0x800, 0x60006004);
- + outl(inl(0x60006004) & ~0x800, 0x60006004);
- +
- + /* device enable */
- + outl(inl(0x6000600C) | 0x807, 0x6000600C);
- +
- + /* enable external dev clock clocks */
- + outl(inl(0x6000600c) | 0x2, 0x6000600c);
- +
- + /* external dev clock to 24MHz */
- + outl(inl(0x70000018) & ~0xc, 0x70000018);
- +#else
- + /* device reset */
- + outl(inl(0xcf005030) | 0x80, 0xcf005030);
- + outl(inl(0xcf005030) & ~0x80, 0xcf005030);
- +
- + /* device enable */
- + outl(inl(0xcf005000) | 0x80, 0xcf005000);
- +
- + /* GPIO D06 enable for output */
- + outl(inl(0xcf00000c) | 0x40, 0xcf00000c);
- + outl(inl(0xcf00001c) & ~0x40, 0xcf00001c);
- + /* bits 11,10 == 01 */
- + outl(inl(0xcf004040) | 0x400, 0xcf004040);
- + outl(inl(0xcf004040) & ~0x800, 0xcf004040);
- +
- + outl(inl(0xcf004048) & ~0x1, 0xcf004048);
- +
- + outl(inl(0xcf000004) & ~0xf, 0xcf000004);
- + outl(inl(0xcf004044) & ~0xf, 0xcf004044);
- +
- + /* C03 = 0 */
- + outl(inl(0xcf000008) | 0x8, 0xcf000008);
- + outl(inl(0xcf000018) | 0x8, 0xcf000018);
- + outl(inl(0xcf000028) & ~0x8, 0xcf000028);
- +#endif
- +
- + return 0;
- +}
- +
- +void wmcodec_write(int reg, int data)
- +{
- + /* Todo: Since the ipod_i2c_* functions also work on H10 and possibly other PP
- + targets, these functions should probably be renamed */
- +#if defined(IRIVER_H10) || defined(IRIVER_H10_5GB)
- + /* The H10's audio codec uses an I2C address of 0x1b */
- + ipod_i2c_send(0x1b, (reg<<1) | ((data&0x100)>>8),data&0xff);
- +#else
- + /* The iPod's audio codecs use an I2C address of 0x1a */
- + ipod_i2c_send(0x1a, (reg<<1) | ((data&0x100)>>8),data&0xff);
- +#endif
- +}
- +
advertising
Update the Post
Either update this post and resubmit it with changes, or make a new post.
You may also comment on this post.
Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.