axehelper: add i2c_scan

This commit is contained in:
Jaroslav Kysela 2015-04-16 15:23:59 +02:00
parent cbdf3ac33b
commit e9b0aad3a3
2 changed files with 64 additions and 0 deletions

View File

@ -29,3 +29,10 @@ I2C address map:
0xd1 - STV0900 #1 - read
0xd2 - STV0900 #2 - write
0xd3 - STV0900 #3 - read
I2C access
==========
All chips are on the first I2C bus accessible through /dev/i2c-0. You may
look to tools/axehelper.c - i2c_scan routine. Note that linux i2c address is
without the read/write bit (so (0xd0 >> 1) = 0x68).

View File

@ -3,6 +3,12 @@
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
static unsigned long
getTick ()
@ -269,6 +275,54 @@ i2c_decoder(void)
}
}
static void
i2c_scan(void)
{
int i, fd, l;
char path[32];
unsigned char buf1[16], buf2[16];
struct i2c_rdwr_ioctl_data d;
struct i2c_msg m[2];
for (i = 0; i < 9; i++) {
if (i < 8)
sprintf(path, "/dev/i2c-%d", i);
else
strcpy(path, "/dev/axe/i2c_drv-0");
fd = open(path, O_RDWR);
if (fd < 0)
continue;
memset(&d, 0, sizeof(d));
memset(&m, 0, sizeof(m));
memset(buf1, 0, sizeof(buf1));
memset(buf2, 0, sizeof(buf2));
buf1[0] = 0xd0 >> 1;
buf1[1] = 0xf1;
buf1[2] = 0x00;
l = 2;
m[0].addr = buf1[0];
m[0].len = l;
m[0].flags = 0;
m[0].buf = buf1 + 1;
m[1].addr = buf1[0];
m[1].len = 1;
m[1].flags = I2C_M_RD;
m[1].buf = buf2;
d.nmsgs = 2;
d.msgs = m;
if (ioctl(fd, I2C_RDWR, &d) < 0)
printf("I2C RDWR failed for '%s'\n", path);
else
printf("I2C byte from '%s': %02x\n", path, buf2[0]);
close(fd);
}
}
int main(int argc, char *argv[])
{
if (argc > 1 && !strcmp(argv[1], "wait")) {
@ -288,5 +342,8 @@ int main(int argc, char *argv[])
if (argc > 1 && !strcmp(argv[1], "i2c_decoder")) {
i2c_decoder();
}
if (argc > 1 && !strcmp(argv[1], "i2c_scan")) {
i2c_scan();
}
return 0;
}