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 パッケージングかぁ……

*1:2.6.20 以降の Fedora 7 では認識されます

*2:最新版の lm_sensors のソースからビルドしてもいいかとも思いましたが,念のため使用しているカーネルのソースにパッチをあてることにしました

*3:これらのディレクトリについてググったんですが,返答のついてない ml の記事にしかヒットしませんでした