From: Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
To: Linux I2C <i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>,
Hendrik Sattler
<post-azCMwr5LJFZ+Wm55xJeGF4QuADTiUCJX@public.gmane.org>
Subject: [PATCH] i2cdump: Let the user specify a register range
Date: Tue, 11 Mar 2008 14:12:12 +0100 [thread overview]
Message-ID: <20080311141212.4cff32bd@hyperion.delvare> (raw)
Hi all,
This is a proposal for a new option to i2cdump, which would let the
user specify a register range to be probed (instead of the default 0x00
to 0xff). This improvement was suggested to me by Hendrik Sattler.
Index: tools/i2cdump.c
===================================================================
--- tools/i2cdump.c (révision 5106)
+++ tools/i2cdump.c (copie de travail)
@@ -61,12 +61,15 @@
int pec = 0, even = 0;
int flags = 0;
int force = 0, yes = 0, version = 0;
+ const char *range = NULL;
+ int first = 0x00, last = 0xff;
/* handle (optional) flags first */
while (1+flags < argc && argv[1+flags][0] == '-') {
switch (argv[1+flags][1]) {
case 'V': version = 1; break;
case 'f': force = 1; break;
+ case 'r': range = argv[1+(++flags)]; break;
case 'y': yes = 1; break;
default:
fprintf(stderr, "Warning: Unsupported flag "
@@ -179,6 +182,39 @@
}
}
+ /* Parse optional range string */
+ if (range) {
+ char *dash;
+
+ first = strtol(range, &dash, 0);
+ if (dash == range || *dash != '-'
+ || first < 0 || first > 0xff) {
+ fprintf(stderr, "Error: Invalid range parameter!\n");
+ exit(1);
+ }
+ last = strtol(++dash, &end, 0);
+ if (end == dash || *end != '\0'
+ || last < first || last > 0xff) {
+ fprintf(stderr, "Error: Invalid range parameter!\n");
+ exit(1);
+ }
+
+ /* Check mode constraints */
+ switch (size) {
+ case I2C_SMBUS_BYTE:
+ case I2C_SMBUS_BYTE_DATA:
+ break;
+ case I2C_SMBUS_WORD_DATA:
+ if (!even || (!(first%2) && last%2))
+ break;
+ /* Fall through */
+ default:
+ fprintf(stderr,
+ "Error: Range parameter not compatible with selected mode!\n");
+ exit(1);
+ }
+ }
+
file = open_i2c_dev(i2cbus, filename, 0);
if (file < 0) {
exit(1);
@@ -273,6 +309,11 @@
fprintf(stderr, "Probing bank %d using bank "
"register 0x%02x.\n", bank, bankreg);
}
+ if (range) {
+ fprintf(stderr,
+ "Probe range limited to 0x%02x-0x%02x.\n",
+ first, last);
+ }
fprintf(stderr, "Continue? [Y/n] ");
fflush(stderr);
@@ -334,7 +375,7 @@
}
if (size == I2C_SMBUS_BYTE) {
- res = i2c_smbus_write_byte(file, 0);
+ res = i2c_smbus_write_byte(file, first);
if(res != 0) {
fprintf(stderr, "Error: Write start address "
"failed, return code %d\n", res);
@@ -347,9 +388,24 @@
for (i = 0; i < 256; i+=16) {
if (size == I2C_SMBUS_BLOCK_DATA && i >= s_length)
break;
+ if (i/16 < first/16)
+ continue;
+ if (i/16 > last/16)
+ break;
+
printf("%02x: ", i);
for (j = 0; j < 16; j++) {
fflush(stdout);
+ /* Skip unwanted registers */
+ if (i+j < first || i+j > last) {
+ printf(" ");
+ if (size == I2C_SMBUS_WORD_DATA) {
+ printf(" ");
+ j++;
+ }
+ continue;
+ }
+
if (size == I2C_SMBUS_BYTE_DATA) {
block[i+j] = res =
i2c_smbus_read_byte_data(file, i+j);
@@ -390,6 +446,11 @@
if (size == I2C_SMBUS_BLOCK_DATA
&& i+j >= s_length)
break;
+ /* Skip unwanted registers */
+ if (i+j < first || i+j > last) {
+ printf(" ");
+ continue;
+ }
res = block[i+j];
if (res < 0)
@@ -410,8 +471,19 @@
} else {
printf(" 0,8 1,9 2,a 3,b 4,c 5,d 6,e 7,f\n");
for (i = 0; i < 256; i+=8) {
+ if (i/8 < first/8)
+ continue;
+ if (i/8 > last/8)
+ break;
+
printf("%02x: ", i);
for (j = 0; j < 8; j++) {
+ /* Skip unwanted registers */
+ if (i+j < first || i+j > last) {
+ printf(" ");
+ continue;
+ }
+
res = i2c_smbus_read_word_data(file, i+j);
if (res < 0)
printf("XXXX ");
Index: tools/i2cdump.8
===================================================================
--- tools/i2cdump.8 (révision 5140)
+++ tools/i2cdump.8 (copie de travail)
@@ -5,6 +5,7 @@
.SH SYNOPSIS
.B i2cdump
.RB [ -f ]
+.RB [ "-r first-last" ]
.RB [ -y ]
.I i2cbus
.I address
@@ -30,6 +31,11 @@
kernel driver in question. It can also cause i2cdump to return invalid
results. So use at your own risk and only if you know what you're doing.
.TP
+.B -r first-last
+Limit the range of registers being accessed. This option is only available
+with modes \fBb\fP, \fBw\fP, \fBc\fP and \fBW\fP. For mode \fBW\fP,
+\fBfirst\fR must be even and \fBlast\fR must be odd.
+.TP
.B -y
Disable interactive mode. By default, i2cdump will wait for a confirmation
from the user before messing with the I2C bus. When this flag is used, it
Hendrik, with this patch applied (on top of i2c-tools 3.0.0 or SVN),
you should be able to dump the registers of your 0Z99x chip with:
i2cdump -r 0x00-0x14 0 0x5c w
Please give it a try and let me know how it goes.
--
Jean Delvare
_______________________________________________
i2c mailing list
i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
http://lists.lm-sensors.org/mailman/listinfo/i2c
reply other threads:[~2008-03-11 13:12 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080311141212.4cff32bd@hyperion.delvare \
--to=khali-puyad+kwke1g9huczpvpmw@public.gmane.org \
--cc=i2c-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org \
--cc=post-azCMwr5LJFZ+Wm55xJeGF4QuADTiUCJX@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox