Changeset 2489

Show
Ignore:
Timestamp:
04/29/04 19:24:45 (9 years ago)
Author:
khali
Message:

Add missing include.

Discard unused hexchar function.
Massive reindent.
Rework the command line parameters handling.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/prog/dump/isaset.c

    r2488 r2489  
    11/* 
    22    isaset.c - isaset, a user-space program to write ISA registers 
    3     Copyright (c) 2000 - 2004  Frodo Looijaard <frodol@dds.nl>, and 
     3    Copyright (C) 2000  Frodo Looijaard <frodol@dds.nl>, and 
    44                        Mark D. Studebaker <mdsxyz123@yahoo.com> 
     5    Copyright (C) 2004  The lm_sensors group 
    56 
    67    This program is free software; you can redistribute it and/or modify 
     
    2223        Typical usage: 
    2324        isaset 0x295 0x296 0x10 0x12    Write 0x12 to address 0x10 using address/data registers 
    24         isaset -f 0x5000 0x12           Write 0x12 to location 0x5010 
     25        isaset -f 0x5010 0x12           Write 0x12 to location 0x5010 
    2526*/ 
    2627 
     
    2829#include <stdlib.h> 
    2930#include <unistd.h> 
     31#include <string.h> 
    3032 
    3133 
     
    4143#endif /* __powerpc__ */ 
    4244 
    43 char hexchar(int i) 
    44 { 
    45   if ((i >= 0) && (i <= 9)) 
    46     return '0' + i; 
    47   else if (i <= 15) 
    48     return 'a' - 10 + i; 
    49   else 
    50     return 'X'; 
    51 } 
    52  
    5345void help(void) 
    5446{ 
    55   fprintf(stderr,"Syntax: isaset ADDRREG DATAREG ADDR DATA (for chips with addr/data registers)\n"); 
    56   fprintf(stderr,"        isaset -f ADDR DATA (for chips with a flat address space)\n"); 
     47        fprintf(stderr, 
     48                "Syntax for I2C-like access:\n" 
     49                "  isaset ADDRREG DATAREG ADDRESS VALUE\n" 
     50                "Syntax for flat address space:\n" 
     51                "  isaset -f ADDRESS VALUE\n"); 
    5752} 
    5853 
    5954int main(int argc, char *argv[]) 
    6055{ 
    61   int addrreg, datareg = 0; 
    62   unsigned char value, res, addr = 0; 
    63   int flat = 0; 
    64   char *end; 
     56        int addrreg, datareg = 0, value, addr = 0; 
     57        unsigned char res; 
     58        int flat = 0; 
     59        char *end; 
    6560 
    66   if (argc < 4) { 
    67     help(); 
    68     exit(1); 
    69   } 
     61        if (argc < 4) { 
     62                help(); 
     63                exit(1); 
     64        } 
    7065 
    71   if(strcmp(argv[1], "-f")) { 
    72     addrreg = strtol(argv[1],&end,0); 
    73   } else { 
    74     if(argc != 4) { 
    75       help(); 
    76       exit(1); 
    77     } 
    78     flat = 1; 
    79     addrreg = strtol(argv[2],&end,0); 
    80   } 
    81   if (*end) { 
    82     fprintf(stderr,"Error: Invalid address!\n"); 
    83     help(); 
    84     exit(1); 
    85   } 
    86   if ((addrreg < 0) || (addrreg > 0xffff)) { 
    87     fprintf(stderr,"Error: Address out of range!\n"); 
    88     help(); 
    89     exit(1); 
    90   } 
     66        if (!strcmp(argv[1], "-f")) { 
     67                flat = 1; 
     68        } 
    9169 
    92   if(flat) { 
    93             value = strtol(argv[3],&end,0); 
    94             if (*end) { 
    95               fprintf(stderr,"Error: Invalid data!\n"); 
    96               help(); 
    97               exit(1); 
    98             } 
    99   } else { 
     70        if (argc != 5-flat) { 
     71                help(); 
     72                exit(1); 
     73        } 
    10074 
    101           datareg = strtol(argv[2],&end,0); 
    102           if (*end) { 
    103             fprintf(stderr,"Error: Invalid data register!\n"); 
    104             help(); 
    105             exit(1); 
    106   } 
    107   if ((datareg < 0) || (datareg > 0xffff)) { 
    108     fprintf(stderr,"Error: Data register out of range!\n"); 
    109     help(); 
    110     exit(1); 
    111   } 
     75        addrreg = strtol(argv[1+flat], &end, 0); 
     76        if (*end) { 
     77                fprintf(stderr, "Error: Invalid address!\n"); 
     78                help(); 
     79                exit(1); 
     80        } 
     81        if (addrreg < 0 || addrreg > (flat?0xffff:0x3fff)) { 
     82                fprintf(stderr, 
     83                        "Error: Address out of range (0x0000-0x%04x)!\n", 
     84                        flat?0xffff:0x3fff); 
     85                help(); 
     86                exit(1); 
     87        } 
    11288 
    113   if(flat) { 
    114     value = strtol(argv[3],&end,0); 
    115     if (*end) { 
    116       fprintf(stderr,"Error: Invalid addr!\n"); 
    117       help(); 
    118       exit(1); 
    119     } 
    120   } else { 
    121     addr = strtol(argv[3],&end,0); 
    122     if (*end) { 
    123       fprintf(stderr,"Error: Invalid addr!\n"); 
    124       help(); 
    125       exit(1); 
    126     } 
    127     value = strtol(argv[4],&end,0); 
    128     if (*end) { 
    129       fprintf(stderr,"Error: Invalid data!\n"); 
    130       help(); 
    131       exit(1); 
    132     } 
    133   } 
    134 } 
     89        if (!flat) { 
     90                datareg = strtol(argv[2], &end, 0); 
     91                if (*end) { 
     92                        fprintf(stderr, "Error: Invalid data register!\n"); 
     93                        help(); 
     94                        exit(1); 
     95                } 
     96                if (datareg < 0 || datareg > 0x3fff) { 
     97                        fprintf(stderr, "Error: Data register out of range " 
     98                                "(0x0000-0x3fff)!\n"); 
     99                        help(); 
     100                        exit(1); 
     101                } 
    135102 
    136   if (getuid()) { 
    137     fprintf(stderr,"Error: Can only be run as root (or make it suid root)\n"); 
    138     exit(1); 
    139   } 
     103                addr = strtol(argv[3], &end, 0); 
     104                if (*end) { 
     105                        fprintf(stderr, "Error: Invalid address!\n"); 
     106                        help(); 
     107                        exit(1); 
     108                } 
     109                if (addr < 0 || addr > 0xff) { 
     110                        fprintf(stderr, "Error: Address out of range " 
     111                                "(0x00-0xff)!\n"); 
     112                        help(); 
     113                        exit(1); 
     114                } 
     115        } 
    140116 
    141   fprintf(stderr,"  WARNING! Running this program can cause system crashes, " 
    142           "data loss and worse!\n"); 
    143   if(flat) 
    144         fprintf(stderr,"  I will write address 0x%04x with data 0x%02x\n", 
    145                  addrreg, value); 
    146   else 
    147         fprintf(stderr,"  I will write chip address 0x%04x with data 0x%02x\n" 
    148                        "  using address register 0x%04x and " 
    149                        "data register 0x%04x.\n", 
    150                        addr, value, addrreg, datareg); 
    151   fprintf(stderr,"  You have five seconds to reconsider and press CTRL-C!\n\n"); 
    152   sleep(5); 
     117        value = strtol(argv[4-flat], &end, 0); 
     118        if (*end) { 
     119                fprintf(stderr, "Error: Invalid value!\n"); 
     120                help(); 
     121                exit(1); 
     122        } 
     123        if (value < 0 || value > 0xff) { 
     124                fprintf(stderr, "Error: Value out of range " 
     125                        "(0x00-0xff)!\n"); 
     126                help(); 
     127                exit(1); 
     128        } 
     129 
     130        if (getuid()) { 
     131                fprintf(stderr, "Error: Can only be run as root " 
     132                        "(or make it suid root)\n"); 
     133                exit(1); 
     134        } 
     135 
     136        fprintf(stderr, "WARNING! Running this program can cause " 
     137                "system crashes, data loss and worse!\n"); 
     138        if (flat) 
     139                fprintf(stderr, "I will write value 0x%02x to address " 
     140                        "0x%04x\n", value, addrreg); 
     141        else 
     142                fprintf(stderr, "I will write value 0x%02x to address " 
     143                        "0x%02x of chip with address register 0x%04x\n" 
     144                        "and data register 0x%04x.\n", 
     145                        value, addr, addrreg, datareg); 
     146        fprintf(stderr, "You have five seconds to reconsider and press " 
     147                "CTRL-C!\n\n"); 
     148        sleep(5); 
    153149 
    154150#ifndef __powerpc__ 
    155   if ((datareg < 0x400) && (addrreg < 0x400) && !flat) { 
    156     if(ioperm(datareg,1,1)) { 
    157       fprintf(stderr,"Error: Could not ioperm() data register!\n"); 
    158       exit(1); 
    159     } 
    160     if(ioperm(addrreg,1,1)) { 
    161       fprintf(stderr,"Error: Could not ioperm() address register!\n"); 
    162       exit(1); 
    163     } 
    164   } else { 
    165     if(iopl(3)) { 
    166       fprintf(stderr,"Error: Could not do iopl(3)!\n"); 
    167       exit(1); 
    168     } 
    169   } 
     151        if (!flat && datareg < 0x400 && addrreg < 0x400) { 
     152                if (ioperm(datareg, 1, 1)) { 
     153                        fprintf(stderr, "Error: Could not ioperm() data " 
     154                                "register!\n"); 
     155                        exit(1); 
     156                } 
     157                if (ioperm(addrreg, 1, 1)) { 
     158                        fprintf(stderr, "Error: Could not ioperm() address " 
     159                                "register!\n"); 
     160                        exit(1); 
     161                } 
     162        } else { 
     163                if (iopl(3)) { 
     164                        fprintf(stderr, "Error: Could not do iopl(3)!\n"); 
     165                        exit(1); 
     166                } 
     167        } 
    170168#endif 
    171169 
    172 /* write */ 
    173         if(flat) { 
    174               outb(value, addrreg); 
     170        /* write */ 
     171        if (flat) { 
     172                outb(value, addrreg); 
    175173        } else {         
    176               outb(addr, addrreg); 
    177               outb(value,datareg); 
     174                outb(addr, addrreg); 
     175                outb(value, datareg); 
    178176        } 
    179177 
    180 /* readback */ 
    181         if(flat) { 
    182               res = inb(addrreg); 
     178        /* readback */ 
     179        if (flat) { 
     180                res = inb(addrreg); 
    183181        } else {         
    184               outb(addr, addrreg); 
    185               res = inb(datareg); 
     182                outb(addr, addrreg); 
     183                res = inb(datareg); 
    186184        } 
    187185 
    188         if(res != value) { 
    189                 fprintf(stderr, "Warning - data mismatch - wrote 0x%.2x, read back 0x%.2x\n", value, res); 
     186        if (res != value) { 
     187                fprintf(stderr, "Warning: Data mismatch, wrote 0x%02x, " 
     188                        "read back 0x%02x\n", value, res); 
    190189        } else { 
    191                 fprintf(stderr, "Value 0x%x written, readback matched\n", value); 
     190                fprintf(stderr, "Value 0x%02x written, readback matched\n", 
     191                        value); 
    192192        } 
    193   exit(0); 
     193 
     194        exit(0); 
    194195}