Changeset 5935

Show
Ignore:
Timestamp:
02/24/11 10:49:17 (4 years ago)
Author:
khali
Message:

Add detection of National Semiconductor LM75A.

Location:
lm-sensors/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/CHANGES

    r5934 r5935  
    3030                  Add detection of AMD family 12h and 14h thermal sensors 
    3131                  Add detection of EMC6D103S 
     32                  Add detection of National Semiconductor LM75A 
    3233 
    33343.2.0 (2010-10-10) 
  • lm-sensors/trunk/prog/detect/sensors-detect

    r5934 r5935  
    503503                i2c_detect => sub { lm75_detect(@_, 0); }, 
    504504        }, { 
     505                name => "National Semiconductor LM75A", 
     506                driver => "lm75", 
     507                i2c_addrs => [0x48..0x4f], 
     508                i2c_detect => sub { lm75_detect(@_, 2); }, 
     509        }, { 
    505510                name => "Dallas Semiconductor DS75", 
    506511                driver => "lm75", 
     
    38403845} 
    38413846 
    3842 # Chip to detect: 0 = LM75, 1 = DS75 
     3847# Chip to detect: 0 = LM75, 1 = DS75, 2 = LM75A 
    38433848# Registers used: 
    38443849#   0x00: Temperature 
     
    38473852#   0x03: Overtemperature Shutdown 
    38483853#   0x04-0x07: No registers 
     3854#   0x07: Device ID (LM75A only) 
    38493855# The first detection step is based on the fact that the LM75 has only 
    38503856# four registers, and cycles addresses over 8-byte boundaries. We use the 
     
    38563862# all register addresses from 0x04 to 0x0f behave like 0x04-0x07 do for 
    38573863# the LM75. 
     3864# And the LM75A is again different, it cycles over 8-byte boundaries, but 
     3865# registers 0x04-0x06 return 0xff. Thankfully it has a device ID register 
     3866# at 0x07. 
    38583867# Not all devices enjoy SMBus read word transactions, so we use read byte 
    38593868# transactions even for the 16-bit registers. The low bits aren't very 
     
    38653874        my $cur = i2c_smbus_read_byte_data($file, 0x00); 
    38663875        my $conf = i2c_smbus_read_byte_data($file, 0x01); 
    3867  
    3868         my $hyst = i2c_smbus_read_byte_data($file, 0x02, NO_CACHE); 
    3869         my $maxreg = $chip == 1 ? 0x0f : 0x07; 
    3870         for $i (0x04 .. $maxreg) { 
    3871                 return if i2c_smbus_read_byte_data($file, $i, NO_CACHE) != $hyst; 
    3872         } 
    3873  
    3874         my $os = i2c_smbus_read_byte_data($file, 0x03, NO_CACHE); 
    3875         for $i (0x04 .. $maxreg) { 
    3876                 return if i2c_smbus_read_byte_data($file, $i, NO_CACHE) != $os; 
    3877         } 
    3878  
    3879         if ($chip == 0) { 
     3876        my ($maxreg, $hyst, $os, $dev_id); 
     3877 
     3878        if ($chip == 2) {       # LM75A 
     3879                $dev_id = i2c_smbus_read_byte_data($file, 0x07); 
     3880                return if $dev_id != 0xA1; 
     3881 
     3882                $hyst = i2c_smbus_read_byte_data($file, 0x02); 
     3883                $os = i2c_smbus_read_byte_data($file, 0x03); 
     3884 
     3885                for $i (0x04 .. 0x06) { 
     3886                        return if i2c_smbus_read_byte_data($file, $i) != 0xff; 
     3887                } 
     3888        } else {                # LM75 or DS75 
     3889                $maxreg = $chip == 1 ? 0x0f : 0x07; 
     3890                $hyst = i2c_smbus_read_byte_data($file, 0x02, NO_CACHE); 
     3891                for $i (0x04 .. $maxreg) { 
     3892                        return if i2c_smbus_read_byte_data($file, $i, NO_CACHE) != $hyst; 
     3893                } 
     3894 
     3895                $os = i2c_smbus_read_byte_data($file, 0x03, NO_CACHE); 
     3896                for $i (0x04 .. $maxreg) { 
     3897                        return if i2c_smbus_read_byte_data($file, $i, NO_CACHE) != $os; 
     3898                } 
     3899        } 
     3900 
     3901        if ($chip != 1) {       # LM75 or LM75A 
    38803902                for ($i = 8; $i <= 248; $i += 40) { 
    38813903                        return if i2c_smbus_read_byte_data($file, $i + 0x01) != $conf 
    38823904                               or i2c_smbus_read_byte_data($file, $i + 0x02) != $hyst 
    38833905                               or i2c_smbus_read_byte_data($file, $i + 0x03) != $os; 
     3906                        return if $chip == 2 
     3907                              and i2c_smbus_read_byte_data($file, $i + 0x07) != $dev_id; 
    38843908                } 
    38853909        } 
     
    38893913 
    38903914        # Unused bits 
    3891         return if $chip == 0 and ($conf & 0xe0); 
     3915        return if $chip != 1 and ($conf & 0xe0); 
    38923916        return if $chip == 1 and ($conf & 0x80); 
    38933917