summaryrefslogtreecommitdiff
path: root/firmware/target/arm/s5l8700
diff options
context:
space:
mode:
authorMichael Sparmann <theseven@rockbox.org>2009-10-21 18:52:09 +0000
committerMichael Sparmann <theseven@rockbox.org>2009-10-21 18:52:09 +0000
commit7bff585d83444dba96c952578a265a5537fec459 (patch)
tree5352fab86af60ba482ed3ee72d8ee0cd3a480756 /firmware/target/arm/s5l8700
parent0c89c0ef7cd2439fe74ef57ac408733aef8fd313 (diff)
iPod Nano 2G: "Fix" the latest PCM issues, channel swap and vinyl popping. The latter is a revert of the cache coherency patch for now, we need to find a better solution in the long term...
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23308 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/s5l8700')
-rw-r--r--firmware/target/arm/s5l8700/pcm-s5l8700.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/firmware/target/arm/s5l8700/pcm-s5l8700.c b/firmware/target/arm/s5l8700/pcm-s5l8700.c
index fd41da1432..219f682e2d 100644
--- a/firmware/target/arm/s5l8700/pcm-s5l8700.c
+++ b/firmware/target/arm/s5l8700/pcm-s5l8700.c
@@ -105,7 +105,7 @@ static void play_next(void *addr, size_t size)
dma_callback);
/* DMA channel on */
- clean_dcache();
+// clean_dcache();
dma_enable_channel(DMA_IISOUT_CHANNEL);
}
@@ -139,7 +139,8 @@ void pcm_play_dma_start(const void *addr, size_t size)
PCON5 = (PCON5 & ~(0xFFFF0000)) | 0x77720000;
PCON6 = (PCON6 & ~(0x0F000000)) | 0x02000000;
- I2STXCON = (0x10 << 16) | /* burst length */
+ I2STXCON = (1 << 20) | /* undocumented */
+ (DMA_IISOUT_BLEN << 16) | /* burst length */
(0 << 15) | /* 0 = falling edge */
(0 << 13) | /* 0 = basic I2S format */
(0 << 12) | /* 0 = MSB first */
@@ -162,7 +163,7 @@ void pcm_play_dma_start(const void *addr, size_t size)
#endif
/* S3: DMA channel 0 on */
- clean_dcache();
+// clean_dcache();
dma_enable_channel(DMA_IISOUT_CHANNEL);
/* S4: IIS Tx clock on */
@@ -190,14 +191,14 @@ void pcm_play_dma_stop(void)
(0 << 0); /* 0 = LRCK on */
}
-/* pause playback by disabling further DMA requests */
+/* pause playback by disabling the I2S interface */
void pcm_play_dma_pause(bool pause)
{
if (pause) {
- I2STXCOM &= ~(1 << 1); /* DMA request enable */
+ I2STXCOM |= (1 << 0); /* LRCK off */
}
else {
- I2STXCOM |= (1 << 1); /* DMA request enable */
+ I2STXCOM &= ~(1 << 0); /* LRCK on */
}
}
@@ -267,7 +268,7 @@ const void * pcm_play_dma_get_peak_buffer(int *count)
void * pcm_dma_addr(void *addr)
{
if (addr != NULL)
- addr = UNCACHED_ADDR(addr);
+ addr = (void*)((uintptr_t)addr | 0x40000000);
return addr;
}
#endif