[转载]the control of legacy IDE controller
原文地址:http://tw.myblog.yahoo.com/jw!btXDNbSQExJPW9YBZ7MJ/article?mid=11
又是包著棉被躺在電腦前的一天^^
今天來講講最熟悉的東西好了,
要講的是legacy IDE controller的控制.
為什麼要稱為legacy呢?
因為IDE controller到SATA之後有另外一種控制介面,
稱之為AHCI,
所有的控制動作都在PCI的memory space完成,
在AHCI之前的就是透過I/O space來對IDE controller的控制.
IDE controller有分兩種mode,compatibility mode和native mode,
compatibility mode的I/O space address是固定的,
port0在0x1F0~0x1F7和0x3F6,前者是command block registers,後者是control block register,
port1在0x170~0x177和0x376,
但就只有一個controller能用,
不然會衝突,
native mode則是由BIOS分配address,
port0在BAR0(configuration space 0x10)和BAR1(configuration space 0x14),
port1在BAR2(configuration space 0x18)和BAR3(configuration space 0x1C),
上面的BAR都要忽視bit0,因為那個bit不是address.
要講控制的話先從control block register說起好了,
在SATA controller之後,
這個block只有一個bit有用,
就是bit2,SRST,
先將這個bit設1,然後再將這個bit設0,
則可以讓IDE controller打出一個software reset,
這是ATA device在legacy下軟體唯一能打的reset動作,
ATAPI device則還有個DEVICE RESET command能打,
至於SATA的COM RESET如果沒有SATA controller的document說明就打不出去.
再來是command block registers,
offset 00h是Data Register,
如果下的是PIO commands則Data要從這邊access,通常單位是Word,
offset 01h是Feature Register,
根據command的不同有不同的定義,後面幾個register也都是這樣,
通常普通的read/write command這個register都是reserved的,
offset 02h是Count Register,
通常普通的read/write command這個register是用來放data長度有幾個sector,
offset 03h,04h,05h分別是LBA_low,LBA_mid,和LBA_high,
通常普通的read/write command這些registers是存放要存取的address,
offset 06h是Device Register,
bit6是LBA mode和CHS mode的選擇,即是03h,04h,05h是LBA還是CHS,
bit4是device select,在PATA一個port上有兩個channel才有用,
bit3~bit0如果是28-bit addressing時代表LBA27~LBA24,不然是reserved,
offset 07h是Command Register,
決定要求Device做什麼command,
當這個register被寫入後整個command就會打出去,
如果Command是48-bit addressing的話,
那Feature,Count,LBA_low,LBA_mid,和LBA_high都會有2-byte,
可是各address就只有定址1-byte,要怎麼設定到第二byte呢?
Spec規定各Register倒數第二次被寫的值為high-byte,最後被寫的值是low-byte,
所以要打48-bit command要記得把這些registers寫兩次避免high-byte不是自己預期的值.
關於這些registers的定義,可以參考ATA-7 volume 1
另外DMA command還有另外的controller要設定才能動,
這個明天再說^^
浙公网安备 33010602011771号