void SuperIO::LoadConfiguration(IOService* provider) { m_Service = provider; OSBoolean* fanControl = OSDynamicCast(OSBoolean, provider->getProperty("Enable Fan Control")); m_FanControl = fanControl->getValue(); OSBoolean* alternateRegisters = OSDynamicCast(OSBoolean, provider->getProperty("Register number alternative variant")); m_AlternateRegisters = alternateRegisters->getValue(); OSArray* fanIDs = OSDynamicCast(OSArray, provider->getProperty("Fan Names")); if (fanIDs) fanIDs = OSArray::withArray(fanIDs); if (fanIDs) { UInt32 count = fanIDs->getCount(); if(count > 5) count = 5; for (UInt32 i = 0; i < count; i++) { OSString* name = OSDynamicCast(OSString, fanIDs->getObject(i)); FanName[i] = name->getCStringNoCopy(); } fanIDs->release(); } }
// GetPlistValue UInt32 VoodooPState::getPlistValue(OSDictionary * dictionary, const char * symbol) { OSObject * object = 0; OSBoolean * boolean = false; OSNumber * number = 0; OSString * string = 0; object = dictionary->getObject(symbol); if (object && (OSTypeIDInst(object) == OSTypeID(OSBoolean))) { boolean = OSDynamicCast(OSBoolean, object); return boolean->getValue(); } if (object && (OSTypeIDInst(object) == OSTypeID(OSNumber))) { number = OSDynamicCast(OSNumber, object); return number->unsigned32BitValue(); } if (object && (OSTypeIDInst(object) == OSTypeID(OSString))) { string = OSDynamicCast(OSString, object); // Implement string to number conversion } return 0; }
static void checkACStatusThread(thread_call_param_t param0, thread_call_param_t param1) { int i=0; const int retryTimes = 10; while (!isStatusThreadCanCancel && i<retryTimes) { if(NULL == commmonBatteryDevice) { IOLog("Can't find battery device, retry %d...\n", retryTimes-i); commmonBatteryDevice = getBatteryDevice(); IOSleep(3000); i++; continue; } OSObject * obj = commmonBatteryDevice->getProperty("ExternalConnected"); OSBoolean * status = OSDynamicCast(OSBoolean, obj); if (!status) { IOLog("Battery status get failed.\n"); break; } if(ACStatusChangedCallback) { bool batStatus = status->getValue(); if(batStatus != ACStatus) { //IOLog("Battery status changed.\n"); ACStatus = batStatus; ACStatusChangedCallback(batStatus); } } else ACStatus = status->getValue(); IOSleep(ACStatus?1000:5000);//1s=1000ms } if(i == 10) IOLog("Can't find battery device, exit.\n"); else IOLog("Battery thread cancelled.\n"); isStatusThreadCancelled = true; }
bool ACPIBacklightPanel::getACStatus() { DbgLog("%s::%s()\n", this->getName(),__FUNCTION__); IOService * batteryDevice = getBatteryDevice(); if (NULL != batteryDevice) { OSObject * obj = batteryDevice->getProperty("ExternalConnected"); OSBoolean * status = OSDynamicCast(OSBoolean, obj); if (status) { DbgLog("%s: getACStatus() AC is %d\n", this->getName(), status->getValue()); return status->getValue(); } else DbgLog("%s: getACStatus() unable to get \"ExternalConnected\" property\n", this->getName()); } return true; }
// Read the settings from the registry void Xbox360Peripheral::readSettings(void) { OSBoolean *value = NULL; OSNumber *number = NULL; OSDictionary *dataDictionary = OSDynamicCast(OSDictionary, getProperty(kDriverSettingKey)); if (dataDictionary == NULL) return; value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertLeftX")); if (value != NULL) invertLeftX = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertLeftY")); if (value != NULL) invertLeftY = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertRightX")); if (value != NULL) invertRightX = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertRightY")); if (value != NULL) invertRightY = value->getValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("DeadzoneLeft")); if (number != NULL) deadzoneLeft = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("DeadzoneRight")); if (number != NULL) deadzoneRight = number->unsigned32BitValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("RelativeLeft")); if (value != NULL) relativeLeft = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("RelativeRight")); if (value != NULL) relativeRight=value->getValue(); #if 0 IOLog("Xbox360Peripheral preferences loaded:\n invertLeft X: %s, Y: %s\n invertRight X: %s, Y:%s\n deadzone Left: %d, Right: %d\n\n", invertLeftX?"True":"False",invertLeftY?"True":"False", invertRightX?"True":"False",invertRightY?"True":"False", deadzoneLeft,deadzoneRight); #endif }
bool getACStatus() { IOService * batteryDevice = getBatteryDevice(); if (NULL != batteryDevice) { OSObject * obj = batteryDevice->getProperty("ExternalConnected"); OSBoolean * status = OSDynamicCast(OSBoolean, obj); if (status) return status->getValue(); } return true; }
//============================================================================== // USB Stuff (Mainly...) //============================================================================== bool com_milvich_driver_Thrustmaster::init(OSDictionary *properties) { IOLog("%s: init\n", NAME); if(!super::init(properties)) { return false; } fIface = NULL; fPipe = NULL; fBuffer = NULL; fOutstandingIOOps = 0; fNeedToClose = false; fFinishedInit = false; for(unsigned int i = 0; i < sizeof(fControlData); i++) { fControlData[i] = 0; } OSBoolean *result; int count; // create the buffer for the reports fReport = IOBufferMemoryDescriptor::withCapacity(kReportSize, kIODirectionOutIn, true); if(!fReport) { IOLog("%s: Failed to create the MemoryDescriptor for our report\n", NAME); return false; } // I need to know this info to create the device descriptor, but I can't // dynamicly look this up until I finish initing the iMate, but that blocks... // So we be stupid and just read from a config file. fHasRudders = false; fHasThrottle = true; result = OSDynamicCast(OSBoolean, getProperty("HasRudder")); if(result) { fHasRudders = result->getValue(); } result = OSDynamicCast(OSBoolean, getProperty("HasThrottle")); if(result) { fHasThrottle = result->getValue(); } // check to see if the rocker switch should act as a modifier if(fHasThrottle) { result = OSDynamicCast(OSBoolean, getProperty("RockerIsModifier")); if(!result) { IOLog("%s: Failed to find an entry for RockerIsModifier, assuming false.\n", NAME); fRockerIsModifier = false; } else { fRockerIsModifier = result->getValue(); } } else { fRockerIsModifier = false; } // setup buttons if(fHasThrottle) { count = kNumOfButtons; } else { count = kNumOfFCSButtons; } OSArray *buttonArray = OSDynamicCast(OSArray, getProperty("Buttons")); if(fRockerIsModifier && buttonArray) { for(int i = 0; i < count; i++) { result = OSDynamicCast(OSBoolean, buttonArray->getObject(i)); if(result && result->getValue()) { for(int j = 0; j < kNumModifiers; j++) { fButtonShifts[i * kNumModifiers + j] = fNumButtons; fNumButtons++; } } else { for(int j = 0; j < kNumModifiers; j++) { fButtonShifts[i * kNumModifiers + j] = fNumButtons; } fNumButtons++; } } } else { // the buttons and hatswitchs are not shifted, so set all 3 shift values // to the same thing fNumButtons = 0; for(int i = 0; i < count; i++) { for(int j = 0; j < kNumModifiers; j++) { fButtonShifts[i * kNumModifiers + j] = fNumButtons; } fNumButtons++; } // same thing with the hat switch } result = OSDynamicCast(OSBoolean, getProperty("ModifierEffectsHat")); fHatIsModified = result && result->getValue(); if(fHatIsModified && fRockerIsModifier) { fHatSwitchShifts[0] = 0; fHatSwitchShifts[1] = 1; fHatSwitchShifts[2] = 2; } else { fHatSwitchShifts[0] = fHatSwitchShifts[1] = fHatSwitchShifts[2] = 0; fHatIsModified = false; } result = OSDynamicCast(OSBoolean, getProperty("TwistRudder")); fTwistRudder = result && result->getValue(); return true; }
// Read the settings from the registry void Xbox360Peripheral::readSettings(void) { OSBoolean *value = NULL; OSNumber *number = NULL; OSDictionary *dataDictionary = OSDynamicCast(OSDictionary, getProperty(kDriverSettingKey)); if (dataDictionary == NULL) return; value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertLeftX")); if (value != NULL) invertLeftX = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertLeftY")); if (value != NULL) invertLeftY = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertRightX")); if (value != NULL) invertRightX = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertRightY")); if (value != NULL) invertRightY = value->getValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("DeadzoneLeft")); if (number != NULL) deadzoneLeft = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("DeadzoneRight")); if (number != NULL) deadzoneRight = number->unsigned32BitValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("RelativeLeft")); if (value != NULL) relativeLeft = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("RelativeRight")); if (value != NULL) relativeRight=value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("DeadOffLeft")); if (value != NULL) deadOffLeft = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("DeadOffRight")); if (value != NULL) deadOffRight = value->getValue(); // number = OSDynamicCast(OSNumber, dataDictionary->getObject("ControllerType")); // No use currently. number = OSDynamicCast(OSNumber, dataDictionary->getObject("rumbleType")); if (number != NULL) rumbleType = number->unsigned8BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingUp")); if (number != NULL) mapping[0] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingDown")); if (number != NULL) mapping[1] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingLeft")); if (number != NULL) mapping[2] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingRight")); if (number != NULL) mapping[3] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingStart")); if (number != NULL) mapping[4] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingBack")); if (number != NULL) mapping[5] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingLSC")); if (number != NULL) mapping[6] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingRSC")); if (number != NULL) mapping[7] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingLB")); if (number != NULL) mapping[8] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingRB")); if (number != NULL) mapping[9] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingGuide")); if (number != NULL) mapping[10] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingA")); if (number != NULL) mapping[11] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingB")); if (number != NULL) mapping[12] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingX")); if (number != NULL) mapping[13] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingY")); if (number != NULL) mapping[14] = number->unsigned32BitValue(); #if 0 IOLog("Xbox360Peripheral preferences loaded:\n invertLeft X: %s, Y: %s\n invertRight X: %s, Y:%s\n deadzone Left: %d, Right: %d\n\n", invertLeftX?"True":"False",invertLeftY?"True":"False", invertRightX?"True":"False",invertRightY?"True":"False", deadzoneLeft,deadzoneRight); #endif }
bool com_reidburke_air_IntelEnhancedSpeedStep::init(OSDictionary* dict) { bool res = super::init(dict); info("Initializing xnu-speedstep-air\n"); // read data cpuid_update_generic_info(); /* Allocate our spinlock for later use */ Lock = IOSimpleLockAlloc(); /* Check for a patched kernel which properly implements rtc_clock_stepped() */ uint64_t magic = -1; // means autodetect OSBoolean* debugMsgs = (OSBoolean*) dict->getObject("DebugMessages"); if (debugMsgs != 0) DebugOn = debugMsgs->getValue(); else DebugOn = false; OSNumber* kernelFeatures = (OSNumber*) dict->getObject("KernelFeatures"); if (kernelFeatures != 0) magic = kernelFeatures->unsigned8BitValue(); if (magic == 255) nanoseconds_to_absolutetime(~(0), &magic); //255uint = -1 int if (magic == 1) { RtcFixKernel = true; Below1Ghz = false; } else if (magic == 2) { RtcFixKernel = true; Below1Ghz = true; } else if (magic == 3) { RtcFixKernel = false; Below1Ghz = true; } else { RtcFixKernel = false; Below1Ghz = false; } checkForNby2Ratio(); // check and store in global variable before loading pstate override if (getFSB() == false) return false; OSArray* overrideTable = (OSArray*) dict->getObject("PStateTable"); if (overrideTable != 0 ) loadPStateOverride(overrideTable); OSNumber* defaultState = (OSNumber*) dict->getObject("DefaultPState"); if (defaultState != 0) DefaultPState = defaultState->unsigned8BitValue(); else DefaultPState = -1; // indicate no default state OSNumber* maxLatency = (OSNumber*) dict->getObject("Latency"); if (maxLatency != 0) MaxLatency = maxLatency->unsigned32BitValue(); else MaxLatency = 0; /* Make preliminary check */ if ( (strcmp(cpuid_info()->cpuid_vendor, CPUID_VID_INTEL) == 0) // Check it's actually Intel && ( cpuid_info()->cpuid_features & CPUID_FEATURE_EST) ) { // Check it supports EST autostart = (OSNumber*) dict->getObject("AutoStart"); info( "do autostart %d \n", autostart->unsigned8BitValue() ); if ( autostart != 0 && autostart->unsigned8BitValue() == 1 ) { Throttler = new AutoThrottler; if (Throttler) { dbg("Throttler instantiated.\n"); OSNumber* targetload = (OSNumber*) dict->getObject("TargetCPULoad"); if (targetload != 0) Throttler->targetCPULoad = (targetload->unsigned16BitValue()) * 10; else Throttler->targetCPULoad = 700; } } } totalThrottles = 0; frequencyUsage[0] = '\0'; /* Return whatever the superclass returned */ return res; }
bool RadeonController::start( IOService * provider ) { if (!super::start(provider)) return false; device = OSDynamicCast(IOPCIDevice, provider); if (device == NULL) return false; //get user options OSBoolean *prop; OSDictionary *dict = OSDynamicCast(OSDictionary, getProperty("UserOptions")); bzero(&options, sizeof(UserOptions)); options.HWCursorSupport = FALSE; options.enableGammaTable = FALSE; options.enableOSXI2C = FALSE; options.lowPowerMode = FALSE; if (dict) { prop = OSDynamicCast(OSBoolean, dict->getObject("enableHWCursor")); if (prop) options.HWCursorSupport = prop->getValue(); prop = OSDynamicCast(OSBoolean, dict->getObject("debugMode")); if (prop) options.debugMode = prop->getValue(); if (options.debugMode) options.HWCursorSupport = FALSE; prop = OSDynamicCast(OSBoolean, dict->getObject("enableGammaTable")); if (prop) options.enableGammaTable = prop->getValue(); prop = OSDynamicCast(OSBoolean, dict->getObject("lowPowerMode")); if (prop) options.lowPowerMode = prop->getValue(); } options.verbosity = 1; #ifdef DEBUG if (0 == getRegistryRoot()->getProperty("RadeonDumpReady")) { getRegistryRoot()->setProperty("RadeonDumpReady", kOSBooleanTrue); DumpMsg.mVerbose = 1; DumpMsg.client = 1; DumpMsg.mMsgBufferSize = 65535; if (dict) { OSNumber *optionNum; optionNum = OSDynamicCast(OSNumber, dict->getObject("verboseLevel")); if (optionNum) DumpMsg.mVerbose = optionNum->unsigned32BitValue(); optionNum = OSDynamicCast(OSNumber, dict->getObject("MsgBufferSize")); if (optionNum) DumpMsg.mMsgBufferSize = max(65535, optionNum->unsigned32BitValue()); } DumpMsg.mMsgBufferEnabled = false; DumpMsg.mMsgBufferPos = 0; DumpMsg.mMessageLock = IOLockAlloc(); DumpMsg.mMsgBuffer = (char *) IOMalloc(DumpMsg.mMsgBufferSize); if (!DumpMsg.mMsgBuffer) { IOLog("error: couldn't allocate message buffer (%ld bytes)\n", DumpMsg.mMsgBufferSize); return false; } enableMsgBuffer(true); } else DumpMsg.client += 1; options.verbosity = DumpMsg.mVerbose; #endif device->setMemoryEnable(true); IOMap = device->mapDeviceMemoryWithRegister( kIOPCIConfigBaseAddress2 ); if (IOMap == NULL) return false; FBMap = device->mapDeviceMemoryWithRegister( kIOPCIConfigBaseAddress0 ); if (FBMap == NULL) return false; memoryMap.MMIOBase = (pointer) IOMap->getVirtualAddress(); memoryMap.MMIOMapSize = IOMap->getLength(); memoryMap.FbBase = (pointer) FBMap->getVirtualAddress(); memoryMap.FbMapSize = FBMap->getLength(); memoryMap.FbPhysBase = (unsigned long)FBMap->getPhysicalAddress(); memoryMap.bitsPerPixel = 32; memoryMap.bitsPerComponent = 8; memoryMap.colorFormat = 0; //0 for non-64 bit memoryMap.BIOSCopy = NULL; memoryMap.BIOSLength = 0; IOMemoryDescriptor * mem; mem = IOMemoryDescriptor::withPhysicalAddress((IOPhysicalAddress) RHD_VBIOS_BASE, RHD_VBIOS_SIZE, kIODirectionOut); if (mem) { memoryMap.BIOSCopy = (unsigned char *)IOMalloc(RHD_VBIOS_SIZE); if (memoryMap.BIOSCopy) { mem->prepare(kIODirectionOut); if (!(memoryMap.BIOSLength = mem->readBytes(0, memoryMap.BIOSCopy, RHD_VBIOS_SIZE))) { LOG("Cannot read BIOS image\n"); memoryMap.BIOSLength = 0; } if ((unsigned int)memoryMap.BIOSLength != RHD_VBIOS_SIZE) LOG("Read only %d of %d bytes of BIOS image\n", memoryMap.BIOSLength, RHD_VBIOS_SIZE); mem->complete(kIODirectionOut); } } if (dict) { const char typeKey[2][8] = {"@0,TYPE", "@1,TYPE"}; const char EDIDKey[2][8] = {"@0,EDID", "@1,EDID"}; const char fixedModesKey[2][17] = {"@0,UseFixedModes", "@1,UseFixedModes"}; OSString *type; OSData *edidData; OSBoolean *boolData; int i; for (i = 0;i < 2;i++) { type = OSDynamicCast(OSString, dict->getObject(typeKey[i])); if (!type) continue; edidData = OSDynamicCast(OSData, dict->getObject(EDIDKey[i])); if (edidData == NULL) continue; options.EDID_Block[i] = (unsigned char *)IOMalloc(edidData->getLength()); if (options.EDID_Block[i] == NULL) continue; strncpy(options.outputTypes[i], type->getCStringNoCopy(), outputTypeLength); bcopy(edidData->getBytesNoCopy(), options.EDID_Block[i], edidData->getLength()); options.EDID_Length[i] = edidData->getLength(); boolData = OSDynamicCast(OSBoolean, dict->getObject(fixedModesKey[i])); if (boolData) options.UseFixedModes[i] = boolData->getValue(); } } xf86Screens[0] = IONew(ScrnInfoRec, 1); //using global variable, will change it later ScrnInfoPtr pScrn = xf86Screens[0]; if (pScrn == NULL) return false; bzero(pScrn, sizeof(ScrnInfoRec)); MAKE_REG_ENTRY(&nub, device); pciRec.chipType = device->configRead16(kIOPCIConfigDeviceID); pciRec.subsysVendor = device->configRead16(kIOPCIConfigSubSystemVendorID); pciRec.subsysCard = device->configRead16(kIOPCIConfigSubSystemID); pciRec.biosSize = 16; //RHD_VBIOS_SIZE = 1 << 16 pScrn->PciTag = &nub; pScrn->PciInfo = &pciRec; pScrn->options = &options; pScrn->memPhysBase = (unsigned long)FBMap->getPhysicalAddress(); pScrn->fbOffset = 0; //scanout offset pScrn->bitsPerPixel = 32; pScrn->bitsPerComponent = 8; pScrn->colorFormat = 0; pScrn->depth = pScrn->bitsPerPixel; pScrn->memoryMap = &memoryMap; createNubs(provider); setModel(device); return true; }
// Read the settings from the registry void Wireless360Controller::readSettings(void) { OSBoolean *value; OSNumber *number; OSDictionary *dataDictionary = OSDynamicCast(OSDictionary, getProperty(kDriverSettingKey)); if(dataDictionary==NULL) return; value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertLeftX")); if (value != NULL) invertLeftX = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertLeftY")); if (value != NULL) invertLeftY = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertRightX")); if (value != NULL) invertRightX = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("InvertRightY")); if (value != NULL) invertRightY = value->getValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("DeadzoneLeft")); if (number != NULL) deadzoneLeft = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("DeadzoneRight")); if (number != NULL) deadzoneRight = number->unsigned32BitValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("RelativeLeft")); if (value != NULL) relativeLeft = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("RelativeRight")); if (value != NULL) relativeRight=value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("DeadOffLeft")); if (value != NULL) deadOffLeft = value->getValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("DeadOffRight")); if (value != NULL) deadOffRight = value->getValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("RumbleType")); if (number != NULL) rumbleType = number->unsigned8BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingUp")); if (number != NULL) mapping[0] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingDown")); if (number != NULL) mapping[1] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingLeft")); if (number != NULL) mapping[2] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingRight")); if (number != NULL) mapping[3] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingStart")); if (number != NULL) mapping[4] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingBack")); if (number != NULL) mapping[5] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingLSC")); if (number != NULL) mapping[6] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingRSC")); if (number != NULL) mapping[7] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingLB")); if (number != NULL) mapping[8] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingRB")); if (number != NULL) mapping[9] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingGuide")); if (number != NULL) mapping[10] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingA")); if (number != NULL) mapping[11] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingB")); if (number != NULL) mapping[12] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingX")); if (number != NULL) mapping[13] = number->unsigned32BitValue(); number = OSDynamicCast(OSNumber, dataDictionary->getObject("BindingY")); if (number != NULL) mapping[14] = number->unsigned32BitValue(); value = OSDynamicCast(OSBoolean, dataDictionary->getObject("SwapSticks")); if (value != NULL) swapSticks = value->getValue(); noMapping = true; UInt8 normalMapping[15] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15 }; for (int i = 0; i < 15; i++) { if (normalMapping[i] != mapping[i]) { noMapping = false; break; } } #if 0 IOLog("Xbox360ControllerClass preferences loaded:\n invertLeft X: %s, Y: %s\n invertRight X: %s, Y:%s\n deadzone Left: %d, Right: %d\n\n", invertLeftX?"True":"False",invertLeftY?"True":"False", invertRightX?"True":"False",invertRightY?"True":"False", deadzoneLeft,deadzoneRight); #endif }
bool PhantomAudioEngine::createAudioStreams(IOAudioSampleRate *initialSampleRate) { bool result = false; OSNumber *number; UInt32 numStreams, streamNum; OSArray *formatArray, *sampleRateArray; UInt32 startingChannelID = 1; IOAudioControl *control; OSString *desc; OSBoolean *boolean; bool separateStreamBuffers = FALSE, separateInputBuffers = FALSE; desc = OSDynamicCast(OSString, getProperty(DESCRIPTION_KEY)); if (desc) { setDescription(desc->getCStringNoCopy()); } number = OSDynamicCast(OSNumber, getProperty(NUM_STREAMS_KEY)); if (number) { numStreams = number->unsigned32BitValue(); } else { numStreams = NUM_STREAMS; } formatArray = OSDynamicCast(OSArray, getProperty(FORMATS_KEY)); if (formatArray == NULL) { goto Done; } sampleRateArray = OSDynamicCast(OSArray, getProperty(SAMPLE_RATES_KEY)); if (sampleRateArray == NULL) { goto Done; } boolean = OSDynamicCast(OSBoolean, getProperty(SEPARATE_STREAM_BUFFERS_KEY)); if (boolean != NULL) { separateStreamBuffers = boolean->getValue(); } boolean = OSDynamicCast(OSBoolean, getProperty(SEPARATE_INPUT_BUFFERS_KEY)); if (boolean != NULL) { separateInputBuffers = boolean->getValue(); } if (separateStreamBuffers) { IOLog("PhantomAudioEngine::createAudioStreams() - Creating a separate buffer for each stream.\n"); } else { IOLog("PhantomAudioEngine::createAudioStreams() - Sharing one buffer among all streams.\n"); } if (separateInputBuffers) { IOLog("PhantomAudioEngine::createAudioStreams() - Creating separate buffers for input and output.\n"); } else { IOLog("PhantomAudioEngine::createAudioStreams() - Sharing input and output buffers.\n"); } for (streamNum = 0; streamNum < numStreams; streamNum++) { IOAudioStream *inputStream = NULL, *outputStream = NULL; UInt32 maxBitWidth = 0; UInt32 maxNumChannels = 0; OSCollectionIterator *formatIterator = NULL, *sampleRateIterator = NULL; OSDictionary *formatDict; IOAudioSampleRate sampleRate; IOAudioStreamFormat initialFormat; bool initialFormatSet; UInt32 channelID; char outputStreamName[20], inputStreamName[20]; UInt32 streamBufferSize; initialFormatSet = false; sampleRate.whole = 0; sampleRate.fraction = 0; inputStream = new IOAudioStream; if (inputStream == NULL) { goto Error; } outputStream = new IOAudioStream; if (outputStream == NULL) { goto Error; } sprintf(inputStreamName, "Input Stream #%ld", streamNum + 1); sprintf(outputStreamName, "Output Stream #%ld", streamNum + 1); if (!inputStream->initWithAudioEngine(this, kIOAudioStreamDirectionInput, startingChannelID, inputStreamName) || !outputStream->initWithAudioEngine(this, kIOAudioStreamDirectionOutput, startingChannelID, outputStreamName)) { goto Error; } formatIterator = OSCollectionIterator::withCollection(formatArray); if (!formatIterator) { goto Error; } sampleRateIterator = OSCollectionIterator::withCollection(sampleRateArray); if (!sampleRateIterator) { goto Error; } formatIterator->reset(); while (formatDict = (OSDictionary *)formatIterator->getNextObject()) { IOAudioStreamFormat format; if (OSDynamicCast(OSDictionary, formatDict) == NULL) { goto Error; } if (IOAudioStream::createFormatFromDictionary(formatDict, &format) == NULL) { goto Error; } if (!initialFormatSet) { initialFormat = format; } sampleRateIterator->reset(); while (number = (OSNumber *)sampleRateIterator->getNextObject()) { if (!OSDynamicCast(OSNumber, number)) { goto Error; } sampleRate.whole = number->unsigned32BitValue(); inputStream->addAvailableFormat(&format, &sampleRate, &sampleRate); if (format.fBitDepth == 24) { IOAudioStream::AudioIOFunction functions[2]; functions[0] = process24BitSamples; functions[1] = clip24BitSamples; //outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, functions, 2); outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, (IOAudioStream::AudioIOFunction)clip24BitSamples); if (format.fNumericRepresentation == kIOAudioStreamSampleFormatLinearPCM && format.fIsMixable == TRUE) { format.fIsMixable = FALSE; outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, (IOAudioStream::AudioIOFunction)clip24BitSamples); } } else if (format.fBitDepth == 16) { IOAudioStream::AudioIOFunction functions[2]; functions[0] = process16BitSamples; functions[1] = clip16BitSamples; //outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, functions, 2); outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, (IOAudioStream::AudioIOFunction)clip16BitSamples); if (format.fNumericRepresentation == kIOAudioStreamSampleFormatLinearPCM && format.fIsMixable == TRUE) { format.fIsMixable = FALSE; outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, (IOAudioStream::AudioIOFunction)clip24BitSamples); } } else { outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate); if (format.fNumericRepresentation == kIOAudioStreamSampleFormatLinearPCM && format.fIsMixable == TRUE) { format.fIsMixable = FALSE; outputStream->addAvailableFormat(&format, &sampleRate, &sampleRate, (IOAudioStream::AudioIOFunction)clip24BitSamples); } } if (format.fNumChannels > maxNumChannels) { maxNumChannels = format.fNumChannels; } if (format.fBitWidth > maxBitWidth) { maxBitWidth = format.fBitWidth; } if (initialSampleRate->whole == 0) { initialSampleRate->whole = sampleRate.whole; } } } streamBufferSize = blockSize * numBlocks * maxNumChannels * maxBitWidth / 8; if (outputBuffer == NULL) { if (separateStreamBuffers) { outputBufferSize = streamBufferSize * numStreams; } else { outputBufferSize = streamBufferSize; } outputBuffer = (void *)IOMalloc(outputBufferSize); if (!outputBuffer) { IOLog("Error allocating output buffer - %lu bytes.\n", outputBufferSize); goto Error; } inputBufferSize = outputBufferSize; if (separateInputBuffers) { inputBuffer = (void *)IOMalloc(inputBufferSize); if (!inputBuffer) { IOLog("Error allocating input buffer - %lu bytes.\n", inputBufferSize); goto Error; } } else { inputBuffer = outputBuffer; } } inputStream->setFormat(&initialFormat); outputStream->setFormat(&initialFormat); if (separateStreamBuffers) { inputStream->setSampleBuffer(&((UInt8 *)inputBuffer)[streamBufferSize * streamNum], streamBufferSize); outputStream->setSampleBuffer(&((UInt8 *)outputBuffer)[streamBufferSize * streamNum], streamBufferSize); } else { inputStream->setSampleBuffer(inputBuffer, streamBufferSize); outputStream->setSampleBuffer(outputBuffer, streamBufferSize); } addAudioStream(inputStream); inputStream->release(); addAudioStream(outputStream); outputStream->release(); formatIterator->release(); sampleRateIterator->release(); for (channelID = startingChannelID; channelID < (startingChannelID + maxNumChannels); channelID++) { char channelName[20]; sprintf(channelName, "Channel %lu", channelID); control = IOAudioLevelControl::createVolumeControl(65535, 0, 65535, (-22 << 16) + (32768), 0, channelID, channelName, 0, kIOAudioControlUsageOutput); if (!control) { goto Error; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::volumeChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioToggleControl::createMuteControl(false, channelID, channelName, 0, kIOAudioControlUsageOutput); if (!control) { goto Error; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::outputMuteChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioLevelControl::createVolumeControl(65535, 0, 65535, (-22 << 16) + (32768), 0, channelID, channelName, 0, kIOAudioControlUsageInput); if (!control) { goto Error; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::gainChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioToggleControl::createMuteControl(false, channelID, channelName, 0, kIOAudioControlUsageInput); if (!control) { goto Error; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::inputMuteChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioToggleControl::createMuteControl(true, channelID, channelName, 0, kIOAudioControlUsagePassThru); if (!control) { goto Error; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::passThruChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); } startingChannelID += maxNumChannels; continue; Error: IOLog("PhantomAudioEngine[%p]::createAudioStreams() - ERROR\n", this); if (inputStream) { inputStream->release(); } if (outputStream) { outputStream->release(); } if (formatIterator) { formatIterator->release(); } if (sampleRateIterator) { sampleRateIterator->release(); } goto Done; } control = IOAudioLevelControl::createVolumeControl(65535, 0, 65535, (-22 << 16) + (32768), 0, kIOAudioControlChannelIDAll, kIOAudioControlChannelNameAll, 0, kIOAudioControlUsageOutput); if (!control) { goto Done; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::volumeChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioToggleControl::createMuteControl(false, kIOAudioControlChannelIDAll, kIOAudioControlChannelNameAll, 0, kIOAudioControlUsageOutput); if (!control) { goto Done; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::outputMuteChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioLevelControl::createVolumeControl(65535, 0, 65535, (-22 << 16) + (32768), 0, kIOAudioControlChannelIDAll, kIOAudioControlChannelNameAll, 0, kIOAudioControlUsageInput); if (!control) { goto Done; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::gainChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioToggleControl::createMuteControl(false, kIOAudioControlChannelIDAll, kIOAudioControlChannelNameAll, 0, kIOAudioControlUsageInput); if (!control) { goto Done; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::inputMuteChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); control = IOAudioToggleControl::createMuteControl(true, kIOAudioControlChannelIDAll, kIOAudioControlChannelNameAll, 0, kIOAudioControlUsagePassThru); if (!control) { goto Done; } control->setValueChangeHandler((IOAudioControl::IntValueChangeHandler)PhantomAudioDevice::passThruChangeHandler, audioDevice); addDefaultAudioControl(control); control->release(); result = true; Done: if (!result) { IOLog("PhantomAudioEngine[%p]::createAudioStreams() - failed!\n", this); } return result; }
bool ACPIProbe::start(IOService * provider) { ACPISensorsDebugLog("starting..."); if (!super::start(provider)) return false; if (!(acpiDevice = OSDynamicCast(IOACPIPlatformDevice, provider))) { ACPISensorsFatalLog("ACPI device not ready"); return false; } profiles = OSDictionary::withCapacity(0); profileList = OSArray::withCapacity(0); OSObject *object = NULL; // Try to load configuration provided by ACPI device if (kIOReturnSuccess == acpiDevice->evaluateObject("LIST", &object) && object) { if (OSArray *list = OSDynamicCast(OSArray, object)) { for (unsigned int i = 0; i < list->getCount(); i++) { if (OSString *method = OSDynamicCast(OSString, list->getObject(i))) { if (kIOReturnSuccess == acpiDevice->evaluateObject(method->getCStringNoCopy(), &object) && object) { if (OSArray *config = OSDynamicCast(OSArray, object)) { if (config->getCount() > 4) { OSString *pName = OSDynamicCast(OSString, config->getObject(0)); OSNumber *pInterval = OSDynamicCast(OSNumber, config->getObject(1)); OSNumber *pTimeout = OSDynamicCast(OSNumber, config->getObject(2)); OSNumber *pVerbose = OSDynamicCast(OSNumber, config->getObject(3)); OSArray *pMethods = OSArray::withCapacity(config->getCount() - 4); for (unsigned int offset = 4; offset < config->getCount(); offset++) { if (OSString *methodName = OSDynamicCast(OSString, config->getObject(offset))) { pMethods->setObject(methodName); } } addProfile(pName, pMethods, pInterval, pTimeout, pVerbose); } } OSSafeRelease(object); } } } OSSafeRelease(list); } } else { ACPISensorsErrorLog("profile definition table (LIST) not found"); } // Try to load configuration from info.plist if (profiles->getCount() == 0) { if (OSDictionary *configuration = getConfigurationNode()) { OSString *pName = OSDynamicCast(OSString, configuration->getObject("ProfileName")); OSNumber *pInterval = OSDynamicCast(OSNumber, configuration->getObject("PollingInterval")); OSNumber *pTimeout = OSDynamicCast(OSNumber, configuration->getObject("PollingTimeout")); OSBoolean *pVerboseBool = OSDynamicCast(OSBoolean, configuration->getObject("VerboseLog")); OSNumber *pVerbose = OSNumber::withNumber(pVerboseBool->getValue() ? 1 : 0, 8); OSArray *pMethods = OSDynamicCast(OSArray, configuration->getObject("MethodsToPoll")); addProfile(pName, pMethods, pInterval, pTimeout, pVerbose); } } if (this->profiles->getCount()) { // Parse active profile if (kIOReturnSuccess == acpiDevice->evaluateObject("ACTV", &object) && object) { if (OSString *method = OSDynamicCast(OSString, object)) { if (kIOReturnSuccess == acpiDevice->evaluateObject(method->getCStringNoCopy(), &object) && object) { if (OSArray *config = OSDynamicCast(OSArray, object)) { if (config->getCount() > 4) { if (OSString *profile = OSDynamicCast(OSString, config->getObject(0))) { if (!(activeProfile = (ACPIProbeProfile *)profiles->getObject(profile))) { activeProfile = (ACPIProbeProfile *)profileList->getObject(0); } } } } OSSafeRelease(object); } OSSafeRelease(method); } } // woorkloop if (!(workloop = getWorkLoop())) { HWSensorsFatalLog("Failed to obtain workloop"); return false; } if (!(timerEventSource = IOTimerEventSource::timerEventSource( this, OSMemberFunctionCast(IOTimerEventSource::Action, this, &ACPIProbe::woorkloopTimerEvent)))) { ACPISensorsFatalLog("failed to initialize timer event source"); return false; } if (kIOReturnSuccess != workloop->addEventSource(timerEventSource)) { ACPISensorsFatalLog("failed to add timer event source into workloop"); return false; } timerEventSource->setTimeoutMS(100); //ACPISensorsInfoLog("%d method%s registered", methods->getCount(), methods->getCount() > 1 ? "s" : ""); } // two power states - off and on static const IOPMPowerState powerStates[2] = { { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 1, IOPMDeviceUsable, IOPMPowerOn, IOPMPowerOn, 0, 0, 0, 0, 0, 0, 0, 0 } }; // register interest in power state changes PMinit(); provider->joinPMtree(this); registerPowerDriver(this, (IOPMPowerState *)powerStates, 2); registerService(); ACPISensorsInfoLog("started"); return true; }