Addresses scanned: I2C 0x48 - 0x4f
Datasheet: Publicly available from www.datasheetarchive.com
+ * Maxim Integrated DS1631
+ Prefix: 'ds1631'
+ Addresses scanned: I2C 0x48 - 0x4f
+ Datasheet: Publicly available from www.maximintegrated.com
+
* Maxim Integrated DS1721
Prefix: 'ds1721'
Addresses scanned: I2C 0x48 - 0x4f
non-volatile registers may last for 10ms or below.
The DS1625 is pin compatible and functionally equivalent with the DS1621,
-but the DS1621 is meant to replace it.
+but the DS1621 is meant to replace it. The DS1631 and DS1721 are also
+pin compatible with the DS1621, but provide multi-resolution support.
+
+Since there is no version register, there is no unique identification
+for these devices. In addition, the DS1631 and DS1721 will emulate a
+DS1621 device, if not explicitly instantiated (why? because the detect
+function compares the temperature register values bits and checks for a
+9-bit resolution). Therefore, for correct device identification and
+functionality, explicit device instantiation is required.
The DS1721 is pin compatible with the DS1621, has an accuracy of +/- 1.0
degree Celius over a -10 to +85 degree range, a minimum/maximum alarm
In addition, the DS1721 supports four resolution settings from 9 to 12 bits
(defined in degrees C per LSB: 0.5, 0.25, 0.125, and 0.0625, respectifully),
-that are set at device power on to the highest resolution: 12-bits (0.0625 degree C).
+that are set at device power on to the highest resolution: 12-bits.
+
+One additional note about the ds1721 is that although the data sheet says
+the temperature flags (THF and TLF) are used internally, these flags do
+get set and cleared as the actual temperature crosses the min or max settings.
+
+The DS1631 is also pin compatible with the DS1621 and feature compatible with
+the DS1721, however the DS1631 accuracy is +/- 0.5 degree Celius over the
+same range.
-Changing the DS1721 resolution mode affects the conversion time and can be
+Changing the DS1631/1721 resolution mode affects the conversion time and can be
done from userspace, via the device 'update_interval' sysfs attribute. This
attribute will normalize range of input values to the device maximum resolution
values defined in the datasheet as such:
* resolution, a thermal alarm output (Tout), and user-defined minimum
* and maximum temperature thresholds (TH & TL).
*
- * The DS1625 & DS1721 are pin compatible with the DS1621 and similar
- * in operation, with slight variations as noted in the device
+ * The DS1625, DS1631, & DS1721 are pin compatible with the DS1621 and
+ * similar in operation, with slight variations as noted in the device
* datasheets (please refer to www.maximintegrated.com for specific
* device information).
*
0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
/* Supported devices */
-enum chips { ds1621, ds1625, ds1721 };
+enum chips { ds1621, ds1625, ds1631, ds1721 };
/* Insmod parameters */
static int polarity = -1;
* 7 6 5 4 3 2 1 0
* |Done|THF |TLF |NVB | 1 | 0 |POL |1SHOT|
*
+ * - DS1631:
+ * 7 6 5 4 3 2 1 0
+ * |Done|THF |TLF |NVB | R1 | R0 |POL |1SHOT|
+ *
* - DS1721:
* 7 6 5 4 3 2 1 0
* |Done| X | X | U | R1 | R0 |POL |1SHOT|
/*
* TEMP: 0.001C/bit (-55C to +125C)
* REG:
- * - 1621, 1625: x = 0.5C
- * - 1721: x = 0.0625C
+ * - 1621, 1625: 0.5C/bit
+ * - 1631, 1721: 0.0625C/bit
* Assume highest resolution and let the bits fall where they may..
*/
static inline u16 DS1621_TEMP_TO_REG(long temp)
data->update_interval = DS1625_CONVERSION_MAX;
sreg = DS1621_COM_START;
break;
+ case ds1631:
case ds1721:
resol = (new_conf & DS1621_REG_CONFIG_RESOL) >>
DS1621_REG_CONFIG_RESOL_SHIFT;
devattr = container_of(attr, struct device_attribute, attr);
if (attr == &dev_attr_update_interval.attr)
- if (data->kind != ds1721)
+ if (data->kind == ds1621 || data->kind == ds1625)
/* shhh, we're hiding update_interval */
return 0;
return attr->mode;
conf = i2c_smbus_read_byte_data(client, DS1621_REG_CONF);
if (conf < 0 || conf & DS1621_REG_CONFIG_NVB)
return -ENODEV;
- /* The 7 lowest bits of a temperature should always be 0. */
+ /*
+ * The ds1621 & ds1625 use 9-bit resolution, so the 7 lowest bits
+ * of the temperature should always be 0 (NOTE: The other chips
+ * have multi-resolution support, so if they have 9-bit resolution
+ * configured and the min/max temperature values set accordingly,
+ * then if not explicitly instantiated, they *will* appear as and
+ * emulate a ds1621 device).
+ */
for (i = 0; i < ARRAY_SIZE(DS1621_REG_TEMP); i++) {
temp = i2c_smbus_read_word_data(client, DS1621_REG_TEMP[i]);
if (temp < 0 || (temp & 0x7f00))
static const struct i2c_device_id ds1621_id[] = {
{ "ds1621", ds1621 },
{ "ds1625", ds1625 },
+ { "ds1631", ds1631 },
{ "ds1721", ds1721 },
{ }
};