From d1a3a3e148cf54569fbf0df4dca5a8db6e0e4793 Mon Sep 17 00:00:00 2001 From: Jörg Hohensohn Date: Thu, 3 Jul 2003 00:02:15 +0000 Subject: When starting from flash, we have to wait for the disk to get ready. (Quite a new situation ;-) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3803 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/ata.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'firmware/drivers/ata.c') diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index 46c2bc8645..f4e1da48c4 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c @@ -424,8 +424,18 @@ extern void ata_flush(void) static int check_registers(void) { - if ( ATA_STATUS & STATUS_BSY ) - return -1; + /* When starting from Flash, the disk is not yet ready when we get here. */ + /* Crude first fix is to block and poll here for a while, + can we do better? */ + int time = 0; + while ((ATA_STATUS & STATUS_BSY)) + { + if (time >= HZ*10) /* timeout, disk is not coming up */ + return -1; + + sleep(HZ/10); + time += HZ/10; + }; ATA_NSECTOR = 0xa5; ATA_SECTOR = 0x5a; @@ -797,14 +807,14 @@ unsigned short* ata_get_identify(void) int ata_init(void) { - mutex_init(&ata_mtx); + mutex_init(&ata_mtx); led(false); - /* Port A setup */ - PAIOR |= 0x0200; /* output for ATA reset */ - PADR |= 0x0200; /* release ATA reset */ - PACR2 &= 0xBFFF; /* GPIO function for PA7 (IDE enable) */ + /* Port A setup */ + PAIOR |= 0x0200; /* output for ATA reset */ + PADR |= 0x0200; /* release ATA reset */ + PACR2 &= 0xBFFF; /* GPIO function for PA7 (IDE enable) */ ata_enable(true); -- cgit v1.2.3