Feb 10, 2010

ディスプレイカードの温度表示

ディスプレイカードの温度上昇が原因と思われる 表示不正が稀に発生するので、 ディスプレイカードの温度を取得して表示してみた。
取得した温度は普段利用しているデスクトップ環境で常時表示している GKrellM (1) のセンサー表示部分に多少無理やり表示してしまう事にする。
GKrellM (1) は mbmon (1) をデーモンとして起動しておくと mbmon (1) から取得した3種類の温度を表示できるので、 mbmon (1) を改造して3番目の温度を ディスプレイカードの温度に変更してしまうというのが 「多少無理やり」な方法だ。

ディスプレイカードに nVidia の GeForce を使用しているので、 温度は nvidia-settings (1) の --query オプションを利用すると取得できる。 まずは mbmon (1) のソースを改造し nvidia-settings (1) を popen (3) で呼び出してみると 確にディスプレイカードの温度は取得できるのだが、 温度取得のたびに nvidia-settings (1) コマンドが起動されるので システムリソースに負荷がかかり過ぎてしまう。
そこで nvidia-settings (1) のソースに付属している サンプルプログラムを調べてみると、 割と簡単にディスプレイカードの温度を取得できる事が判ったので mbmon (1) から直接ディスプレイカードの温度を取得する。

まずは、必要となる NVCtrl.hNVCtrlLib.hlibXNVCtrl.a の3ファイルを準備するために、 nvidia-settings をコンパイルする。
ports/x11/nvidia-settingsmake (1) を実行すると、 ports/x11/nvidia-settings/work/nvidia-settings-1.0/src/libXNVCtrl に上記3ファイルが作成される。

次に mbmon (1) を修正してプログラムをインストールする。
ports/sysutils/mbmon ディレクトリで make configure まで実行した後で以下のパッチを適用し、 上記3ファイルを prts/sysutils/mbmon/work/xmbmon205にコピーして make (1)すると ディスプレイカードの温度を取得できる mbmon (1) ができる。
この mbmon (1) をデーモンとして起動すると GKrellM (1) のセンサー表示部分の 温度表示の 3番目にディスプレイカードの温度が表示できる。

Image: gkrellm.jpg

diff -rcN xmbmon205.orig/Makefile xmbmon205/Makefile
*** xmbmon205.orig/Makefile   2010-02-10 15:42:38.000000000 +0900
--- xmbmon205/Makefile        2010-02-10 15:45:16.000000000 +0900
***************
*** 25,30 ****
--- 25,34 ----
  LIBS= -lm 
  LIBSX=$(LIBS)  -L/usr/X11R6/lib -lXt  -lSM -lICE -lX11 
  
+ INCLUDES+= -I. -I/usr/X11R6/include
+ LIBS+= -L. -lXNVCtrl -L/usr/X11R6/lib -lXext -lX11
+ DEFS+= -DNVHACK
+ 
  #CC=/compat/linux/usr/bin/gcc
  CC=cc
  CFLAGS+=$(INCLUDES) $(DEFS)
diff -rcN xmbmon205.orig/mbmon.c xmbmon205/mbmon.c
*** xmbmon205.orig/mbmon.c    2010-02-10 15:31:52.000000000 +0900
--- xmbmon205/mbmon.c         2010-02-10 15:17:02.000000000 +0900
***************
*** 36,41 ****
--- 36,47 ----
  #  include <sys/sysctl.h>
  #endif
  
+ #ifdef    NVHACK
+ #include <X11/Xlib.h>
+ #include "NVCtrl.h"
+ #include "NVCtrlLib.h"
+ #endif
+ 
  #include "mbmon.h"
  
  static const char *MyName = "mbmon";
***************
*** 510,515 ****
--- 516,536 ----
  
      getTemp(&temp1, &temp2, &temp3);
  
+ #ifdef    NVHACK
+     {
+ 
+         Display    *dpy;
+         int        temp;
+ 
+         if((dpy = XOpenDisplay(NULL))){
+             if(XNVCTRLQueryAttribute(dpy, 0, 0, NV_CTRL_GPU_CORE_TEMPERATURE, &temp))
+                 temp3 = temp;
+             XCloseDisplay(dpy);
+         }
+         
+     }
+ #endif
+ 
  /* get fan speeds */
  
      getFanSp(&rot1, &rot2, &rot3);

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.