diff options
author | Daniel Ankers <dan@weirdo.org.uk> | 2007-02-04 03:20:36 +0000 |
---|---|---|
committer | Daniel Ankers <dan@weirdo.org.uk> | 2007-02-04 03:20:36 +0000 |
commit | 67ec6177a7ed1934cf2ef97f0863c07f40498cc8 (patch) | |
tree | 255ff7ceea5364c0507589e7e9c825b007a00318 /firmware | |
parent | a7af649766ff3a673783ac375a264ab69fbbe104 (diff) | |
download | rockbox-67ec6177a7ed1934cf2ef97f0863c07f40498cc8.tar.gz rockbox-67ec6177a7ed1934cf2ef97f0863c07f40498cc8.zip |
Work around a bug in the Sansa flash driver
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12187 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/target/arm/sandisk/sansa-e200/ata-e200.c | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/firmware/target/arm/sandisk/sansa-e200/ata-e200.c b/firmware/target/arm/sandisk/sansa-e200/ata-e200.c index b94363e6b1..bfb0d27f97 100644 --- a/firmware/target/arm/sandisk/sansa-e200/ata-e200.c +++ b/firmware/target/arm/sandisk/sansa-e200/ata-e200.c @@ -267,27 +267,14 @@ static void copy_write_sectors(const unsigned char* buf, int wordcount) static void copy_write_sectors(const unsigned char* buf, int wordcount) { - if ( (unsigned long)buf & 1) - { /* not 16-bit aligned, copy byte by byte */ - unsigned short tmp = 0; - const unsigned char* bufend = buf + wordcount*2; - do - { - tmp = (unsigned short) *buf++; - tmp |= (unsigned short) *buf++ << 8; - DATA_REG = tmp; - } while (buf < bufend); /* tail loop is faster */ - } - else - { /* 16-bit aligned, can do faster copy */ - unsigned short* wbuf = (unsigned short*)buf; - unsigned short* wbufend = wbuf + wordcount; - do - { - DATA_REG = *wbuf; - asm volatile("nop\n\t"); - } while (++wbuf < wbufend); /* tail loop is faster */ - } + unsigned short tmp = 0; + const unsigned char* bufend = buf + wordcount*2; + do + { + tmp = (unsigned short) *buf++; + tmp |= (unsigned short) *buf++ << 8; + DATA_REG = tmp; + } while (buf < bufend); /* tail loop is faster */ } |