Changeset 5962 for lm-sensors/trunk/prog/dump/isaset.c
- Timestamp:
- 04/15/11 10:27:30 (13 months ago)
- Files:
-
- 1 modified
-
lm-sensors/trunk/prog/dump/isaset.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/prog/dump/isaset.c
r5709 r5962 3 3 Copyright (C) 2000 Frodo Looijaard <frodol@dds.nl>, and 4 4 Mark D. Studebaker <mdsxyz123@yahoo.com> 5 Copyright (C) 2004 ,2007Jean Delvare <khali@linux-fr.org>5 Copyright (C) 2004-2011 Jean Delvare <khali@linux-fr.org> 6 6 7 7 This program is free software; you can redistribute it and/or modify … … 49 49 fprintf(stderr, 50 50 "Syntax for I2C-like access:\n" 51 " isaset [ -y] ADDRREG DATAREG ADDRESS VALUE [MASK]\n"51 " isaset [OPTIONS] ADDRREG DATAREG ADDRESS VALUE [MASK]\n" 52 52 "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"); 54 59 } 55 60 56 61 int main(int argc, char *argv[]) 57 62 { 58 int addrreg, datareg = 0, value, addr = 0, vmask= 0;59 unsigned charres;63 int addrreg, datareg = 0, addr = 0; 64 unsigned long value, vmask = 0, maxval = 0xff, res; 60 65 int flags = 0; 61 int flat = 0, yes = 0 ;66 int flat = 0, yes = 0, width = 1; 62 67 char *end; 63 68 … … 67 72 case 'f': flat = 1; break; 68 73 case 'y': yes = 1; break; 74 case 'W': width = 2; maxval = 0xffff; break; 75 case 'L': width = 4; maxval = 0xffffffff; break; 69 76 default: 70 77 fprintf(stderr, "Warning: Unsupported flag " … … 129 136 flags += 2; 130 137 131 value = strto l(argv[flags+2], &end, 0);138 value = strtoul(argv[flags+2], &end, 0); 132 139 if (*end) { 133 140 fprintf(stderr, "Error: Invalid value!\n"); … … 135 142 exit(1); 136 143 } 137 if (value < 0 || value > 0xff) {144 if (value > maxval) { 138 145 fprintf(stderr, "Error: Value out of range " 139 "(0x 00-0xff)!\n");146 "(0x%0*u-%0*lu)!\n", width * 2, 0, width * 2, maxval); 140 147 help(); 141 148 exit(1); … … 143 150 144 151 if (flags+3 < argc) { 145 vmask = strto l(argv[flags+3], &end, 0);152 vmask = strtoul(argv[flags+3], &end, 0); 146 153 if (*end) { 147 154 fprintf(stderr, "Error: Invalid mask!\n"); … … 149 156 exit(1); 150 157 } 151 if (vmask < 0 || vmask > 0xff) {158 if (vmask > maxval) { 152 159 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); 154 162 help(); 155 163 exit(1); … … 168 176 169 177 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); 173 182 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 " 175 185 "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, 177 187 value, vmask ? " (masked)" : "", addr, 178 188 addrreg, datareg); … … 207 217 208 218 if (vmask) { 209 intoldvalue;219 unsigned long oldvalue; 210 220 211 221 if (flat) { 212 oldvalue = in b(addrreg);222 oldvalue = inx(addrreg, width); 213 223 } else { 214 224 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); 221 226 } 222 227 … … 224 229 225 230 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, 229 235 flat ? "address" : "register", 230 236 flat ? addrreg : addr); … … 242 248 if (flat) { 243 249 /* write */ 244 out b(value, addrreg);250 outx(value, addrreg, width); 245 251 /* readback */ 246 res = in b(addrreg);252 res = inx(addrreg, width); 247 253 } else { 248 254 /* write */ 249 255 outb(addr, addrreg); 250 out b(value, datareg);256 outx(value, datareg, width); 251 257 /* readback */ 252 res = in b(datareg);258 res = inx(datareg, width); 253 259 } 254 260 255 261 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); 258 265 } 259 266
