Broken DS1621 detection / ds1621 module / A7V8X

Prof. Dr. Peter A. Henning p.henning at
Tue Jan 4 02:08:12 CET 2005

Hi there,

I have some DS1621 temperature sensors attached to an VIA 8235 sitting on my 
Asus A7V8X.

Detection of the DS1621 in sensors-detect is broken. According to the data 
sheet of the DS1621, one bit of the configuration register is always 1 and 
another always 0. This is simply not true, if the chip is not properly 
initialized. I suggest the following replacement for sub ds1621_detect in 

--------------- SNIP ---------------------------------------------------
# $_[0]: A reference to the file descriptor to access this chip.
#        We may assume an i2c_set_slave_addr was already done.
# $_[1]: Address
# Returns: undef if not detected, (3) if detected,
#   (5) or (7) if even more bits match. 
# Registers used:
#   0xAA: Temperature
#   0xA1: High limit
#   0xA2: Low limit
#   0xAC: Configuration
# subroutine modified by Peter A. Henning
# Old version checks, if Bit 3 is set and Bit 2 is clear. 
# The DS1621 will however aways have a config like 0x????1??? 
# Also, the calculation of temperatures needs to swap bytes. The lower byte 
# (before swapping) contains the temperature as signed 8-bit integer, the
# higher byte's (before swapping) highest bit is worth another 0.5 degree.
# Hence, logical AND with 0x7F00 should give zero. 

sub ds1621_detect
  my $i;
  my ($file,$addr) = @_;
  my $temp = i2c_smbus_read_word_data($file,0xAA);
  return if ($temp & 0x7F00);
  $temp = i2c_smbus_read_word_data($file,0xA1);
  return if ($temp & 0x7F00);
  $temp = i2c_smbus_read_word_data($file,0xA2);
  return if ($temp & 0x7F00);
  my $conf = i2c_smbus_read_byte_data($file,0xAC);
  return (7) if ($conf & 0x10) == 0x10;
------------- SNAP --------------------------------------------------------

The DS1621 kernel driver module only loads correctly, if each of the DS1621 
chips is initialized properly. For this I use a simple Perl script writing 
into the configuration register a value of 0x09


Could one integrate this into the kernel module ?

A note on the Asus Mainboard A7V8X: It carries an ASB100 chip, which occupies 
addresses 0x48 and 0x49. These collide with the two lower addresses possible 
for the DS1621 (ranging from 0x48 - 0x4f). Address bits for the DS1621 must 
be set accordingly. Also, I find that for this Asus Mainboard one needs a 
different temperature algorithm in sensors.conf:

Contribution to sensors.conf:

------------- SNIP -------------------------------------------
# Dallas 1621 Chips connected to internal SMBus
# Last number = 48 + 3-Bit Adress set at Sensor Chip
# Careful: Adresses 0x48 and 0x49 need to be kept free for asb100
chip "ds1621-i2c-*-4f"
    label temp  "Power Temp"
    set temp_hyst 35
    set temp_over 40
chip "ds1621-i2c-*-4e"
    label temp  "GPU Temp"
    set temp_hyst 45
    set temp_over 55
chip "ds1621-i2c-*-4d"
    label temp  "Harddisk Temp"
    set temp_hyst 35
    set temp_over 40
# Configuration for Asus A7V8X
# asb100 Chip on Board
chip "asb100-*"

    (Here is the usual stuff for voltages & fans)

    # Used for Athlon Socket A
    # obtained by careful comparison against Asus Probe under Windows
    label temp2 "CPU Socket Temp"
    set temp2_over 60
    set temp2_hyst 50
    compute temp2 (@*90/100)+7, (@-7)*100/90

    # Used for Athlon diode
    # obtained by careful comparison against Asus Probe under Windows
    label temp4 "CPU Diode Temp"
    set temp4_over 60
    set temp4_hyst 50
    compute temp4 (@*90/100)+7, (@-7)*100/90
---------------- SNAP ----------------------------------------------------             


Peter Henning

----------------------------------------------PGP 0x5CDC14A1 -------
| Prof.Dr.Peter A.Henning
| European E-Learning Award EureleA
| Director MediaLab
| Computer Science, Karlsruhe University of Applied Sciences

More information about the lm-sensors mailing list