summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/ata_flash.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/firmware/drivers/ata_flash.c b/firmware/drivers/ata_flash.c
index ccdc8c2443..078cc6b494 100644
--- a/firmware/drivers/ata_flash.c
+++ b/firmware/drivers/ata_flash.c
@@ -149,6 +149,7 @@ int flash_read_id(int no) {
149int flash_read_sector(int sector, unsigned char* buf, 149int flash_read_sector(int sector, unsigned char* buf,
150 unsigned char* oob) 150 unsigned char* oob)
151{ 151{
152 unsigned long *bufl = (unsigned long *)buf;
152 int chip, chip_sector; 153 int chip, chip_sector;
153 int i; 154 int i;
154 155
@@ -167,8 +168,29 @@ int flash_read_sector(int sector, unsigned char* buf,
167 168
168 flash_wait_ready(); 169 flash_wait_ready();
169 170
170 for (i = 0; i < 512; i++) 171 if ((unsigned long)buf & 3)
171 buf[i] = flash_read_data(); 172 {
173 for (i = 0; i < 512; i++)
174 buf[i] = flash_read_data();
175 }
176 else
177 {
178 for (i = 0; i < 512 / 4; i++) {
179 unsigned long v;
180#ifdef ROCKBOX_LITTLE_ENDIAN
181 v = flash_read_data();
182 v |= (unsigned long)flash_read_data() << 8;
183 v |= (unsigned long)flash_read_data() << 16;
184 v |= (unsigned long)flash_read_data() << 24;
185#else
186 v = (unsigned long)flash_read_data() << 24;
187 v |= (unsigned long)flash_read_data() << 16;
188 v |= (unsigned long)flash_read_data() << 8;
189 v |= flash_read_data();
190#endif
191 bufl[i] = v;
192 }
193 }
172 194
173 flash_write_cmd(0x05); 195 flash_write_cmd(0x05);
174 flash_write_addr((chip_sector & 3) * 0x10); 196 flash_write_addr((chip_sector & 3) * 0x10);