ATA (technologia)

ATA (, ) – 16-bitowy interfejs systemowy w komputerach klasy PC i Amiga przeznaczony do komunikacji z dyskami twardymi, zaproponowany w 1983 przez firmę Compaq i wprowadzony w ich komputerach, we współpracy z Western Digital, w 1984 pod nazwą IDE (ang. Integrated Drive Electronics). Nazwa ta pochodzi od innowacyjnego podejścia Western Digital do sterowania dyskiem twardym, czyli zintegrowania go z kontrolerem – wcześniej kontrolery dysków były umieszczane na kartach rozszerzeń montowanych w sloty magistrali ISA. Od 2003 (kiedy to wprowadzono Serial ATA) standard ten jest określany jako Parallel ATA, lub w skrócie PATA, aby uniknąć jego pomylenia ze standardem SATA.

Dyski twarde w technologii ATA/IDE w rozmiarze 5,25" i 3,5" zasilane są napięciem 5 V i 12 V poprzez złącze typu Molex, a w rozmiarze 2,5" napięciem 5 V poprzez pomniejszone złącze ATA z dodatkowymi 4 pinami.

Standard ATA nie jest już rozwijany w kierunku zwiększania szybkości transmisji. Początkowo stosowano oznaczenia ATA-1, ATA-2 itd., natomiast później były używane określenia związane z przepustowością interfejsu – 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żny od operacji

W 2,5" dyskach (z laptopów) stosowane są cztery dodatkowe piny:
 {| class="wikitable"
! Pin
! Funkcja
! Pin
! Funkcja
|-
| 41 || +5VDC (logic) || 42 || +5VDC (motor)
|-
| 43 || GND || 44 || Type (0==ATA)
|}

Widok złącza PATA dysku 2,5", X oznacza pin nr 1

 {| class="wikitable"
| .....................x ..
|-
| ............ ......... ..
|}

Opis rejestrów napędów ATA 
Ogólnie można wyróżnić dwa rodzaje napędów ze złączem ATA:
 dyski twarde – czyli urządzenia, które nie obsługują komend pakietowych
 napędy optyczne CD/DVD – czyli urządzenia, które obsługują komendy pakietowe

Rejestry dla urządzeń 1)
 {| class="wikitable"
! Adres
! -----
! -----
! -----
! -----
! Funkcje
! -----
|-
| !CS0 || !CS1 || DA2 || DA1 || DA0 || Odczyt !DIOR || Zapis !DIOW
|-
| || || || || || Rejestry kontrolne ||
|-
| N || A || N || x || x || Zwolniony || Nieużywany
|-
| N || A || A || N || x || Zwolniony || Nieużywany
|-
| N || A || A || A || N || Alternate Status || Device Control
|-
| N || A || A || A || A || Przestarzały || Nieużywany
|-
| || || || || || Rejestry komend ||
|-
| A || N || N || N || N || Data || Data
|-
| A || N || N || N || A || Error || Features
|-
| A || N || N || A || N || Sector Count || Sector Count
|-
| A || N || N || A || A || LBA Low || LBA Low
|-
| A || N || A || N || N || LBA Mid || LBA Mid
|-
| A || N || A || N || A || LBA High || LBA High
|-
| A || N || A || A || N || Device Select || Device Select
|-
| A || N || A || A || A || Status || Command
|-
| A || A || x || x || x || Zwolniony || Nieużywany
|}

Rejestry dla urządzeń 2)
 {| class="wikitable"
! Adres
! -----
! -----
! -----
! -----
! Funkcje
! -----
|-
| !CS0 || !CS1 || DA2 || DA1 || DA0 || Odczyt !DIOR || Zapis !DIOW
|-
| || || || || || Rejestry kontrolne ||
|-
| N || A || N || x || x || Zwolniony || Nieużywany
|-
| N || A || A || N || x || Zwolniony || Nieużywany
|-
| N || A || A || A || N || Alternate Status || Device Control
|-
| N || A || A || A || A || Przestarzały || Nieużywany
|-
| || || || || || Rejestry komend ||
|-
| A || N || N || N || N || Data || Data
|-
| A || N || N || N || A || Error || Features
|-
| A || N || N || A || N || Interrupt Reason || Sector Count
|-
| A || N || N || A || A || * || *
|-
| A || N || A || N || N || Byte Count Low || Byte Count Low
|-
| A || N || A || N || A || Byte Count High || Byte Count High
|-
| A || N || A || A || N || Device Select || Device Select
|-
| A || N || A || A || A || Status || Command
|-
| A || A || x || x || x || Zwolniony || Nieużywany
|}
 A = sygnał ustawiony (logiczna 1)
 N = sygnał zanegowany (logiczne 0)
 x = stan dowolny (0 lub 1)

Rejestrów o nazwach Zwolniony, Przestarzały, Nieużywany nie należy używać.

!CS0, !CS1 – oznacza negację pinów – to oznacza, że w rzeczywistości (na interfejs ATA) należy podawać wartości zanegowane z tabeli (tam gdzie A podawać N, tam gdzie N podawać A)

„*” rejestr używany przez dyski twarde (urządzenia nie obsługujące komend pakietowych)
Rejestr nie używany przez napędy CD/DVD (urządzenia obsługujące komendy pakietowe)

Rejestry kontrolne 
Alternate Status

 ZASTOSOWANIE: odczyt podstawowych informacji o stanie urządzenia bez kasowania obsługi przerwania
 rejestr jest tylko do odczytu, a w czasie zapisu dane trafiają do Device Control
 kiedy bit BSY=1 wtedy inne bity z tego rejestru nie powinny być interpretowane, zawartość tego rejestru nie jest prawdziwa gdy urządzenie jest w trybie uśpienia
 odczyt tego rejestru nie spowoduje skasowania obsługi przerwania
 zawartość tego rejestru jest identyczna z zawartością rejestru Status

Device Control
 ZASTOSOWANIE: rejestr ten umożliwia wykonanie programowego resetu oraz włączenie obsługi przerwania
 rejestr jest tylko do zapisu, w czasie odczytu jest to Alternate Status
 rejestr powinien być zapisywany tylko gdy DMACK=0
 zawartość tego rejestru będzie zinterpretowana przez napęd od razu po jego zapisaniu

 HOB (HighOrderByte)znaczenie tylko w przypadku dysków twardych – adres LBA 48-bitowy – gdy HOB=0 to napęd interpretuje młodszą część (0–23) adresu LBA 48-bitowego, gdy HOB=1 część starszą (24–47)
 r(6:3) (reserved) zarezerwowane
 SRST (SoftwareReSeT) reset programowy 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 16-bitowy
 dostęp (odczyt/zapis) do rejestrów jest realizowany właśnie poprzez ten rejestr tylko w trybie PIO; ponieważ rejestry są 8-bitowe to dane jakie chcemy zapisać (odczytać) do tych rejestrów ustawiamy na części młodszej rejestru (Bity DD7–DD0), część starsza nie jest interpretowana; natomiast gdy transferujemy dane z napędu to musimy korzystać 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, 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
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || # || # || # || # || # || ABRT || # || #
|}
 # zawartość tych bitów zależy od wykonanej operacji(komendy)
 ABRT (ABoRT) ABRT=1 gdy nastąpiło anulowanie wykonania komendy(na skutek nie właściwej komendy, niewłaściwego parametru w komendzie, błędu odczytu itd.)

Features
 ZASTOSOWANIE: zależnie od komendy
 rejestr jest tylko do zapisu, w czasie odczytu jest to Error
 rejestr powinien być zapisywany tylko gdy BSY=0 oraz DRQ=0 oraz DMACK=0
 zawartość tego rejestru staje się parametrem komendy po zapisaniu rejestru Command
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || # || # || # || # || # || # || # || #
|}
 # zawartość tych bitów zależy od komendy

Sector Count / Interrupt Reason
 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 Sector Count, w przypadku napędu CD/DVD jest to Interrupt Reason w czasie odczytu i Sector Count w czasie zapisu (patrz tabela)
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
|Opis || # || # || # || # || # || # || # || #
|}
 # 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
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || # || # || # || # || # || # || # || #
|}
 # 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, w przypadku napędu CD/DVD jest to Byte Count Low
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || # || # || # || # || # || # || # || #
|}
 # 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, w przypadku napędu CD/DVD jest to Byte Count High
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || # || # || # || # || # || # || # || #
|}
 # zawartość tych bitów zależy od komendy

Device Select
 ZASTOSOWANIE: wybór urządzenia master lub slave
 rejestr jest do zapisu lub odczytu
 rejestr powinien być zapisywany tylko gdy BSY=0 oraz DRQ=0 oraz DMACK=0, zawartość rejestru jest niepoprawna dla dysku twardego jest w trybie uśpienia, dla napędu CD/DVD jest poprawna w trybie uśpienia
 bit DEV jest interpretowany natychmiast po zapisaniu, reszta bitów tego rejestru staje się parametrem komendy po zapisaniu rejestru Command
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || przestarzały || # || przestarzały || DEV || # || # || # || #
|}
 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
 kiedy bit BSY=1 wtedy inne bity z tego rejestru nie powinny być interpretowane, zawartość tego rejestru nie jest prawdziwa gdy urządzenie jest w trybie uśpienia
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || BSY || DRDY || DF/SE || # || DRQ || przestarzały || przestarzały || ERR/CHK
|}
 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(ERR/CHK=1) błędu

Command
 ZASTOSOWANIE: rejestr zawiera kod komendy,rejestr ten zapisuje się 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, gdy jest odczytywany dane reprezentują zawartość rejestru Status
 rejestr powinien być zapisywany tylko gdy BSY=0 oraz DRQ=0 oraz DMACK=0
 {| class="wikitable"
! Bity
! 7
! 6
! 5
! 4
! 3
! 2
! 1
! 0
|-
| Opis || # || # || # || # || # || # || # || #
|}
 # 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 pinow 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 ustawia domyślnie 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ż 
 ATAPI
 Serial ATA

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

Magistrale