bloggerads

2014年4月26日 星期六

IDE (Integrated Drive Electronics) controller

IDE是早期用來控制碟機的spec, 目前已完全被AHCI所取代。

Q: 為什麼還是要學IDE protocol呢?
A: 因為Intel目前為止的設計,還是保留著支援IDE的彈性,在一些老系統(如xp)也只有IDE driver。通常都會讓使用者自行透過Bios選項將AHCI controller切換成IDE controller,這時Driver/Bios的控制硬碟方式就要改成IDE,所以還是有學習的價值。

Q: Why not default use IDE in modern PC?
A: IDE原理是控制IO register去下ATA command,除了速度慢以外。最大問題是他的設計是古老的思維而限制住他未來擴充的彈性,因此在2003年Intel release AHCI 用以取代IDE。

+ 本文開始 +

spec請參考以下這三分。古老的spec設計通常都比較簡單易懂
  1. PCI IDE Controller Specification Revision  1.0    3/4/94
  2. Programming Interface for Bus Master IDE Controller Revision  1.0     5/16/94
  3. Information Technology - AT Attachment - 8 ATA/ATAPI Command Set 
一個IDE controller規定了四個channel, 基本上有兩種mode, Compatibility and Native。

Compatibility mode:
  • 固定的IO register(Primary cmd/ctrl = 0x1f0~0x1f7/0x3f6, Secondary cmd/ctrl = 0x170~0x177/0x376)位址和固定的IRQ(14, 15)。
Native mode:
  • 由系統來assign: Primary cmd/ctrl = bar#0/bar#1, Secondary cmd/ctrl = bar#2/bar#3, 
需要注意的是control register 的位址是 ctrl port + 2

Q: 如何知道現在這個IDE是Compatibility or Native?
A: 在PCI header, Base-Class(09h), Sub-Class(0Ah), Interface:(0Bh) 定義了class code, 如果programmable indicator 不是fixed,operating mode可由程式來填入改變

Programmable Indicator: Indicate if controller support both mode (1), or fixed mode(0)
Operating Mode: Determine mode (0: compatibility, 1: native) 
Q: 如何找到硬碟插在哪個channel上並且發送ATA command?
A: 可以透過設定device register的bit 4, 然後看status是否回0x50來判斷channel上是否有device, 


接著請參考ATA spec定義的欄位,填寫要發的 command


Q: Bus Master code怎麼寫?
A: Bar#4 給定了Bus Master IO base address, 剩下的部分請參考圖,和原文spec step by step, 照做就可以把code寫出來了。


注意Command Register的Bit 3(read/write control), 下read command 時 bit3要設為 1, write command 時 bit3設為 0
programming bus master IDE, 請參考以下原文
3.1. Standard Programming Sequence
To initiate a bus master transfer between memory and an IDE DMA slave device, the following steps are required:

1) Software prepares a PRD Table in system memory. Each PRD is 8 bytes long and consists of an address pointer to the starting address and the transfer count of the memory buffer to be transferred. In any given PRD Table, two consecutive PRDs are offset by 8-bytes and are aligned on a 4-byte boundary.


2) Software provides the starting address of the PRD Table by loading the PRD Table Pointer Register . The direction of the data transfer is specified by setting the Read/Write Control bit. Clear the Interrupt bit and Error bit in the Status register.


3) Software issues the appropriate DMA transfer command to the disk device.


4) Engage the bus master function by writing a '1' to the Start bit in the Bus Master IDE Command Register for the appropriate channel.


5) The controller transfers data to/from memory responding to DMA requests from the IDE device.


6) At the end of the transfer the IDE device signals an interrupt.


7) In response to the interrupt, software resets the Start/Stop bit in the command register. It then reads the controller status and then the drive status to determine if the transfer completed


successfully.




沒有留言:

張貼留言