Changeset 2899 for lm-sensors/trunk/prog/dump/isadump.c
- Timestamp:
- 02/09/05 22:08:17 (8 years ago)
- Files:
-
- 1 modified
-
lm-sensors/trunk/prog/dump/isadump.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/prog/dump/isadump.c
r2663 r2899 34 34 #include <string.h> 35 35 36 #include "superio.h" 37 36 38 37 39 /* To keep glibc2 happy */ … … 60 62 fprintf(stderr, 61 63 "Syntax for I2C-like access:\n" 62 " isadump [-y] ADDRREG DATAREG [BANK [BANKREG]]\n"64 " isadump [-y] [-k V1,V2...] ADDRREG DATAREG [BANK [BANKREG]]\n" 63 65 "Syntax for flat address space:\n" 64 66 " isadump [-y] -f ADDRESS [RANGE [BANK [BANKREG]]]\n"); … … 108 110 int flat = 0, yes = 0; 109 111 char *end; 112 unsigned char enter_key[SUPERIO_MAX_KEY+1]; 113 114 enter_key[0] = 0; 110 115 111 116 /* handle (optional) flags first */ … … 114 119 case 'f': flat = 1; break; 115 120 case 'y': yes = 1; break; 121 case 'k': 122 if (2+flags >= argc 123 || superio_parse_key(enter_key, argv[2+flags]) < 0) { 124 fprintf(stderr, "Invalid or missing key\n"); 125 help(); 126 exit(1); 127 } 128 flags++; 129 break; 116 130 default: 117 131 fprintf(stderr, "Warning: Unsupported flag " … … 121 135 } 122 136 flags++; 137 } 138 139 /* key is never needed in flat mode */ 140 if (flat && enter_key[0]) { 141 fprintf(stderr, "Error: Cannot use key in flat mode\n"); 142 exit(1); 123 143 } 124 144 … … 256 276 #endif 257 277 278 /* Enter Super-I/O configuration mode */ 279 if (enter_key[0]) 280 superio_write_key(addrreg, enter_key); 281 258 282 if (bank >= 0) 259 283 oldbank = set_bank(flat, addrreg, datareg, bank, bankreg); … … 262 286 for (i = 0; i < range; i += 16) { 263 287 printf("%c0: ", hexchar(i/16)); 288 289 /* It was noticed that Winbond Super-I/O chips 290 would leave the configuration mode after 291 an arbitrary number of register reads, 292 causing any subsequent read attempt to 293 silently fail. Repeating the key every 16 reads 294 prevents that. */ 295 if (enter_key[0]) 296 superio_write_key(addrreg, enter_key); 297 264 298 for (j = 0; j < 16; j++) { 265 299 if (flat) { … … 278 312 set_bank(flat, addrreg, datareg, oldbank, bankreg); 279 313 314 /* Exit Super-I/O configuration mode */ 315 if (enter_key[0]) 316 superio_reset(addrreg, datareg); 317 280 318 exit(0); 281 319 }
