Beispiel #1
0
bool
IOI2CLM6x::start	(
						IOService*						provider
					)
{
	IOReturn								status;

	fRegistersAreSaved = false;

	sGetSensorValueSym = OSSymbol::withCString( "getSensorValue" );

	// Start I2CDriver first...
	if ( !( super::start( provider ) ) )
		return( false );

	nrequire( fInitHWFailed, IOI2CLM6x_start_fInitHWFailedErr );

	// Create child nubs.
	require_success( ( status = createChildNubs( fProvider ) ), IOI2CLM6x_start_createChildNubsErr );

	// Register so others can find us with a waitForService().
	registerService();

	return( true );


IOI2CLM6x_start_createChildNubsErr:
IOI2CLM6x_start_fInitHWFailedErr:
	freeI2CResources();
	return( false );
}
Beispiel #2
0
void
IOI2CLM6x::processPowerEvent	(
									UInt32			eventType
								)
{
	switch ( eventType )
	{
		case	kI2CPowerEvent_OFF:
		case	kI2CPowerEvent_SLEEP:
		{
			require_success( saveRegisters(), IOI2CLM6x_processPowerEvent_saveRegistersErr );
			fRegistersAreSaved = true;
			break;
		}

		case	kI2CPowerEvent_ON:
		case	kI2CPowerEvent_WAKE:
		{
			if ( fRegistersAreSaved )
			{
				// Full Power State
				require_success( restoreRegisters(), IOI2CLM6x_processPowerEvent_restoreRegistersErr );
				fRegistersAreSaved = false;
			}
			break;
		}

		case	kI2CPowerEvent_STARTUP:
		{
			require_success( initHW(), IOI2CLM6x_processPowerEvent_initHWErr );
			break;
		}
    }

IOI2CLM6x_processPowerEvent_initHWErr:
IOI2CLM6x_processPowerEvent_saveRegistersErr:
	return;

IOI2CLM6x_processPowerEvent_restoreRegistersErr:
	fRegistersAreSaved = false;
	return;
}
Beispiel #3
0
IOReturn
IOI2CLM6x::getRemoteTemperature	(
									SInt32*				temperature
								)
{
    UInt8							rawDataMsb;
    UInt8							rawDataLsb;
    IOReturn						status = kIOReturnSuccess;

	require_success( ( status = readI2C( kLM6xReg_RemoteTemperatureMSB, &rawDataMsb, 1 ) ), IOI2CLM6x_getRemoteTemperature_readI2CErr1 );
	require_success( ( status = readI2C( kLM6xReg_RemoteTemperatureLSB, &rawDataLsb, 1 ) ), IOI2CLM6x_getRemoteTemperature_readI2CErr2 );

	// Remote temperature data is represented by a 11-bit, two's complement word with 
	// an LSB equal to 0.125C.  The data format is a left justified 16-bit word available in
	// two 8-bit registers.

	*temperature = ( ( ( ( SInt8 ) rawDataMsb ) << 16 ) | ( rawDataLsb << 8 ) );

IOI2CLM6x_getRemoteTemperature_readI2CErr2:
IOI2CLM6x_getRemoteTemperature_readI2CErr1:
	return( status );
}
Beispiel #4
0
IOReturn
IOI2CLM6x::getLocalTemperature	(
									SInt32*				temperature
								)
{
    IOReturn						status = kIOReturnSuccess;
    UInt8							rawData;

	require_success( ( status = readI2C( kLM6xReg_LocalTemperature, &rawData, 1 ) ), IOI2CLM6x_getLocalTemperature_readI2CErr );

	// Local temperature data is represented by a 8-bit, two's complement word with 
	// an LSB equal to 1.0C.  We need to shift it into a 16.16 format.

	*temperature = ( ( ( SInt8 ) rawData ) << 16 );

IOI2CLM6x_getLocalTemperature_readI2CErr:
	return( status );
}
Beispiel #5
0
forensic1394_result platform_enable_sbp2(forensic1394_bus *bus,
                                         const uint32_t *sbp2dir, size_t len)
{
    int i;

    CFMutableDictionaryRef matchingDict;

    io_iterator_t iterator;
    io_object_t currdev;

    IOCFPlugInInterface **plugIn;
    SInt32 theScore;    // Unused

    IOFireWireLibDeviceRef localDev;
    IOFireWireLibLocalUnitDirectoryRef localUnitDir;

    IOReturn iret;
    forensic1394_result fret = FORENSIC1394_RESULT_SUCCESS;

    // We need to get the systems local device node to update the CSR
    matchingDict = IOServiceMatching("IOFireWireLocalNode");
    iret = IOServiceGetMatchingServices(kIOMasterPortDefault,
                                        matchingDict,
                                        &iterator);

    // If the call fails then we do not need to release the iterator
    require_success(iret, cleanupNull, fret);

    // There should only be one of these; so grab the first
    currdev = IOIteratorNext(iterator);

    // Get a plug-in interface to the device
    IOCreatePlugInInterfaceForService(currdev,
                                      kIOFireWireLibTypeID,
                                      kIOCFPlugInInterfaceID,
                                      &plugIn,
                                      &theScore);

    // Ensure plugIn is != NULL; otherwise this is a general error
    require_assertion(plugIn, cleanupCurrdev, fret, FORENSIC1394_RESULT_OTHER_ERROR);

    // Use this plug-in to get a firewire device interface
    iret = (*plugIn)->QueryInterface(plugIn,
                                     CFUUIDGetUUIDBytes(kIOFireWireDeviceInterfaceID_v9),
                                     (void **) &localDev);

    require_success(iret, cleanupPlugIn, fret);

    // Use this device interface to open up the device
    (*localDev)->Open(localDev);

    // And grab a unit local directory interface
    localUnitDir = (*localDev)->CreateLocalUnitDirectory(localDev,
                                                         CFUUIDGetUUIDBytes(kIOFireWireLocalUnitDirectoryInterfaceID));


    // Add the unit directory, ignoring the first entry
    for (i = 1; i < len; i++)
    {
        // The entries are passed as <8-bit key><24-bit value>
        UInt32 key      = CSR_KEY(sbp2dir[i]);
        UInt32 value    = CSR_VALUE(sbp2dir[i]);

        // Add the key-value pair to the local unit directory
        (*localUnitDir)->AddEntry_UInt32(localUnitDir, key, value, NULL);
    }

    // Publish this unit directory
    (*localUnitDir)->Publish(localUnitDir);

    // Save the interface references for later
    bus->pbus->localDev     = localDev;
    bus->pbus->localUnitDir = localUnitDir;

cleanupPlugIn:
    // Release the plug-in interface
    IODestroyPlugInInterface(plugIn);

cleanupCurrdev:
    // Release the current device io_object
    IOObjectRelease(currdev);

    // Release the iterator used to find the device
    IOObjectRelease(iterator);

cleanupNull:
    // Should be FORENSIC1394_RESULT_SUCCESS unless changed by an error macro
    return fret;
}