From 933e887fe2d9a0924a8e05efa6bc3b530b40976d Mon Sep 17 00:00:00 2001 From: Sergey Solomin Date: Tue, 6 Sep 2016 15:36:43 -0500 Subject: [PATCH 1/1] 4 byte read support 466 --- tools/i2cdump.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tools/i2cdump.c b/tools/i2cdump.c index a7bba72..99c79be 100644 --- a/tools/i2cdump.c +++ b/tools/i2cdump.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,8 @@ #include "util.h" #include "../version.h" +#define I2C_SMBUS_DWORD 7 + static void help(void) { fprintf(stderr, @@ -46,6 +49,7 @@ static void help(void) " s (SMBus block)\n" " i (I2C block)\n" " c (consecutive byte)\n" + " d (double word)\n" " Append p for SMBus PEC\n"); } @@ -184,6 +188,9 @@ int main(int argc, char *argv[]) } else if (!strncmp(argv[flags+3], "c", 1)) { size = I2C_SMBUS_BYTE; pec = argv[flags+3][1] == 'p'; + } else if (!strncmp(argv[flags+3], "d", 1)) { + size = I2C_SMBUS_DWORD; + pec = argv[flags+3][1] == 'p'; } else if (!strcmp(argv[flags+3], "i")) size = I2C_SMBUS_I2C_BLOCK_DATA; else { @@ -285,6 +292,7 @@ int main(int argc, char *argv[]) size == I2C_SMBUS_BLOCK_DATA ? "smbus block" : size == I2C_SMBUS_I2C_BLOCK_DATA ? "i2c block" : size == I2C_SMBUS_BYTE ? "byte consecutive read" : + size == I2C_SMBUS_DWORD ? "double word" : size == I2C_SMBUS_BYTE_DATA ? "byte" : "word"); if (pec) fprintf(stderr, "PEC checking enabled.\n"); @@ -313,6 +321,32 @@ int main(int argc, char *argv[]) } } + /* handle mode 'd' (double word read) */ + if (size == I2C_SMBUS_DWORD) { + unsigned char buff[sizeof(uint32_t)]; + struct i2c_rdwr_ioctl_data msgset; + struct i2c_msg msg[1]; + + msg[0].addr = address; + msg[0].flags = I2C_M_RD; + msg[0].len = sizeof(buff); + msg[0].buf = buff; + + msgset.msgs = msg; + msgset.nmsgs = 1; + + if (ioctl( file, I2C_RDWR, &msgset ) < 0) { + fprintf(stderr, "Error: Could not read " + "double word. %s\n", strerror(errno)); + exit(1); + } + for (uint8_t n = 0; n < sizeof(buff); n++) { + printf ("%02x ", buff[n]); + } + printf ("\n"); + exit(0); + } + /* See Winbond w83781d data sheet for bank details */ if (bank && size != I2C_SMBUS_BLOCK_DATA) { res = i2c_smbus_read_byte_data(file, bankreg); -- 1.8.2.2