[precedente] Rete Locale - Copertina - Linux e i giochi [successivo]

Articolo


L'integrato lm78 e Linux

Questa pagina è una prova: voglio fare capire come si arriva a fare funzionare un dispositivo particolare sotto linux.

Sto scrivendo la pagina "live" cioè, a parte le correzioni al testo perchè non sono un mostro, quindi questo testo diventerà lunghetto, lo so già perchè ho testato la cosa una decina di giorni fa per essere sicuro di riuscirci (sarò matto ma non così tanto!), ora non ricordo UNA FAVA di quello che ho fatto allora, quindi sarà + o - qualcosa di veramente sulla pelle.

L' lm78 è un integrato che, a partire dalla comparsa del chipset Intel TX, viene installato sulle MB per monitorare alcuni parametri, le tensioni, le velocità di rotazione delle ventole, le temperature, sia della CPU che di altre componenti del PC.

Inutile dire che mettere in funzione sto coso è utile, anzi, utilissimo, perchè uno dei problemi che ho spesso sulle mie macchine è proprio quello delle temperature, avere un dispositivo che mi consente di avere anche questa cosa sotto controllo è quasi una manna...

Allora io so che sulla mia MB c'è l'LM78 ora come faccio a farlo munghiare? direi che la prima cosa che faccio è partire da lontano: vado su altavista e faccio una ricerca!!!!!

Allora:

http://www.altavista.com/cgi-bin/query?pg=q&kl=XX&q=%2Blinux+%2Blm78+%2Bhowto&search=Search

quindi:

http://huizen.dds.nl/~frodol/index.html

poi:

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

Questo giusto per fare capire che le cose non si inventano ma sono da trovare in rete!!!

Sarebbe da tradurre, questa è la prima cosa a cui penso, certo però le informazioni non mancano...

Comunque c'è un bellissimo pacchettino da scaricare:

http://www.netroedge.com/~lm78/archive/lm_sensors-1.4.10.tar.gz

(nota la versione precedente è quella che ho trovato dieci giorni fa (nota per gli utenti W$: questo è Linux!) (vecchia versione))

Io scarico i documenti tramite W$ ma su un server linux, questo significa 9 su 10 perdere l'estensione corretta, ora qui ci sono i link corretti, ma la cose a volte rompe.

Bene ora ho il pacchettino, lo metto sul PC destinato a questo test: io l'ho chiamato in modo molto originale debian, è sull'intranet ed è un pc senza scheda video, con un kernel 2.1.125 che butta fuori tutto su console seriale, quindi spero che vada tutto bene.

Debian è un Pentium II a 333Mhz, è il primo PII che compero e devo dire che non sono restato colpito dalla velocità, il mio Sky (un dual Pentium 200Mhz) mi sembra molto più veloce.
Dentro la macchina sono installate 3 schede rete: una ne2k pci, una ne2000 isa pnp ed una 3com 3c590 pci, un controller Adaptec AAA131 e BASTA!!!! ho detto che non c'è la scheda video... e non c'è.

Questa è una pagina con /proc/pci e /proc/cpuinfo (vecchia versione).

Una volta messo il pacchetto su debian (ho usato ftp... niente di particolare) provo come al solito a vedere come è fatto. Questo è un consiglio che passo a tutti, infatti spesso si trovano (maledetti) pacchetti che non mettono tutto in sottodirectory, quindi un bel tar tzf basta a farci capire come questo è fatto:


debian:~# tar tzf lm_sensors-1_4_10_tar.gz 
lm_sensors-1.4.10/Changes.old
...

Va benissimo allora si scompatta con tar xzf e si entra nella directory lm_sensors-1.4.10

Guardate cosa ho fatto:


debian:~/lm_sensors-1.4.10# make
make: *** Warning: File `Makefile' has modification time in the future
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lm78.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lm75.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c main.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c smbus.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c piix4.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c via.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lmsysctl.c
ld -m elf_i386 -r -o lm_sensors.o lm78.o lm75.o main.o smbus.o piix4.o via.o lmsysctl.o
make: *** Warning: Clock skew detected. Your build may be incomplete.
debian:~/lm_sensors-1.4.10# touch *
debian:~/lm_sensors-1.4.10# make
make: Nothing to be done for `all'.
debian:~/lm_sensors-1.4.10# make clean
rm -f *.o lm_sensors.o lmtest .lm_sensors.c .lm_sensors.o
rm -f lm_sensors-*
debian:~/lm_sensors-1.4.10# make
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lm78.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lm75.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c main.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c smbus.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c piix4.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c via.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lmsysctl.c
ld -m elf_i386 -r -o lm_sensors.o lm78.o lm75.o main.o smbus.o piix4.o via.o lmsysctl.o
debian:~/lm_sensors-1.4.10#

Perché i due passaggi? il messaggio di errore è dovuto al fatto che sto testando un sistema con l'ora messa nel 2000... e questo PC ha retto benissimo a livello di Bios, mentre Linux ha ciccato al 2038, ora siccome il sistema non ha video e non ha tastiera l'ora è impostata nel bios in modo che se faccio:


debian:~/lm_sensors-1.4.10# date -s "11/11/1998 20:43"
mer nov 11 20:43:00 CET 1998
debian:~/lm_sensors-1.4.10# hwclock -w
mktime() failed unexpectedly (rc -1). Aborting.
debian:~/lm_sensors-1.4.10#

Salta fuori un errore quando tenta di aggiornare data ed ora del BIOS (hwclock -w), questo perchè Linux non riesce a leggere la data del 2038 che è ora nel sistema..., unico risultato? quando resetto la macchina (ogni 2 ore) riprende in modo errato la data dal BIOS e non riesco ad impostarla!

Andiamo avanti, intanto il pacchetto si è compilato senza errori...., direi che è ottimo.

Come si usa?

C'è un file README con dentro oltre mille altre informazioni utili (da leggere perchè alcune sono avvertenze importanti) questa semplice istruzione:

Compile with 'make' and run 'insmod sensors_mod.o' then read
the file /proc/sensors. See INSTALL for more detailed information.

Seguo le istruzioni alla lettera.... vediamo cosa succede!

debian:~/lm_sensors-1.4.10# insmod lm_sensors.o 
lm_sensors.o: kernel-module version mismatch
lm_sensors.o was compiled for kernel version 2.0.33
while this kernel is version 2.1.125.

Non va... vediamo INSTALL se mi da qualche suggerimento! no... niente su questo, ma allora dove sta il problema?

Provo a vedere se ricompilando le cose vanno a posto (non si sa mai), ma no non cambia nulla.....

Ad un certo punto mi viene in mente che la debian potrebbe non avere il link bensì una directory vera e popria in /usr/include/linux:


debian:/usr/include# ls -ld linux
drwxr-xr-x 3 root root 11264 ott 14 18:21 linux
debian:/usr/include# 

Bingo! allora vediamo così cosa succede:


debian:/usr/include# rm linux
rm: linux: is a directory
debian:/usr/include# mv linux linux-org
debian:/usr/include# mv asm asm-org
debian:/usr/include# mv scsi scsi-org
debian:/usr/include# ln -s /usr/src/linux/include/linux .
debian:/usr/include# ln -s /usr/src/linux/include/asm .
debian:/usr/include# ln -s /usr/src/linux/include/scsi .
debian:/usr/include# cd linux
debian:/usr/include# ls -ld linux
lrwxrwxrwx 1 root root 28 nov 11 20:57 linux -> /usr/src/linux/include/linux
debian:/usr/include#

Tanto per farmi capire, intanto rm per una directory non va (ma uno può anche sbagliarsi), poi viene sempre in mente di non cancellare, bensì rinominare la directory. Poi, e questo è IMPORTANTISSIMO, non è necessario fare queste operazioni se le directory sono già a posto (come link) oppure non è stato cambiato il kernel!

Andiamo avanti e torniamo ai sensori...


debian:~/lm_sensors-1.4.10# make clean
rm -f *.o lm_sensors.o lmtest .lm_sensors.c .lm_sensors.o
rm -f lm_sensors-*
debian:~/lm_sensors-1.4.10# make
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lm78.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lm75.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c main.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c smbus.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c piix4.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c via.c
cc -D__KERNEL__ -DMODULE -I. -O2 -fomit-frame-pointer -D__SMP__ -DEXTERN=extern -c lmsysctl.c
ld -m elf_i386 -r -o lm_sensors.o lm78.o lm75.o main.o smbus.o piix4.o via.o lmsysctl.o
debian:~/lm_sensors-1.4.10# insmod lm_sensors.o
debian:~/lm_sensors-1.4.10# cat /proc/sensors 
Vcore: +0.00V (min = +0.00V, max = +0.00V)
Vcore2: +0.00V (min = +0.00V, max = +0.00V)
+3.3V: +0.00V (min = +0.00V, max = +0.00V)
+5V: +0.00V (min = +0.00V, max = +0.00V)
+12V: +0.00V (min = +0.00V, max = +0.00V)
-12V: +0.00V (min = +0.00V, max = +0.00V)
-5V: +0.00V (min = +0.00V, max = +0.00V)
Fan1: 999999 rpm (min=999999 rpm) 
Fan2: 999999 rpm (min=999999 rpm) 
Fan3: 999999 rpm (min=999999 rpm) 
Mainboard: 0 C (min = 0 C, max = 0 C)
Other alarms: (none)
VID: 3.50 (possibly not connected)
debian:~/lm_sensors-1.4.10#

La conclusione? buco nell'acqua, già io non avevo provato questa MB bensì una TX normalissima, il risultato se tutto funziona è diverso.. ma cerchiamo di capire perchè i sensori non sembrano funzionare. Forse hanno messo su sta piastra un'altro tipo di dispositivo non coperto dal driver Linux...

C'è un programmino di test che fa parte del pacchetto vediamo cosa dice, naturalmente dopo averlo compilato!


debian:~/lm_sensors-1.4.10# make lmtest
cc -O -Wall lmtest.c -o lmtest
smbus.h: In function `SMbus_Write_Block_Data':
In file included from lm78.h:28,
from lmtest.c:26:
smbus.h:140: warning: comparison is always 0 due to limited range of data type
lmtest.c: In function `main':
lmtest.c:50: warning: implicit declaration of function `ioperm'
debian:~/lm_sensors-1.4.10# ./lmtest 
LM78: Busy!debian:~/lm_sensors-1.4.10#
LM78: Busy!debian:~/lm_sensors-1.4.10# ./lmtest
LM78: Busy!debian:~/lm_sensors-1.4.10# ./lmtest

La cosa è strana, nel file lmtest.c viene semplicemente riportato che l'evento Busy! è rarissimo... intanto vediamo anche cosa salta fuori dai file di log:


Nov 11 21:05:22 debian kernel: lm_sensors version 1.4.10 (19981109) 
Nov 11 21:05:22 debian kernel: LM78 detected and installed (accessed through the SMBus, address 0x2d) 
Nov 11 21:05:22 debian kernel: No LM75 temperature sensors found

La cosa si fa interessante: il bus SMBus è riconosciuto ma non vengono trovati sensori...

Direi che non conviene insistere, cerco di capire che diavolo di dispositivo c'è sulla MB, potrebbe bastare per segnalare la cosa agli autori di lm_sensors e magari avere una soluzione!

Mi sposto sul mio server intranet (server2) MB Pentium normale (una TX che so funzionare perfettamente!):


server2:~# cd /src/lm_sensors-1.4.9/
server2:/src/lm_sensors-1.4.9# ls
COPYING         INSTALL         doc/            lm78.h          lmconfig.h      lmtest.c        main.o          smbus.h
Changes         Makefile        lm75.c          lm78.o          lmsmbus.h       lmtest.h        piix4.c         smbus.o
Changes.old     README          lm75.h          lm_sensors.h    lmsysctl.c      lmversion.h     piix4.h
FAQ             TODO            lm75.o          lm_sensors.lsm  lmsysctl.o      main.c          smbus.c
HELP            compat.h        lm78.c          lm_sensors.o    lmtest*         main.h          smbus.c.chng
server2:/src/lm_sensors-1.4.9#

È la versione diversa di lm_sensors.... tanto per farvi capire che stavo facendo sul serio... Cosa succede di diverso?


server2:/src/lm_sensors-1.4.9# 
server2:/src/lm_sensors-1.4.9# insmod lm_sensors.o 
server2:/src/lm_sensors-1.4.9# lsmod
Module Pages Used by
lm_sensors 8 0
ip_alias 1 2 (autoclean)
ipx 3 10 (autoclean)
bsd_comp 1 0
ppp 5 [bsd_comp] 0
slhc 2 [ppp] 0
server2:/src/lm_sensors-1.4.9#

Questo significa solo che il modulo è caricato, mentre quello che segue è più significativo...


server2:/src/lm_sensors-1.4.9# cat /proc/sensors 
Vcore:  +2.84V  (min = +2.70V,  max = +3.29V)
Vcore2: +2.84V  (min = +2.70V,  max = +3.29V)
+3.3V:  +3.52V  (min = +2.97V,  max = +3.63V)
+5V:    +5.13V  (min = +4.48V,  max = +5.48V)
+12V:   +12.03V (min = +10.82V, max = +13.19V)
-12V:   -11.62V (min = -10.79V, max = -13.18V)
-5V:    -4.76V  (min = -4.50V,  max = -5.49V)
Fan1:   0 rpm           (min=3000 rpm)          ALARM   (not connected?)
Fan2:   5075 rpm        (min=3000 rpm)   
Fan3:   0 rpm           (min=3000 rpm)          ALARM   (not connected?)
Mainboard: 31 C (min = 0 C,     max = 50 C)
Other alarms: (none)
VID:     3.00
Temp-1: +30.5 C (Tos = +50.0 C, Thyst = +45.0 C)
server2:/src/lm_sensors-1.4.9# 

Questo direi che funziona.... anche lmtest?


server2:/src/lm_sensors-1.4.9# lmtest 
config: 0x01
mask1: 0x00
mask2: 0x00
nmi mask1: 0x00
nmi mask2: 0x40
vid/fan: 0x55

Post Ram/Value Ram(0x00): 00 00 08 04 48 00 00 90 50 42 70 18 00 00 20 20
Post Ram/Value Ram(0x10): 20 00 02 10 00 80 10 00 00 02 00 00 10 00 00 01
Post Ram/Value Ram(0x20): B2 B2 DC BE C6 D1 C6 1F FF 84 FF CE A9 CE A9 E3
Post Ram/Value Ram(0x30): BA CB A6 D9 B2 ED C2 E4 BB 32 00 E1 E1 E1 30 01
Post Ram/Value Ram(0x40): 01 40 08 00 00 00 40 55 2D 40 40 40 40 40 40 00
Post Ram/Value Ram(0x50): 01 00 00 00 00 00 40 55 2D 40 40 40 40 40 40 00
Post Ram/Value Ram(0x60): B2 B2 DC BE C6 D1 C6 1F FF 84 FF CE A9 CE A9 E3
Post Ram/Value Ram(0x70): BA CB A6 D9 B2 ED C2 E4 BB 32 00 E1 E1 E1 30 01
VID/Fan Divisor Register: 0x55
Serial bus address: 0x2D
IN0: 178 (2.85)   Min: 169 (2.70)  Max: 206 (3.30)
IN1: 178 (2.85)   Min: 169 (2.70)  Max: 206 (3.30)
IN2: 220 (3.52)   Min: 186 (2.98)  Max: 227 (3.63)
IN3: 190 (5.02)   Min: 166 (4.39)  Max: 203 (5.37)
IN4: 198 (12.21)   Min: 178 (10.98)  Max: 217 (13.39)
-IN5: 209 (-11.87)   Min: 194 (-11.01)  Max: 237 (-13.46)
-IN6: 198 (-4.84)   Min: 187 (-4.57)  Max: 228 (-5.57)
----------
Mb_temp: 31
Fan1: 0 rpm
Fan2: 5114 rpm
Fan3: 0 rpm
server2:/src/lm_sensors-1.4.9# 

Si, evidentemente la macchina con il PII ha qualche problema.

Conclusione

A me non interessava presentare un successo sicuro, l'idea era di fare capire a tutti che le cose ci sono e per farle funzionare, all'inizio specialmente, ci vuole un po' di applicazione.

Spero che questo pezzo di testo possa aiutare altri utenti Linux a risolvere problemi magari più semplici, in fondo in mezzo a tante cose inutili, legate all'argomento, ho cercato di mettere in campo un metodo, quello che uso io, che può non essere universale, può essere oscuro a qualcuno, ma funziona!

di Massimo Nuvoli


[precedente] Rete Locale - Copertina - Linux e i giochi [successivo]