Support LM77 Temperature.
This commit is contained in:
parent
dbbc553deb
commit
43911ef4e2
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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_ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user