Changeset 1417
- Timestamp:
- 07/02/02 05:08:02 (11 years ago)
- Location:
- lm-sensors/trunk
- Files:
-
- 2 modified
-
etc/sensors.conf.eg (modified) (1 diff)
-
kernel/chips/vt1211.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lm-sensors/trunk/etc/sensors.conf.eg
r1383 r1417 1340 1340 # set remote_temp_low 40 1341 1341 # set remote_temp_over 70 1342 1343 chip "vt1211-*" 1344 1345 label in0 "unused" 1346 label in1 "+2.5V" 1347 label in2 "VCore1" 1348 label in3 "+5V" 1349 label in4 "+12V" 1350 label in5 "+3.3V" 1351 label in6 "VCore2" 1352 1353 label temp1 "1211 Temp" 1354 label temp2 "MB Temp" 1355 label temp3 "Proc Temp" 1356 1357 # 1358 # All voltage calculations have the form 1359 # ((@ * 100) - 3) / (K * 95.8), (@ * K * 0.958) + .03 1360 # where K = R2 / (R1 + R2). 1361 # Use the following K values based on input voltage: 1362 # voltage K 1363 # 2.5 0.8333 1364 # 3.3 0.6296 1365 # 3.5 (Vcore) 0.5952 1366 # 5.0 0.4167 1367 # 12.0 0.1754 1368 # 1369 compute in0 ((@ * 100) - 3) / (0.5952 * 95.8), (@ * 0.5952 * 0.958) + .03 1370 compute in1 ((@ * 100) - 3) / (0.8333 * 95.8), (@ * 0.8333 * 0.958) + .03 1371 compute in2 ((@ * 100) - 3) / (0.5952 * 95.8), (@ * 0.5952 * 0.958) + .03 1372 compute in3 ((@ * 100) - 3) / (0.4167 * 95.8), (@ * 0.4167 * 0.958) + .03 1373 compute in4 ((@ * 100) - 3) / (0.1754 * 95.8), (@ * 0.1754 * 0.958) + .03 1374 compute in5 ((@ * 100) - 3) / (0.6296 * 95.8), (@ * 0.6296 * 0.958) + .03 1375 compute in6 ((@ * 100) - 3) / (0.5952 * 95.8), (@ * 0.5952 * 0.958) + .03 1376 1377 set in1_min 2.5 * 0.95 1378 set in1_max 2.5 * 1.05 1379 set in1_min 2.5 * 0.95 1380 set in1_max 2.5 * 1.05 1381 set in2_min 2.0 * 0.97 1382 set in2_max 2.0 * 1.03 1383 set in3_min 5.0 * 0.95 1384 set in3_max 5.0 * 1.05 1385 set in4_min 12.0 * 0.90 1386 set in4_max 12.0 * 1.10 1387 set in5_min 3.3 * 0.95 1388 set in5_max 3.3 * 1.05 1389 set in6_min 2.0 * 0.97 1390 set in6_max 2.0 * 1.03 1391 1392 compute temp1 (@ - 65) / 0.9686, (@ * 0.9686) + 65 1393 compute temp3 (@ - 65) / 0.9686, (@ * 0.9686) + 65 1394 1395 set temp1_hyst 40 1396 set temp1_over 45 1397 set temp2_hyst 55 1398 set temp2_over 60 1399 set temp3_hyst 60 1400 set temp3_over 65 1401 1402 set fan1_min 3000 1403 set fan2_min 3000 -
lm-sensors/trunk/kernel/chips/vt1211.c
r1409 r1417 154 154 #define VT1211_REG_UCH_CONFIG 0x4a 155 155 #define VT1211_REG_TEMP1_CONFIG 0x4b 156 #define VT1211_REG_TEMP 1_CONFIG 0x4c156 #define VT1211_REG_TEMP2_CONFIG 0x4c 157 157 158 158 /* temps 1-7; voltages 0-6 */ … … 168 168 #define PWM_TO_REG(val) SENSORS_LIMIT((((val) * 2555) / 1000), 0, 255) 169 169 170 /* Conversions. Rounding and limit checking is only done on the TO_REG 171 variants. */ 172 173 /********* VOLTAGE CONVERSIONS (Bob Dougherty) ********/ 174 // From HWMon.cpp (Copyright 1998-2000 Jonathan Teh Soon Yew): 175 // voltagefactor[0]=1.25/2628; (2628/1.25=2102.4) // Vccp 176 // voltagefactor[1]=1.25/2628; (2628/1.25=2102.4) // +2.5V 177 // voltagefactor[2]=1.67/2628; (2628/1.67=1573.7) // +3.3V 178 // voltagefactor[3]=2.6/2628; (2628/2.60=1010.8) // +5V 179 // voltagefactor[4]=6.3/2628; (2628/6.30=417.14) // +12V 180 // in[i]=(data[i+2]*25.0+133)*voltagefactor[i]; 181 // That is: 182 // volts = (25*regVal+133)*factor 183 // regVal = (volts/factor-133)/25 184 // (These conversions were contributed by Jonathan Teh Soon Yew 185 // <j.teh@iname.com>) 186 // 187 // These get us close, but they don't completely agree with what my BIOS 188 // says- they are all a bit low. But, it all we have to go on... 189 extern inline u8 IN_TO_REG(long val, int inNum) 190 { 191 // to avoid floating point, we multiply everything by 100. 192 // val is guaranteed to be positive, so we can achieve the effect of 193 // rounding by (...*10+5)/10. Note that the *10 is hidden in the 194 // /250 (which should really be /2500). 195 // At the end, we need to /100 because we *100 everything and we need 196 // to /10 because of the rounding thing, so we /1000. 197 if (inNum <= 1) 198 return (u8) 199 SENSORS_LIMIT(((val * 210240 - 13300) / 250 + 5) / 1000, 200 0, 255); 201 else if (inNum == 2) 202 return (u8) 203 SENSORS_LIMIT(((val * 157370 - 13300) / 250 + 5) / 1000, 204 0, 255); 205 else if (inNum == 3) 206 return (u8) 207 SENSORS_LIMIT(((val * 101080 - 13300) / 250 + 5) / 1000, 208 0, 255); 209 else 210 return (u8) SENSORS_LIMIT(((val * 41714 - 13300) / 250 + 5) 211 / 1000, 0, 255); 212 } 213 214 extern inline long IN_FROM_REG(u8 val, int inNum) 215 { 216 // to avoid floating point, we multiply everything by 100. 217 // val is guaranteed to be positive, so we can achieve the effect of 218 // rounding by adding 0.5. Or, to avoid fp math, we do (...*10+5)/10. 219 // We need to scale with *100 anyway, so no need to /100 at the end. 220 if (inNum <= 1) 221 return (long) (((250000 * val + 13300) / 210240 * 10 + 5) /10); 222 else if (inNum == 2) 223 return (long) (((250000 * val + 13300) / 157370 * 10 + 5) /10); 224 else if (inNum == 3) 225 return (long) (((250000 * val + 13300) / 101080 * 10 + 5) /10); 226 else 227 return (long) (((250000 * val + 13300) / 41714 * 10 + 5) /10); 228 } 170 #define TEMP_FROM_REG(val) ((val)*10) 171 #define TEMP_FROM_REG10(val) (((val)*10)/4) 172 #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-5)/10):\ 173 ((val)+5)/10),0,255)) 174 #define IN_FROM_REG(val) /*(((val)*10+5)/10)*/ (val) 175 #define IN_TO_REG(val) (SENSORS_LIMIT((((val) * 10 + 5)/10),0,255)) 176 229 177 230 178 /********* FAN RPM CONVERSIONS ********/ … … 236 184 return 0; 237 185 rpm = SENSORS_LIMIT(rpm, 1, 1000000); 238 return SENSORS_LIMIT((13 50000 + rpm * div / 2) / (rpm * div), 1, 255);186 return SENSORS_LIMIT((1310720 + rpm * div / 2) / (rpm * div), 1, 255); 239 187 } 240 188 241 189 #define MIN_TO_REG(a,b) FAN_TO_REG(a,b) 242 #define FAN_FROM_REG(val,div) ((val)==0?0:(val)==255?0:1350000/((val)*(div))) 243 244 /******** TEMP CONVERSIONS (Bob Dougherty) *********/ 245 // linear fits from HWMon.cpp (Copyright 1998-2000 Jonathan Teh Soon Yew) 246 // if(temp<169) 247 // return double(temp)*0.427-32.08; 248 // else if(temp>=169 && temp<=202) 249 // return double(temp)*0.582-58.16; 250 // else 251 // return double(temp)*0.924-127.33; 252 // 253 // A fifth-order polynomial fits the unofficial data (provided by Alex van 254 // Kaam <darkside@chello.nl>) a bit better. It also give more reasonable 255 // numbers on my machine (ie. they agree with what my BIOS tells me). 256 // Here's the fifth-order fit to the 8-bit data: 257 // temp = 1.625093e-10*val^5 - 1.001632e-07*val^4 + 2.457653e-05*val^3 - 258 // 2.967619e-03*val^2 + 2.175144e-01*val - 7.090067e+0. 259 // 260 // (2000-10-25- RFD: thanks to Uwe Andersen <uandersen@mayah.com> for 261 // finding my typos in this formula!) 262 // 263 // Alas, none of the elegant function-fit solutions will work because we 264 // aren't allowed to use floating point in the kernel and doing it with 265 // integers doesn't rpovide enough precision. So we'll do boring old 266 // look-up table stuff. The unofficial data (see below) have effectively 267 // 7-bit resolution (they are rounded to the nearest degree). I'm assuming 268 // that the transfer function of the device is monotonic and smooth, so a 269 // smooth function fit to the data will allow us to get better precision. 270 // I used the 5th-order poly fit described above and solved for 271 // VIA register values 0-255. I *10 before rounding, so we get tenth-degree 272 // precision. (I could have done all 1024 values for our 10-bit readings, 273 // but the function is very linear in the useful range (0-80 deg C), so 274 // we'll just use linear interpolation for 10-bit readings.) So, tempLUT 275 // is the temp at via register values 0-255: 276 static const long tempLUT[] = 277 { -709, -688, -667, -646, -627, -607, -589, -570, -553, -536, -519, 278 -503, -487, -471, -456, -442, -428, -414, -400, -387, -375, 279 -362, -350, -339, -327, -316, -305, -295, -285, -275, -265, 280 -255, -246, -237, -229, -220, -212, -204, -196, -188, -180, 281 -173, -166, -159, -152, -145, -139, -132, -126, -120, -114, 282 -108, -102, -96, -91, -85, -80, -74, -69, -64, -59, -54, -49, 283 -44, -39, -34, -29, -25, -20, -15, -11, -6, -2, 3, 7, 12, 16, 284 20, 25, 29, 33, 37, 42, 46, 50, 54, 59, 63, 67, 71, 75, 79, 84, 285 88, 92, 96, 100, 104, 109, 113, 117, 121, 125, 130, 134, 138, 286 142, 146, 151, 155, 159, 163, 168, 172, 176, 181, 185, 189, 287 193, 198, 202, 206, 211, 215, 219, 224, 228, 232, 237, 241, 288 245, 250, 254, 259, 263, 267, 272, 276, 281, 285, 290, 294, 289 299, 303, 307, 312, 316, 321, 325, 330, 334, 339, 344, 348, 290 353, 357, 362, 366, 371, 376, 380, 385, 390, 395, 399, 404, 291 409, 414, 419, 423, 428, 433, 438, 443, 449, 454, 459, 464, 292 469, 475, 480, 486, 491, 497, 502, 508, 514, 520, 526, 532, 293 538, 544, 551, 557, 564, 571, 578, 584, 592, 599, 606, 614, 294 621, 629, 637, 645, 654, 662, 671, 680, 689, 698, 708, 718, 295 728, 738, 749, 759, 770, 782, 793, 805, 818, 830, 843, 856, 296 870, 883, 898, 912, 927, 943, 958, 975, 991, 1008, 1026, 1044, 297 1062, 1081, 1101, 1121, 1141, 1162, 1184, 1206, 1229, 1252, 298 1276, 1301, 1326, 1352, 1378, 1406, 1434, 1462 299 }; 300 301 /* the original LUT values from Alex van Kaam <darkside@chello.nl> 302 (for via register values 12-240): 303 {-50,-49,-47,-45,-43,-41,-39,-38,-37,-35,-34,-33,-32,-31, 304 -30,-29,-28,-27,-26,-25,-24,-24,-23,-22,-21,-20,-20,-19,-18,-17,-17,-16,-15, 305 -15,-14,-14,-13,-12,-12,-11,-11,-10,-9,-9,-8,-8,-7,-7,-6,-6,-5,-5,-4,-4,-3, 306 -3,-2,-2,-1,-1,0,0,1,1,1,3,3,3,4,4,4,5,5,5,6,6,7,7,8,8,9,9,9,10,10,11,11,12, 307 12,12,13,13,13,14,14,15,15,16,16,16,17,17,18,18,19,19,20,20,21,21,21,22,22, 308 22,23,23,24,24,25,25,26,26,26,27,27,27,28,28,29,29,30,30,30,31,31,32,32,33, 309 33,34,34,35,35,35,36,36,37,37,38,38,39,39,40,40,41,41,42,42,43,43,44,44,45, 310 45,46,46,47,48,48,49,49,50,51,51,52,52,53,53,54,55,55,56,57,57,58,59,59,60, 311 61,62,62,63,64,65,66,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,83,84, 312 85,86,88,89,91,92,94,96,97,99,101,103,105,107,109,110}; 313 */ 314 315 // Here's the reverse LUT. I got it by doing a 6-th order poly fit (needed 316 // an extra term for a good fit to these inverse data!) and then 317 // solving for each temp value from -50 to 110 (the useable range for 318 // this chip). Here's the fit: 319 // viaRegVal = -1.160370e-10*val^6 +3.193693e-08*val^5 - 1.464447e-06*val^4 320 // - 2.525453e-04*val^3 + 1.424593e-02*val^2 + 2.148941e+00*val +7.275808e+01) 321 // Note that n=161: 322 static const u8 viaLUT[] = 323 { 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23, 324 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 39, 40, 325 41, 43, 45, 46, 48, 49, 51, 53, 55, 57, 59, 60, 62, 64, 66, 326 69, 71, 73, 75, 77, 79, 82, 84, 86, 88, 91, 93, 95, 98, 100, 327 103, 105, 107, 110, 112, 115, 117, 119, 122, 124, 126, 129, 328 131, 134, 136, 138, 140, 143, 145, 147, 150, 152, 154, 156, 329 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 330 182, 183, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 331 200, 202, 203, 205, 206, 207, 208, 209, 210, 211, 212, 213, 332 214, 215, 216, 217, 218, 219, 220, 221, 222, 222, 223, 224, 333 225, 226, 226, 227, 228, 228, 229, 230, 230, 231, 232, 232, 334 233, 233, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 335 239, 240 336 }; 337 338 /* Converting temps to (8-bit) hyst and over registers */ 339 // No interpolation here. Just check the limits and go. 340 // The +5 effectively rounds off properly and the +50 is because 341 // the temps start at -50 342 extern inline u8 TEMP_TO_REG(long val) 343 { 344 return (u8) 345 SENSORS_LIMIT(viaLUT[((val <= -500) ? 0 : (val >= 1100) ? 160 : 346 ((val + 5) / 10 + 50))], 0, 255); 347 } 348 349 /* for 8-bit temperature hyst and over registers */ 350 // The temp values are already *10, so we don't need to do that. 351 // But we _will_ round these off to the nearest degree with (...*10+5)/10 352 #define TEMP_FROM_REG(val) ((tempLUT[(val)]*10+5)/10) 353 354 /* for 10-bit temperature readings */ 355 // You might _think_ this is too long to inline, but's it's really only 356 // called once... 357 extern inline long TEMP_FROM_REG10(u16 val) 358 { 359 // the temp values are already *10, so we don't need to do that. 360 long temp; 361 u16 eightBits = val >> 2; 362 u16 twoBits = val & 3; 363 364 // handle the extremes first (they won't interpolate well! ;-) 365 if (val == 0) 366 return (long) tempLUT[0]; 367 if (val == 1023) 368 return (long) tempLUT[255]; 369 370 if (twoBits == 0) 371 return (long) tempLUT[eightBits]; 372 else { 373 // do some interpolation by multipying the lower and upper 374 // bounds by 25, 50 or 75, then /100. 375 temp = ((25 * (4 - twoBits)) * tempLUT[eightBits] 376 + (25 * twoBits) * tempLUT[eightBits + 1]); 377 // increase the magnitude by 50 to achieve rounding. 378 if (temp > 0) 379 temp += 50; 380 else 381 temp -= 50; 382 return (temp / 100); 383 } 384 } 385 386 #define VT1211_INIT_FAN_MIN_1 3000 387 #define VT1211_INIT_FAN_MIN_2 3000 190 #define FAN_FROM_REG(val,div) ((val)==0?0:(val)==255?0:1310720/((val)*(div))) 388 191 389 192 #ifdef MODULE … … 690 493 691 494 data->vrm = DEFAULT_VRM; 495 /* set "default" interrupt mode for alarms, which isn't the default */ 496 vt1211_write_value(client, VT1211_REG_TEMP1_CONFIG, 0); 497 vt1211_write_value(client, VT1211_REG_TEMP2_CONFIG, 0); 692 498 } 693 499 … … 774 580 data->alarms = vt_rdval(client, VT1211_REG_ALARM1) | 775 581 (vt_rdval(client, VT1211_REG_ALARM2) << 8); 776 data->uch_config= vt_rdval(client, VT1211_REG_UCH_CONFIG);777 582 data->vid= vt_rdval(client, VT1211_REG_VID) & 0x1f; 778 583 data->last_updated = jiffies; … … 794 599 else if (operation == SENSORS_PROC_REAL_READ) { 795 600 vt1211_update_client(client); 796 results[0] = IN_FROM_REG(data->in_min[nr] , nr);797 results[1] = IN_FROM_REG(data->in_max[nr] , nr);798 results[2] = IN_FROM_REG(data->in[nr] , nr);601 results[0] = IN_FROM_REG(data->in_min[nr]); 602 results[1] = IN_FROM_REG(data->in_max[nr]); 603 results[2] = IN_FROM_REG(data->in[nr]); 799 604 *nrels_mag = 3; 800 605 } else if (operation == SENSORS_PROC_REAL_WRITE) { 801 606 if (*nrels_mag >= 1) { 802 data->in_min[nr] = IN_TO_REG(results[0] , nr);607 data->in_min[nr] = IN_TO_REG(results[0]); 803 608 vt1211_write_value(client, VT1211_REG_IN_MIN(nr), 804 609 data->in_min[nr]); 805 610 } 806 611 if (*nrels_mag >= 2) { 807 data->in_max[nr] = IN_TO_REG(results[1] , nr);612 data->in_max[nr] = IN_TO_REG(results[1]); 808 613 vt1211_write_value(client, VT1211_REG_IN_MAX(nr), 809 614 data->in_max[nr]); … … 969 774 struct vt1211_data *data = client->data; 970 775 if (operation == SENSORS_PROC_REAL_INFO) 971 *nrels_mag = 1;776 *nrels_mag = 0; 972 777 else if (operation == SENSORS_PROC_REAL_READ) { 973 778 results[0] = data->uch_config; 974 779 *nrels_mag = 1; 975 780 } else if (operation == SENSORS_PROC_REAL_WRITE) { 976 if (*nrels_mag >= 1) 977 data->vrm = results[0]; 781 if (*nrels_mag >= 1) { 782 data->uch_config = results[0] & 0x7c; 783 vt1211_write_value(client, VT1211_REG_UCH_CONFIG, 784 results[0] & 0x7c); 785 } 978 786 } 979 787 }
