summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/i2cget.86
-rw-r--r--tools/i2cget.c18
2 files changed, 19 insertions, 5 deletions
diff --git a/tools/i2cget.8 b/tools/i2cget.8
index e0b8644..83c6f7d 100644
--- a/tools/i2cget.8
+++ b/tools/i2cget.8
@@ -50,9 +50,9 @@ will be read (if that makes sense for the considered chip).
.PP
The \fImode\fR parameter, if specified, is one of the letters \fBb\fP,
\fBw\fP, \fBc\fP, or \fBi\fP, corresponding to a read byte data, a read
-word data, a write byte/read byte, or an I2C block read transaction,
-respectively. A \fBp\fP can also be appended to the \fImode\fR parameter to
-enable PEC, except for I2C block transactions. If the \fImode\fR
+word data, a write byte/read byte, an SMBus block read, or an I2C block read
+transaction, respectively. A \fBp\fP can also be appended to the \fImode\fR
+parameter to enable PEC, except for I2C block transactions. If the \fImode\fR
parameter is omitted,
i2cget defaults to a read byte data transaction, unless \fIdata-address\fR is
also omitted, in which case the default (and only valid) transaction is a
diff --git a/tools/i2cget.c b/tools/i2cget.c
index 32af2a6..38bd44a 100644
--- a/tools/i2cget.c
+++ b/tools/i2cget.c
@@ -1,6 +1,6 @@
/*
i2cget.c - A user-space program to read an I2C register.
- Copyright (C) 2005-2012 Jean Delvare <jdelvare@suse.de>
+ Copyright (C) 2005-2021 Jean Delvare <jdelvare@suse.de>
Based on i2cset.c:
Copyright (C) 2001-2003 Frodo Looijaard <frodol@dds.nl>, and
@@ -48,6 +48,7 @@ static void help(void)
" b (read byte data, default)\n"
" w (read word data)\n"
" c (write byte/read byte)\n"
+ " s (read SMBus block data)\n"
" i (read I2C block data)\n"
" Append p for SMBus PEC\n"
" LENGTH is the I2C block data length (between 1 and %d, default %d)\n",
@@ -93,6 +94,13 @@ static int check_funcs(int file, int size, int daddress, int pec)
}
break;
+ case I2C_SMBUS_BLOCK_DATA:
+ if (!(funcs & I2C_FUNC_SMBUS_READ_BLOCK_DATA)) {
+ fprintf(stderr, MISSING_FUNC_FMT, "SMBus block read");
+ return -1;
+ }
+ break;
+
case I2C_SMBUS_I2C_BLOCK_DATA:
if (!(funcs & I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
fprintf(stderr, MISSING_FUNC_FMT, "I2C block read");
@@ -150,6 +158,7 @@ static int confirm(const char *filename, int address, int size, int daddress,
size == I2C_SMBUS_BYTE ? (daddress < 0 ?
"read byte" : "write byte/read byte") :
size == I2C_SMBUS_BYTE_DATA ? "read byte data" :
+ size == I2C_SMBUS_BLOCK_DATA ? "read SMBus block data" :
"read word data");
if (pec)
fprintf(stderr, "PEC checking enabled.\n");
@@ -225,6 +234,7 @@ int main(int argc, char *argv[])
case 'b': size = I2C_SMBUS_BYTE_DATA; break;
case 'w': size = I2C_SMBUS_WORD_DATA; break;
case 'c': size = I2C_SMBUS_BYTE; break;
+ case 's': size = I2C_SMBUS_BLOCK_DATA; break;
case 'i': size = I2C_SMBUS_I2C_BLOCK_DATA; break;
default:
fprintf(stderr, "Error: Invalid mode!\n");
@@ -279,6 +289,9 @@ int main(int argc, char *argv[])
case I2C_SMBUS_WORD_DATA:
res = i2c_smbus_read_word_data(file, daddress);
break;
+ case I2C_SMBUS_BLOCK_DATA:
+ res = i2c_smbus_read_block_data(file, daddress, block_data);
+ break;
case I2C_SMBUS_I2C_BLOCK_DATA:
res = i2c_smbus_read_i2c_block_data(file, daddress, length, block_data);
break;
@@ -292,7 +305,8 @@ int main(int argc, char *argv[])
exit(2);
}
- if (size == I2C_SMBUS_I2C_BLOCK_DATA) {
+ if (size == I2C_SMBUS_BLOCK_DATA ||
+ size == I2C_SMBUS_I2C_BLOCK_DATA) {
int i;
for (i = 0; i < res - 1; ++i)