diff options
| author | Jean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com> | 2005-02-08 15:11:58 +0000 |
|---|---|---|
| committer | Jean-Philippe Bernardy <jeanphilippe.bernardy@gmail.com> | 2005-02-08 15:11:58 +0000 |
| commit | 9c6a549ad2118cb93e4b9e638f0db1673cea6034 (patch) | |
| tree | 6aeb05e2db3941ca6953d7a6588929689d3cf7ac | |
| parent | 3842dc3a724a643db732e22a4f0e74a373b7bac4 (diff) | |
| download | rockbox-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.c | 30 |
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); /*************************** |