Added ATA spindown


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@543 a1c6a512-1295-4272-9138-f99709370657
diff --git a/gdb/sh-stub.c b/gdb/sh-stub.c
index 2eb6a5d..7a717e0 100644
--- a/gdb/sh-stub.c
+++ b/gdb/sh-stub.c
@@ -409,6 +409,52 @@
 static char remcomInBuffer[BUFMAX];
 static char remcomOutBuffer[BUFMAX];
 
+#define ATA_NSECTOR     (*((volatile unsigned char*)0x06100102))
+#define ATA_COMMAND     (*((volatile unsigned char*)0x06100107))
+#define ATA_CONTROL     (*((volatile unsigned char*)0x06200306))
+#define ATA_ALT_STATUS  ATA_CONTROL
+
+#define STATUS_BSY      0x80
+#define STATUS_RDY      0x40
+
+#define CMD_STANDBY_IMMEDIATE      0xE0
+#define CMD_STANDBY                0xE2
+
+void ata_wait_for_bsy(void)
+{
+    while (ATA_ALT_STATUS & STATUS_BSY);
+}
+
+int ata_wait_for_rdy(void)
+{
+    ata_wait_for_bsy();
+    return ATA_ALT_STATUS & STATUS_RDY;
+}
+
+int ata_spindown(int time)
+{
+    /* activate ATA */
+    PADR &= ~0x80;
+
+    if(!ata_wait_for_rdy())
+        return -1;
+
+    if ( time == -1 ) {
+        ATA_COMMAND = CMD_STANDBY_IMMEDIATE;
+    }
+    else {
+        if (time > 255)
+            return -1;
+        ATA_NSECTOR = time & 0xff;
+        ATA_COMMAND = CMD_STANDBY;
+    }
+
+    if (!ata_wait_for_rdy())
+        return -1;
+
+    return 0;
+}
+
 void blink(void)
 {
     while(1)
@@ -1097,6 +1143,8 @@
     dofault = 1;
     stepped = 0;
 
+    ata_spindown(-1);
+    
     stub_sp = stub_stack;
     breakpoint ();