/** * __i2c_transfer - unlocked flavor of i2c_transfer * @adap: Handle to I2C bus * @msgs: One or more messages to execute before STOP is issued to * terminate the operation; each message begins with a START. * @num: Number of messages to be executed. * * Returns negative errno, else the number of messages executed. * * Adapter lock must be held when calling this function. No debug logging * takes place. adap->algo->master_xfer existence isn't checked. */ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) { int ret, try1; /* Retry automatically on arbitration loss */ mach_timespec_t end, now; clock_get_system_nanotime((clock_sec_t*)&end.tv_sec, (clock_usec_t*)&end.tv_nsec); now.tv_sec = 0; now.tv_nsec = adap->timeout * NSEC_PER_USEC; ADD_MACH_TIMESPEC(&end, &now); for (ret = 0, try1 = 0; try1 <= adap->retries; try1++) { ret = adap->algo->master_xfer(adap, msgs, num); IOLog("GeforceSensors: _i2c_transfer=%d\n", ret); if (ret != -EAGAIN) break; clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&end, &now) <= 0) break; } return ret; }
const void *FakeSMCKey::getValue() { if (handler) { mach_timespec_t now, end; end.tv_sec = lastUpdated.tv_sec; end.tv_nsec = lastUpdated.tv_nsec; now.tv_sec = 1; now.tv_nsec = 0; ADD_MACH_TIMESPEC(&end, &now); clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&end, &now) < 0) { IOReturn result = handler->callPlatformFunction(kFakeSMCGetValueCallback, false, (void *)key, (void *)value, (void *)size, 0); if (kIOReturnSuccess == result) clock_get_system_nanotime((clock_sec_t*)&lastUpdated.tv_sec, (clock_nsec_t*)&lastUpdated.tv_nsec); else HWSensorsWarningLog("value update request callback error for key %s, return 0x%x", key, result); } } return value; };
float PTIDSensors::readTachometer(UInt32 index) { mach_timespec_t now; clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&tachometerNextUpdate, &now) <= 0) { mach_timespec_t next; tachometerNextUpdate.tv_sec = now.tv_sec; tachometerNextUpdate.tv_nsec = now.tv_nsec; next.tv_sec = 1; next.tv_nsec = 0; ADD_MACH_TIMESPEC(&tachometerNextUpdate, &next); updateTachometers(); } if (tachometers) { if (OSNumber *number = OSDynamicCast(OSNumber, tachometers->getObject(index))) { UInt64 value = number->unsigned32BitValue(); return (value == 0x80000000) ? 0 : (float)value; } } return 0; }
inline void NDAS_clock_get_uptime(uint64_t *time) { #ifdef __KPI_SOCKET__ // BUG BUG BUG!!! /* uint64_t absoluteTime; clock_get_uptime(&absoluteTime); absolutetime_to_nanoseconds(absoluteTime, time); */ uint32_t secpart, nsecpart; clock_get_system_nanotime(&secpart, &nsecpart); *time = nsecpart + (1000000000ULL * secpart); //convert seconds to nanoseconds. #else AbsoluteTime absoluteTime; clock_get_uptime(&absoluteTime); //AbsoluteTime_to_scalar((AbsoluteTime*)time); absolutetime_to_nanoseconds(absoluteTime, time); #endif }
float INT340EMonitor::readTemperature(UInt32 index) { mach_timespec_t now; clock_get_system_nanotime((clock_sec_t*)&now.tv_sec, (clock_nsec_t*)&now.tv_nsec); if (CMP_MACH_TIMESPEC(&temperatureNextUpdate, &now) <= 0) { mach_timespec_t next; temperatureNextUpdate.tv_sec = now.tv_sec; temperatureNextUpdate.tv_nsec = now.tv_nsec; next.tv_sec = 1; next.tv_nsec = 0; ADD_MACH_TIMESPEC(&temperatureNextUpdate, &next); updateTemperatures(); } if (temperatures) { if (OSNumber *number = OSDynamicCast(OSNumber, temperatures->getObject(index))) { UInt64 value = number->unsigned32BitValue(); return (value == 0x80000000) ? 0 : (float)((value - 0xAAC) / 0xA); } } return 0; }
void PAVirtualDeviceUserClient::sendNotification(UInt32 notificationType, UInt32 value) { if (!notificationReadDescriptor) return; clock_sec_t secs; clock_nsec_t nanosecs; clock_get_system_nanotime (&secs, &nanosecs); notificationBlock no; no.timeStampSec = secs; no.timeStampNanoSec = nanosecs; no.notificationType = notificationType; no.value = value; if (notificationReadDescriptor->prepare() != kIOReturnSuccess) { IOLog("%s(%p): notificationReadDescriptor->prepare() failed!\n", getName(), this); notificationReadDescriptor->release(); notificationReadDescriptor = NULL; return; } notificationReadDescriptor->writeBytes(0, &no, sizeof(no)); notificationReadDescriptor->complete(); sendAsyncResult64(notificationReadReference, kIOReturnSuccess, NULL, 0); }
void IOGetTime( mach_timespec_t * clock_time) { clock_sec_t sec; clock_nsec_t nsec; clock_get_system_nanotime(&sec, &nsec); clock_time->tv_sec = (typeof(clock_time->tv_sec))sec; clock_time->tv_nsec = nsec; }
bool PTIDSensors::start(IOService * provider) { if (!super::start(provider)) return false; acpiDevice = (IOACPIPlatformDevice *)provider; if (!acpiDevice) { HWSensorsFatalLog("ACPI device not ready"); return false; } // Update timers clock_get_system_nanotime((clock_sec_t*)&temperatureNextUpdate.tv_sec, (clock_nsec_t*)&temperatureNextUpdate.tv_nsec); acpiDevice->evaluateInteger("IVER", &version); if (version == 0) { OSString *name = OSDynamicCast(OSString, getProperty("IONameMatched")); if (name && name->isEqualTo("INT3F0D")) version = 0x30000; else return false; } setProperty("version", version, 64); // Parse sensors switch (version) { case 0x30000: { OSObject *object = NULL; // Temperatures if(kIOReturnSuccess == acpiDevice->evaluateObject("TSDL", &object) && object) { OSArray *description = OSDynamicCast(OSArray, object); if (OSIterator *iterator = OSCollectionIterator::withCollection(description)) { HWSensorsDebugLog("Parsing temperatures..."); UInt32 count = 0; while (OSObject *item = iterator->getNextObject()) { parseTemperatureName(OSDynamicCast(OSString, item), count / 2); count += 2; } } } else HWSensorsErrorLog("failed to evaluate TSDL table"); // Tachometers if(kIOReturnSuccess == acpiDevice->evaluateObject("OSDL", &object) && object) { OSArray *description = OSDynamicCast(OSArray, object); if (OSIterator *iterator = OSCollectionIterator::withCollection(description)) { HWSensorsDebugLog("Parsing tachometers..."); UInt32 count = 0; while (OSObject *item = iterator->getNextObject()) { parseTachometerName(OSDynamicCast(OSString, item), count / 3); count += 3; } } } else HWSensorsErrorLog("failed to evaluate OSDL table"); break; } case 0x20001: { OSObject *object = NULL; // Temperatures if(kIOReturnSuccess == acpiDevice->evaluateObject("TMPV", &object) && object) { OSArray *description = OSDynamicCast(OSArray, object); if (OSIterator *iterator = OSCollectionIterator::withCollection(description)) { HWSensorsDebugLog("Parsing temperatures..."); UInt32 count = 0; while (OSObject *item = iterator->getNextObject()) { parseTemperatureName(OSDynamicCast(OSString, item), count + 1); count += 3; } } } else HWSensorsErrorLog("failed to evaluate TMPV table"); // Tachometers if(kIOReturnSuccess == acpiDevice->evaluateObject("OSDV", &object) && object) { OSArray *description = OSDynamicCast(OSArray, object); if (OSIterator *iterator = OSCollectionIterator::withCollection(description)) { HWSensorsDebugLog("Parsing tachometers..."); UInt32 count = 0; while (OSObject *item = iterator->getNextObject()) { parseTachometerName(OSDynamicCast(OSString, item), count + 2); count++; } } } else HWSensorsErrorLog("failed to evaluate OSDV table"); break; } default: HWSensorsFatalLog("usupported interface version: 0x%x", (UInt32)version); return false; } registerService(); HWSensorsInfoLog("started"); return true; }