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即可。

該硬碟的資訊如下

沒有留言:

張貼留言