diff --git a/smc-command/smc.c b/smc-command/smc.c index ff1e48b..ba8defc 100644 --- a/smc-command/smc.c +++ b/smc-command/smc.c @@ -37,7 +37,7 @@ UInt32 _strtoul(char *str, int size, int base) if (base == 16) total += str[i] << (size - 1 - i) * 8; else - total += (unsigned char) (str[i] << (size - 1 - i) * 8); + total += ((unsigned char) (str[i]) << (size - 1 - i) * 8); } return total; } @@ -52,7 +52,7 @@ void _ultostr(char *str, UInt32 val) (unsigned int) val); } -float _strtof(char *str, int size, int e) +float _strtof(unsigned char *str, int size, int e) { float total = 0; int i; @@ -65,6 +65,8 @@ float _strtof(char *str, int size, int e) total += str[i] << (size - 1 - i) * (8 - e); } + total += (str[size-1] & 0x03) * 0.25; + return total; } @@ -75,11 +77,50 @@ void smc_init(){ void smc_close(){ 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) { - /* FIXME: This decode is incomplete, last 2 bits are dropped */ - - printf("%.0f ", _strtof(val.bytes, val.dataSize, 2)); + printf("%.2f ", ntohs(*(UInt16*)val.bytes) / 4.0); } void printUInt(SMCVal_t val) @@ -87,6 +128,71 @@ void printUInt(SMCVal_t val) 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) { int i; @@ -106,8 +212,50 @@ void printVal(SMCVal_t val) (strcmp(val.dataType, DATATYPE_UINT16) == 0) || (strcmp(val.dataType, DATATYPE_UINT32) == 0)) 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); + 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); } @@ -381,6 +529,9 @@ kern_return_t SMCPrintFans(void) for (i = 0; i < totalFans; 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); SMCReadKey(key, &val); printf(" Actual speed : %.0f\n", _strtof(val.bytes, val.dataSize, 2)); diff --git a/smc-command/smc.h b/smc-command/smc.h index f001abf..4ad4798 100644 --- a/smc-command/smc.h +++ b/smc-command/smc.h @@ -38,11 +38,36 @@ #define SMC_CMD_READ_PLIMIT 11 #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_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_UINT16 "ui16" #define DATATYPE_UINT32 "ui32" +#define DATATYPE_SI8 "si8 " +#define DATATYPE_SI16 "si16" + +#define DATATYPE_PWM "{pwm" + typedef struct { char major; char minor; @@ -65,7 +90,7 @@ typedef struct { char dataAttributes; } SMCKeyData_keyInfo_t; -typedef char SMCBytes_t[32]; +typedef unsigned char SMCBytes_t[32]; typedef struct { UInt32 key; @@ -97,5 +122,4 @@ kern_return_t SMCClose(io_connect_t conn); void smc_init(); void smc_close(); -float _strtof(char *str, int size, int e); - +float _strtof(unsigned char *str, int size, int e);