Support LM77 Temperature.

This commit is contained in:
kiyohara 2006-05-17 00:10:54 +00:00
parent dbbc553deb
commit 43911ef4e2
2 changed files with 78 additions and 12 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: lm75.c,v 1.8 2006/05/05 18:04:42 thorpej Exp $ */
/* $NetBSD: lm75.c,v 1.9 2006/05/17 00:10:54 kiyohara Exp $ */
/*
* Copyright (c) 2003 Wasabi Systems, Inc.
@ -49,12 +49,13 @@ struct lmtemp_softc {
struct device sc_dev;
i2c_tag_t sc_tag;
int sc_address;
int sc_is_ds75;
struct envsys_tre_data sc_sensor[1];
struct envsys_basic_info sc_info[1];
struct sysmon_envsys sc_sysmon;
uint32_t (*sc_lmtemp_decode)(const uint8_t *);
};
static int lmtemp_match(struct device *, struct cfdata *, void *);
@ -76,13 +77,45 @@ static const struct envsys_range lmtemp_ranges[] = {
static int lmtemp_config_write(struct lmtemp_softc *, uint8_t);
static uint32_t lmtemp_decode_lm75(const uint8_t *);
static uint32_t lmtemp_decode_ds75(const uint8_t *);
static uint32_t lmtemp_decode_lm77(const uint8_t *);
enum {
lmtemp_lm75 = 0,
lmtemp_ds75,
lmtemp_lm77,
};
static const struct {
int lmtemp_type;
const char *lmtemp_name;
int lmtemp_addrmask;
int lmtemp_addr;
uint32_t (*lmtemp_decode)(const uint8_t *);
} lmtemptbl[] = {
{ lmtemp_lm75, "LM75",
LM75_ADDRMASK, LM75_ADDR, lmtemp_decode_lm75 },
{ lmtemp_ds75, "DS75",
LM75_ADDRMASK, LM75_ADDR, lmtemp_decode_ds75 },
{ lmtemp_lm77, "LM77",
LM77_ADDRMASK, LM77_ADDR, lmtemp_decode_lm77 },
{ -1, NULL,
0, 0, NULL }
};
static int
lmtemp_match(struct device *parent, struct cfdata *cf, void *aux)
{
struct i2c_attach_args *ia = aux;
int i;
if ((ia->ia_addr & LM75_ADDRMASK) == LM75_ADDR)
for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
if (lmtemptbl[i].lmtemp_type == cf->cf_flags)
break;
if (lmtemptbl[i].lmtemp_type == -1)
return (0);
if ((ia->ia_addr & lmtemptbl[i].lmtemp_addrmask) ==
lmtemptbl[i].lmtemp_addr)
return (1);
return (0);
@ -94,14 +127,18 @@ lmtemp_attach(struct device *parent, struct device *self, void *aux)
struct lmtemp_softc *sc = device_private(self);
struct i2c_attach_args *ia = aux;
prop_string_t desc;
int i;
for (i = 0; lmtemptbl[i].lmtemp_type != -1 ; i++)
if (lmtemptbl[i].lmtemp_type ==
device_cfdata(&sc->sc_dev)->cf_flags)
break;
sc->sc_tag = ia->ia_tag;
sc->sc_address = ia->ia_addr;
sc->sc_is_ds75 = device_cfdata(&sc->sc_dev)->cf_flags & 1;
aprint_naive(": Temperature Sensor\n");
aprint_normal(": %s Temperature Sensor\n",
(sc->sc_is_ds75) ? "DS75" : "LM75");
aprint_normal(": %s Temperature Sensor\n", lmtemptbl[i].lmtemp_name);
/* Set the configuration of the LM75 to defaults. */
iic_acquire_bus(sc->sc_tag, I2C_F_POLL);
@ -129,6 +166,8 @@ lmtemp_attach(struct device *parent, struct device *self, void *aux)
else
strcpy(sc->sc_info[0].desc, sc->sc_dev.dv_xname);
sc->sc_lmtemp_decode = lmtemptbl[i].lmtemp_decode;
/* Hook into system monitor. */
sc->sc_sysmon.sme_ranges = lmtemp_ranges;
sc->sc_sysmon.sme_sensor_info = sc->sc_info;
@ -172,11 +211,7 @@ lmtemp_temp_read(struct lmtemp_softc *sc, uint8_t which, uint32_t *valp)
if (error)
return (error);
if (sc->sc_is_ds75)
*valp = lmtemp_decode_ds75(buf);
else
*valp = lmtemp_decode_lm75(buf);
*valp = sc->sc_lmtemp_decode(buf);
return (0);
}
@ -279,3 +314,23 @@ lmtemp_decode_ds75(const uint8_t *buf)
return (temp * 62500 + 273150000);
}
static uint32_t
lmtemp_decode_lm77(const uint8_t *buf)
{
int temp;
uint32_t val;
/*
* Describe each bits of temperature registers on LM77.
* D15 - D12: Sign
* D11 - D3 : Bit8(MSB) - Bit0
*/
temp = (int8_t)buf[0];
temp = (temp << 5) | (buf[1] >> 3);
/* Temp is given in 1/2 deg. C, we convert to uK. */
val = temp * 500000 + 273150000;
return (val);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: lm75reg.h,v 1.2 2005/12/11 12:21:22 christos Exp $ */
/* $NetBSD: lm75reg.h,v 1.3 2006/05/17 00:10:54 kiyohara Exp $ */
/*
* Copyright (c) 2003 Wasabi Systems, Inc.
@ -45,6 +45,8 @@
*/
#define LM75_ADDRMASK 0x78
#define LM75_ADDR 0x48
#define LM77_ADDRMASK 0x7c
#define LM77_ADDR 0x48
/*
* Temperature on the LM75 is represented by a 9-bit two's complement
@ -65,6 +67,11 @@
#define LM75_REG_THYST_SET_POINT 0x02
#define LM75_REG_TOS_SET_POINT 0x03
#define LM77_REG_TCRIT_SET_POINT 0x03
#define LM77_REG_TLOW_SET_POINT 0x04
#define LM77_REG_THIGH_SET_POINT 0x05
#define LM75_TEMP_LEN 2 /* 2 data bytes */
#define LM75_CONFIG_SHUTDOWN 0x01
@ -75,4 +82,8 @@
#define LM75_CONFIG_FAULT_QUEUE_4 (2 << 3)
#define LM75_CONFIG_FAULT_QUEUE_6 (3 << 3)
#define LM77_CONFIG_TCRITAPOLARITY 0x04
#define LM77_CONFIG_INTPOLARITY 0x08
#define LM77_CONFIG_FAULT_QUEUE LM75_CONFIG_FAULT_QUEUE_4
#endif /* _DEV_I2C_LM75REG_H_ */