Changeset 5961

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

isadump: Add support for word (16-bit) and long (32-bit) reads

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

Location:
lm-sensors/trunk
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/CHANGES

    r5958 r5961  
    33 
    44SVN HEAD 
     5  isadump: Add support for word (16-bit) and long (32-bit) reads 
    56  sensors-detect: Add AMD family 15h CPU detection 
    67                  Add detection of ADT7461A / NCT1008 
  • lm-sensors/trunk/prog/dump/isadump.8

    r4471 r5961  
    1 .TH ISADUMP 8 "August 2004" 
     1.TH ISADUMP 8 "April 2011" 
    22.SH NAME 
    33isadump \- examine ISA registers 
     
    66.B isadump 
    77.RB [ -y ] 
     8.RB [ -W | -L ] 
    89.RB [ "-k V1,V2..." ] 
    910.I addrreg 
     
    1314.br 
    1415.B isadump 
     16.B -f 
    1517.RB [ -y ] 
    16 .BI "-f " address 
     18.RB [ -W | -L ] 
     19.I address 
    1720.RI [ "range " [ "bank " [ bankreg ]]] 
    1821#for flat address space 
     
    4043Known key sequences are: 0x87,0x01,0x55,0x55 for ITE, 0x55 for SMSC, 0x87,0x87 
    4144for Winbond and VIA, none needed for National Semiconductor. 
     45.TP 
     46.B -W 
     47Perform 16-bit reads. 
     48.TP 
     49.B -L 
     50Perform 32-bit reads. 
    4251 
    4352.SH OPTIONS (I2C-like access mode) 
  • lm-sensors/trunk/prog/dump/isadump.c

    r5709 r5961  
    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 
     
    5353        fprintf(stderr, 
    5454                "Syntax for I2C-like access:\n" 
    55                 "  isadump [-y] [-k V1,V2...] ADDRREG DATAREG [BANK [BANKREG]]\n" 
     55                "  isadump [OPTIONS] [-k V1,V2...] ADDRREG DATAREG [BANK [BANKREG]]\n" 
    5656                "Syntax for flat address space:\n" 
    57                 "  isadump [-y] -f ADDRESS [RANGE [BANK [BANKREG]]]\n"); 
     57                "  isadump -f [OPTIONS] ADDRESS [RANGE [BANK [BANKREG]]]\n" 
     58                "Options:\n" 
     59                "  -k   Super-I/O configuration access key\n" 
     60                "  -f   Enable flat address space mode\n" 
     61                "  -y   Assume affirmative answer to all questions\n" 
     62                "  -W   Read and display word (16-bit) values\n" 
     63                "  -L   Read and display long (32-bit) values\n"); 
    5864} 
    5965 
     
    97103        int bankreg; 
    98104        int oldbank = 0; 
    99         int i, j, res; 
     105        int i, j; 
     106        unsigned long res; 
    100107        int flags = 0; 
    101         int flat = 0, yes = 0; 
     108        int flat = 0, yes = 0, width = 1; 
    102109        char *end; 
    103110        unsigned char enter_key[SUPERIO_MAX_KEY+1]; 
     
    119126                        flags++; 
    120127                        break; 
     128                case 'W': width = 2; break; 
     129                case 'L': width = 4; break; 
    121130                default: 
    122131                        fprintf(stderr, "Warning: Unsupported flag " 
     
    271280                oldbank = set_bank(flat, addrreg, datareg, bank, bankreg); 
    272281 
    273         if (flat) 
    274                 printf("  "); 
    275         printf("     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n"); 
     282        /* print column headers */ 
     283        printf("%*s", flat ? 5 : 3, ""); 
     284        for (j = 0; j < 16; j += width) 
     285                printf(" %*x", width * 2, j); 
     286        printf("\n"); 
     287 
    276288        for (i = 0; i < range; i += 16) { 
    277289                if (flat) 
     
    289301                        superio_write_key(addrreg, enter_key); 
    290302 
    291                 for (j = 0; j < 16; j++) { 
     303                for (j = 0; j < 16; j += width) { 
    292304                        fflush(stdout); 
    293305                        if (flat) { 
    294                                 res = inb(addrreg + i + j); 
     306                                res = inx(addrreg + i + j, width); 
    295307                        } else {         
    296308                                outb(i+j, addrreg); 
     
    299311                                        range = 128; 
    300312                                } 
    301                                 res = inb(datareg); 
    302                         } 
    303                         printf("%02x ", res); 
     313                                res = inx(datareg, width); 
     314                        } 
     315                        printf("%0*lx ", width * 2, res); 
    304316                } 
    305317                printf("\n"); 
  • lm-sensors/trunk/prog/dump/util.c

    r4670 r5961  
    1111#include <stdio.h> 
    1212#include "util.h" 
     13 
     14/* To keep glibc2 happy */ 
     15#if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 0 
     16#include <sys/io.h> 
     17#else 
     18#include <asm/io.h> 
     19#endif 
    1320 
    1421/* Return 1 if we should continue, 0 if we should abort */ 
     
    4754} 
    4855 
     56/* I/O read of specified size */ 
     57unsigned long inx(int addr, int width) 
     58{ 
     59        switch (width) { 
     60        case 2: 
     61                return inw(addr); 
     62                break; 
     63        case 4: 
     64                return inl(addr); 
     65                break; 
     66        default: 
     67                return inb(addr); 
     68        } 
     69} 
  • lm-sensors/trunk/prog/dump/util.h

    r4670 r5961  
    1313 
    1414extern int user_ack(int def); 
     15extern unsigned long inx(int addr, int width); 
    1516 
    1617#endif /* _UTIL_H */