4,273 瀏覽數

Temperature sensor with integrated SPD

最近在看 I²C 的相關資料發現了,新的 DDR4 使用 4Kb EEPROM 外 (DDR3 使用 2Kb EEPROM),還加入了溫度偵測的 Sensor (TSOD:Temperature Sensor on DIMMs),通常這個兩個東西 4Kb EEPROM+ Temperature Sensor 全部做成一顆 IC,如 IDT TSE2004GB2DDR4 Temp Sensor with SPD ,這規範是由 JEDEC 訂立的.

在瞭解 DIMM 的 EEPROM (SDP)+Thermal Sensor 前我們先回憶一下.

什麼是 DIMM SPD 在每一個記憶體模組上面都會有一塊 SPD(Serial presence detect) 的 EEPROM(Electrically Erasable Programmable Read Only Memory). 主要記載了該憶體模組的資訊,

那什麼又是 I²C – (Inter-Integrated Circuit,讀法為 “I-squared-C”) 是一種慢速 serial bus 的協定,主要透過兩條線路的匯流排 (串列資料(SDA)及串列時脈(SCL)) 與電腦上的控制晶片(MC : Micro Controller)做溝通.

所以我們可以直接透過 I²C 的方式來讀取這 溫度偵測器Temperature Sensor 數值, 在 Linux 下要透過下面指令來讀取 I²C 的資料.關於 I²C 的指令請先參考 http://benjr.tw/93915

ben@ubuntu:~$ sudo su -
root@ubuntu:~# modprobe i2c-dev
root@ubuntu:~#ls /dev/i2c*
/dev/i2c-0  /dev/i2c-1

你可以看到 I²C 有兩條 (/dev/i2c-0 與 /dev/i2c-1),現在確定無誤,接下來就需要安裝 i2c-tools (vmware 等虛擬裝置下目前沒有看到模擬 I²C 的裝置).

root@ubuntu:~# apt-get install i2c-tools
root@ubuntu:~# i2cdetect 
Error: No i2c-bus specified!
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
       i2cdetect -F I2CBUS
       i2cdetect -l
  I2CBUS is an integer or an I2C bus name
  If provided, FIRST and LAST limit the probing range.

透過 # i2cdetect -l 可以看到有兩條 I²C (/dev/i2c-0 與 /dev/i2c-1),但 I²C bus 上面有哪些裝置就需要另外的參數 (-y)來看

root@ubuntu:~# i2cdetect -l
i2c-0   i2c             bcm2708_i2c.0                           I2C adapter
i2c-1   i2c             bcm2708_i2c.1                           I2C adapter
root@ubuntu:~# i2cdetect -y 1
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

查到有哪一些 I²C 之後,還需要知道裝置在哪裡,當查到時就可以透過 #i2cdump 或是 #i2cget 的指令來查,裝置暫存器的內容.

root@ubuntu:~# i2cget -y 1 0x68 05 w
0x2fc6

現在來看一下,透過 #i2cget 讀取資料(0x68 是假設的不是實際位置)後但要怎麼作轉換,可以先參考 JEDEC 的說明文件 – http://www.jedec.org/sites/default/files/docs/4_01_04R21.pdf ,下載需要事先申請帳號,隨便使用一個 mail 都可做申請.
在 4_01_04R21.pdf – 2.13 TS Register Set Definition , ADDR 05 就是我們要讀取 TSOD 的值 Ambient Temperature (Current Ambient temperature) 但讀出來的值要怎麼作轉換呢!

同一篇文件 Temperature Register Value Definitions
TSOD01

假如我們讀取的值是 0x2fc6 ,Temperature sensor 用兩個位元組 (2bytes=16bits) 來紀錄溫度,但首先高位元是 c6 低位元是 2f ,所以依據上表
0xc62f= 1100 0110 0010 1111 (前三bit ,Bit 16,15,14 先不用看)
0 0110 0010 1111 (Bit 13 表示 0-> 正值 1->負值,負值要做2補數運算:一個數字的二補數就是將該數字作位元反相運算,再將結果加 1)
0110 0010 1111 (Bit 3-4 -> 小數點 ,Bit 5-12 整數)
0110 0010 (Bit -> 5-12 整數) 轉換成10進制 所以是 64+32+2=98
1111 (Bit 3-4 -> 小數點) 0.5+0.25=0.75
所以溫度算出來是 98.75

算起來蠻麻煩的,其實有一個比較好的方式來算,先轉成10進制,然後 x0.25 就可以算出來.這種方式很適合用在公式的直接轉換.

0xc62f (十六進制)= 1100 0110 0010 1111 (只需要 bit 12-3) = 0110 0010 11(二進制) =395(十進制)
395*0.25=98.75 (一樣算出)

以前 sensor 可以透過 lm_sensors 套件提供的指令 #sensors-detect ,#sensors 來看,但現在不確定是不是有支援 TSOD 的.

網友的想法

  1. 自動參照通知: Linux command – i2c-dev | Benjr.tw

發表迴響