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 ();