IOI2CMaxim1989.cpp [plain text]
#include "IOI2CMaxim1989.h"
#define super IOI2CDevice
OSDefineMetaClassAndStructors(IOI2CMaxim1989, IOI2CDevice)
void IOI2CMaxim1989::free( void )
{
super::free();
}
bool IOI2CMaxim1989::start( IOService *nub )
{
IOReturn status;
DLOG("IOI2CMaxim1989::start - entered\n");
if (false == super::start(nub))
return false;
if (!fGetSensorValueSym)
fGetSensorValueSym = OSSymbol::withCString("getSensorValue");
UInt8 deviceID;
if (kIOReturnSuccess != (status = readI2C(kReadDeviceID, &deviceID, 1)))
{
IOLog("IOI2CMaxim1989@%lx::start device not responding!\n", getI2CAddress());
freeI2CResources();
return false;
}
registerService();
publishChildren(nub);
return(true);
}
void IOI2CMaxim1989::stop( IOService *nub )
{
DLOG("IOI2CMaxim1989::stop - entered\n");
performFunctionsWithFlags (kIOPFFlagOnTerm);
if (fGetSensorValueSym) { fGetSensorValueSym->release(); fGetSensorValueSym = NULL; }
super::stop( nub );
}
IOReturn IOI2CMaxim1989::callPlatformFunction(const OSSymbol *functionName,
bool waitForFunction, void *param1, void *param2,
void *param3, void *param4)
{
UInt32 maximReg = (UInt32)param1;
SInt32 *temp_buf = (SInt32 *)param2;
DLOG("IOI2CMaxim1989::callPlatformFunction(%x) %s %s %08lx %08lx %08lx %08lx\n",
fI2CAddress, functionName->getCStringNoCopy(), waitForFunction ? "TRUE" : "FALSE",
(UInt32) param1, (UInt32) param2, (UInt32) param3, (UInt32) param4);
if (functionName->isEqualTo(fGetSensorValueSym) == true)
{
if (isI2COffline() == true)
return(kIOReturnOffline);
if (temp_buf == NULL)
return(kIOReturnBadArgument);
return(getTemp(maximReg, temp_buf));
}
return(super::callPlatformFunction(functionName, waitForFunction,
param1, param2, param3, param4));
}
IOReturn IOI2CMaxim1989::publishChildren(IOService *nub)
{
OSIterator *childIterator = NULL;
IORegistryEntry *childEntry = NULL;
IOService *childNub = NULL;
childIterator = nub->getChildIterator(gIODTPlane);
if( childIterator != NULL )
{
while ( ( childEntry = (IORegistryEntry *)( childIterator->getNextObject() ) ) != NULL )
{
childNub = OSDynamicCast(IOService, OSMetaClass::allocClassWithName("IOService"));
childNub->init(childEntry, gIODTPlane);
childNub->attach(this);
childNub->registerService();
DLOG("IOI2CMaxim1989::publishChildren(0x%x) published child %s\n", getI2CAddress(), childEntry->getName());
}
childIterator->release();
}
return kIOReturnSuccess;
}
#pragma mark -
#pragma mark *** Read Temperature Channels ***
#pragma mark -
IOReturn IOI2CMaxim1989::getTemp( UInt32 maximReg, SInt32 * temp )
{
IOReturn status;
UInt8 integer;
if (kIOReturnSuccess != (status = readI2C( maximReg, &integer, 1 )))
{
IOLog("IOI2CMaxim1989::getTemp read temp failed!\n");
*temp = -1;
return status;
}
*temp = (((SInt32)integer << 16) & 0x00FF0000);
return status;
}