10. Protocol Overview

Commands can be grouped into different classes according to the protocols 
followed for command execution. The command classes with their associated 
protocols are defined below.

For all commands, the host first checks if BSY=1, and should proceed no 
further unless and until BSY=0. For most commands, the host will also wait for 
DRDY=1 before proceeding. Those commands shown with DRDY=x can be executed 
when DRDY=0. 

Data transfers may be accomplished in more ways than are described below, but 
these sequences should work with all known implementations of ATA drives. 

10.1  PIO Data In Commands

This class includes:

 - Identify Drive
 - Read Buffer
 - Read Long
 - Read Sector(s)

Execution includes the transfer of one or more 512 byte (>512 bytes on Read 
Long) sectors of data from the drive to the host. 

 a) The host writes any required parameters to the Features, Sector Count, 
    Sector Number, Cylinder and Drive/Head registers.
 b) The host writes the command code to the Command Register.
 c) The drive sets BSY and prepares for data transfer.
 d) When a sector of data is available, the drive sets DRQ and clears BSY 
    prior to asserting INTRQ.
 e) After detecting INTRQ, the host reads the Status Register, then reads one 
    sector of data via the Data Register. In response to the Status Register 
    being read, the drive negates INTRQ. 
 f) The drive clears DRQ. If transfer of another sector is required, the drive 
    also sets BSY and the above sequence is repeated from d).

10.1.1  PIO Read Command

 +- a) -+-- b) -+        +- e) -+--------+       +- e) -+--------+ 
 |Setup | Issue |        | Read |Transfer|       | Read |Transfer| 
 |      |Command|        |Status|  Data  |:::::::|Status|  Data  | 
 +------+-------+        +------+--------+       +------+--------+ 
 |BSY=0 |       |BSY=1   |BSY=0 |        |BSY=1  |BSY=0 |        |BSY=1
        |DRDY=1          |      |        |       |      |        |
                         |DRQ=1 |        |DRQ=0  |DRQ=1 |        |DRQ=0
                         |Assert|Negate  |       |Assert|Negate
                          INTRQ  INTRQ            INTRQ  INTRQ 

If Error Status is presented, the drive is prepared to transfer data, and it 
is at the host's discretion that the data is transferred. 

10.1.2  PIO Read Aborted Command

 +- a) -+-- b) -+        +- e) -+
 |Setup | Issue |        | Read |
 |      |Command|        |Status|
 +------+-------+        +------+
 |BSY=0 |       |BSY=1   |BSY=0 |      
        |DRDY=1          |      |
                         |DRQ=1 |DRQ=0
                         |Assert|Negate
                          INTRQ  INTRQ

Although DRQ=1, there is no data to be transferred under this condition.

10.2  PIO Data Out Commands

This class includes:

 - Format 
 - Write Buffer
 - Write Long
 - Write Sector(s)

Execution includes the transfer of one or more 512 byte (>512 bytes on Write 
Long) sectors of data from the drive to the host. 

 a) The host writes any required parameters to the Features, Sector Count, 
    Sector Number, Cylinder and Drive/Head registers.
 b) The host writes the command code to the Command Register.
 c) The drive sets DRQ when it is ready to accept the first sector of data.
 d) The host writes one sector of data via the Data Register.
 e) The drive clears DRQ and sets BSY.
 f) When the drive has completed processing of the sector, it clears BSY and 
    asserts INTRQ. If transfer of another sector is required, the drive also 
    sets DRQ.
 g) After detecting INTRQ, the host reads the Status Register.
 h) The drive clears the interrupt.
 i) If transfer of another sector is required, the above sequence is repeated 
    from d).

10.2.1  PIO Write Command

 +- a) -+-- b) -+      +--------+      +- e) -+--------+       +- e) -+
 |Setup | Issue |      |Transfer|      | Read |Transfer|       | Read |
 |      |Command|      |  Data  |      |Status|  Data  |:::::::|Status|
 +------+-------+      +--------+      +------+--------+       +------+
 |BSY=0 |       |BSY=1 |BSY=0   |BSY=1 |BSY=0 |        |BSY=1  |BSY=0 |
        |DRDY=1        |        |      |      |        |       |      |
                       |DRQ=1   |DRQ=0 |DRQ=1 |        |DRQ=0  |      |
                       |        |      |Assert|Negate  |       |Assert|Negate
                                        INTRQ  INTRQ            INTRQ  INTRQ 

10.2.2  PIO Write Aborted Command

 +- a) -+-- b) -+       +- e) -+
 |Setup | Issue |       | Read |
 |      |Command|       |Status|
 +------+-------+       +------+
 |BSY=0 |       |BSY=1  |BSY=0 |
        |DRDY=1         |      |
        |               |Assert|Negate
                         INTRQ  INTRQ 

10.3  Non-Data Commands

This class includes:

 - Execute Drive Diagnostic (DRDY=x)
 - Idle
 - Initialize Drive Parameters (DRDY=x)
 - Read Power Mode
 - Read Verify Sector(s)
 - Recalibrate
 - Seek
 - Set Features 
 - Set Multiple Mode
 - Standby

Execution of these commands involves no data transfer.

 a) The host writes any required parameters to the Features, Sector Count, 
    Sector Number, Cylinder and Drive/Head registers.
 b) The host writes the command code to the Command Register.
 c) The drive sets BSY. 
 d) When the drive has completed processing, it clears BSY and asserts INTRQ. 
 g) The host reads the Status Register.
 h) The drive negates INTRQ.

10.4  Miscellaneous Commands

This class includes:

 - Read Multiple
 - Sleep
 - Write Multiple
 - Write Same

The protocol for these commands is contained in the individual command 
descriptions.

10.5  DMA Data Transfer Commands (Optional)

This class comprises:

 - Read DMA
 - Write DMA

Data transfers using DMA commands differ in two ways from PIO transfers:

 - data transfers are performed using the slave-DMA channel 
 - no intermediate sector interrupts are issued on multi-sector commands 

Initiation of the DMA transfer commands is identical to the Read Sector or 
Write Sector commands except that the host initializes the slave-DMA channel 
prior to issuing the command.

The interrupt handler for DMA transfers is different in that:

 - no intermediate sector interrupts are issued on multi-sector commands
 - the host resets the DMA channel prior to reading status from the drive.

The DMA protocol allows high performance multi-tasking operating systems to 
eliminate processor overhead associated with PIO transfers. 

 a) Command Phase
    1) Host initializes the slave-DMA channel
    2) Host updates the Command Block Registers
    3) Host writes command code to the Command Register
 b) Data Phase - the register contents are not valid during a DMA Data Phase.
    1) The slave-DMA channel qualifies data transfers to and from the drive 
       with DMARQ
 c) Status Phase
    1) Drive generates the interrupt to the host
    2) Host resets the slave-DMA channel
    3) Host reads the Status Register and Error Register

10.5.1  Normal DMA Transfer

 +--------------+-------+      +---------------------+  +---------+------+
 |Initialize DMA|Command|      |  DMA Data Transfer  |  |Reset DMA|Status|
 +--------------+-------+      +---------------------+  +---------+------+
 |BSY=0                 |BSY=1 |BSY=x                   |BSY=1    |BSY=0
                               |DRQ=x                   |nIEN=0

10.5.2  Aborted DMA Transfer

 +--------------+-------+      +-------------+  +---------+------+
 |Initialize DMA|Command|      |    DMA Data |  |Reset DMA|Status|
 +--------------+-------+      +-------------+  +---------+------+
 |BSY=0                 |BSY=1 |BSY=x           |BSY=1    |BSY=0
                               |DRQ=1           |nIEN=0

10.5.3  Aborted DMA Command

 +--------------+-------+      +---------+------+
 |Initialize DMA|Command|      |Reset DMA|Status|
 +--------------+-------+      +---------+------+
 |BSY=0                 |BSY=1 |BSY=1    |BSY=0
                               |nIEN=0

