Changeset 1987

Show
Ignore:
Timestamp:
08/31/03 22:45:12 (5 years ago)
Author:
jrm
Message:

(jrm): New driver and other support for the Maxim MAX6650 and MAX6651 chips.

Mainly targetted (and tested) with the 6651, but should work with
the MAX6550.

See doc/chips/max6650 for notes, bugs, assumptions, etc.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • lm-sensors/trunk/CHANGES

    r1978 r1987  
    5959  Module lm83: Add t_crit and alarms support 
    6060  Module lm90: New 
     61  Module max6650: New 
    6162  Module saa1064: New 
    6263  Module w83781d: Enhance chip detection 
  • lm-sensors/trunk/CONTRIBUTORS

    r1896 r1987  
    9191* Sascha Volkenandt <sascha@akv-soft.de> 
    9292  Author of the SAA1064 chip driver. 
     93* John Morris (john.morris@spirentcom.com) 
     94  Author of the MAX6650 chip driver. 
     95   
  • lm-sensors/trunk/README

    r1897 r1987  
    7878  Intel Xeon processor embedded sensors 
    7979  ITE IT8705F, IT8712F embedded sensors 
    80   Maxim MAX1617 and MAX1617A 
     80  Maxim MAX1617, MAX1617A, MAX6650 and MAX6651 
    8181  Microchip TC1068, TCM1617, TCN75 
    8282  Myson MTP008 
  • lm-sensors/trunk/lib/chips.c

    r1978 r1987  
    44444444  }; 
    44454445 
     4446static sensors_chip_feature max6650_features[] = 
     4447  { 
     4448    { SENSORS_MAX6650_FAN1_TACH, "fan1", SENSORS_NO_MAPPING, 
     4449                                 SENSORS_NO_MAPPING, SENSORS_MODE_R, 
     4450                                 MAX6650_SYSCTL_FAN1, VALUE(1), 0 }, 
     4451    { SENSORS_MAX6650_FAN2_TACH, "fan2", SENSORS_NO_MAPPING, 
     4452                                 SENSORS_NO_MAPPING, SENSORS_MODE_R, 
     4453                                 MAX6650_SYSCTL_FAN2, VALUE(1), 0 }, 
     4454    { SENSORS_MAX6650_FAN3_TACH, "fan3", SENSORS_NO_MAPPING, 
     4455                                 SENSORS_NO_MAPPING, SENSORS_MODE_R, 
     4456                                 MAX6650_SYSCTL_FAN3, VALUE(1), 0 }, 
     4457    { SENSORS_MAX6650_FAN4_TACH, "fan4", SENSORS_NO_MAPPING, 
     4458                                 SENSORS_NO_MAPPING, SENSORS_MODE_R, 
     4459                                 MAX6650_SYSCTL_FAN4, VALUE(1), 0 }, 
     4460    { SENSORS_MAX6650_SPEED, "speed", SENSORS_NO_MAPPING, 
     4461                                 SENSORS_NO_MAPPING, SENSORS_MODE_RW, 
     4462                                 MAX6650_SYSCTL_SPEED, VALUE(1), 0 }, 
     4463  }; 
     4464 
    44464465sensors_chip_features sensors_chip_features_list[] = 
    44474466{ 
     
    45124531 { SENSORS_LM90_PREFIX, lm90_features }, 
    45134532 { SENSORS_XEONTEMP_PREFIX, xeontemp_features }, 
     4533 { SENSORS_MAX6650_PREFIX, max6650_features }, 
    45144534 { 0 } 
    45154535}; 
  • lm-sensors/trunk/lib/chips.h

    r1978 r1987  
    16561656#define SENSORS_XEONTEMP_ALARMS 81 /* R */ 
    16571657 
     1658/* MAX6650 / 1 chips */ 
     1659 
     1660#define SENSORS_MAX6650_PREFIX "max6650" 
     1661 
     1662#define SENSORS_MAX6650_FAN1_TACH  1 /* R */ 
     1663#define SENSORS_MAX6650_FAN2_TACH  2 /* R */ 
     1664#define SENSORS_MAX6650_FAN3_TACH  3 /* R */ 
     1665#define SENSORS_MAX6650_FAN4_TACH  4 /* R */ 
     1666#define SENSORS_MAX6650_SPEED      5 /* RW */ 
     1667 
    16581668#endif /* def LIB_SENSORS_CHIPS_H */ 
  • lm-sensors/trunk/prog/detect/sensors-detect

    r1982 r1987  
    777777            ipmi_smic_detect via8231_isa_detect lm85_detect smartbatt_detect 
    778778            adm1026_detect w83l785ts_detect lm83_detect lm90_detect 
    779             saa1064_detect w83l784r_detect mozart_detect); 
     779            saa1064_detect w83l784r_detect mozart_detect max6650_detect); 
    780780 
    781781# This is a list of all recognized chips.  
     
    10601060       i2c_addrs => [0x18..0x1a,0x29..0x2b,0x4c..0x4e], 
    10611061       i2c_detect => sub { adm1021_detect 3, @_ }, 
     1062     }, 
     1063     { 
     1064       name => "Maxim MAX6650/MAX6651", 
     1065       driver => "max6650", 
     1066       i2c_addrs => [0x1b,0x1f,0x48,0x4b], 
     1067       i2c_detect => sub { max6650_detect 0, @_ }, 
    10621068     }, 
    10631069     { 
     
    34013407} 
    34023408 
     3409# $_[0]: Chip to detect. Always zero for now, but available for future use 
     3410#        if somebody finds a way to distinguish MAX6650 and MAX6651. 
     3411# $_[1]: A reference to the file descriptor to access this chip. 
     3412#        We may assume an i2c_set_slave_addr was already done. 
     3413# $_[2]: Address 
     3414# Returns: undef if not detected, 4 if detected. 
     3415# 
     3416# The max6650 has no device ID register. However, a few registers have 
     3417# spare bits, which are documented as being always zero on read. We read 
     3418# all of these registers check the spare bits. Any non-zero means this 
     3419# is not a max6650/1. 
     3420# 
     3421# The always zero bits are:  
     3422#   configuration byte register (0x02) - top 2 bits  
     3423#   gpio status register (0x14) - top 3 bits 
     3424#   alarm enable register (0x08) - top 3 bits 
     3425#   alarm status register (0x0A) - top 3 bits 
     3426#   tachometer count time register (0x16) - top 6 bits 
     3427sub max6650_detect 
     3428{ 
     3429  my ($chip, $file) = @_; 
     3430  return if i2c_smbus_read_byte_data($file,0x16) & 0xFC; 
     3431  return if i2c_smbus_read_byte_data($file,0x0A) & 0xE0; 
     3432  return if i2c_smbus_read_byte_data($file,0x08) & 0xE0; 
     3433  return if i2c_smbus_read_byte_data($file,0x14) & 0xE0; 
     3434  return if i2c_smbus_read_byte_data($file,0x02) & 0xC0; 
     3435  return 4; 
     3436} 
    34033437 
    34043438 
  • lm-sensors/trunk/prog/sensors/chips.c

    r1978 r1987  
    45124512} 
    45134513 
     4514void print_max6650(const sensors_chip_name *name) 
     4515{ 
     4516  char *label = NULL; 
     4517  double tach, speed; 
     4518  int valid, i; 
     4519 
     4520  static const struct 
     4521  { 
     4522    int tag; 
     4523    char *name; 
     4524  } 
     4525  tach_list[] = 
     4526  { 
     4527    { SENSORS_MAX6650_FAN1_TACH, "FAN1" }, 
     4528    { SENSORS_MAX6650_FAN2_TACH, "FAN2" }, 
     4529    { SENSORS_MAX6650_FAN3_TACH, "FAN3" }, 
     4530    { SENSORS_MAX6650_FAN4_TACH, "FAN4" } 
     4531  }; 
     4532 
     4533  /* Display full config for fan1, which is controlled */ 
     4534 
     4535  if (!sensors_get_label_and_valid(*name,tach_list[0].tag,&label,&valid) && 
     4536      !sensors_get_feature(*name,tach_list[0].tag,&tach) && 
     4537      !sensors_get_feature(*name,SENSORS_MAX6650_SPEED,&speed)) { 
     4538    if (valid) { 
     4539      print_label(label,10); 
     4540      printf("configured %4.0f RPM, actual %4.0f RPM.\n", speed, tach); 
     4541    } 
     4542  } else 
     4543    printf("ERROR: Can't get %s data!\n", tach_list[i].name); 
     4544  free_the_label(&label); 
     4545   
     4546  /* Just display the measured speed for the other three, uncontrolled fans */ 
     4547   
     4548  for (i = 1; i < 4; i++) 
     4549  { 
     4550    if (!sensors_get_label_and_valid(*name,tach_list[i].tag,&label,&valid) && 
     4551        !sensors_get_feature(*name,tach_list[i].tag,&tach)) { 
     4552      if (valid) { 
     4553        print_label(label,10); 
     4554        printf("%4.0f RPM  \n", tach); 
     4555      } 
     4556    } else 
     4557      printf("ERROR: Can't get %s data!\n", tach_list[i].name); 
     4558  
     4559    free_the_label(&label); 
     4560  } 
     4561} 
     4562 
    45144563void print_unknown_chip(const sensors_chip_name *name) 
    45154564{ 
  • lm-sensors/trunk/prog/sensors/chips.h

    r1978 r1987  
    5656extern void print_lm90(const sensors_chip_name *name); 
    5757extern void print_xeontemp(const sensors_chip_name *name); 
     58extern void print_max6650(const sensors_chip_name *name); 
    5859 
    5960#endif /* def PROG_SENSORS_CHIPS_H */ 
  • lm-sensors/trunk/prog/sensors/main.c

    r1978 r1987  
    381381  else if (!strcmp(name.prefix,"xeontemp")) 
    382382    print_xeontemp(&name); 
     383  else if (!strcmp(name.prefix,"max6650")) 
     384    print_max6650(&name); 
    383385  else 
    384386    print_unknown_chip(&name);