Merge pull request #6 from denis2342/master

fixes the decoding of int values. this is important for the correct readout of the number of keys
This commit is contained in:
Hendrik Holtmann
2014-02-10 01:28:37 +01:00
2 changed files with 184 additions and 9 deletions

View File

@ -37,7 +37,7 @@ UInt32 _strtoul(char *str, int size, int base)
if (base == 16) if (base == 16)
total += str[i] << (size - 1 - i) * 8; total += str[i] << (size - 1 - i) * 8;
else else
total += (unsigned char) (str[i] << (size - 1 - i) * 8); total += ((unsigned char) (str[i]) << (size - 1 - i) * 8);
} }
return total; return total;
} }
@ -52,7 +52,7 @@ void _ultostr(char *str, UInt32 val)
(unsigned int) val); (unsigned int) val);
} }
float _strtof(char *str, int size, int e) float _strtof(unsigned char *str, int size, int e)
{ {
float total = 0; float total = 0;
int i; int i;
@ -65,6 +65,8 @@ float _strtof(char *str, int size, int e)
total += str[i] << (size - 1 - i) * (8 - e); total += str[i] << (size - 1 - i) * (8 - e);
} }
total += (str[size-1] & 0x03) * 0.25;
return total; return total;
} }
@ -75,11 +77,50 @@ void smc_init(){
void smc_close(){ void smc_close(){
SMCClose(conn); SMCClose(conn);
} }
void printFP1F(SMCVal_t val)
{
printf("%.5f ", ntohs(*(UInt16*)val.bytes) / 32768.0);
}
void printFP4C(SMCVal_t val)
{
printf("%.5f ", ntohs(*(UInt16*)val.bytes) / 4096.0);
}
void printFP5B(SMCVal_t val)
{
printf("%.5f ", ntohs(*(UInt16*)val.bytes) / 2048.0);
}
void printFP6A(SMCVal_t val)
{
printf("%.4f ", ntohs(*(UInt16*)val.bytes) / 1024.0);
}
void printFP79(SMCVal_t val)
{
printf("%.4f ", ntohs(*(UInt16*)val.bytes) / 512.0);
}
void printFP88(SMCVal_t val)
{
printf("%.3f ", ntohs(*(UInt16*)val.bytes) / 256.0);
}
void printFPA6(SMCVal_t val)
{
printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 64.0);
}
void printFPC4(SMCVal_t val)
{
printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 16.0);
}
void printFPE2(SMCVal_t val) void printFPE2(SMCVal_t val)
{ {
/* FIXME: This decode is incomplete, last 2 bits are dropped */ printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 4.0);
printf("%.0f ", _strtof(val.bytes, val.dataSize, 2));
} }
void printUInt(SMCVal_t val) void printUInt(SMCVal_t val)
@ -87,6 +128,71 @@ void printUInt(SMCVal_t val)
printf("%u ", (unsigned int) _strtoul(val.bytes, val.dataSize, 10)); printf("%u ", (unsigned int) _strtoul(val.bytes, val.dataSize, 10));
} }
void printSP1E(SMCVal_t val)
{
printf("%.5f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 16384.0);
}
void printSP3C(SMCVal_t val)
{
printf("%.5f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 4096.0);
}
void printSP4B(SMCVal_t val)
{
printf("%.4f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 2048.0);
}
void printSP5A(SMCVal_t val)
{
printf("%.4f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 1024.0);
}
void printSP69(SMCVal_t val)
{
printf("%.3f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 512.0);
}
void printSP78(SMCVal_t val)
{
printf("%.3f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 256.0);
}
void printSP87(SMCVal_t val)
{
printf("%.3f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 128.0);
}
void printSP96(SMCVal_t val)
{
printf("%.2f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 64.0);
}
void printSPB4(SMCVal_t val)
{
printf("%.2f ", ((SInt16)ntohs(*(UInt16*)val.bytes)) / 16.0);
}
void printSPF0(SMCVal_t val)
{
printf("%.0f ", (float)ntohs(*(UInt16*)val.bytes));
}
void printSI8(SMCVal_t val)
{
printf("%d ", (signed char)*val.bytes);
}
void printSI16(SMCVal_t val)
{
printf("%d ", ntohs(*(SInt16*)val.bytes));
}
void printPWM(SMCVal_t val)
{
printf("%.1f%% ", ntohs(*(UInt16*)val.bytes) * 100 / 65536.0);
}
void printBytesHex(SMCVal_t val) void printBytesHex(SMCVal_t val)
{ {
int i; int i;
@ -106,8 +212,50 @@ void printVal(SMCVal_t val)
(strcmp(val.dataType, DATATYPE_UINT16) == 0) || (strcmp(val.dataType, DATATYPE_UINT16) == 0) ||
(strcmp(val.dataType, DATATYPE_UINT32) == 0)) (strcmp(val.dataType, DATATYPE_UINT32) == 0))
printUInt(val); printUInt(val);
else if (strcmp(val.dataType, DATATYPE_FPE2) == 0) else if (strcmp(val.dataType, DATATYPE_FP1F) == 0 && val.dataSize == 2)
printFP1F(val);
else if (strcmp(val.dataType, DATATYPE_FP4C) == 0 && val.dataSize == 2)
printFP4C(val);
else if (strcmp(val.dataType, DATATYPE_FP5B) == 0 && val.dataSize == 2)
printFP5B(val);
else if (strcmp(val.dataType, DATATYPE_FP6A) == 0 && val.dataSize == 2)
printFP6A(val);
else if (strcmp(val.dataType, DATATYPE_FP79) == 0 && val.dataSize == 2)
printFP79(val);
else if (strcmp(val.dataType, DATATYPE_FP88) == 0 && val.dataSize == 2)
printFP88(val);
else if (strcmp(val.dataType, DATATYPE_FPA6) == 0 && val.dataSize == 2)
printFPA6(val);
else if (strcmp(val.dataType, DATATYPE_FPC4) == 0 && val.dataSize == 2)
printFPC4(val);
else if (strcmp(val.dataType, DATATYPE_FPE2) == 0 && val.dataSize == 2)
printFPE2(val); printFPE2(val);
else if (strcmp(val.dataType, DATATYPE_SP1E) == 0 && val.dataSize == 2)
printSP1E(val);
else if (strcmp(val.dataType, DATATYPE_SP3C) == 0 && val.dataSize == 2)
printSP3C(val);
else if (strcmp(val.dataType, DATATYPE_SP4B) == 0 && val.dataSize == 2)
printSP4B(val);
else if (strcmp(val.dataType, DATATYPE_SP5A) == 0 && val.dataSize == 2)
printSP5A(val);
else if (strcmp(val.dataType, DATATYPE_SP69) == 0 && val.dataSize == 2)
printSP69(val);
else if (strcmp(val.dataType, DATATYPE_SP78) == 0 && val.dataSize == 2)
printSP78(val);
else if (strcmp(val.dataType, DATATYPE_SP87) == 0 && val.dataSize == 2)
printSP87(val);
else if (strcmp(val.dataType, DATATYPE_SP96) == 0 && val.dataSize == 2)
printSP96(val);
else if (strcmp(val.dataType, DATATYPE_SPB4) == 0 && val.dataSize == 2)
printSPB4(val);
else if (strcmp(val.dataType, DATATYPE_SPF0) == 0 && val.dataSize == 2)
printSPF0(val);
else if (strcmp(val.dataType, DATATYPE_SI8) == 0 && val.dataSize == 1)
printSI8(val);
else if (strcmp(val.dataType, DATATYPE_SI16) == 0 && val.dataSize == 2)
printSI16(val);
else if (strcmp(val.dataType, DATATYPE_PWM) == 0 && val.dataSize == 2)
printPWM(val);
printBytesHex(val); printBytesHex(val);
} }
@ -381,6 +529,9 @@ kern_return_t SMCPrintFans(void)
for (i = 0; i < totalFans; i++) for (i = 0; i < totalFans; i++)
{ {
printf("\nFan #%d:\n", i); printf("\nFan #%d:\n", i);
sprintf(key, "F%dID", i);
SMCReadKey(key, &val);
printf(" Fan ID : %s\n", val.bytes+4);
sprintf(key, "F%dAc", i); sprintf(key, "F%dAc", i);
SMCReadKey(key, &val); SMCReadKey(key, &val);
printf(" Actual speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2)); printf(" Actual speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2));

View File

@ -38,11 +38,36 @@
#define SMC_CMD_READ_PLIMIT 11 #define SMC_CMD_READ_PLIMIT 11
#define SMC_CMD_READ_VERS 12 #define SMC_CMD_READ_VERS 12
#define DATATYPE_FP1F "fp1f"
#define DATATYPE_FP4C "fp4c"
#define DATATYPE_FP5B "fp5b"
#define DATATYPE_FP6A "fp6a"
#define DATATYPE_FP79 "fp79"
#define DATATYPE_FP88 "fp88"
#define DATATYPE_FPA6 "fpa6"
#define DATATYPE_FPC4 "fpc4"
#define DATATYPE_FPE2 "fpe2" #define DATATYPE_FPE2 "fpe2"
#define DATATYPE_SP1E "sp1e"
#define DATATYPE_SP3C "sp3c"
#define DATATYPE_SP4B "sp4b"
#define DATATYPE_SP5A "sp5a"
#define DATATYPE_SP69 "sp69"
#define DATATYPE_SP78 "sp78"
#define DATATYPE_SP87 "sp87"
#define DATATYPE_SP96 "sp96"
#define DATATYPE_SPB4 "spb4"
#define DATATYPE_SPF0 "spf0"
#define DATATYPE_UINT8 "ui8 " #define DATATYPE_UINT8 "ui8 "
#define DATATYPE_UINT16 "ui16" #define DATATYPE_UINT16 "ui16"
#define DATATYPE_UINT32 "ui32" #define DATATYPE_UINT32 "ui32"
#define DATATYPE_SI8 "si8 "
#define DATATYPE_SI16 "si16"
#define DATATYPE_PWM "{pwm"
typedef struct { typedef struct {
char major; char major;
char minor; char minor;
@ -65,7 +90,7 @@ typedef struct {
char dataAttributes; char dataAttributes;
} SMCKeyData_keyInfo_t; } SMCKeyData_keyInfo_t;
typedef char SMCBytes_t[32]; typedef unsigned char SMCBytes_t[32];
typedef struct { typedef struct {
UInt32 key; UInt32 key;
@ -97,5 +122,4 @@ kern_return_t SMCClose(io_connect_t conn);
void smc_init(); void smc_init();
void smc_close(); void smc_close();
float _strtof(char *str, int size, int e); float _strtof(unsigned char *str, int size, int e);