ATA (technologia)

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