Changeset 5151

Show
Ignore:
Timestamp:
03/19/08 15:43:04 (8 months ago)
Author:
khali
Message:

Let the user specify a register range.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • i2c-tools/trunk/CHANGES

    r5140 r5151  
    1111  i2cdump: Fix I2C block mode error code 
    1212           Remove man page reference to hardware monitoring chips 
     13           Let the user specify a register range 
    1314  i2cset: Final status messages go to stdout 
    1415          Return success even when readback fails or doesn't match 
  • i2c-tools/trunk/tools/i2cdump.8

    r5140 r5151  
    66.B i2cdump 
    77.RB [ -f ] 
     8.RB [ "-r first-last" ] 
    89.RB [ -y ] 
    910.I i2cbus 
     
    3031kernel driver in question. It can also cause i2cdump to return invalid 
    3132results. So use at your own risk and only if you know what you're doing. 
     33.TP 
     34.B -r first-last 
     35Limit the range of registers being accessed. This option is only available 
     36with modes \fBb\fP, \fBw\fP, \fBc\fP and \fBW\fP. For mode \fBW\fP, 
     37\fBfirst\fR must be even and \fBlast\fR must be odd. 
    3238.TP 
    3339.B -y 
  • i2c-tools/trunk/tools/i2cdump.c

    r5073 r5151  
    33    Copyright (C) 2002-2003  Frodo Looijaard <frodol@dds.nl>, and 
    44                             Mark D. Studebaker <mdsxyz123@yahoo.com> 
    5     Copyright (C) 2004-2007  Jean Delvare <khali@linux-fr.org> 
     5    Copyright (C) 2004-2008  Jean Delvare <khali@linux-fr.org> 
    66 
    77    This program is free software; you can redistribute it and/or modify 
     
    3232static void help(void) 
    3333{ 
    34         fprintf(stderr, "Syntax: i2cdump [-f] [-y] I2CBUS ADDRESS [MODE]
    35                 "[BANK [BANKREG]]\n" 
     34        fprintf(stderr, "Syntax: i2cdump [-f] [-r first-last] [-y] I2CBUS
     35                "ADDRESS [MODE] [BANK [BANKREG]]\n" 
    3636                "        i2cdump -V\n" 
    3737                "  MODE is one of:\n" 
     
    6262        int flags = 0; 
    6363        int force = 0, yes = 0, version = 0; 
     64        const char *range = NULL; 
     65        int first = 0x00, last = 0xff; 
    6466 
    6567        /* handle (optional) flags first */ 
     
    6870                case 'V': version = 1; break; 
    6971                case 'f': force = 1; break; 
     72                case 'r': range = argv[1+(++flags)]; break; 
    7073                case 'y': yes = 1; break; 
    7174                default: 
     
    180183        } 
    181184 
     185        /* Parse optional range string */ 
     186        if (range) { 
     187                char *dash; 
     188 
     189                first = strtol(range, &dash, 0); 
     190                if (dash == range || *dash != '-' 
     191                 || first < 0 || first > 0xff) { 
     192                        fprintf(stderr, "Error: Invalid range parameter!\n"); 
     193                        exit(1); 
     194                } 
     195                last = strtol(++dash, &end, 0); 
     196                if (end == dash || *end != '\0' 
     197                 || last < first || last > 0xff) { 
     198                        fprintf(stderr, "Error: Invalid range parameter!\n"); 
     199                        exit(1); 
     200                } 
     201 
     202                /* Check mode constraints */ 
     203                switch (size) { 
     204                case I2C_SMBUS_BYTE: 
     205                case I2C_SMBUS_BYTE_DATA: 
     206                        break; 
     207                case I2C_SMBUS_WORD_DATA: 
     208                        if (!even || (!(first%2) && last%2)) 
     209                                break; 
     210                        /* Fall through */ 
     211                default: 
     212                        fprintf(stderr, 
     213                                "Error: Range parameter not compatible with selected mode!\n"); 
     214                        exit(1); 
     215                } 
     216        } 
     217 
    182218        file = open_i2c_dev(i2cbus, filename, 0); 
    183219        if (file < 0) { 
     
    274310                                        "register 0x%02x.\n", bank, bankreg); 
    275311                } 
     312                if (range) { 
     313                        fprintf(stderr, 
     314                                "Probe range limited to 0x%02x-0x%02x.\n", 
     315                                first, last); 
     316                } 
    276317 
    277318                fprintf(stderr, "Continue? [Y/n] "); 
     
    335376 
    336377                if (size == I2C_SMBUS_BYTE) { 
    337                         res = i2c_smbus_write_byte(file, 0); 
     378                        res = i2c_smbus_write_byte(file, first); 
    338379                        if(res != 0) { 
    339380                                fprintf(stderr, "Error: Write start address " 
     
    348389                        if (size == I2C_SMBUS_BLOCK_DATA && i >= s_length) 
    349390                                break; 
     391                        if (i/16 < first/16) 
     392                                continue; 
     393                        if (i/16 > last/16) 
     394                                break; 
     395 
    350396                        printf("%02x: ", i); 
    351397                        for (j = 0; j < 16; j++) { 
    352398                                fflush(stdout); 
     399                                /* Skip unwanted registers */ 
     400                                if (i+j < first || i+j > last) { 
     401                                        printf("   "); 
     402                                        if (size == I2C_SMBUS_WORD_DATA) { 
     403                                                printf("   "); 
     404                                                j++; 
     405                                        } 
     406                                        continue; 
     407                                } 
     408 
    353409                                if (size == I2C_SMBUS_BYTE_DATA) { 
    354410                                        block[i+j] = res = 
     
    391447                                 && i+j >= s_length) 
    392448                                        break; 
     449                                /* Skip unwanted registers */ 
     450                                if (i+j < first || i+j > last) { 
     451                                        printf(" "); 
     452                                        continue; 
     453                                } 
    393454 
    394455                                res = block[i+j]; 
     
    411472                printf("     0,8  1,9  2,a  3,b  4,c  5,d  6,e  7,f\n"); 
    412473                for (i = 0; i < 256; i+=8) { 
     474                        if (i/8 < first/8) 
     475                                continue; 
     476                        if (i/8 > last/8) 
     477                                break; 
     478 
    413479                        printf("%02x: ", i); 
    414480                        for (j = 0; j < 8; j++) { 
     481                                /* Skip unwanted registers */ 
     482                                if (i+j < first || i+j > last) { 
     483                                        printf("     "); 
     484                                        continue; 
     485                                } 
     486 
    415487                                res = i2c_smbus_read_word_data(file, i+j); 
    416488                                if (res < 0)