Changeset 1417

Show
Ignore:
Timestamp:
07/02/02 05:08:02 (11 years ago)
Author:
mds
Message:

vt1211 update; move calculations from driver to sensors.conf

Location:
lm-sensors/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/etc/sensors.conf.eg

    r1383 r1417  
    13401340#   set remote_temp_low         40 
    13411341#   set remote_temp_over        70 
     1342 
     1343chip "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  
    154154#define VT1211_REG_UCH_CONFIG 0x4a 
    155155#define VT1211_REG_TEMP1_CONFIG 0x4b 
    156 #define VT1211_REG_TEMP1_CONFIG 0x4c 
     156#define VT1211_REG_TEMP2_CONFIG 0x4c 
    157157 
    158158/* temps 1-7; voltages 0-6 */ 
     
    168168#define PWM_TO_REG(val) SENSORS_LIMIT((((val) * 2555) / 1000), 0, 255) 
    169169 
    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 
    229177 
    230178/********* FAN RPM CONVERSIONS ********/ 
     
    236184                return 0; 
    237185        rpm = SENSORS_LIMIT(rpm, 1, 1000000); 
    238         return SENSORS_LIMIT((1350000 + rpm * div / 2) / (rpm * div), 1, 255); 
     186        return SENSORS_LIMIT((1310720 + rpm * div / 2) / (rpm * div), 1, 255); 
    239187} 
    240188 
    241189#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))) 
    388191 
    389192#ifdef MODULE 
     
    690493 
    691494        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); 
    692498} 
    693499 
     
    774580                data->alarms = vt_rdval(client, VT1211_REG_ALARM1) | 
    775581                                    (vt_rdval(client, VT1211_REG_ALARM2) << 8); 
    776                 data->uch_config= vt_rdval(client, VT1211_REG_UCH_CONFIG); 
    777582                data->vid= vt_rdval(client, VT1211_REG_VID) & 0x1f; 
    778583                data->last_updated = jiffies; 
     
    794599        else if (operation == SENSORS_PROC_REAL_READ) { 
    795600                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]); 
    799604                *nrels_mag = 3; 
    800605        } else if (operation == SENSORS_PROC_REAL_WRITE) { 
    801606                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]); 
    803608                        vt1211_write_value(client, VT1211_REG_IN_MIN(nr), 
    804609                                            data->in_min[nr]); 
    805610                } 
    806611                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]); 
    808613                        vt1211_write_value(client, VT1211_REG_IN_MAX(nr), 
    809614                                            data->in_max[nr]); 
     
    969774        struct vt1211_data *data = client->data; 
    970775        if (operation == SENSORS_PROC_REAL_INFO) 
    971                 *nrels_mag = 1; 
     776                *nrels_mag = 0; 
    972777        else if (operation == SENSORS_PROC_REAL_READ) { 
    973778                results[0] = data->uch_config; 
    974779                *nrels_mag = 1; 
    975780        } 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                } 
    978786        } 
    979787}