diff options
author | Michael Sevakis <jethead71@rockbox.org> | 2007-05-22 15:34:24 +0000 |
---|---|---|
committer | Michael Sevakis <jethead71@rockbox.org> | 2007-05-22 15:34:24 +0000 |
commit | e7075db2a76425051b2ecfdd14f14b07384c7e08 (patch) | |
tree | ea8d3c314b96d33451aa0c67780505076c4845e7 /firmware/target/arm/pcm-pp.c | |
parent | 213e7d847245f9ac61a64497424faeac0e22b4a2 (diff) | |
download | rockbox-e7075db2a76425051b2ecfdd14f14b07384c7e08.tar.gz rockbox-e7075db2a76425051b2ecfdd14f14b07384c7e08.zip |
e200: Use 16-16 L-R pairs when writing to the TX FIFO. Kill the channel swapping and clicks. Reduce number of FIQs. Should be adaptable to iPods and other PP targets in a few minutes work, eh?
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13463 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/pcm-pp.c')
-rw-r--r-- | firmware/target/arm/pcm-pp.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/firmware/target/arm/pcm-pp.c b/firmware/target/arm/pcm-pp.c index e483700e88..41bd92bd0d 100644 --- a/firmware/target/arm/pcm-pp.c +++ b/firmware/target/arm/pcm-pp.c | |||
@@ -93,13 +93,7 @@ void fiq(void) | |||
93 | "bls .fifo_full \n\t" /* FIFO full, exit */ | 93 | "bls .fifo_full \n\t" /* FIFO full, exit */ |
94 | "ldr r10, [r9], #4 \n\t" /* load two samples */ | 94 | "ldr r10, [r9], #4 \n\t" /* load two samples */ |
95 | #ifdef HAVE_AS3514 | 95 | #ifdef HAVE_AS3514 |
96 | /* The AS3514 reads 3 bytes at a time, it seems, ignoring the lowest. | 96 | "str r10, [r12, #0x40]\n\t" /* write them */ |
97 | This code seems to work well, but we may have to mask off the extra | ||
98 | bits - at the expense of a few extra cycles in the FIQ */ | ||
99 | "mov r10, r10, ror #2\n\t" /* put left sample at the top bits */ | ||
100 | "str r10, [r12, #0x40]\n\t" /* write top sample, lower sample ignored */ | ||
101 | "mov r10, r10, ror #16\n\t" /* put left sample at the top bits */ | ||
102 | "str r10, [r12, #0x40]\n\t" /* then write it */ | ||
103 | #else | 97 | #else |
104 | "mov r10, r10, ror #16\n\t" /* put left sample at the top bits */ | 98 | "mov r10, r10, ror #16\n\t" /* put left sample at the top bits */ |
105 | "str r10, [r12, #0x40]\n\t" /* write top sample, lower sample ignored */ | 99 | "str r10, [r12, #0x40]\n\t" /* write top sample, lower sample ignored */ |
@@ -184,8 +178,13 @@ void fiq(void) | |||
184 | return; | 178 | return; |
185 | } | 179 | } |
186 | 180 | ||
181 | #ifdef HAVE_AS3514 | ||
182 | IISFIFO_WR = *(int32_t *)p; | ||
183 | p += 2; | ||
184 | #else | ||
187 | IISFIFO_WR = (*(p++))<<16; | 185 | IISFIFO_WR = (*(p++))<<16; |
188 | IISFIFO_WR = (*(p++))<<16; | 186 | IISFIFO_WR = (*(p++))<<16; |
187 | #endif | ||
189 | p_size-=4; | 188 | p_size-=4; |
190 | } | 189 | } |
191 | 190 | ||
@@ -240,8 +239,13 @@ void pcm_play_dma_start(const void *addr, size_t size) | |||
240 | return; | 239 | return; |
241 | } | 240 | } |
242 | 241 | ||
242 | #ifdef HAVE_AS3514 | ||
243 | IISFIFO_WR = *(int32_t *)p; | ||
244 | p += 2; | ||
245 | #else | ||
243 | IISFIFO_WR = (*(p++))<<16; | 246 | IISFIFO_WR = (*(p++))<<16; |
244 | IISFIFO_WR = (*(p++))<<16; | 247 | IISFIFO_WR = (*(p++))<<16; |
248 | #endif | ||
245 | p_size-=4; | 249 | p_size-=4; |
246 | } | 250 | } |
247 | } | 251 | } |
@@ -315,8 +319,13 @@ void pcm_play_pause_unpause(void) | |||
315 | return; | 319 | return; |
316 | } | 320 | } |
317 | 321 | ||
322 | #ifdef HAVE_AS3514 | ||
323 | IISFIFO_WR = *(int32_t *)p; | ||
324 | p += 2; | ||
325 | #else | ||
318 | IISFIFO_WR = (*(p++))<<16; | 326 | IISFIFO_WR = (*(p++))<<16; |
319 | IISFIFO_WR = (*(p++))<<16; | 327 | IISFIFO_WR = (*(p++))<<16; |
328 | #endif | ||
320 | p_size-=4; | 329 | p_size-=4; |
321 | } | 330 | } |
322 | } | 331 | } |