在介紹如何讀寫SMBus之前,首先我們必須先知道什麼是SMBUS?
SMBus (System Managemnet Bus,系統管理匯流排)
簡單來說是有兩條訊號線(SMBCLK/SMBDATA)所組成一個匯流排,讓系統上一些低速裝置進行互相溝通的管道,如EC或感測裝置等。簡單舉個例子,當系統上想得知某個掛在SMBus匯流排下的溫度感測器他的溫度變化時,首先我們必須得知感測裝置的位置(Slave Address),由Host透過SMBus通道對溫度感測器進行回傳溫度的命令,當感測器得到命令後,再將溫度回傳給Host。
2.選擇IO Space方式,輸入IO Base: 0xF040,根據Spec我們主要讀寫區域為Offset 00h - 07h。
3.Byte Read- SMB_BASE + 0x00h (HST_STS)寫入0xFE,清除暫存器狀態,以確保SMBus不為忙碌狀態- SMB_BASE + 0x04h (XMIT_SLVA)寫入0xA1 (裝置的Slave Address)注意!!此處以Memory裝置為範例,所以Slave Address = 0xA1,而BIT0 = 1為讀取,反之則為寫入。- SMB_BASE + 0x03h (HST_CMD)寫入0x00 ,此處主要寫入要讀取的Offset,先以0x00為範例- SMB_BASE + 0x02h (HST_CNT)寫入0x48,開始執行讀取。Bit6代表開始執行,Bit2-4為選擇讀取的方式
- SMB_BASE + 0x05h (HST_D0),讀取Byte資料顯示於此4.Word Read-重複Byte Read步驟1-3- SMB_BASE + 0x02h (HST_CNT)寫入0x4C,開始執行讀取。Bit6代表開始執行,Bit2-4為選擇讀取的方式- SMB_BASE + 0x05h (HST_D0) / SMB_BASE + 0x06h (HST_D1),讀取Word資料顯示於此5.Block Read-重複Byte Read步驟1-3- SMB_BASE + 0x02h (HST_CNT)寫入0x54,開始執行讀取。Bit6代表開始執行,Bit2-4為選擇讀取的方式- SMB_BASE + 0x05h (HST_D0) ,根據SPEC,此暫存器為確認BLOCK讀取幾個Byte範圍。- SMB_BASE + 0x07h (HOST_BLOCK_dB),資料一筆一筆丟到此暫存器- SMB_BASE + 0x00h (HST_STS),當第一筆資料被讀取後,HST_STS寫入0xFF,通知SMBus回傳下一筆資料,直至最後一筆結束,HST_STS顯示0xC1 > 0xFE > 0x82 > 0xC2
感謝教學,對初學BIOS領域的新人幫助很大!
回覆刪除感謝教學,正好面臨這個問題,如題,您的 SMB_BASE = 0xF040嗎?規格提到bit[15:5],我的SMBusBaseAddr取出後 = EFA1,取bit[15:5] = 7DD,但我試SMB_BASE = EFA1 or 7DD 都無法正常存取,可能是哪裡的問題,感謝不吝嗇賜教,謝謝
回覆刪除