From fefbf318675cc9c439ac46212cdca143f1e2082f Mon Sep 17 00:00:00 2001 From: Frodo Looijaard Date: Wed, 13 Jan 1999 21:08:50 +0000 Subject: [PATCH] New program 'i2cdetect', which scans your i2c bus for connected devices git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@167 7894878c-1315-0410-8ee3-d5d059ff63e0 --- prog/detect/i2cdetect.c | 88 +++++++++++++++++++++++++++++++++++++++++ prog/dump/Module.mk | 6 ++- prog/dump/i2cdetect.c | 88 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 prog/detect/i2cdetect.c create mode 100644 prog/dump/i2cdetect.c diff --git a/prog/detect/i2cdetect.c b/prog/detect/i2cdetect.c new file mode 100644 index 00000000..293a4ab6 --- /dev/null +++ b/prog/detect/i2cdetect.c @@ -0,0 +1,88 @@ +/* + i2cdetect.c - Part of i2cdetect, a user-space program to scan for I2C + devices. + Copyright (c) 1999 Frodo Looijaard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include "src/i2c-dev.h" + +void help(void) +{ + fprintf(stderr,"Syntax: i2cdetect I2CBUS\n"); +} + +int main(int argc, char *argv[]) +{ + char *end; + int i,j,res,i2cbus,file; + char filename[20]; + + + if (argc < 2) { + fprintf(stderr,"Error: No i2c-bus specified!\n"); + help(); + exit(1); + } + + i2cbus = strtol(argv[1],&end,0); + if (*end) { + fprintf(stderr,"Error: First argument not a number!\n"); + help(); + exit(1); + } + if ((i2cbus < 0) || (i2cbus > 0xff)) { + fprintf(stderr,"Error: I2CBUS argument out of range!\n"); + help(); + } + + sprintf(filename,"/dev/i2c-%d",i2cbus); + if ((file = open(filename,O_RDWR)) < 0) { + fprintf(stderr,"Error: Could not open file `%s': %s\n",filename, + strerror(errno)); + exit(1); + } + + fprintf(stderr," WARNING! This program can confuse your I2C bus, " + "cause data loss and worse!\n"); + fprintf(stderr," I will probe file %s\n", filename); + fprintf(stderr," You have five seconds to reconsider and press CTRL-C!\n\n"); + sleep(5); + + printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n"); + for (i = 0; i < 128; i+=16) { + printf("%02x: ",i); + for(j = 0; j < 16; j++) { + if (ioctl(file,I2C_SLAVE,i+j) < 0) { + fprintf(stderr,"Error: Could not set address to %d: %s\n",i+j, + strerror(errno)); + exit(1); + } + + res = i2c_smbus_read_byte(file); + if (res < 0) + printf("XX "); + else + printf("%02x ",i+j); + } + printf("\n"); + } + exit(0); +} diff --git a/prog/dump/Module.mk b/prog/dump/Module.mk index 444b40d1..0a3e9a3f 100644 --- a/prog/dump/Module.mk +++ b/prog/dump/Module.mk @@ -22,8 +22,10 @@ MODULE_DIR := prog/dump # Regrettably, even 'simply expanded variables' will not put their currently # defined value verbatim into the command-list of rules... -PROGDUMPTARGETS := $(MODULE_DIR)/isadump $(MODULE_DIR)/i2cdump -PROGDUMPSOURCES := $(MODULE_DIR)/isadump.c $(MODULE_DIR)/i2cdump.c +PROGDUMPTARGETS := $(MODULE_DIR)/isadump $(MODULE_DIR)/i2cdump \ + $(MODULE_DIR)/i2cdetect +PROGDUMPSOURCES := $(MODULE_DIR)/isadump.c $(MODULE_DIR)/i2cdump.c \ + $(MODULE_DIR)/i2cdetect.c # Include all dependency files. We use '.rd' to indicate this will create # executables. diff --git a/prog/dump/i2cdetect.c b/prog/dump/i2cdetect.c new file mode 100644 index 00000000..293a4ab6 --- /dev/null +++ b/prog/dump/i2cdetect.c @@ -0,0 +1,88 @@ +/* + i2cdetect.c - Part of i2cdetect, a user-space program to scan for I2C + devices. + Copyright (c) 1999 Frodo Looijaard + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include +#include +#include "src/i2c-dev.h" + +void help(void) +{ + fprintf(stderr,"Syntax: i2cdetect I2CBUS\n"); +} + +int main(int argc, char *argv[]) +{ + char *end; + int i,j,res,i2cbus,file; + char filename[20]; + + + if (argc < 2) { + fprintf(stderr,"Error: No i2c-bus specified!\n"); + help(); + exit(1); + } + + i2cbus = strtol(argv[1],&end,0); + if (*end) { + fprintf(stderr,"Error: First argument not a number!\n"); + help(); + exit(1); + } + if ((i2cbus < 0) || (i2cbus > 0xff)) { + fprintf(stderr,"Error: I2CBUS argument out of range!\n"); + help(); + } + + sprintf(filename,"/dev/i2c-%d",i2cbus); + if ((file = open(filename,O_RDWR)) < 0) { + fprintf(stderr,"Error: Could not open file `%s': %s\n",filename, + strerror(errno)); + exit(1); + } + + fprintf(stderr," WARNING! This program can confuse your I2C bus, " + "cause data loss and worse!\n"); + fprintf(stderr," I will probe file %s\n", filename); + fprintf(stderr," You have five seconds to reconsider and press CTRL-C!\n\n"); + sleep(5); + + printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\n"); + for (i = 0; i < 128; i+=16) { + printf("%02x: ",i); + for(j = 0; j < 16; j++) { + if (ioctl(file,I2C_SLAVE,i+j) < 0) { + fprintf(stderr,"Error: Could not set address to %d: %s\n",i+j, + strerror(errno)); + exit(1); + } + + res = i2c_smbus_read_byte(file); + if (res < 0) + printf("XX "); + else + printf("%02x ",i+j); + } + printf("\n"); + } + exit(0); +}