summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>2005-02-08 15:11:58 +0000
committerJean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com>2005-02-08 15:11:58 +0000
commit9c6a549ad2118cb93e4b9e638f0db1673cea6034 (patch)
tree6aeb05e2db3941ca6953d7a6588929689d3cf7ac
parent3842dc3a724a643db732e22a4f0e74a373b7bac4 (diff)
downloadrockbox-9c6a549ad2118cb93e4b9e638f0db1673cea6034.zip
rockbox-9c6a549ad2118cb93e4b9e638f0db1673cea6034.tar.gz
rockbox-9c6a549ad2118cb93e4b9e638f0db1673cea6034.tar.bz2
rockbox-9c6a549ad2118cb93e4b9e638f0db1673cea6034.tar.xz
Variants for gmini dma transfers
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@5852 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/system.c30
1 files changed, 29 insertions, 1 deletions
diff --git a/firmware/system.c b/firmware/system.c
index 757fe9e..693c4a1 100644
--- a/firmware/system.c
+++ b/firmware/system.c
@@ -27,12 +27,15 @@
void* volatile interrupt_vector[16] __attribute__ ((section(".idata")));
+void ddma_wait_idle(void) __attribute__ ((section (".icode")));
void ddma_wait_idle(void)
{
do {
} while ((DDMACOM & 3) != 0);
}
+void ddma_transfer(int dir, int mem, long intAddr, long extAddr, int num)
+ __attribute__ ((section (".icode")));
void ddma_transfer(int dir, int mem, long intAddr, long extAddr, int num) {
int irq = set_irq_level(1);
ddma_wait_idle();
@@ -52,6 +55,31 @@ void ddma_transfer(int dir, int mem, long intAddr, long extAddr, int num) {
set_irq_level(irq);
}
+static void ddma_wait_idle_noicode(void)
+{
+ do {
+ } while ((DDMACOM & 3) != 0);
+}
+
+static void ddma_transfer_noicode(int dir, int mem, long intAddr, long extAddr, int num) {
+ int irq = set_irq_level(1);
+ ddma_wait_idle_noicode();
+ long externalAddress = (long) extAddr;
+ long internalAddress = (long) intAddr;
+ /* HW wants those two in word units. */
+ num /= 2;
+ externalAddress /= 2;
+
+ DDMACFG = (dir << 1) | (mem << 2);
+ DDMAIADR = internalAddress;
+ DDMAEADR = externalAddress;
+ DDMANUM = num;
+ DDMACOM |= 0x4; /* start */
+
+ ddma_wait_idle_noicode(); /* wait for completion */
+ set_irq_level(irq);
+}
+
/* Some linker-defined symbols */
extern int icodecopy;
extern int icodesize;
@@ -86,7 +114,7 @@ void system_init(void)
/************************
* Copy .icode section to icram
*/
- ddma_transfer(0, 0, 0x40, (long)&icodecopy, (int)&icodesize);
+ ddma_transfer_noicode(0, 0, 0x40, (long)&icodecopy, (int)&icodesize);
/***************************