summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/ata.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c
index fa51259d99..d75544ef3a 100644
--- a/firmware/drivers/ata.c
+++ b/firmware/drivers/ata.c
@@ -21,6 +21,7 @@
21#include "led.h" 21#include "led.h"
22#include "sh7034.h" 22#include "sh7034.h"
23#include "system.h" 23#include "system.h"
24#include "debug.h"
24 25
25#define ATA_DATA (*((volatile unsigned short*)0x06104100)) 26#define ATA_DATA (*((volatile unsigned short*)0x06104100))
26#define ATA_ERROR (*((volatile unsigned char*)0x06100101)) 27#define ATA_ERROR (*((volatile unsigned char*)0x06100101))
@@ -32,7 +33,7 @@
32#define ATA_SELECT (*((volatile unsigned char*)0x06100106)) 33#define ATA_SELECT (*((volatile unsigned char*)0x06100106))
33#define ATA_COMMAND (*((volatile unsigned char*)0x06100107)) 34#define ATA_COMMAND (*((volatile unsigned char*)0x06100107))
34#define ATA_STATUS ATA_COMMAND 35#define ATA_STATUS ATA_COMMAND
35#define ATA_CONTROL (*((volatile unsigned char*)0x06100306)) 36#define ATA_CONTROL (*((volatile unsigned char*)0x06200306))
36#define ATA_ALT_STATUS ATA_CONTROL 37#define ATA_ALT_STATUS ATA_CONTROL
37 38
38#define SELECT_LBA 0x40 39#define SELECT_LBA 0x40
@@ -59,9 +60,13 @@ static int wait_for_bsy(void)
59 yield(); 60 yield();
60 61
61 if (TIME_BEFORE(current_tick, timeout)) 62 if (TIME_BEFORE(current_tick, timeout))
63 {
62 return 1; 64 return 1;
65 }
63 else 66 else
67 {
64 return 0; /* timeout */ 68 return 0; /* timeout */
69 }
65} 70}
66 71
67static int wait_for_rdy(void) 72static int wait_for_rdy(void)
@@ -210,7 +215,7 @@ static int freeze_lock(void)
210 215
211int ata_spindown(int time) 216int ata_spindown(int time)
212{ 217{
213 if (!wait_for_rdy()) 218 if(!wait_for_rdy())
214 return -1; 219 return -1;
215 220
216 if ( time == -1 ) { 221 if ( time == -1 ) {
@@ -231,11 +236,11 @@ int ata_spindown(int time)
231 236
232int ata_hard_reset(void) 237int ata_hard_reset(void)
233{ 238{
234 clear_bit(1,PADR); 239 PADR &= ~0x0002;
235 sleep(HZ/500);
236 240
237 set_bit(1,PADR); 241 sleep(2);
238 sleep(HZ/500); 242
243 PADR |= 0x0002;
239 244
240 return wait_for_rdy(); 245 return wait_for_rdy();
241} 246}
@@ -257,7 +262,7 @@ int ata_init(void)
257 led(FALSE); 262 led(FALSE);
258 263
259 /* activate ATA */ 264 /* activate ATA */
260 PADR |= 0x80; 265 PADR &= ~0x80;
261 266
262 if (!ata_hard_reset()) 267 if (!ata_hard_reset())
263 return -1; 268 return -1;
@@ -265,12 +270,15 @@ int ata_init(void)
265 if (!check_registers()) 270 if (!check_registers())
266 return -2; 271 return -2;
267 272
268 if (!check_harddisk()) 273// if (!check_harddisk())
269 return -3; 274// return -3;
270 275
271 if (!freeze_lock()) 276 if (freeze_lock() < 0)
272 return -4; 277 return -4;
273 278
279// if(ata_spindown(-1) < 0)
280// return -5;
281
274 ATA_SELECT = SELECT_LBA; 282 ATA_SELECT = SELECT_LBA;
275 ATA_CONTROL = CONTROL_nIEN; 283 ATA_CONTROL = CONTROL_nIEN;
276 284