Hi,
Habe auf meinem ATMega 1284P PATA zum laufen gebracht. Von den 6 Platten
die ich noch hier habe, funktionieren 5 offenbar inzw. problemlos. Kann
jedenfalls lesen und schreiben ohne Probleme. Die älteste ist eine
Samsung 560MB Platte von 1995.
Eine Platte bereitet mir jedoch Sorgen. Eine WD Caviar 31600 von 1996.
Sobald ich das READ SECTOR(S) Kommando absetze, quitiert sie das mit dem
Error Status Register 0x04 (Command Aborted). Der Alternate Status steht
auf 0x40 (Drive Ready), der Status steht auf 0x51 danach (Error, Drive
Ready, Drive Seek Complete).
Initialisiert wird die Platte wie folgt:
- warte 200ms
- warte bis Rdy und nicht mehr Bsy
- Schreibe ins Device Head Register 0x40
- warte bis Rdy und nicht mehr Bsy
- Schreibe ins Feature Register 3
- schreibe ins Sector Count Register 1
- Schreibe ins Command-Register "Set Features"
- warte bis nicht mehr bsy
- Schreibe ins Command-Register "Recalibrate"
Damit sollte die Platte auf den Default-PIO-Mode ohne IORDY eingestellt
sein - auch wenn man den ganzen Set Features block auslaesst taucht der
Fehler auf.
!!
Danach setze ich ein "Identify Device" ab, und die zurückgelesenen
16Bit-Werte sind OK - Model Name, Firmware-Ver, Sektor usw. sind korrekt
!!
--> 16Bit von der Platte lesen funzt also grundsaetzlich schon....
Ich gehe beim lesen von Sektor 0 wie folgt beim lesen vor:
1. Setzen Sector Count Register auf 1
2. Setzen Sector Number Register auf 0
3. Setzen Cylinder Low Register auf 0
4. Setzen Cylinder High Register auf 0
bis hierhin nach jedem CMD: Err 0x00, AltStat 0xe0, Stat 0x50
5. Setzen Device Head Register auf 0x40 (-> LBA)
jetzt: Err 0x00, AltStat 0x40, Stat 0x50
6. Setzen Command Register auf 0x20 (READ SECTOR(S))
jetzt: Err 0x04, AltStat 0x40, Stat 0x59
(Eine funktionierende: Err 0xd0, AltStat 0x40, Stat 0x58)
Hier taucht also schon der Fehler auf...
Nun geht es so weiter:
7. Setze AVR-Port auf Eingabe
8. Warte bis HDD nicht mehr Busy und DRQ auf High
9. Nehme entsprechende CS und DA Pins auf Low
10. Aktiviere /RD, nop(), nop(), nop()
11. Lese Low-Byte
12. Gleichzeitig wird High-Byte in einem '573 gespeichert
13. Deaktiviere /RD
14. Output-Enable des '573, nop(), nop(), nop()
15. Lese High-Byte
15. Output-Disable des '573
16. Goto 10. Bis 512B gelesen
17. Setze alle CS und DA Pins auf High
Ich habe auch schonmal die LBA-Register welche vor dem READ SECTOR(S)
gefuellt werden nochmal zurueckgelesen. Es stehen die Werte drinn,
welche ich vorher eingetragen habe.
Achja... an einem PC kann ich mit dem LW im WDMA2-Modus problemlos Daten
lesen und schreiben - irgendwas muss ich also falsch machen.
Hat einer Eine Idee, wiso mein Laufwerk das Read-Sectors Command nicht
mag?