User Tools

Site Tools

study:windows:241031-001:index

使用RW讀寫Smbus device (2024-10-31)

Local Backup

  • 在網路上介紹透過RW或是RU來操作SMBus的資料很少,好不容易才找到可以參考的且實用的網頁,不過說明的又很有限,所以在此完整的說明操作流程。
  • 1.下載安裝RWEverything,開啟RW中PCI Device table列表,找Smbus controller,如Intel PCH SMbus controoler: D31:F3,將預設以1 Byte顯示方式改為 4 Byte。
  • 2.找到SMB_BASE的位置 , 如: offset 20h~23h。
  • 3.右鍵點選”Open IO Space”, 開啟對應的IO Space table。
  • 4.以下即開始介紹藉由IO操作SMBus讀寫Device的方法
    • (1)我們先來看幾個常用的暫存器。
    • (2)下面分別介紹Byte read、Word read、Block read讀取資料的步驟。

Byte read:

  • Step1:
    • 清除暫存器狀態:SMB_BASE + 0x00 → Host Status。
    • 填入0xFE清除暫存器狀態,數值變化的狀態0x40 → 0xFE → 0x00 → 0x40。
  • Step2:
    • 填入裝置在SMBus的位址:SMB_BASE + 0x04 → Slave Address。
    • 如Memory Slave Address 為0xA0~0xA6,Bit0=1代表read,所以填入0xA0 + 1 = 0xA1。
  • Step3:
    • 指定欲讀取裝置內資訊擺放的起點:SMB_BASE + 0x03 → HOST Command。
    • 讀取裝置內資訊的起始位置,從頭開始讀取,這裡先填0x00。
  • Step4:
    • 選擇執行的方式與啟動:SMB_BASE + 0x02 → Host Control。
    • 填入0x48,Bit6=1代表開始執行、Bit2~4代表選擇要使用的執行方式。
  • Step5:
    • 讀取資料:SMB_BASE + 0x05 → Host Data0。
    • 返回裝置內指定位置的資訊。

Word Read:

  • Step1:
    • 清除暫存器狀態:SMB_BASE + 0x00 → Host Status。
    • 填入0xFE清除暫存器狀態,數值變化的狀態0x40 → 0xFE → 0x00 → 0x40。
  • Step2:
    • 填入裝置在SMBus的位址:SMB_BASE + 0x04 → Slave Address。
    • 如Memory Slave Address 為0xA0~0xA6,Bit0=1代表read,所以填入0xA0 + 1 = 0xA1。
  • Step3:
    • 指定欲讀取裝置內資訊擺放的起點:SMB_BASE + 0x03 → HOST Command。
    • 讀取裝置內資訊的起始位置,從頭開始讀取,這裡先填0x00。
  • Step4:
    • 選擇執行的方式與啟動:SMB_BASE + 0x02 → Host Control。
    • 填入0x4C,Bit6=1代表開始執行、Bit2~4代表選擇要使用的執行方式。
    • SMB_BASE + 0x00 數值變化的狀態:0x40 → 0x42。
    • SMB_BASE + 0x02 數值變化的狀態:0x4C → 0x0C。
  • Step5:
    • 讀取資料:SMB_BASE + 0x05 → Host Data0。
    • 返回裝置內指定第一位置的資訊。
  • Step6:
    • 讀取資料:SMB_BASE + 0x06 → Host Data1。
    • 返回裝置內指定第二位置的資訊。

Block read:

  • Step1:
    • 清除暫存器狀態:SMB_BASE + 0x00 → Host Status。
    • 填入0xFE清除暫存器狀態,數值變化的狀態0x40 → 0xFE → 0x00 → 0x40。
  • Step2:
    • 填入裝置在SMBus的位址:SMB_BASE + 0x04 → Slave Address。
    • 如Memory Slave Address 為0xA0~0xA6,Bit0=1代表read,所以填入0xA0 + 1 = 0xA1。
  • Step3:
    • 指定欲讀取裝置內資訊擺放的起點:SMB_BASE + 0x03 → HOST Command。
    • 讀取裝置內數值的起始位置,從0x01頭開始讀取。
  • Step4:
    • 選擇執行的方式與啟動:SMB_BASE + 0x02 → Host Control。
    • 填入0x54,Bit6=1代表開始執行、Bit2~4代表選擇要使用的執行方式。
    • SMB_BASE + 0x00 數值變化的狀態:0x40 → 0xC1。
    • SMB_BASE + 0x02 數值變化的狀態:0x54 → 0x14。
  • Step5:
    • 取得資料的長度:SMB_BASE + 0x05 → Host Data0。
    • 回傳數值位元組數,該值也是愈讀取裝置啟始點的數值資料。
  • Step6:
    • SMB_BASE + 0x07 → HOST_BLOCK_DB。
    • 返回block讀取的第一個位元組,該值為Step3指定起點 + 1數值。
  • Step7:
    • 取得Block read全部數值:SMB_BASE + 0x00 → Host Status。
    • 寫0xFF清除狀態位元,表示該筆資料已取走,通知SMBus傳回下一筆資料至offset 0x07的位置。
    • 數值變化的狀態:0xC1 → 0xFE → 0x81 → 0xC1。
    • 最後一筆資料顯示狀態:0xC1 → 0xFE → 0x82 → 0xC2。
  • 以此類推,重複做Step7動作直到這個block讀完。

資料來源

  • 9 person(s) visited this page until now.

Permalink study/windows/241031-001/index.txt · Last modified: 2024/10/31 20:24 by jethro

oeffentlich