Changeset 5962

Show
Ignore:
Timestamp:
04/15/11 10:27:30 (13 months ago)
Author:
khali
Message:

isaset: Add support for word (16-bit) and long (32-bit) writes

Sometimes the hardware expects 16-bit or 32-bit writes rather than byte
writes. Add support to isaset so that the user can ask for such writes.

Location:
lm-sensors/trunk
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/CHANGES

    r5961 r5962  
    44SVN HEAD 
    55  isadump: Add support for word (16-bit) and long (32-bit) reads 
     6  isaset: Add support for word (16-bit) and long (32-bit) writes 
    67  sensors-detect: Add AMD family 15h CPU detection 
    78                  Add detection of ADT7461A / NCT1008 
  • lm-sensors/trunk/prog/dump/isaset.8

    r4471 r5962  
    1 .TH ISASET 8 "May 2005" 
     1.TH ISASET 8 "April 2011" 
    22.SH "NAME" 
    33isaset \- set ISA registers 
     
    66.B isaset 
    77.RB [ -y ] 
     8.RB [ -W | -L ] 
    89.I addrreg 
    910.I datareg 
     
    1415.br 
    1516.B isaset 
     17.B -f 
    1618.RB [ -y ] 
    17 .BI "-f " address 
     19.RB [ -W | -L ] 
     20.I address 
    1821.I value 
    1922.RI [ mask ] 
     
    3437will perform the operation directly. This is mainly meant to be used in 
    3538scripts. 
     39.TP 
     40.B -W 
     41Perform a 16-bit write. 
     42.TP 
     43.B -L 
     44Perform a 32-bit write. 
    3645 
    3746.SH OPTIONS (I2C-like access mode) 
  • lm-sensors/trunk/prog/dump/isaset.c

    r5709 r5962  
    33    Copyright (C) 2000  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-2011  Jean Delvare <khali@linux-fr.org> 
    66 
    77    This program is free software; you can redistribute it and/or modify 
     
    4949        fprintf(stderr, 
    5050                "Syntax for I2C-like access:\n" 
    51                 "  isaset [-y] ADDRREG DATAREG ADDRESS VALUE [MASK]\n" 
     51                "  isaset [OPTIONS] ADDRREG DATAREG ADDRESS VALUE [MASK]\n" 
    5252                "Syntax for flat address space:\n" 
    53                 "  isaset [-y] -f ADDRESS VALUE [MASK]\n"); 
     53                "  isaset -f [OPTIONS] ADDRESS VALUE [MASK]\n" 
     54                "Options:\n" 
     55                "  -f   Enable flat address space mode\n" 
     56                "  -y   Assume affirmative answer to all questions\n" 
     57                "  -W   Write a word (16-bit) value\n" 
     58                "  -L   Write a long (32-bit) value\n"); 
    5459} 
    5560 
    5661int main(int argc, char *argv[]) 
    5762{ 
    58         int addrreg, datareg = 0, value, addr = 0, vmask = 0; 
    59         unsigned char res; 
     63        int addrreg, datareg = 0, addr = 0; 
     64        unsigned long value, vmask = 0, maxval = 0xff, res; 
    6065        int flags = 0; 
    61         int flat = 0, yes = 0; 
     66        int flat = 0, yes = 0, width = 1; 
    6267        char *end; 
    6368 
     
    6772                case 'f': flat = 1; break; 
    6873                case 'y': yes = 1; break; 
     74                case 'W': width = 2; maxval = 0xffff; break; 
     75                case 'L': width = 4; maxval = 0xffffffff; break; 
    6976                default: 
    7077                        fprintf(stderr, "Warning: Unsupported flag " 
     
    129136                flags += 2; 
    130137 
    131         value = strtol(argv[flags+2], &end, 0); 
     138        value = strtoul(argv[flags+2], &end, 0); 
    132139        if (*end) { 
    133140                fprintf(stderr, "Error: Invalid value!\n"); 
     
    135142                exit(1); 
    136143        } 
    137         if (value < 0 || value > 0xff) { 
     144        if (value > maxval) { 
    138145                fprintf(stderr, "Error: Value out of range " 
    139                         "(0x00-0xff)!\n"); 
     146                        "(0x%0*u-%0*lu)!\n", width * 2, 0, width * 2, maxval); 
    140147                help(); 
    141148                exit(1); 
     
    143150 
    144151        if (flags+3 < argc) { 
    145                 vmask = strtol(argv[flags+3], &end, 0); 
     152                vmask = strtoul(argv[flags+3], &end, 0); 
    146153                if (*end) { 
    147154                        fprintf(stderr, "Error: Invalid mask!\n"); 
     
    149156                        exit(1); 
    150157                } 
    151                 if (vmask < 0 || vmask > 0xff) { 
     158                if (vmask > maxval) { 
    152159                        fprintf(stderr, "Error: Mask out of range " 
    153                                 "(0x00-0xff)!\n"); 
     160                                "(0x%0*u-%0*lu)!\n", width * 2, 0, 
     161                                width * 2, maxval); 
    154162                        help(); 
    155163                        exit(1); 
     
    168176 
    169177                if (flat) 
    170                         fprintf(stderr, "I will write value 0x%02x%s to address " 
    171                                 "0x%x.\n", value, vmask ? " (masked)" : "", 
    172                                 addrreg); 
     178                        fprintf(stderr, 
     179                                "I will write value 0x%0*lx%s to address " 
     180                                "0x%x.\n", width * 2, value, 
     181                                vmask ? " (masked)" : "", addrreg); 
    173182                else 
    174                         fprintf(stderr, "I will write value 0x%02x%s to address " 
     183                        fprintf(stderr, 
     184                                "I will write value 0x%0*lx%s to address " 
    175185                                "0x%02x of chip with address register 0x%x\n" 
    176                                 "and data register 0x%x.\n", 
     186                                "and data register 0x%x.\n", width * 2, 
    177187                                value, vmask ? " (masked)" : "", addr, 
    178188                                addrreg, datareg); 
     
    207217 
    208218        if (vmask) { 
    209                 int oldvalue; 
     219                unsigned long oldvalue; 
    210220 
    211221                if (flat) { 
    212                         oldvalue = inb(addrreg); 
     222                        oldvalue = inx(addrreg, width); 
    213223                } else {         
    214224                        outb(addr, addrreg); 
    215                         oldvalue = inb(datareg); 
    216                 } 
    217  
    218                 if (oldvalue < 0) { 
    219                         fprintf(stderr, "Error: Failed to read old value\n"); 
    220                         exit(1); 
     225                        oldvalue = inx(datareg, width); 
    221226                } 
    222227 
     
    224229 
    225230                if (!yes) { 
    226                         fprintf(stderr, "Old value 0x%02x, write mask " 
    227                                 "0x%02x: Will write 0x%02x to %s " 
    228                                 "0x%02x\n", oldvalue, vmask, value, 
     231                        fprintf(stderr, "Old value 0x%0*lx, write mask " 
     232                                "0x%0*lx: Will write 0x%0*lx to %s " 
     233                                "0x%02x\n", width * 2, oldvalue, 
     234                                width * 2, vmask, width * 2, value, 
    229235                                flat ? "address" : "register", 
    230236                                flat ? addrreg : addr); 
     
    242248        if (flat) { 
    243249                /* write */ 
    244                 outb(value, addrreg); 
     250                outx(value, addrreg, width); 
    245251                /* readback */ 
    246                 res = inb(addrreg); 
     252                res = inx(addrreg, width); 
    247253        } else {         
    248254                /* write */ 
    249255                outb(addr, addrreg); 
    250                 outb(value, datareg); 
     256                outx(value, datareg, width); 
    251257                /* readback */ 
    252                 res = inb(datareg); 
     258                res = inx(datareg, width); 
    253259        } 
    254260 
    255261        if (res != value) { 
    256                 fprintf(stderr, "Data mismatch, wrote 0x%02x, " 
    257                         "read 0x%02x back.\n", value, res); 
     262                fprintf(stderr, "Data mismatch, wrote 0x%0*lx, " 
     263                        "read 0x%0*lx back.\n", width * 2, value, 
     264                        width * 2, res); 
    258265        } 
    259266 
  • lm-sensors/trunk/prog/dump/util.c

    r5961 r5962  
    6868        } 
    6969} 
     70 
     71/* I/O write of specified size */ 
     72void outx(unsigned long value, int addr, int width) 
     73{ 
     74        switch (width) { 
     75        case 2: 
     76                outw(value, addr); 
     77                break; 
     78        case 4: 
     79                outl(value, addr); 
     80                break; 
     81        default: 
     82                outb(value, addr); 
     83        } 
     84} 
  • lm-sensors/trunk/prog/dump/util.h

    r5961 r5962  
    1414extern int user_ack(int def); 
    1515extern unsigned long inx(int addr, int width); 
     16extern void outx(unsigned long value, int addr, int width); 
    1617 
    1718#endif /* _UTIL_H */