diff options
-rw-r--r-- | sys/dev/i2c/i2c_scan.c | 105 |
1 files changed, 70 insertions, 35 deletions
diff --git a/sys/dev/i2c/i2c_scan.c b/sys/dev/i2c/i2c_scan.c index 223ed975c6a..e09d360dc9f 100644 --- a/sys/dev/i2c/i2c_scan.c +++ b/sys/dev/i2c/i2c_scan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: i2c_scan.c,v 1.1 2005/12/19 19:36:46 grange Exp $ */ +/* $OpenBSD: i2c_scan.c,v 1.2 2005/12/20 05:00:47 deraadt Exp $ */ /* * Copyright (c) 2005 Alexander Yurchenko <grange@openbsd.org> @@ -22,52 +22,87 @@ #include <sys/param.h> #include <sys/systm.h> +#include <sys/device.h> #define _I2C_PRIVATE #include <dev/i2c/i2cvar.h> -/* Device signatures */ -static const struct { - const char * name; - i2c_addr_t addr; - u_int8_t offset; - u_int8_t value; -} iicsig[] = { - { "foo", 0xff, 0xff, 0xff } +/* +some basic devices... + + 0x7 == 0x0001 national lm92 + 0x3e == 0x01 national product + 0x3f == 0x73 lm93 + 0x3e == 0x02 + 0x3f == 0x06 lm87 + 0xfe == 0x01 national product + 0xff == 0x33 lm90 + 0xff == 0x49 0x52 lm99 lm89 + 0xff == 0x17 lm86 + 0xff == ?? lm83? + cannot identify lm81 lm80 + 0xfe == 0x4d maxim (6659/6658/6659) == lm90 + no 0x7 register?? maxim (6633/6634/6635) lm92 + +XXX remove this block of text later +0x00 National (on LM84) +0x01 National +0x12C3 Asus (at 0x4F) +0x23 Analog Devices +0x41 Analog Devices (also at 0x16) +0x49 TI +0x4D Maxim +0x54 On Semi +0x5C SMSC +0x5D SMSC +0x55 SMSC +0x5CA3 Winbond (at 0x4F) +0x90 ITE (at 0x58) +0xA1 Philips (at 0x05 too) +0xA3 Winbond (at 0x4F) +0xAC Myson (at 0x58) +0xC3 Asus (at 0x4F) +0xDA Dallas +0x54 Microchip (at 0x7) + + */ + +struct { + u_int8_t start, end; +} probe_paddrs[] = { + { 0x20, 0x2f }, + { 0x48, 0x4f }, + { 0xad, 0xad } }; +u_int8_t probe[] = { 0x3e, 0x3f, 0xfe, 0xff, 0x4f, 0x58, 0x07 }; + void iic_scan(struct device *self, struct i2cbus_attach_args *iba) { i2c_tag_t ic = iba->iba_tag; u_int8_t cmd = 0, addr, data; - int i; - - /* Do full scan */ - printf("%s: full scan:", self->dv_xname); - for (addr = 0; addr < 0x80; addr++) { - ic->ic_acquire_bus(ic->ic_cookie, I2C_F_POLL); - if (ic->ic_exec(ic->ic_cookie, I2C_OP_READ_WITH_STOP, addr, - &cmd, 1, NULL, 0, I2C_F_POLL) == 0) - printf(" 0x%x", addr); - ic->ic_release_bus(ic->ic_cookie, I2C_F_POLL); - } - printf("\n"); - - /* Scan only for know signatures */ - printf("%s: sign scan:", self->dv_xname); - for (i = 0; i < sizeof(iicsig) / sizeof(iicsig[0]); i++) { - addr = iicsig[i].addr; - cmd = iicsig[i].offset; + int i, j; - ic->ic_acquire_bus(ic->ic_cookie, I2C_F_POLL); - if (ic->ic_exec(ic->ic_cookie, I2C_OP_READ_WITH_STOP, addr, - &cmd, 1, &data, 1, I2C_F_POLL) == 0) { - if (iicsig[i].value == 0xff || - iicsig[i].value == data) - printf(" %s", iicsig[i].name); + for (j = 0; j < sizeof(probe_paddrs)/sizeof(probe_paddrs[0]); j++) { + for (addr = probe_paddrs[j].start; addr <= probe_paddrs[j].end; + addr++) { + /* Perform RECEIVE BYTE command */ + ic->ic_acquire_bus(ic->ic_cookie, I2C_F_POLL); + if (ic->ic_exec(ic->ic_cookie, I2C_OP_READ_WITH_STOP, addr, + &cmd, 1, NULL, 0, I2C_F_POLL) == 0) { + printf("addr 0x%x at %s: ", addr, self->dv_xname); + for (i = 0; i < sizeof(probe); i++) { + cmd = probe[i]; + if (ic->ic_exec(ic->ic_cookie, + I2C_OP_READ_WITH_STOP, addr, + &cmd, 1, &data, 1, I2C_F_POLL) == 0 && + data != 0xff) + printf(" %02x=%02x", cmd, data); + } + printf("\n"); + } + ic->ic_release_bus(ic->ic_cookie, I2C_F_POLL); } - ic->ic_release_bus(ic->ic_cookie, I2C_F_POLL); } - printf("\n"); } |