*********************************************************
    Mother Board Monitor Program for X Window System

        XMBmon ver.1.06pl1

    for FreeBSD (and possibly Linux, but not checked).
 *********************************************************


<< 1. どんなソフトか >>

 最近はマザーボードに CPU の温度や CPU Fan の回転数などをモニター
する機能がついたものが増えて来ています。マイクロソフト Windows 上
ではこのモニター機能を使ってリアルタイムに CPUの温度などをグラフ化
するプログラムがありますが、X 上でそのような機能を持ったプログラム
がないようなので作ってみました。ただし、機能は最低限のものしかあり
ません。コマンドライン版では、温度・電圧・ファンの回転数をリアル
タイムに報告し、X Window System版では温度と電圧を折れ線グラフに
して表示します。


<< 2. 新ヴァージョンでの変更点 >>

・Athlon マシンで多く使われている VIA のサウスチップセット
 VT82C686A/B 内蔵のハードウエアモニタに対応。

・自前の SMBus 入出力機能を装備し、FreeBSD 上での power management
 デバイスドライバー(例えば、intpm driver for Intel PIIX4 (440BX
 チップセット内蔵))による SMBus ドライバなしでも動作可能。

・サポートされているハードウエアモニタチップを自動判別(ただし、
  完璧ではありません)。

((注意)) 以前のヴァージョン(ver.1.05)で何の問題もなく動いている
   人はこのヴァージョンを使う必要はありません。プログラムの機能
   そのものは全く同じです。


<< 3. サポートしているハードウエアモニタチップ >>

 もし、自分のマザーボードに積まれているハードウエア監視機能が
以下のチップを使っている場合には動作すると思います。

   National Semiconductor社    LM78/LM79
   WinBond社                   W83781D, W83782D, W83783S
   ASUSTek社                   AS99127F
   VIA社サウスチップセット     VT82C686A/B 内蔵

 その他のハードウエアモニタチップでも上記の互換チップの場合は
動く可能性があります。


<< 4. 使い方 >>

 パッケージを解凍してできたディレクトリで ./configure & make
すれば

      mbmon      mother board monitor for tty-terminal
      xmbmon     mother board monitor for X

の二つのバイナリができます。

((注意)) このプログラムは SMBus または ISA-IO port に問答無用で
   アクセスし、場合によってはシステムをクラッシュさせる可能性が
   ある「危険」なソフトウエアです。このことを十分認識して下さい。
   特に、IO port 0x295, 0x296 へのアクセスは NE2000 互換ボードと
   重なる場合がありますので、これらの port への書き込みが許されるか
   チェックしてください。私はこのプログラムによって起きた如何なる
   問題にも責任は取れません。

 プログラムのコンパイルが成功したら、まず、あなたのマザーボードで
ちゃんと動くかどうかをチェックしてみましょう。まず、root になって

   # ./mbmon -d

と mbmon プログラムをデバッグモードで動かしてみて下さい。これで、

   No Hardware Monitor found!!
   InitMBInfo: Undefined error: 0

というエラーメッセージが表示されずに、検知したハードウエアモニタ
チップの情報を表示すれば、このプログラムが動く可能性があります。
続けて -d オプションなしで起動して、

   Temp.= 34.2, 57.0, 48.0; Rot.= 4623, 4420, 2060
    Vcore = 1.86, 3.54; Volt. = 3.54, 4.93, 12.13, -11.98, -5.01

のような表示が 5秒おきに繰り返されるならば大丈夫です。とりあえず、
^C (CTRL-C)でプログラムを止めて 2つのプログラムをインストールして
下さい(mbmon は ^C 以外に止める方法はありません)。mbmon, xmbmon の
両方とも IO port に直接アクセスするので setuid root してパスの通った
ところに置いておく必要があります。Makefile の make install を参考に
してください。もし、mbmon を /usr/local/bin、xmbmon を /usr/X11R6/bin
に置くのでよければ、

   # make install

でこれらの作業をやってくれます。

 上にも書いたようにこのプログラムは IO port へのアクセスを行ない
ますので、例え setuid root してもこのアクセスが禁止されていれば
動きません。もし、

   InitMBInfo: Operation not permitted
   This program needs "setuid root"!!

となったとすると、FreeBSD のシステムの security level が厳しい
ためにIO port にアクセスできないと思われます(/etc/rc.conf 中の
kern_securelevel_enable, kern_securelevel 参照)。security level を
下げるか、すなおにあきらめてください。

 Linux の場合は Makefile 中の DEFS 変数に -DLINUX を付けて
コンパイルしてみて下さい。ただし、私自身の回りには Linux の動く環境
はありませんので、実機での動作は確認していません。動かない可能性も
高いです(ISA-IO port で動く場合は verion 1.05 で動いていたそうなので、
かなり動く可能性がありますが)。


<< 5. より詳しい解説 >>

 このプログラムはマザーボードに積まれているハードウエアモニターチップ
として Winbond の W83781D chip をメインに考えられています。このチップ
では、温度が 3つ(Temp0, Temp1, Temp2)、電圧が 7つ(V0 - V6)、および
FAN の回転数が 3つ(Fan0, Fan1, Fan2) 測定できるようになっています。
mbmon ではすべての情報をテキストで xmbmon では Temp0,1,2 および
V0(Vcore)の情報をグラフで表示します。単位は温度については摂氏(C)、
電圧についてはヴォルト(V)、FAN の回転数については 回/分 (rpm) です。
別のチップではこれらの情報のうちいくつかはサポートされていません。
例えば、VIA のVT82C686A/B の場合は温度は 2つ、電圧は 5つ、ファンの
回転数は 2つのみがモニターされます。mbmon ではモニターされない項目は
0.0 または 0 と表示されます。なお、mbmon は入力値としてモニター情報
を表示する間隔(単位:秒、デフォルトは 5秒)を受け付けます。

   Usage: mbmon -[V|S|I] [-d (debug)]  (default 5 sec)

 xmbmon の場合 Temp0,Temp1,Temp2 をそれぞれ "MB","CPU","chip" という
項目で表示しますが、それらは X の resource として変更可能です
(xmbmon.resources 参照)。マザーボードによっては、これら 3つの温度が
実際に何をモニターした温度かは違っており、適切な項目名になっていない
と思いますので、適宜変更してください。また、3つ目の温度センサーがない、
または、繋がっていない場合はこれを表示させないようにできます。
その時は Makefile の DEFS 変数に -DNO_TEMP3 を付け加えてバイナリを
作り直してください。

 自分のマザーボードでどのようなハードウエアモニターチップが使われて
いるかわからない場合は、先にも書いたように

   # mbmon -d
   # xmbmon -debug

というデバッグオプション付で起動することによりハードウエアモニター
チップの情報を得ることができます。これによってこのプログラムが使える
かどうかがかなりの程度判断できるでしょう。このプログラムでサポート
されているハードウエアモニタチップの内で、LM78/79 はマザーボード
の温度 Temp0 のみで、W83783S は Temp3 がありません。また、マザーボード
によってはモニターチップがサポートしていてもその機能を生かしていない
ものもあるようです。なお、通常 Temp0 がマザーボードの温度で、これは
ほとんど室温に近く変化に乏しいようです。Temp1,2 は温度センサーチップ
を繋いで始めて有効になる場合が多いのですが、最近のマザーボード(例えば
ASUS P3B-F)では PentiumII/III の CPU 内部にある温度センサーに Temp1
が繋がれていることもあるようです。私の試してみたマザーボードとその
デバッグの結果については DEBUG_info ファイルに載せてあります。

 一般に最近のマザーボードではハードウエアモニターチップにアクセス
する方法として、SMBus (System Management Bus)と 古い ISA の IO port
による方法がありますが、新しいチップ(例えば ASUS の マザーボードで
多く使われている AS99127F など)は SMBus のみでしか使えないようです。
以前のヴァージョン(ver.1.05)ではこの SMBus には FreeBSD 3.3R より
あとにサポートされた device driver (intpm device) を通してアクセス
していました。しかし、この intpm driver はインテルチップセットで
ある 440BX のサウスチップ PIIX4 に対してのみ有効であり、他のチップ
セット、特に Athlon マシンで使われる VIA のチップセットの場合は
使えませんでした[注1参照]。今回の新しいヴァージョンでは、SMBus に
対するアクセスを行なう自前のファンクションを用意することによって、
OS の device driver のサポートのない場合にも SMBus へのアクセスに
対応できるようにしました。従って今回のヴァージョンではデフォルトの
コンパイルでは常に IO port のアクセスを行ないます。この意味でこの
プログラムは「危険」なプログラムです。しかしながら、OS でハード
ウエアモニタチップを操作できる intpm driver のようなデバイス
ドライバが有効な場合には、ver.1.05 と同様な SMBus の ioctl を
使った方法でアクセスさせることも可能です。このためには、コンパイル
オプションとして Makefile 中の DEFS 変数に -DSMBUS_IOCTL を付け
加えてみてください。./configure で /dev/smb0 があることが確認
されていれば、より安全な SMBus の ioctl アクセスファンクションの
方を使用します。

 また、VIA の VT82C686A/B の内蔵ハードウエアモニタ機能の場合には
Winbond のチップとは違った方法で ISA-IO port にアクセスすることに
よって温度等の情報を得ることができます。従って、これを合わせると
全部で 3つの方法でハードウエアモニタチップとアクセスすることが
できます。この VIA チップに特有の方法を method V、 より一般的な
ハードウエアモニタチップへのアクセス方法である SMBus による方法を
method S、そして LM78/79 や Winbond のチップによる ISA-IO port に
よるアクセス方法を method I、として強制的にそれぞれの方法でハード
ウエアモニタから情報を得るためのオプションが

   # mbmon -[V|S|I]
   # xmbmon -method [V|S|I]

です。マザーボードによってどの方法がサポートされているかを調べる
には、デバッグオプションに更にこのオプションを付けて起動してみる
といいでしょう。もし、これらの method オプションを付けない時には
method V、S、I、の順序でチェックして自動的に有効なアクセス方法を
選択して起動するようにしています。なお、xmbmon にはこの他にも多く
のオプションがありますが、これらはヘルプオプション -h (or -help)
付きで起動することによって調べられます。また、それらは X の
resource のところで説明されます。

 開発は FreeBSD 3.5-STABLE 上で行ないましたが、4.X 上でも動作する
ことを確認しています。Linux に対しては、FreeBSD ports の
linux_devtools-6.1 上で compile できることは確認し、また、一部の
方に動作確認をお願いし動作する可能性があることを確かめていますが、
とにかく私自身で確認したものではありません。

 [注1] なお、ごく最近 VIA VT82C596/VT82C686 系のサウスチップ用の
   power management device driver (viapm driver) が作成されたそうで、
   最新の FreeBSD (version 4.X? or 5.X?) ではこれが使えるかもしれ
   ません(未確認)。その場合は、ioctl による SMBus access 方法が
   使える可能性がありますので、-DSMBUS_IOCTL コンパイルオプション付
   で作ったバイナリを使う方が安定性が高いかもしれません。viapm driver
   についての最新情報は、

   http://people.freebsd.org/~nsouch/iicbus.html
   http://www.planet.kobe-u.ac.jp/~takawata/acpi/

を見て下さい。


<< 6. xmbmon の X resource について >>

 xmbmon は X toolkit を用いて作成されており、標準的な X resource
(geometry, font など)が通常通り使えます。この他に xmbmon に特有の
resource は以下の通りです。

XMBmon*count:   下の sec の間に温度等を調べる回数 (default:4)
XMBmon*sec:     グラフの 1点を書く間隔の秒数 (default:20)
XMBmon*wsec:    グラフの全幅に対応する秒数 (default:1800)
XMBmon*tmin:    温度の下限の目盛、度C単位 (default:10.0)
XMBmon*tmax:    温度の上限の目盛、度C単位 (default:50.0)
XMBmon*vmin:    コア電圧の下限の目盛、V単位 (default:1.80)
XMBmon*vmax:    コア電圧の上限の目盛、V単位 (default:2.20)
XMBmon*tick:    温度・コア電圧の目盛のティックの数 (default:3)
XMBmon*cltmb:   Temp0 の線の色 (default:blue)
XMBmon*cltcpu:  Temp1 の線の色 (default:red)
XMBmon*cltcs:   Temp2 の線の色 (default:cyan)
XMBmon*clvc:    Vcore の線の色 (default:green)
XMBmon*cmtmb:   Temp0 用の項目名 (default:\ MB)
XMBmon*cmtcpu:  Temp1 用の項目名 (default:CPU)
XMBmon*cmtcs:   Temp2 用の項目名 (default:chip)
XMBmon*cmvc:    Vcore 用の項目名 (default:Vc\ )
XMBmon*method:  使うアクセス方法 (default:\ )

 デフォルトでは 20(sec)/4(count)=5 秒毎にタイマー割り込みを発生
させて温度等の情報を読みとり、20秒間の 4回の読みとり値の平均値を
グラフにプロットすることになります。xmbmon のウインドウの横幅に対応
する時間が 1800(wsec)秒、すなわち30分間で、もしこれを過ぎると以前の
グラフの値は消去されグラフは新しい値を更新していきます(ちょうど xload
と同じように)。以上の resource は xmbmon のとれるオプションと同じで、
xmbmon を起動する時に指定することもできます。-help オプションを
付けて起動するとこの説明が次のように出ます。

   # xmbmon -help
X MotherBoard Monitor, ver.1.06pl1 by YRS
  options: -g   (100x140)  <geometry(Toolkit option)>
         : -count     (4)  <counts in an interval>
         : -sec      (20)  <seconds of an interval>
         : -wsec   (1800)  <total seconds shown>
         : -tmin   (10.0)  <min. temperature>
         : -tmax   (50.0)  <max. temperature>
         : -vmin   (1.80)  <min. voltage>
         : -vmax   (2.20)  <max. voltage>
         : -tick      (3)  <ticks in ordinate>
         : -cltmb  (blue)  <Temp1 color>
         : -cltcpu  (red)  <Temp2 color>
         : -cltcs  (cyan)  <Temp3 color>
         : -clvc  (green)  <Vcore color>
         : -cmtmb   ( MB)  <comment of Temp1>
         : -cmtcpu  (CPU)  <comment of Temp2>
         : -cmtcs  (chip)  <comment of Temp3>
         : -cmvc    (Vc )  <comment of Vcore>
         : -debug           for debug information
         : -method  (   )  <access method (V|S|I)>

 もし、-DNO_TEMP3 オプションを付けてコンパイルした xmbmon は
X resource の cltcs と cmtcs を使いません。


<< 7. バグ >>

 verion 1.06 であった、他のプログラムが /dev/io を open したまま
でいると xmbmon が暴走する、というバグは pl1 (patch level 1)で fix
されました。今のところこの他に致命的なバグはないと思います。


<< 8. 他のハードウエアモニタチップに対応させたい人へ >>

 今回のヴァージョンでは自前の SMBus アクセスファンクションを実装
したので、OS でサポートされている device driver がなくても、SMBus
に繋がれたハードウエアモニタチップにアクセスして情報を得ることが
可能です。意欲のある人は PCI device configuration から SMBus を
使って power management を司るチップを捜し出しそのチップの使い方
を調査すれば[注2]、この mbmon/xmbmon で現在対応している

   National Semiconductor社    LM78/LM79
   WinBond社                   W83781D, W83782D, W83783S
   ASUSTek社                   AS99127F
   VIA社サウスチップセット     VT82C686A/B 内蔵

以外のハードウエアモニタチップに対応させることができると思います。
このために PCI Configuration を調べるテストプログラムが testpci.c、
SMBus をチェックするプログラムが testsmb.c、また、Winbond-like
なハードウエアモニタ機能をチェックするプログラムが testhwm.c として
このパッケージに含まれています。また、PCI Configuration の情報を
得るファンクションは pci_hwm.c/h に、SMBus に直接アクセスする
ファンクション群は smb_io.c/h に入っています。他のハードウエア
モニタチップに対応させようとする方はこれらを活用してがんばって
みてください。ただし、これらは mbmon/xmbmon より更に危険な
プログラムであることは言うまでもありませんので、OS のクラッシュ
などの不慮の事態に備えることをお忘れなく。

 なお、どのマザーボードがどのようなハードウエアモニタチップを
使っているかに関する情報は例えば、マイクロソフト Windows 上の MBM
(Mother Board Monitor) というプログラムの開発者 Alex van Kaam さん
のホームページ、

   http://mbm.livewiredev.com/

が参考になるでしょう。または、日本では LM78mon というプログラムの
開発者である :p araffin.(米谷)さんのホームページ、

   http://homepage1.nifty.com/paraffin/

の support 掲示版での議論も参考になると思います。また、Winbond の
チップの詳しい情報は以下の PDF ファイルにあります。

   http://www.winbond.com.tw/sheet/w83781d.pdf
   http://www.winbond.com.tw/sheet/w83782d.pdf
   http://www.winbond.com.tw/sheet/w83783s.pdf

または、Linux での hardware monitor のホームページにもこれらの多くの
チップの PDF ファイルが集めてあります。

    http://www.netroedge.com/~lm78/pdfs.html

 しかしながら、一般にハードウエアモニタチップのアクセス方法の情報
は必ずしも公開されているとは限らず、その場合は残念ながら対応は
難しいかもしれません。

 [注2] SMBus (System Management Bus)は PCI bus に繋がったハードウエア
   を繰る汎用バスの一つで、ACPI のような Power Management の機能はこの
   バス上に実装されており、通常この上にハードウエアモニタチップが
   繋がっています。従って、SMBus を通してチップにアクセスするためには
   (1) PCI 上にある power management を司る chip を調べる(例えば Intel
   PIIX4(440BX)、VIA VT82C686A/B)、(2) それに繋がっているハードウエア
   モニタチップ(例えば ASUS AS99127F)を調べる、の 2段階が必要です。
   ここで、VT82C686A/B は south chipset にモニタ機能が内蔵されてます。

<< 9. 謝辞 >>

・最初の公開 version 1.04 では ISA IO port へのアクセスによって
  Winbond chip からの情報を得るものでした。この時、このアクセス方法
  については、上記の MBM の作者の Alex van Kaam さんが当時ホームページ
  で公開されていたものを用いました(残念ながら今この情報は見当たり
  ません)。この情報がなければこのプログラムの開発は行なわれなかった
  でしょう。大変感謝しています(現在詳しい情報は上記の Winbond のホーム
  ページ上にあります)。

・次の公開 version 1.05 の作成に当たっては、SMBus 対応および configure
  への対応について FreeBSD の intpm driver を書かれた渡辺尊紀@神戸大さん
  に全面的に御協力いただきました。今回のヴァージョンでは、この intpm
  に基づく SMBus への ioctl によるアクセス方法とは違うやり方を導入しま
  したが、device driver が導入された環境ではこの方法が最も安全な方法で
  あり、また、このアクセス方法の分離の雛型を示していただいたことは、
  今回も大変役にたちました。大変感謝しています。また、この version 1.05
  から Linux への部分的対応が行なわれましたが、それには 岡村耕二@九大さん
  に協力していただきました。また、ASUS のチップ AS99127F の制御情報に
  ついては上記の LM78mon の作者である 米谷紀幸(:p araffin.)さんにに教え
  ていただきました。以上の方々に感謝いたします。

・今回の version 1.06 では、最近研究室で計算速度重視のために増えて
  きている Athlon マシンでも使えるようにとの目的で開発を行ないました。
  この時 VIA のチップである VT82C686A/B についてはハードウエアモニタ
  機能は公開されておらず、上記の :p araffin.(米谷)さんに全面的に情報
  を教えていただきました。また、ASUS の多くのマザーボードは VT82C686
  を使っていても、ハードウエアモニタは自社の AS99127F を使っており、
  この時には(FreeBSD 3.X では viapm driver が使えないので) SMBus に
  直接アクセスする必要があります。このための PCI Configuration や
  SMBus への直接アクセス方法などの技術情報の詳細についても、上記の
  :p araffin.(米谷)さんの全面的な御協力を得ました。この御協力がなけ
  れば今回のような形のヴァージョンアップ版は作れなかったでしょう。
  いろいろと教えていただいたことには大変感謝しています。


<< 10. 最後に>>

 このプログラムは完全にフリーソフトです。どのように改変・変更
してもかまいませんし、コピー・配布も自由です。また、このプログラム
を使ったために何か不都合なことが起きても作者は一切の責任を負い
ません。今のところ、このプログラムをより一層発展させるつもりは
ありません。ただ、もしこのプログラムを元によりよいものができた時
には作者にフィードバックしていただければ嬉しいです(もちろん全然
義務ではありません)。

   2001年8月25日 九州大学大学院理学研究院物理学部門  清水良文

   e-mail:yrsh2scp@mbox.nc.kyushu-u.ac.jp
   http://www.nt.phys.kyushu-u.ac.jp/shimizu/index.html