iInfo 資訊交流: 用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(2)

最新消息

[公告2014/5/30] 如有需要將部落格中,任何一篇文章的程式碼使用在商業用途,請與我聯繫。

[公告2015/04/26] Line版的 iInfo程式與投資應用 群組已上線想加入的朋友們,請先查看 "入群須知" 再與我聯繫 Line : aminwhite5168,加入請告知身分與回答 "入群須知" 的問題。

[公告2017/02/20] 近來有網友詢問 MultiCharts 與 Excel 畫冰火能量圖 (8)MultiCharts 與Excel 畫冰火能量圖(11) --- 更名「台股儀表板」 文章中教學檔案取得方式,有興趣的朋友可透過 Line了解詳情 (請勿以為是免費分享),Line : aminwhite5168。

[公告 2017/04/25] 近期使用Google Chrome瀏覽器開啟含有程式碼的文章會出現含有 "font" 字樣,這部分是Google Chrome瀏覽器造成,各位讀者多按幾次重新整理就可以正常了。

[公告 2017/05/23] 證交所於今日2017/05/23下午進行網頁大改版,部落格文章裡有參考到的文章有使用證交所的文章都影響,請各位讀者多多包涵。

2013年4月28日 星期日

用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(2)

接續上一篇用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(1),這一篇將就前面整理的資訊來取得HDD資訊。
Step 1 : 由Intel® 6 Series Chipset and Intel® C200 Series Chipset找出在PCI interface的Bus 0、Device 1F、Function 2的ABAR與所有的PxPCR。

Port Registers
Value
ABAR
0xB0417000
Port0 Offset(ABAR + 0*80h + 100h)
0xB0417100
Port1 Offset(ABAR + 1*80h + 100h)
0xB0417180
Port2 Offset(ABAR + 2*80h + 100h)
0xB0417200
Port3 Offset(ABAR + 3*80h + 100h)
0xB0417280
Port4 Offset(ABAR + 4*80h + 100h)
0xB0417300
Port5 Offset(ABAR + 5*80h + 100h)
0xB0417380
Port6 Offset(ABAR + 6*80h + 100h)
0xB0417400
Port7 Offset(ABAR + 7*80h + 100h)
0xB0417480

Step 2 : Serial ATA AHCI 1.3 Specification用RU抓出系統中有關下圖Port Registers。


Port Registers
Value
ABAR
0xB0417000
Port0 Offset(ABAR + Port*80h + 100h)
0xB0417100
P0CLB(P0PCR + Offset 00h)
0x91DE9000
P0CLBU(P0PCR + Offset 04h)
0x00000000
P0FB(P0PCR + Offset 08h)
0x91DE7000
P0FBU(P0PCR + Offset 0Ch)
0x00000000
P0IS(P0PCR + Offset 10h)
0x00000021
P0IE(P0PCR + Offset 14h)
0x00000000
P0CMD(P0PCR + Offset 18h)
0x00000006
P0TFD(P0PCR + Offset 20h)
0x00000050
P0SIG(P0PCR + Offset 24h)
0x00000101
P0SSTS(P0PCR + Offset 28h)
0x00000133
P0SCTL(P0PCR + Offset 2Ch)
0x00000300
P0SERR(P0PCR + Offset 30h)
0x00000000
P0SACT(P0PCR + Offset 34h)
0x00000000
P0CI(P0PCR + Offset 38h)
0x00000000
P0SNTF(P0PCR + Offset 3Ch)
0x00000000
P0FBS(P0PCR + Offset 40h)
0x00000000
P0VS(P0PCR + Offset 70h)
0x00000000

Step 3 : 判斷裝置所在位置與裝置類型。
若PxSIG&0x0000FFFF為0x00000101,則裝置存在於該Port上,反之則否。由P0SIG判斷裝置存在於Port0的位置上
若PxSSTS&0xFFFF0000為0xEB140000,則裝置類型為ATAPI裝置,如CD、DVD,反之則為ATA裝置。由P0SSTS判斷裝置類型為ATA裝置,如HDD、SSD。

Step 4 : P0CLB由找出FIS Base Address

Step 5 : 使用上一篇用RU在DOS或UEFI下,對SATA Controller下ATA Command取得HDD與ODD資訊(1)文章整理的ATA Command,抓取Identify Data就是HDD的資訊。


Identify Data HDD
Identify Data ODD
Attribute Values
Attribute Thresholds
Enable SMART
Disable SMART
SMART STATUS
Input
Feature
XX
XX
D0h
D1h
D8h
D9h
DAh
Sector Count
01h
01h
01h
01h
XX
XX
XX
Sector Number
XX
XX
XX
XX
01h
01h
XX
LBA Low
XX
XX
4Fh
4Fh
4Fh
4Fh
4Fh
LBA High
XX
XX
C2h
C2h
C2h
C2h
C2h
Device/Head
XX
XX
A0h
A0h
XX
XX
XX
Command
ECh
A1h
B0h
B0h
B0h
B0h
B0h
Output
Return Byte
512
512
512
512
0
0
0


Step 6 : 建立PRDT (Physical Region Descriptor Table)。

各位址的意義

確認DW3 BIT0 (Data Byte Count),是否為 1,如果 BIT0為 0,將其設為1。
確認DW3 BIT31(Interrupt On Completion),是否為 1,如果 BIT0為 0,將其設為1。

Step 7 : 建立Command List結構。

各位址的意義

設定以下參數
CFL= 5 (CFIS length)
PRDTL = 1 (PRDT entry number. For Identify command)

Step 8 : 開始執行。
原始狀態

設定執行Command,切忌順序要對。
  1. 將P0CMD(P0PCR + Offset 18h) Bit4設為1。
  2. P0CI(P0PCR + Offset 38h) Bit0設為1。
  3. 將P0CMD(P0PCR + Offset 18h) Bit0設為1。
  4. 等待P0CI(P0PCR + Offset 38h) 由01變為00 或在上一步執行後等待0.3~0.5秒即可。
執行後的狀態

Step 9 : 取得HDD資訊

最後需要將取回的HDD資料進行高低位元資料轉換,如此才能獲得最後HDD的資訊。以上的作法是針對HDD,若是要取得ODD資訊,只需要在Step 5的Command換成0xA1即可。

該硬碟的資訊如下