IOReturn AudioProj7PowerObject::setHardwarePowerOn(){ debugIOLog (3, "+ AudioProj7PowerObject::setHardwarePowerOn"); IOReturn result = kIOReturnSuccess; UInt32 progOut; IOService *keyLargo = 0; keyLargo = IOService::waitForService(IOService::serviceMatching("KeyLargo")); if(keyLargo){ long gpioOffset = kPowerObjectOffset; UInt8 value = kPowerOn; keyLargo->callPlatformFunction("keyLargo_writeRegUInt8", false, (void *)&gpioOffset, (void *)(UInt32)value, 0, 0); } if(audioPluginRef) { IOSleep(300); // we need to wait to be sure that the antipop has the time to do his stuff progOut = audioPluginRef->sndHWGetProgOutput(); progOut |= kSndHWProgOutput0; audioPluginRef->sndHWSetProgOutput(progOut); } if(audioPluginRef) { audioPluginRef->sndHWSetPowerState(kIOAudioDeviceActive); audioPluginRef->setDeviceDetectionActive(); } debugIOLog (3, "- AudioProj7PowerObject::setHardwarePowerOn"); return result; }
IOReturn AudioProj7PowerObject::setHardwarePowerOff(){ IOReturn result = kIOReturnSuccess; UInt32 progOut; IOService *keyLargo = 0; debugIOLog (3, "+ AudioProj7PowerObject::setHardwarePowerOff"); progOut = audioPluginRef->sndHWGetProgOutput(); progOut &= ~kSndHWProgOutput0; audioPluginRef->sndHWSetProgOutput(progOut); IOSleep(200); audioPluginRef->sndHWSetPowerState(kIOAudioDeviceSleep); audioPluginRef->setDeviceDetectionInActive(); keyLargo = IOService::waitForService(IOService::serviceMatching("KeyLargo")); if(keyLargo){ long gpioOffset = kPowerObjectOffset; UInt8 value = kPowerOff; keyLargo->callPlatformFunction("keyLargo_writeRegUInt8", false, (void *)&gpioOffset, (void *)(UInt32)value, 0, 0); } debugIOLog (3, "- AudioProj7PowerObject::setHardwarePowerOff"); return result; }
IOReturn AudioProj6PowerObject::setHardwarePowerOn(){ IOReturn result = kIOReturnSuccess; IOService *HeathRow = 0; UInt32 mask, data; UInt32 powerRegAdrr; debugIOLog (3, "+ AudioProj6PowerObject::setHardwarePowerOn"); HeathRow = IOService::waitForService(IOService::serviceMatching("Heathrow")); powerRegAdrr = kPowerObjectOffset; if(HeathRow) { mask = kPowerObjectMask; data = kPowerOn; HeathRow->callPlatformFunction(OSSymbol::withCString("heathrow_safeWriteRegUInt32"), false, (void *)powerRegAdrr, (void *)mask, (void *) data, 0); IOSleep(10); } if(audioPluginRef) { audioPluginRef->sndHWSetPowerState(kIOAudioDeviceActive); audioPluginRef->setDeviceDetectionActive(); } debugIOLog (3, "- AudioProj6PowerObject::setHardwarePowerOn, %d", kIOReturnSuccess == result); return result; }
// Access to Keylargo registers: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [3110829] register accesses need to translate endian format. void AudioI2SControl::KLSetRegister(UInt32 klRegisterOffset, UInt32 value) { IOService * keyLargoService = NULL; UInt32 mask = kAudioFCR1Mask; const OSSymbol * theSymbol; theSymbol = OSSymbol::withCString ("keyLargo_safeWriteRegUInt32"); keyLargoService = IOService::waitForService (IOService::serviceMatching ("KeyLargo")); if (keyLargoService && theSymbol) { keyLargoService->callPlatformFunction (theSymbol, false, (void *)klRegisterOffset, (void *)mask, (void *) value, 0); theSymbol->release (); } }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // [3110829] register accesses need to translate endian format. UInt32 AudioI2SControl::KLGetRegister(UInt32 klRegisterOffset) { UInt32 value = 0; IOService * keyLargoService = NULL; const OSSymbol * theSymbol; theSymbol = OSSymbol::withCString ("keyLargo_safeReadRegUInt32"); keyLargoService = IOService::waitForService (IOService::serviceMatching ("KeyLargo")); if (keyLargoService && theSymbol) { keyLargoService->callPlatformFunction (theSymbol, false, (void *)klRegisterOffset, &value, 0, 0); theSymbol->release (); } return value; }
static IOReturn IOGetVolumeCryptKey(dev_t block_dev, OSString ** pKeyUUID, uint8_t * volumeCryptKey, size_t keySize) { IOReturn err; IOService * part; OSString * keyUUID = 0; OSString * keyStoreUUID = 0; uuid_t volumeKeyUUID; aks_volume_key_t vek; static IOService * sKeyStore; part = IOCopyMediaForDev(block_dev); if (!part) return (kIOReturnNotFound); err = part->callPlatformFunction(PLATFORM_FUNCTION_GET_MEDIA_ENCRYPTION_KEY_UUID, false, (void *) &keyUUID, (void *) &keyStoreUUID, NULL, NULL); if ((kIOReturnSuccess == err) && keyUUID && keyStoreUUID) { // IOLog("got volume key %s\n", keyStoreUUID->getCStringNoCopy()); if (!sKeyStore) sKeyStore = (IOService *) IORegistryEntry::fromPath(AKS_SERVICE_PATH, gIOServicePlane); if (sKeyStore) err = uuid_parse(keyStoreUUID->getCStringNoCopy(), volumeKeyUUID); else err = kIOReturnNoResources; if (kIOReturnSuccess == err) err = sKeyStore->callPlatformFunction(gAKSGetKey, true, volumeKeyUUID, &vek, NULL, NULL); if (kIOReturnSuccess != err) IOLog("volume key err 0x%x\n", err); else { if (vek.key.keybytecount < keySize) keySize = vek.key.keybytecount; bcopy(&vek.key.keybytes[0], volumeCryptKey, keySize); } bzero(&vek, sizeof(vek)); } part->release(); if (pKeyUUID) *pKeyUUID = keyUUID; return (err); }
// -------------------------------------------------------------------------- // Method: setSerialFormatRegister ::Set global values to the serial format register void AudioI2SControl::setSerialFormatRegister(ClockSource clockSource, UInt32 mclkDivisor, UInt32 sclkDivisor, SoundFormat serialFormat, UInt32 newDataFormat) { UInt32 regValue = 0; IOService * keyLargo; IOReturn err; const OSSymbol* funcSymbolName = NULL; // [3323977] err = kIOReturnError; switch ((int)clockSource) { case kClock18MHz: regValue = kClockSource18MHz; break; case kClock45MHz: regValue = kClockSource45MHz; break; case kClock49MHz: regValue = kClockSource49MHz; break; default: break; } switch (mclkDivisor) { case 1: regValue |= kMClkDivisor1; break; case 3: regValue |= kMClkDivisor3; break; case 5: regValue |= kMClkDivisor5; break; default: regValue |= (((mclkDivisor / 2) - 1) << kMClkDivisorShift) & kMClkDivisorMask; break; } switch ((int)sclkDivisor) { // sclk is equivalent to Bclk case 1: regValue |= kSClkDivisor1; break; case 3: regValue |= kSClkDivisor3; break; default: regValue |= (((sclkDivisor / 2) - 1) << kSClkDivisorShift) & kSClkDivisorMask; break; } regValue |= kSClkMaster; // force master mode switch (serialFormat) { case kSndIOFormatI2SSony: regValue |= kSerialFormatSony; break; case kSndIOFormatI2S64x: regValue |= kSerialFormat64x; break; case kSndIOFormatI2S32x: regValue |= kSerialFormat32x; break; default: break; } // This is a 3 step process: // 1] Stop the clock: clockRun(false); keyLargo = NULL; keyLargo = IOService::waitForService (IOService::serviceMatching ("KeyLargo")); if (NULL != keyLargo) { funcSymbolName = OSSymbol::withCString ( "keyLargo_powerI2S" ); // [3323977] FailIf ( NULL == funcSymbolName, Exit ); // [3323977] // ...turn on the i2s clocks... switch ( i2SInterfaceNumber ) { case kUseI2SCell0: err = keyLargo->callPlatformFunction (funcSymbolName, false, (void *)true, (void *)0, 0, 0); break; // [3323977] case kUseI2SCell1: err = keyLargo->callPlatformFunction (funcSymbolName, false, (void *)true, (void *)1, 0, 0); break; // [3323977] } funcSymbolName->release (); // [3323977] if ( kIOReturnSuccess != err ) { debugIOLog (1, "keyLargo->callPlatformFunction FAIL" ); } } // 2 Setup the serial format register & data format register SetSerialFormatReg ( regValue ); dataFormat = newDataFormat; // [3060321] save this to verify value that was used to init! SetDataWordSizesReg ( dataFormat ); // [3060321] rbm 2 Oct 2002 MUST OCCUR WHILE CLOCK IS STOPPED // 3 restarts the clock: clockRun(true); Exit: return; }