diff options
author | Björn Stenberg <bjorn@haxx.se> | 2002-04-27 14:19:00 +0000 |
---|---|---|
committer | Björn Stenberg <bjorn@haxx.se> | 2002-04-27 14:19:00 +0000 |
commit | 6c9e57810d6b07d4f05e4e7be14913b91083e2c3 (patch) | |
tree | 45bd8efa6f2dd675ce8e555736784a1347d72d7d /firmware | |
parent | 2d00952708ece12a044776315908b571813608d6 (diff) | |
download | rockbox-6c9e57810d6b07d4f05e4e7be14913b91083e2c3.tar.gz rockbox-6c9e57810d6b07d4f05e4e7be14913b91083e2c3.zip |
Added ata_spindown() and use of ALT_STATUS instead of STATUS
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@259 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/drivers/ata.c | 42 | ||||
-rw-r--r-- | firmware/drivers/ata.h | 12 |
2 files changed, 49 insertions, 5 deletions
diff --git a/firmware/drivers/ata.c b/firmware/drivers/ata.c index cb4e1e6b90..24abecdb5c 100644 --- a/firmware/drivers/ata.c +++ b/firmware/drivers/ata.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #define ATA_COMMAND (*((volatile unsigned char*)0x06100107)) | 31 | #define ATA_COMMAND (*((volatile unsigned char*)0x06100107)) |
32 | #define ATA_STATUS ATA_COMMAND | 32 | #define ATA_STATUS ATA_COMMAND |
33 | #define ATA_CONTROL (*((volatile unsigned char*)0x06100306)) | 33 | #define ATA_CONTROL (*((volatile unsigned char*)0x06100306)) |
34 | #define ATA_ALT_STATUS ATA_CONTROL | ||
34 | 35 | ||
35 | #define SELECT_LBA 0x40 | 36 | #define SELECT_LBA 0x40 |
36 | 37 | ||
@@ -52,7 +53,7 @@ | |||
52 | static int wait_for_bsy(void) | 53 | static int wait_for_bsy(void) |
53 | { | 54 | { |
54 | char timeout = current_tick + HZ; | 55 | char timeout = current_tick + HZ; |
55 | while (TIME_BEFORE(current_tick, timeout) && (ATA_STATUS & STATUS_BSY)) | 56 | while (TIME_BEFORE(current_tick, timeout) && (ATA_ALT_STATUS & STATUS_BSY)) |
56 | yield(); | 57 | yield(); |
57 | 58 | ||
58 | if (TIME_BEFORE(current_tick, timeout)) | 59 | if (TIME_BEFORE(current_tick, timeout)) |
@@ -65,21 +66,21 @@ static int wait_for_rdy(void) | |||
65 | { | 66 | { |
66 | if (!wait_for_bsy()) | 67 | if (!wait_for_bsy()) |
67 | return 0; | 68 | return 0; |
68 | return ATA_STATUS & STATUS_RDY; | 69 | return ATA_ALT_STATUS & STATUS_RDY; |
69 | } | 70 | } |
70 | 71 | ||
71 | static int wait_for_start_of_transfer(void) | 72 | static int wait_for_start_of_transfer(void) |
72 | { | 73 | { |
73 | if (!wait_for_bsy()) | 74 | if (!wait_for_bsy()) |
74 | return 0; | 75 | return 0; |
75 | return (ATA_STATUS & (STATUS_RDY|STATUS_DRQ)) == (STATUS_RDY|STATUS_DRQ); | 76 | return (ATA_ALT_STATUS & (STATUS_BSY|STATUS_DRQ)) == STATUS_DRQ; |
76 | } | 77 | } |
77 | 78 | ||
78 | static int wait_for_end_of_transfer(void) | 79 | static int wait_for_end_of_transfer(void) |
79 | { | 80 | { |
80 | if (!wait_for_bsy()) | 81 | if (!wait_for_bsy()) |
81 | return 0; | 82 | return 0; |
82 | return (ATA_STATUS & (STATUS_RDY|STATUS_DRQ)) == STATUS_RDY; | 83 | return (ATA_ALT_STATUS & (STATUS_RDY|STATUS_DRQ)) == STATUS_RDY; |
83 | } | 84 | } |
84 | 85 | ||
85 | int ata_read_sectors(unsigned long start, | 86 | int ata_read_sectors(unsigned long start, |
@@ -107,6 +108,11 @@ int ata_read_sectors(unsigned long start, | |||
107 | 108 | ||
108 | for (j=0; j<256; j++) | 109 | for (j=0; j<256; j++) |
109 | ((unsigned short*)buf)[j] = SWAB16(ATA_DATA); | 110 | ((unsigned short*)buf)[j] = SWAB16(ATA_DATA); |
111 | |||
112 | #ifdef USE_INTERRUPT | ||
113 | /* reading the status register clears the interrupt */ | ||
114 | j = ATA_STATUS; | ||
115 | #endif | ||
110 | } | 116 | } |
111 | 117 | ||
112 | led_turn_off(); | 118 | led_turn_off(); |
@@ -139,6 +145,11 @@ int ata_write_sectors(unsigned long start, | |||
139 | 145 | ||
140 | for (j=0; j<256; j++) | 146 | for (j=0; j<256; j++) |
141 | ATA_DATA = SWAB16(((unsigned short*)buf)[j]); | 147 | ATA_DATA = SWAB16(((unsigned short*)buf)[j]); |
148 | |||
149 | #ifdef USE_INTERRUPT | ||
150 | /* reading the status register clears the interrupt */ | ||
151 | j = ATA_STATUS; | ||
152 | #endif | ||
142 | } | 153 | } |
143 | 154 | ||
144 | led_turn_off (); | 155 | led_turn_off (); |
@@ -193,6 +204,27 @@ static int freeze_lock(void) | |||
193 | return 0; | 204 | return 0; |
194 | } | 205 | } |
195 | 206 | ||
207 | int ata_spindown(int time) | ||
208 | { | ||
209 | if (!wait_for_rdy()) | ||
210 | return -1; | ||
211 | |||
212 | if ( time == -1 ) { | ||
213 | ATA_COMMAND = CMD_STANDBY_IMMEDIATE; | ||
214 | } | ||
215 | else { | ||
216 | if (time > 255) | ||
217 | return -1; | ||
218 | ATA_NSECTOR = time & 0xff; | ||
219 | ATA_COMMAND = CMD_STANDBY; | ||
220 | } | ||
221 | |||
222 | if (!wait_for_rdy()) | ||
223 | return -1; | ||
224 | |||
225 | return 0; | ||
226 | } | ||
227 | |||
196 | int ata_hard_reset(void) | 228 | int ata_hard_reset(void) |
197 | { | 229 | { |
198 | clear_bit(1,PADR); | 230 | clear_bit(1,PADR); |
diff --git a/firmware/drivers/ata.h b/firmware/drivers/ata.h index 50cd85d755..38e45d9e45 100644 --- a/firmware/drivers/ata.h +++ b/firmware/drivers/ata.h | |||
@@ -19,6 +19,18 @@ | |||
19 | #ifndef __ATA_H__ | 19 | #ifndef __ATA_H__ |
20 | #define __ATA_H__ | 20 | #define __ATA_H__ |
21 | 21 | ||
22 | /* | ||
23 | ata_spindown() time values: | ||
24 | -1 Immediate spindown | ||
25 | 0 Timeout disabled | ||
26 | 1-240 (time * 5) seconds | ||
27 | 241-251((time - 240) * 30) minutes | ||
28 | 252 21 minutes | ||
29 | 253 Period between 8 and 12 hrs | ||
30 | 254 Reserved | ||
31 | 255 21 min 15 s | ||
32 | */ | ||
33 | extern int ata_spindown(int time); | ||
22 | extern int ata_hard_reset(void); | 34 | extern int ata_hard_reset(void); |
23 | extern int ata_soft_reset(void); | 35 | extern int ata_soft_reset(void); |
24 | extern int ata_init(void); | 36 | extern int ata_init(void); |