Example #1
0
/**
 * __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;
}
Example #2
0
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; 
};
Example #3
0
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;
}
Example #4
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);
}
Example #7
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;
}
Example #8
0
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;
}