From b09d3aec392538ca0934644ff6357c41aaa4c323 Mon Sep 17 00:00:00 2001 From: Marcin Bukat Date: Mon, 26 Apr 2010 21:40:00 +0000 Subject: Add MPIO HD200 port - changed files git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25724 a1c6a512-1295-4272-9138-f99709370657 --- firmware/SOURCES | 24 +++++++++++++++++++++++- firmware/drivers/audio/wm8751.c | 25 +++++++++++++++++++++++-- firmware/export/audiohw.h | 2 +- firmware/export/config.h | 3 +++ firmware/export/wm8751.h | 9 +++++++++ firmware/sound.c | 11 ++++++----- firmware/target/coldfire/crt0.S | 19 ++++++++++++++++++- firmware/target/coldfire/i2c-coldfire.c | 4 ++++ firmware/target/coldfire/pcm-coldfire.c | 30 ++++++++++++++++++++++++++++++ firmware/target/coldfire/system-coldfire.c | 5 +++++ 10 files changed, 122 insertions(+), 10 deletions(-) (limited to 'firmware') diff --git a/firmware/SOURCES b/firmware/SOURCES index b13f6a0df8..48360d7b45 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -258,7 +258,8 @@ drivers/mas.c #if !defined(SIMULATOR) && !defined(BOOTLOADER) #if defined(HAVE_UDA1380) drivers/audio/uda1380.c -#elif defined(HAVE_WM8751) +#elif defined(HAVE_WM8751) \ + || defined(HAVE_WM8750) drivers/audio/wm8751.c #elif defined(HAVE_WM8978) drivers/audio/wm8978.c @@ -1609,3 +1610,24 @@ target/arm/usb-fw-pp502x.c #endif /* SIMULATOR */ #endif +#ifdef MPIO_HD200 +#ifndef SIMULATOR +/* TODO: currently including all files */ +target/coldfire/mpio/hd200/adc-hd200.c +target/coldfire/mpio/hd200/button-hd200.c +target/coldfire/mpio/hd200/lcd-hd200.c +target/coldfire/mpio/hd200/lcd-as-hd200.S +target/coldfire/mpio/hd200/power-hd200.c +target/coldfire/mpio/hd200/powermgmt-hd200.c +target/coldfire/mpio/hd200/backlight-hd200.c +target/coldfire/mpio/hd200/system-hd200.c +target/coldfire/mpio/hd200/usb-hd200.c +target/coldfire/mpio/fmradio_i2c-mpio.c +target/coldfire/mpio/ata-mpio.c +target/coldfire/mpio/ata-as-mpio.S +#ifndef BOOTLOADER +target/coldfire/mpio/audio-mpio.c +target/coldfire/wmcodec-coldfire.c +#endif /* BOOTLOADER */ +#endif /* SIMULATOR */ +#endif diff --git a/firmware/drivers/audio/wm8751.c b/firmware/drivers/audio/wm8751.c index b42c4b1041..cdc64fd69b 100644 --- a/firmware/drivers/audio/wm8751.c +++ b/firmware/drivers/audio/wm8751.c @@ -116,17 +116,22 @@ void audiohw_preinit(void) * and Headphone outputs are all OFF (DACMU = 1 Power * Management registers 1 and 2 are all zeros). */ + wmcodec_write(RESET, RESET_RESET); /*Reset*/ /* 2. Enable Vmid and VREF. */ wmcodec_write(PWRMGMT1, PWRMGMT1_VREF | PWRMGMT1_VMIDSEL_5K); +#ifdef CODEC_SLAVE + wmcodec_write(AINTFCE,AINTFCE_WL_16|AINTFCE_FORMAT_I2S); +#else /* BCLKINV=0(Dont invert BCLK) MS=1(Enable Master) LRSWAP=0 LRP=0 */ /* IWL=00(16 bit) FORMAT=10(I2S format) */ wmcodec_write(AINTFCE, AINTFCE_MS | AINTFCE_WL_16 | AINTFCE_FORMAT_I2S); - +#endif /* Set default samplerate */ + audiohw_set_frequency(HW_FREQ_DEFAULT); } @@ -140,7 +145,7 @@ void audiohw_postinit(void) wmcodec_write(PWRMGMT2, PWRMGMT2_DACL | PWRMGMT2_DACR); /* 4. Enable line and / or headphone output buffers as required. */ -#ifdef MROBE_100 +#if defined(MROBE_100) || defined(MPIO_HD200) wmcodec_write(PWRMGMT2, PWRMGMT2_DACL | PWRMGMT2_DACR | PWRMGMT2_LOUT1 | PWRMGMT2_ROUT1); #else @@ -166,6 +171,19 @@ void audiohw_postinit(void) #endif #endif +#ifdef MPIO_HD200 + /* Crude fix for high pitch noise at startup + * I should find out what realy causes this + */ + wmcodec_write(LOUT1, LOUT1_BITS|0x7f); + wmcodec_write(ROUT1, ROUT1_BITS|0x7f); + wmcodec_write(LOUT1, LOUT1_BITS); + wmcodec_write(ROUT1, ROUT1_BITS); +#endif + + /* lower power consumption */ + wmcodec_write(PWRMGMT1, PWRMGMT1_VREF | PWRMGMT1_VMIDSEL_50K); + audiohw_mute(false); #ifdef MROBE_100 @@ -234,6 +252,8 @@ void audiohw_close(void) void audiohw_set_frequency(int fsel) { + (void)fsel; +#ifndef CODEC_SLAVE static const unsigned char srctrl_table[HW_NUM_FREQ] = { HW_HAVE_11_([HW_FREQ_11] = CODEC_SRCTRL_11025HZ,) @@ -246,4 +266,5 @@ void audiohw_set_frequency(int fsel) fsel = HW_FREQ_DEFAULT; wmcodec_write(CLOCKING, srctrl_table[fsel]); +#endif } diff --git a/firmware/export/audiohw.h b/firmware/export/audiohw.h index 781bc12f8e..c00b673a4a 100644 --- a/firmware/export/audiohw.h +++ b/firmware/export/audiohw.h @@ -38,7 +38,7 @@ #include "uda1380.h" #elif defined(HAVE_UDA1341) #include "uda1341.h" -#elif defined(HAVE_WM8751) +#elif defined(HAVE_WM8750) || defined(HAVE_WM8751) #include "wm8751.h" #elif defined(HAVE_WM8978) #include "wm8978.h" diff --git a/firmware/export/config.h b/firmware/export/config.h index fb9381e7da..906a3fef1a 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -117,6 +117,7 @@ #define MINI2440_PAD 41 #define PHILIPS_HDD6330_PAD 42 #define PBELL_VIBE500_PAD 43 +#define MPIO_HD200_PAD 44 /* CONFIG_REMOTE_KEYPAD */ #define H100_REMOTE 1 @@ -412,6 +413,8 @@ Lyre prototype 1 */ #include "config/samsungyps3.h" #elif defined(PBELL_VIBE500) #include "config/vibe500.h" +#elif defined(MPIO_HD200) +#include "config/mpiohd200.h" #else /* no known platform */ #endif diff --git a/firmware/export/wm8751.h b/firmware/export/wm8751.h index 15170b76bc..c171642853 100644 --- a/firmware/export/wm8751.h +++ b/firmware/export/wm8751.h @@ -98,6 +98,15 @@ extern void audiohw_set_lineout_vol(int vol_l, int vol_r); #define RESET 0x0f #define RESET_RESET 0x000 +/* WM8750 only */ +#define ENHANCE_3D 0x10 +#define ENHANCE_3D_3DEN (1 << 0) +#define ENHANCE_3D_DEPTH(x) (((x) & 0xf) << 1) +#define ENHANCE_3D_3DLC (1 << 5) +#define ENHANCE_3D_3DUC (1 << 6) +#define ENHANCE_3D_MODE3D_PLAYBACK (1 << 7) +#define ENHANCE_3D_MODE3D_RECORD (0 << 7) + #define ADDITIONAL1 0x17 #define ADDITIONAL1_TOEN (1 << 0) #define ADDITIONAL1_DACINV (1 << 1) diff --git a/firmware/sound.c b/firmware/sound.c index d64dfcfdb9..4f95b6ed50 100644 --- a/firmware/sound.c +++ b/firmware/sound.c @@ -235,11 +235,12 @@ static void set_prescaled_volume(void) dac_volume(tenthdb2reg(l), tenthdb2reg(r), false); #elif defined(HAVE_UDA1380) || defined(HAVE_WM8975) || defined(HAVE_WM8758) \ || defined(HAVE_WM8711) || defined(HAVE_WM8721) || defined(HAVE_WM8731) \ - || defined(HAVE_WM8751) || defined(HAVE_AS3514) || defined(HAVE_TSC2100) \ - || defined(HAVE_AK4537) || defined(HAVE_UDA1341) + || defined(HAVE_WM8750) || defined(HAVE_WM8751) || defined(HAVE_AS3514) \ + || defined(HAVE_TSC2100) || defined(HAVE_AK4537) || defined(HAVE_UDA1341) audiohw_set_master_vol(tenthdb2master(l), tenthdb2master(r)); #if defined(HAVE_WM8975) || defined(HAVE_WM8758) \ - || (defined(HAVE_WM8751) && !defined(MROBE_100)) || defined(HAVE_WM8985) + || defined(HAVE_WM8750) || (defined(HAVE_WM8751) && !defined(MROBE_100)) \ + || defined(HAVE_WM8985) audiohw_set_lineout_vol(tenthdb2master(0), tenthdb2master(0)); #endif @@ -295,7 +296,7 @@ void sound_set_bass(int value) return; #if !defined(AUDIOHW_HAVE_CLIPPING) -#if defined(HAVE_WM8751) +#if defined(HAVE_WM8750) || defined(HAVE_WM8751) current_bass = value; #else current_bass = value * 10; @@ -319,7 +320,7 @@ void sound_set_treble(int value) return; #if !defined(AUDIOHW_HAVE_CLIPPING) -#if defined(HAVE_WM8751) +#if defined(HAVE_WM8750) || defined(HAVE_WM8751) current_treble = value; #else current_treble = value * 10; diff --git a/firmware/target/coldfire/crt0.S b/firmware/target/coldfire/crt0.S index bc8a370823..38365c7d71 100644 --- a/firmware/target/coldfire/crt0.S +++ b/firmware/target/coldfire/crt0.S @@ -63,7 +63,16 @@ start: move.l #0x00000180,%d0 /* CSCR0 - no wait states, 16 bits, no bursts */ move.l %d0,(0x088,%a0) -#ifndef IAUDIO_M3 +#ifdef MPIO_HD200 + /* Chip select 3 - LCD controller */ + /* values taken from original firmware except base address*/ + move.l #0xf0000000,%d0 /* CSAR3 - Base = 0xf0000000 */ + move.l %d0,(0x0a4,%a0) + moveq.l #0x1,%d0 /* CSMR3 - 64K */ + move.l %d0,(0x0a8,%a0) + move.l #0x00000980,%d0 /* CSCR3 - 1 wait state, 16 bits no bursts */ + move.l %d0,(0x0ac,%a0) +#elif !(defined IAUDIO_M3) /* Chip select 1 - LCD controller */ move.l #0xf0000000,%d0 /* CSAR1 - Base = 0xf0000000 */ move.l %d0,(0x08c,%a0) @@ -267,6 +276,14 @@ start: or.l %d0,(0xbc,%a1) #endif +#ifdef MPIO_HD200 + /* Set KEEP_ACT */ + move.l #0x02200000,%d0 + or.l %d0,(0xb4,%a1) + or.l %d0,(0xb8,%a1) + or.l %d0,(0xbc,%a1) +#endif + /* zero out bss */ lea _edata,%a2 lea _end,%a4 diff --git a/firmware/target/coldfire/i2c-coldfire.c b/firmware/target/coldfire/i2c-coldfire.c index ebfe0a006e..ab3018d713 100644 --- a/firmware/target/coldfire/i2c-coldfire.c +++ b/firmware/target/coldfire/i2c-coldfire.c @@ -70,6 +70,10 @@ void i2c_init(void) #elif defined(IRIVER_H100_SERIES) || defined(IRIVER_H300_SERIES) MBDR = 0; /* iRiver firmware does this */ MBCR = IEN; /* Enable interface */ +#elif defined(MPIO_HD200) + /* second channel */ + MFDR2 = 0x0d; + MBCR2 = IEN; #endif } diff --git a/firmware/target/coldfire/pcm-coldfire.c b/firmware/target/coldfire/pcm-coldfire.c index 0782b116b4..209d227187 100644 --- a/firmware/target/coldfire/pcm-coldfire.c +++ b/firmware/target/coldfire/pcm-coldfire.c @@ -55,6 +55,24 @@ #define FPARM_CLOCKSEL 0 #define FPARM_CLSEL 1 + +/* SCLK = Fs * bit clocks per word + * so SCLK should be Fs * 64 + * + * CLOCKSEL sets SCLK freq based on Audio CLK + * 0x0c SCLK = Audio CLK/2 88200 * 64 = 5644800 Hz + * 0x06 SCLK = Audio CLK/4 44100 * 64 = 2822400 Hz + * 0x04 SCLK = Audio CLK/8 22050 * 64 = 1411200 Hz + * 0x02 SCLK = Audio CLK/16 11025 * 64 = 705600 Hz + * + * CLSEL sets MCLK1/2 DAC freq based on XTAL freq + * 0x01 MCLK1/2 = XTAL freq + * 0x02 MCLK1/2 = XTAL/2 freq + * + * Audio CLK can be XTAL freq or XTAL/2 freq (bit22 in PLLCR) + * we always set bit22 so Audio CLK is always XTAL freq + */ + #if CONFIG_CPU == MCF5249 && defined(HAVE_UDA1380) static const unsigned char pcm_freq_parms[HW_NUM_FREQ][2] = { @@ -65,6 +83,16 @@ static const unsigned char pcm_freq_parms[HW_NUM_FREQ][2] = }; #endif +#if CONFIG_CPU == MCF5249 && defined(HAVE_WM8750) +static const unsigned char pcm_freq_parms[HW_NUM_FREQ][2] = +{ + [HW_FREQ_88] = { 0x0c, 0x01 }, + [HW_FREQ_44] = { 0x06, 0x01 }, + [HW_FREQ_22] = { 0x04, 0x01 }, + [HW_FREQ_11] = { 0x02, 0x01 }, +}; +#endif + #if (CONFIG_CPU == MCF5250 || CONFIG_CPU == MCF5249) && defined(HAVE_TLV320) static const unsigned char pcm_freq_parms[HW_NUM_FREQ][2] = { @@ -324,6 +352,7 @@ const void * pcm_play_dma_get_peak_buffer(int *count) return (void *)((addr + 2) & ~3); } /* pcm_play_dma_get_peak_buffer */ +#ifdef HAVE_RECORDING /**************************************************************************** ** Recording DMA transfer **/ @@ -487,3 +516,4 @@ const void * pcm_rec_dma_get_peak_buffer(int *count) *count = (end >> 2) - addr; return (void *)(addr << 2); } /* pcm_rec_dma_get_peak_buffer */ +#endif diff --git a/firmware/target/coldfire/system-coldfire.c b/firmware/target/coldfire/system-coldfire.c index a387824526..ba67daa3a6 100644 --- a/firmware/target/coldfire/system-coldfire.c +++ b/firmware/target/coldfire/system-coldfire.c @@ -152,6 +152,11 @@ default_interrupt (ADC); /* A/D converter */ #define EXCP_BUTTON_MASK 0x00000202 #define EXCP_BUTTON_VALUE 0x00000200 /* On button and !hold */ #define EXCP_PLLCR 0x10800000 +#elif defined(MPIO_HD200) +#define EXCP_BUTTON_GPIO_READ GPIO1_READ +#define EXCP_BUTTON_MASK 0x01000010 +#define EXCP_BUTTON_VALUE 0x01000000 /* Play button and !hold */ +#define EXCP_PLLCR 0x10800000 #else #define EXCP_BUTTON_GPIO_READ GPIO1_READ #define EXCP_BUTTON_MASK 0x00000022 -- cgit v1.2.3