ATA (ang. Advanced Technology Attachment, AT Attachment)
Interfejs ATA, znany również jako AT Attachment, to 16-bitowy system komunikacyjny wykorzystywany w komputerach klasy PC oraz Amiga, stworzony z myślą o współpracy z dyskami twardymi. Został zaprezentowany w 1983 roku przez firmę Compaq i wprowadzony do użytku w ich komputerach w 1986 roku we współpracy z Western Digital, pod nazwą IDE (ang. Integrated Drive Electronics). Nazwa ta odnosi się do nowatorskiego podejścia Western Digital do kontroli dysków twardych, które polegało na zintegrowaniu kontrolera z dyskiem, w przeciwieństwie do wcześniejszej praktyki, gdzie kontrolery były instalowane na kartach rozszerzeń w slotach magistrali ISA. Od 2003 roku, po wprowadzeniu standardu Serial ATA, interfejs ten jest określany jako Parallel ATA, w skrócie PATA, aby uniknąć pomyłek z interfejsem SATA.
Zasilanie dysków
Dyski twarde wykorzystujące technologię ATA/IDE w rozmiarach 5,25″ oraz 3,5″ są zasilane napięciem 5 V i 12 V przez złącze typu Molex, natomiast dyski o rozmiarze 2,5″ korzystają z napięcia 5 V dostarczanego przez mniejsze złącze ATA z dodatkowymi 4 pinami.
Ewolucja standardu ATA
Standard ATA nie jest obecnie rozwijany w kierunku zwiększania szybkości transmisji. Początkowo oznaczenia obejmowały ATA-1, ATA-2 itd., a później zaczęto używać oznaczeń związanych z przepustowością interfejsu, takich jak ATA/33, ATA/66, ATA/100, ATA/133.
Opis złączy
- – oznacza negację pinów
- → pin ustawia host
- ← pin ustawia napęd
- ↔ pin dwukierunkowy: kierunek zależy od operacji
W dyskach 2,5″ (stosowanych w laptopach) obecne są cztery dodatkowe piny:
Widok złącza PATA dysku 2,5″, gdzie X oznacza pin nr 1.
Opis rejestrów napędów ATA
Można wyróżnić dwa typy napędów korzystających ze złącza ATA:
- dyski twarde – urządzenia, które nie obsługują komend pakietowych
- napędy optyczne CD/DVD – urządzenia, które obsługują komendy pakietowe
Rejestry dla urządzeń
- A = sygnał ustawiony (logiczna 1)
- N = sygnał zanegowany (logiczne 0)
- x = stan dowolny (0 lub 1)
Rejestry o nazwach Zwolniony, Przestarzały, Nieużywany nie powinny być używane.
!CS0, !CS1 – oznaczają negację pinów, co oznacza, że na interfejsie ATA należy podawać wartości negowane (gdzie A podawać N, a gdzie N podawać A).
„*” rejestr używany przez dyski twarde (urządzenia nie obsługujące komend pakietowych).
Rejestr nieużywany przez napędy CD/DVD (urządzenia obsługujące komendy pakietowe).
Rejestry kontrolne
Alternate Status
ZASTOSOWANIE: umożliwia odczyt podstawowych informacji o stanie urządzenia bez przerywania obsługi przerwania.
Rejestr ten jest tylko do odczytu, a w trakcie zapisu dane trafiają do rejestru Device Control.
Jeśli bit BSY=1, inne bity z tego rejestru nie powinny być interpretowane, a jego zawartość nie jest prawdziwa, gdy urządzenie jest w trybie uśpienia.
Odczyt tego rejestru nie spowoduje skasowania obsługi przerwania, a jego zawartość jest identyczna z zawartością rejestru Status.
Device Control
ZASTOSOWANIE: umożliwia programowy reset oraz włączenie obsługi przerwania.
Rejestr ten jest tylko do zapisu, a w czasie odczytu jest to Alternate Status.
Powinien być zapisywany tylko wtedy, gdy DMACK=0.
Zawartość tego rejestru będzie interpretowana przez napęd od razu po jego zapisaniu.
HOB (HighOrderByte) ma znaczenie tylko w przypadku dysków twardych – adres LBA 48-bitowy – gdy HOB=0, napęd interpretuje młodszą część (0–23) adresu LBA 48-bitowego, a gdy HOB=1, część starszą (24–47).
r(6:3) (reserved) – zarezerwowane.
SRST (SoftwareReSeT) – programowy reset napędu.
nIEN (notInterruptENable) – bit włącza przerwanie (gdy nIEN=0 i urządzenie jest wybrane) lub wyłącza przerwanie (gdy nIEN=1 lub urządzenie nie jest wybrane).
Bit 0 zawsze powinien mieć wartość 0.
Rejestry komend
Data
ZASTOSOWANIE: transfer danych (tylko w trybie PIO), dostęp do rejestrów.
Rejestr ten służy do zapisu lub odczytu.
Dostęp do rejestru powinien odbywać się w czasie przesyłania danych w trybie PIO, gdy DRQ=1 oraz BSY=0 oraz DMACK=0.
Rejestr jest 16-bitowy.
Dostęp (odczyt/zapis) do rejestrów realizowany jest właśnie poprzez ten rejestr w trybie PIO; ponieważ rejestry są 8-bitowe, dane, które chcemy zapisać (lub odczytać) ustawiamy na części młodszej rejestru (Bity DD7–DD0), a część starsza nie jest interpretowana. Gdy transferujemy dane z napędu, korzystamy z całej szerokości rejestru (Bity DD15–DD0) – nie ma możliwości pracy w trybie 8-bitowym.
Error
ZASTOSOWANIE: określenie przyczyny błędu.
Rejestr tylko do odczytu; gdy jest zapisywany, dane trafiają do rejestru Features.
Zawartość rejestru jest poprawna, gdy BSY=0 oraz DRQ=0 oraz ERR=1 lub SE=1. Po włączeniu zasilania, po wykonaniu sprzętowego lub programowego resetu, po wykonaniu komend EXECUTE DEVICE DIAGNOSTICS lub DEVICE RESET, zawartość rejestru jest niewłaściwa w trybie uśpienia.
# Zawartość tych bitów zależy od wykonanej operacji (komendy).
ABRT (ABoRT) – ABRT=1, gdy wystąpiło anulowanie wykonania komendy (w wyniku niewłaściwej komendy, błędu odczytu itd.).
Features
ZASTOSOWANIE: zależnie od komendy.
Rejestr jest tylko do zapisu; w czasie odczytu jest to Error.
Powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0.
Zawartość tego rejestru staje się parametrem komendy po zapisaniu rejestru Command.
# Zawartość tych bitów zależy od komendy.
Sector Count / Interrupt Reason
ZASTOSOWANIE: zależnie od komendy.
Rejestr jest do zapisu lub odczytu.
Powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0; zawartość rejestru jest niepoprawna, gdy urządzenie jest w trybie uśpienia.
Zawartość tego rejestru staje się parametrem komendy po zapisaniu rejestru Command.
W przypadku dysku twardego jest to rejestr Sector Count, natomiast w przypadku napędu CD/DVD jest to Interrupt Reason w czasie odczytu i Sector Count w czasie zapisu.
# Zawartość tych bitów zależy od komendy.
LBA Low
ZASTOSOWANIE: zależnie od komendy.
Rejestr jest do zapisu lub odczytu.
Rejestr powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0; zawartość rejestru jest niepoprawna, gdy urządzenie jest w trybie uśpienia.
Zawartość tego rejestru staje się parametrem komendy po zapisaniu rejestru Command.
W przypadku napędu CD/DVD rejestr ten nie jest używany.
# Zawartość tych bitów zależy od komendy.
LBA Mid / Byte Count Low
ZASTOSOWANIE: zależnie od komendy.
Rejestr jest do zapisu lub odczytu.
Rejestr powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0; zawartość rejestru jest niepoprawna, gdy urządzenie jest w trybie uśpienia.
Zawartość tego rejestru staje się parametrem komendy po zapisaniu rejestru Command.
W przypadku dysku twardego jest to rejestr LBA Mid, a w przypadku napędu CD/DVD jest to Byte Count Low.
# Zawartość tych bitów zależy od komendy.
LBA High / Byte Count High
ZASTOSOWANIE: zależnie od komendy.
Rejestr jest do zapisu lub odczytu.
Rejestr powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0; zawartość rejestru jest niepoprawna, gdy urządzenie jest w trybie uśpienia.
Zawartość tego rejestru staje się parametrem komendy po zapisaniu rejestru Command.
W przypadku dysku twardego jest to rejestr LBA High, a w przypadku napędu CD/DVD jest to Byte Count High.
# Zawartość tych bitów zależy od komendy.
Device Select
ZASTOSOWANIE: wybór urządzenia master lub slave.
Rejestr jest do zapisu lub odczytu.
Powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0; zawartość rejestru jest niepoprawna dla dysku twardego, gdy jest w trybie uśpienia, natomiast dla napędu CD/DVD jest poprawna w trybie uśpienia.
Bit DEV jest interpretowany natychmiast po zapisaniu, a reszta bitów tego rejestru staje się parametrem komendy po zapisaniu rejestru Command.
Zapis do bitów przestarzałych będzie ignorowany przez napęd.
DEV (DEVice) – DEV=0 wybór urządzenia Master, DEV=1 wybór urządzenia Slave.
# Zawartość tych bitów zależy od komendy.
Status
ZASTOSOWANIE: odczyt podstawowych informacji o stanie urządzenia oraz kasowanie obsługi przerwania.
Rejestr jest do odczytu; gdy jest zapisywany, dane trafiają do rejestru Command.
Jeśli bit BSY=1, inne bity z tego rejestru nie powinny być interpretowane, a jego zawartość nie jest prawdziwa, gdy urządzenie jest w trybie uśpienia.
BSY (BuSY) informuje, że urządzenie jest zajęte (gdy BSY=1).
DRDY (DeviceReaDY) informuje o gotowości (gdy DRDY=1) urządzenia.
DF/SE (DeviceFault/StreamError) informuje o błędzie (gdy DF/SE=1); nie wszystkie komendy obsługują (ustawiają) ten bit.
# Zawartość zależna od komendy.
DRQ (DataReQuest) informuje o żądaniu (DRQ=1) przesyłania danych z/do napędu.
ERR/CHK (ERRor/CHecK) informuje o wystąpieniu błędu (ERR/CHK=1).
Command
ZASTOSOWANIE: rejestr zawiera kod komendy; zapisuje się go na końcu (po zapisaniu wszystkich innych rejestrów). Po zapisaniu tego rejestru urządzenie przystępuje do wykonania komendy, a pozostałe rejestry przeznaczone do zapisu mogą stać się parametrami komendy (zależnie od rodzaju komendy).
Rejestr jest do zapisu, a gdy jest odczytywany, dane reprezentują zawartość rejestru Status.
Powinien być zapisywany tylko, gdy BSY=0 oraz DRQ=0 oraz DMACK=0.
# Zawartość tych bitów reprezentuje kod komendy – np. kod 0xA0 jest komendą identyfikacji urządzenia.
Przykłady obsługi urządzenia
Sprzętowy reset
Sprzętowy reset powinien być wykonany co najmniej raz po włączeniu zasilania.
Przykład w języku asembler dla mikrokontrolerów AVR:
Resetdrive: cbi porte,RESET_ ;ustaw reset(czyli !RESET=0) sbi portd,c0 ;!C0=1→C0=0 sbi portd,c1 ;!C1=1→C1=0 cbi portd,a0 ;A0=0 cbi portd,a1 ;A1=0 cbi portd,a2 ;A2=0 sbi portd,dmack ;!DMACK=1→DMACK=0 sbi Porte,dior ;!DIOR=1→DIOR=0 sbi Porte,diow ;!DIOW=1→DIOW=0 Ddra = 0 ;porta podłączony do pinów DD8-DD15 Ddrc = 0 ;portc podłączony do pinów DD0-DD7 rcall czekaj25us ;minimum 25us sbi porte,RESET_ ;wyzeruj reset(czyli !RESET=1) rcall czekaj2ms ;minimum 2ms rcall Read_status_register_bsy0 ;czekaj na BSY=0 Ret
Po wykonaniu tej procedury można założyć, że urządzenie jest prawidłowo „zresetowane”.
Odczyt rejestru Status i oczekiwanie na BSY=0
Po zresetowaniu urządzenie domyślnie ustawia tryb pracy na PIO0. Tryb pracy można zmienić (na PIO0-4, MWDMA0-2 lub UDMA 0–6) za pomocą komendy SET FEATURES.
Niezbędne opóźnienia są generowane za pomocą instrukcji nop i są poprawne dla trybu PIO0.
Read_status_register_bsy0: push GPR ldi GPR,0 Out ddrc , Gpr ;1 cykl Out ddra , Gpr ;1 cykl;ustawia port danych DD15-DD0 jako wejście ldi GPR,0b10111100 Out portd , Gpr ;bity⇒|7-!CS1|6-!CS0|5-DA2|4-DA0|3-DA1|2-!DMACK|1-IORDY|0-DMARQ| Petla_stat: nop;---czekaj--------------------------70ns min—nop=ok.62,5ns dla zegara 16 MHz nop cbi porte,DIOR nop;---czekaj---------------------------230ns min nop nop nop in GPR,pinc ;minęło co najmniej 230ns, dane gotowe do odczytu sts Status,GPR nop;---czekaj---------------------------dane muszą być "ustawione" min 60ns sbi porte,DIOR nop;---czekaj---------------------------dane muszą być "przytrzymane" min 30ns sbrc GPR,7 ;BSY=? w tej chwili GPR jako STATUS rjmp petla_stat ;BSY=1 ;BSY=0 pop GPR Ret
Zobacz też
Bibliografia
- T13/Project 1532D Volume 1 Revision 4b 21 April 2004
- T13/Project 1532D Volume 2 Revision 4b 21 April 2004
- T13/Project 1532D Volume 3 Revision 4b 21 April 2004
Linki zewnętrzne
Strona informacyjna na temat interfejsów ATA (IDE/EIDE), Serial ATA (SATA), ATAPI