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 ); }
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; }
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 ); }
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 ); }
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; }