uGuru 資料手冊¶
首先,我所瞭解的 uGuru 並非基於 Abit 提供的任何幫助、提示或資料手冊。我所獲得的 uGuru 資料是透過我“逆向工程”的微薄知識彙集而成的。順便說一句,您可能已經注意到 uGuru 並非如 Abit 所聲稱的那樣是他們自己開發的晶片。它實際上只是由華邦 (Winbond) 製造的微處理器 (uC) (W83L950D)。而且,閱讀此特定微處理器的手冊或向華邦傳送郵件尋求幫助,都無法獲得關於 uGuru 的任何有用資料,因為響應呼叫的是微處理器內部的程式。
Olle Sandberg <ollebull@gmail.com>,2005-05-25
本檔案最初版本由 Olle Sandberg 完成,他承擔了初期逆向工程的繁重工作。本版本已幾乎完全重寫,以提高畫質晰度,並擴充套件了寫入支援和更多資料儲存區的資訊。寫入支援再次由 Olle 逆向工程完成,而額外的資料儲存區則由我逆向工程完成。我謹向 Olle 表示感謝,沒有他的努力,本檔案和 Linux 驅動程式將無法編寫。
注意:由於缺乏規格說明,本文僅描述了 uGuru 的感測器部分,而不包括 CPU / 記憶體 / 等的電壓和頻率控制。
Hans de Goede <j.w.r.degoede@hhs.nl>,2006-01-28
檢測¶
據瞭解,uGuru 始終位於並使用 (ISA) I/O 埠 0xE0 和 0xE4,因此我們無需掃描任何埠範圍,只需檢查這兩個埠持有的值即可進行檢測。我們將 0xE0 稱為 CMD(命令埠),將 0xE4 稱為 DATA,因為 Abit 使用這些名稱來指代它們。
如果 DATA 埠值為 0x00 或 0x08,並且 CMD 埠值為 0x00 或 0xAC,則可能存在 uGuru。我們必須檢查資料埠的兩個不同值,因為重啟後 uGuru 在此處將保持 0x00,但如果驅動程式被移除後又重新載入,資料埠將保持 0x08,稍後會詳細介紹。
經過對 Linux 核心驅動程式的廣泛測試,發現某些 uGuru 變體在 CMD 埠上會保持 0x00 而不是 0xAC,因此我們也必須檢查 CMD 的兩個不同值。在這些 uGuru 上,DATA 最初會保持 0x09,並且只有在首先讀取 CMD 後才會保持 0x08,因此必須首先讀取 CMD!
為確保 uGuru 確實存在,應進行一次或多次暫存器集的測試讀取。
讀取 / 寫入¶
定址¶
uGuru 具有多個不同的定址級別。我們將第一個定址級別稱為“bank”(儲存區)。一個儲存區儲存一個或多個感測器的資料。儲存區中每個感測器的資料為一個或多個位元組大小。
給定儲存區的位元組數是固定的,您應始終讀取或寫入相應數量的位元組;讀取/寫入更多位元組將會失敗,而寫入少於給定儲存區位元組數的結果是不確定的。
有關所有已知儲存區地址、該儲存區中的感測器數量、每個感測器的資料位元組數以及這些位元組的內容/含義,請參見下文。
儘管本文件和核心驅動程式都沿用了儲存區內定址的感測器術語,但這並非 100% 準確,例如在儲存區 0x24 中,儲存區內的定址選擇的是 PWM 輸出而非感測器。
請注意,有些儲存區同時具有讀取地址和寫入地址,uGuru 就是透過這種方式判斷是對儲存區進行讀取還是寫入操作的;因此,讀取時應始終使用讀取地址,寫入時應使用寫入地址。寫入地址總是比讀取地址大一 (1)。
uGuru 準備就緒¶
在您能夠從 uGuru 讀取或向其寫入之前,必須首先將 uGuru 置於“準備就緒”模式。
要將 uGuru 置於準備就緒模式,首先向 DATA 寫入 0x00,然後等待 DATA 保持 0x09,DATA 應在 250 個讀取週期內讀取到 0x09。
接下來必須讀取 CMD,並且其值應為 0xAC;通常 CMD 第一次讀取時就為 0xAC,但有時需要一段時間 CMD 才能保持 0xAC,因此需要多次讀取(最多 50 次)。
讀取 CMD 後,DATA 應保持 0x08,這意味著 uGuru 已準備好接收輸入。如上所述,DATA 通常在第一次讀取時保持 0x08,但並非總是如此。此步驟可以跳過,但如果 uGuru 尚未在 DATA 埠報告 0x08 而您繼續寫入儲存區地址,則會發生什麼情況尚不確定。
向 uGuru 傳送儲存區和感測器地址¶
首先,uGuru 必須處於如上所述的“準備就緒”模式,DATA 應保持 0x08,表明 uGuru 需要輸入,在此情況下是儲存區地址。
接下來將儲存區地址寫入 DATA。寫入儲存區地址後,等待 DATA 再次保持 0x08,表明它需要/已準備好接收更多輸入(最多 250 次讀取)。
一旦 DATA 再次保持 0x08,將感測器地址寫入 CMD。
讀取¶
首先,如上所述傳送儲存區和感測器地址。然後,對於您要讀取的每個資料位元組,等待 DATA 保持 0x01,這表明 uGuru 已準備好進行讀取(最多 250 次讀取),一旦 DATA 保持 0x01,則從 CMD 讀取該位元組。
一旦所有位元組都被讀取,資料將保持 0x09,但沒有理由對此進行測試。請注意,位元組數取決於儲存區地址,參見上文和下文。
成功讀取完成後,建議將 uGuru 重新置於準備就緒模式,以便它為下一個讀取/寫入週期做好準備。這樣,如果您的程式/驅動程式被解除安裝後又重新載入,上述檢測演算法仍將起作用。
寫入¶
首先,如上所述傳送儲存區和感測器地址。然後,對於您要寫入的每個資料位元組,等待 DATA 保持 0x00,這表明 uGuru 已準備好進行寫入(最多 250 次讀取),一旦 DATA 保持 0x00,則將該位元組寫入 CMD。
一旦所有位元組都已寫入,等待 DATA 保持 0x01(最多 250 次讀取),不要問為什麼會這樣。
一旦 DATA 保持 0x01,讀取 CMD,它現在應該保持 0xAC。
成功寫入完成後,建議將 uGuru 重新置於準備就緒模式,以便它為下一個讀取/寫入週期做好準備。這樣,如果您的程式/驅動程式被解除安裝後又重新載入,上述檢測演算法仍將起作用。
注意事項¶
在對 Linux 核心驅動程式進行更廣泛的測試後,發現一些 uGuru 變體在寫入儲存區地址後,無法在 250 次讀取內使 DATA 保持 0x08。對於這些版本,這種情況發生得很頻繁,使用更大的超時時間也無濟於事,它們只是離線一兩秒鐘,進行一些內部校準或其他操作。您的程式碼應該準備好處理這種情況,並且在此特定情況下,如果沒有響應,只需暫停一段時間,然後重試。
地址對映¶
儲存區 0x20 警報 (R)¶
該儲存區包含 0 個感測器,即感測器地址被忽略(但必須寫入),只需使用 0。儲存區 0x20 包含 3 個位元組。
- 位元組 0
此位元組儲存感測器儲存區 1 中感測器 0-7 的警報標誌,其中位 0 對應感測器 0,位 1 對應感測器 1,依此類推。
- 位元組 1
此位元組儲存感測器儲存區 1 中感測器 8-15 的警報標誌,其中位 0 對應感測器 8,位 1 對應感測器 9,依此類推。
- 位元組 2
此位元組儲存感測器儲存區 2 中感測器 0-5 的警報標誌,其中位 0 對應感測器 0,位 1 對應感測器 1,依此類推。
儲存區 0x21 感測器儲存區 1 值 / 讀數 (R)¶
該儲存區包含 16 個感測器,每個感測器包含 1 個位元組。迄今為止,已知以下感測器在所有主機板上都可用:
感測器 0 CPU 溫度
感測器 1 系統溫度
感測器 3 CPU 核心電壓
感測器 4 DDR 電壓
感測器 10 DDR Vtt 電壓
感測器 15 PWM 溫度
- 位元組 0
此位元組儲存感測器的讀數。儲存區 1 中的感測器可以是電壓感測器,也可以是溫度感測器,這取決於主機板。然而,uGuru 似乎知道(已程式設計)連線的是哪種感測器,詳見感測器儲存區 1 設定說明。
電壓感測器使用線性刻度,讀數 0 對應 0 伏特,讀數 255 對應 3494 毫伏。然而,更高電壓的感測器透過分壓電路連線。目前已知使用的分壓電路產生的範圍有:0-4361mV、0-6248mV 或 0-14510mV。3.3 伏電源使用 0-4361mV 範圍,5 伏電源使用 0-6248mV,12 伏電源使用 0-14510mV。
溫度感測器也使用線性刻度,讀數 0 對應 0 攝氏度,讀數 255 對應 255 攝氏度。
儲存區 0x22 感測器儲存區 1 設定 (R) 和 儲存區 0x23 感測器儲存區 1 設定 (W)¶
這些儲存區包含 16 個感測器,每個感測器包含 3 個位元組。每組 3 個位元組包含儲存區 0x21 中具有相同感測器地址的感測器的設定。
- 位元組 0
所選感測器的警報行為。1 表示啟用所述行為。
- 位 0
如果測量溫度超過警告閾值,則發出警報 (RW) [1]
- 位 1
如果測量電壓超過最大閾值,則發出警報 (RW) [2]
- 位 2
如果測量電壓低於最小閾值,則發出警報 (RW) [2]
- 位 3
如果警報則蜂鳴 (RW)
- 位 4
如果警報原因是測量溫度超過警告閾值,則為 1 (R)
- 位 5
如果警報原因是測量電壓超過最大閾值,則為 1 (R)
- 位 6
如果警報原因是測量電壓低於最小閾值,則為 1 (R)
- 位 7
電壓感測器:如果警報持續超過 4 秒則關機 (RW)
溫度感測器:如果溫度超過關機閾值則關機 (RW)
- 位元組 1
溫度感測器:警告閾值(按儲存區 0x21 比例)
電壓感測器:最小閾值(按儲存區 0x21 比例)
- 位元組 2
溫度感測器:關機閾值(按儲存區 0x21 比例)
電壓感測器:最大閾值(按儲存區 0x21 比例)
儲存區 0x24 風扇 PWM 輸出 (R) 和 儲存區 0x25 風扇 PWM 輸出 (W)¶
- 這些儲存區包含 3 個“感測器”,每個感測器包含 5 個位元組。
感測器 0 通常控制 CPU 風扇
感測器 1 通常控制北橋 (NB)(或單晶片組)風扇
感測器 2 通常控制系統風扇
- 位元組 0
標誌 0x80 用於啟用控制,停用時風扇以 100% 執行。儲存區 0x21 中的低半位元組(溫度)感測器地址用於控制。
- 位元組 1
0-255 = 0-12V (線性),指定風扇在低於低閾值溫度(在位元組 3 中指定)時轉動的電壓
- 位元組 2
0-255 = 0-12V (線性),指定風扇在高於高閾值溫度(在位元組 4 中指定)時轉動的電壓
- 位元組 3
低閾值溫度(按儲存區 0x21 比例)
- 位元組 4
高閾值溫度(按儲存區 0x21 比例)
儲存區 0x26 感測器儲存區 2 值 / 讀數 (R)¶
該儲存區包含 6 個感測器(據我所知),每個感測器包含 1 個位元組。
- 迄今為止,已知以下感測器在所有主機板上都可用:
感測器 0:CPU 風扇速度
感測器 1:北橋 (NB)(或單晶片組)風扇速度
感測器 2:系統風扇速度
- 位元組 0
此位元組儲存感測器的讀數。0-255 = 0-15300 (線性)
儲存區 0x27 感測器儲存區 2 設定 (R) 和 儲存區 0x28 感測器儲存區 2 設定 (W)¶
這些儲存區包含 6 個感測器(據我所知),每個感測器包含 2 個位元組。
- 位元組 0
所選感測器的警報行為。1 表示啟用所述行為。
- 位 0
如果測量轉速低於最小閾值,則發出警報 (RW)
- 位 3
如果警報則蜂鳴 (RW)
- 位 7
如果警報持續超過 4 秒則關機 (RW)
- 位元組 1
最小閾值(按儲存區 0x26 比例)
給勇於探索者的警告¶
在此提醒那些想要嘗試並找出電壓/時鐘程式設計方法的人:我曾嘗試使用感測器儲存區 (0x20-0x28) 的讀取程式碼來讀取(且僅讀取)儲存區 0-0x30,結果導致電壓被 _永久性_ 重新程式設計。幸運的是,我的感測器部分已配置為在任何超出規格的電壓下關閉系統,這可能保護了我的電腦(重啟後我設法立即進入 BIOS 並重新載入了預設設定)。這可能意味著非感測器部分的讀寫週期與感測器部分的讀寫週期不同。