110Gd (IT8718F) のためにカーネルモジュール it87.c をビルドする (1)
(1) といいつつ,時間がないのでたぶん続きません。
NEC Express 5800 / 110Gd には ITE の 8718F というセンサモジュールが搭載されてます。ですが,これは rhel の 2.6.18 系のカーネルではサポートされていません*1。なので lm_sensors で測定不可能です。
下位コンパチの IT87 として認識させようとしたけど
% sudo modprobe it87 force_it87=9191,0x290
うまくいきません(force_it8712 でもだめ)。
仕方ないので,カーネルモジュールを up to date なものでビルドすることにします。まず http://www.lm-sensors.org/wiki/Devices の IT8718F の「patch to 2.6.18」というのを 2.6.18-8.1.14 のソースに当てて,it87.c をでっちあげます*2。
Kconfig の内容は以下の通り。
config SENSORS_IT87 tristate "ITE IT87xx and compatibles" depends on I2C select I2C_ISA select HWMON_VID help If you say yes here you get support for ITE IT8705F, IT8712F, IT8716F and IT8718F sensor chips, and the SiS960 clone. This driver can also be built as a module. If so, the module will be called it87.
Makefile の内容は以下の通り。書き方は,カーネルモジュールことはじめ - や を参考にしました。
KDIR := /lib/modules/$(shell uname -r)/build obj-$(CONFIG_SENSORS_IT87) += it87.o all: it87.ko it87.ko: it87.c make -C $(KDIR) M=`pwd` modules clean: make -C $(KDIR) -r M=`pwd` clean
んで,make すると it87.ko ができます。
いざインストール,と思ったんですがシステムのを書き換えるのにはちょっとためらいがあるし,と思って,/lib/modules/`uname -r`/ の下を覗くと extra, updates, weak-updates という意味ありげなディレクトリがありました。ところが,ここのいずれにおいても単純に modprobe してもうまく認識されません*3。
なので,とりあえず insmod it87.ko してカーネルモジュールをロード。
するとカーネルメッセージとして下記を吐いて正常に読み込まれました(dmesg 等で確認)。
it87: Found IT8718F chip at 0x290, revision 1
いざいざ,sensors で確認。
% sensors it8718-isa-0290 Adapter: ISA adapter
認識はされてるみたいだけど,データがとれない模様。
user land のプログラムも新しいのをビルドして確認してみます。
% make user % prog/sensors/sensors it8718-isa-0290 Adapter: ISA adapter ERROR: Can't get alarm data! ERROR: Can't get IN0 data! ERROR: Can't get IN1 data! ERROR: Can't get IN2 data! ERROR: Can't get IN3 data! ERROR: Can't get IN4 data! ERROR: Can't get IN7 data! ERROR: Can't get IN8 data! ERROR: Can't get TEMP1 data! ERROR: Can't get TEMP2 data! ERROR: Can't get TEMP3 data!
やっぱうまくいかない!
んでも,
% ls /sys/bus/i2c/devices/9191-0290/ alarms hwmon:hwmon0 in3_input in6_max pwm2 temp2_max bus in0_input in3_max in6_min pwm2_enable temp2_min cpu0_vid in0_max in3_min in7_input pwm3 temp2_type driver in0_min in4_input in7_max pwm3_enable temp3_input fan1_input in1_input in4_max in7_min subsystem temp3_max fan1_min in1_max in4_min in8_input temp1_input temp3_min fan2_input in1_min in5_input name temp1_max temp3_type fan2_min in2_input in5_max power temp1_min uevent fan3_input in2_max in5_min pwm1 temp1_type vrm fan3_min in2_min in6_input pwm1_enable temp2_input % cat /sys/bus/i2c/devices/9191-0290/temp1_input 41000
おお,sysfs 経由ではとれてるみたい。
んーむつかしい,というところで時間切れ。
2007/10/16 追記
あーひょっとして
% ldd prog/sensors/sensors libsensors.so.3 => /usr/lib64/libsensors.so.3 (0x0000003819c00000) libc.so.6 => /lib64/libc.so.6 (0x0000003920c00000) libm.so.6 => /lib64/libm.so.6 (0x0000003921400000) libsysfs.so.2 => /usr/lib64/libsysfs.so.2 (0x0000003921000000) /lib64/ld-linux-x86-64.so.2 (0x0000003920800000)
んーやっぱり!システム付属の libsensors を見てるのね。
では,ということで LD_PRELOAD (see Binary Hacks #60)を使って,
% LD_PRELOAD=lib/libsensors.so.3 prog/sensors/sensors it8718-isa-0290 Adapter: ISA adapter in0: +1.14 V (min = +0.72 V, max = +1.65 V) in1: +1.78 V (min = +1.52 V, max = +2.08 V) in2: +3.25 V (min = +2.80 V, max = +3.81 V) in3: +4.08 V (min = +2.72 V, max = +3.68 V) ALARM in4: +2.99 V (min = +2.54 V, max = +3.46 V) in5: +0.00 V (min = +0.00 V, max = +4.08 V) ALARM in6: +1.17 V (min = +0.00 V, max = +4.08 V) in7: +2.51 V (min = +2.11 V, max = +2.88 V) in8: +3.26 V fan1: 2115 RPM (min = 1687 RPM) fan2: 1674 RPM (min = 1101 RPM) fan3: 1687 RPM (min = 1101 RPM) temp1: +40°C (low = +5°C, high = +93°C) sensor = diode temp2: +42°C (low = -1°C, high = +127°C) sensor = thermistor temp3: +34°C (low = +5°C, high = +65°C) sensor = thermistor vid: +0.000 V
おお,(一応)うまくいきました。
ITE8718F だと vid に対応してるはずなんですが 0V になってますね。でもこれ Fedora 7 でもそうだから,よしとします。
あとは rpm パッケージングかぁ……