// 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; }
bool iTCOWatchdog::init (OSDictionary* dict) { OSNumber *nkey; OSBoolean *bkey; bool res; //DbgPrint(drvid, "init\n"); res = super::init(dict); Timeout = DEFAULT_TIMEOUT; SelfFeeding = false; WorkaroundBug = false; if ((conf = OSDynamicCast(OSDictionary, getProperty("Settings"))) && (nkey = OSDynamicCast(OSNumber, conf->getObject("Timeout")))) Timeout = nkey->unsigned32BitValue(); if (conf && (bkey = OSDynamicCast(OSBoolean, conf->getObject("SelfFeeding")))) SelfFeeding = bkey->isTrue(); if (conf && (bkey = OSDynamicCast(OSBoolean, conf->getObject("UnsafeWorkaroundBIOSBug")))) WorkaroundBug = bkey->isTrue(); first_run = true; is_active = SMIWereEnabled = false; GCSMem.range = NULL; GCSMem.map = NULL; lock = IOSimpleLockAlloc(); return res; }
UInt32 ACPIBacklightPanel::queryACPICurentBrightnessLevel() { //DbgLog("%s::%s()\n", this->getName(),__FUNCTION__); if (_backlightHandler) return _backlightHandler->getBacklightLevel(); UInt32 level = minAC; const char* method = _extended ? "XBQC" : "_BQC"; if (kIOReturnSuccess == backLightDevice->evaluateInteger(method, &level)) { //DbgLog("%s: queryACPICurentBrightnessLevel %s = %d\n", this->getName(), method, level); OSBoolean * useIdx = OSDynamicCast(OSBoolean, getProperty("BQC use index")); if (useIdx && useIdx->isTrue()) { OSArray * levels = queryACPISupportedBrightnessLevels(); if (levels) { OSNumber *num = OSDynamicCast(OSNumber, levels->getObject(level)); if (num) level = num->unsigned32BitValue(); levels->release(); } } //DbgLog("%s: queryACPICurentBrightnessLevel returning %d\n", this->getName(), level); } else { IOLog("ACPIBacklight: Error in queryACPICurentBrightnessLevel %s\n", method); } //some laptops didn't return anything on startup, return then max value (first entry in _BCL): return level; }
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(); } }
bool TZSensors::start(IOService * provider) { if (!super::start(provider)) return false; acpiDevice = (IOACPIPlatformDevice *)provider; if (!acpiDevice) { HWSensorsFatalLog("ACPI device not ready"); return false; } if (OSDictionary *configuration = getConfigurationNode()) { OSBoolean* disable = OSDynamicCast(OSBoolean, configuration->getObject("DisableDevice")); if (disable && disable->isTrue()) return false; } // On some computers (eg. RehabMan's ProBook 4530s), the system will hang on startup // if kernel cache is used, because of the early call to updateTemperatures and/or // updateTachometers. At least that is the case with an SSD and a valid pre-linked // kernel, along with kernel cache enabled. This 1000ms sleep seems to fix the problem, // enabling a clean boot with TZSensors enabled. // // On the ProBook this is the case with both TZSensors and PTIDSensors, although // PTIDSensors can be avoided by using DropSSDT=Yes (because PTID device is in an SSDT) // // And in the case of TZSensors it even happens (intermittently) without kernel cache. IOSleep(1000); OSObject *object = NULL; if(kIOReturnSuccess == acpiDevice->evaluateObject("_TMP", &object) && object) { for (UInt8 i = 0; i < 0xf; i++) { char key[5]; snprintf(key, 5, KEY_FORMAT_THERMALZONE_TEMPERATURE, i); if (!isKeyHandled(key)) { if (addSensor(key, TYPE_SP78, TYPE_SPXX_SIZE, kFakeSMCTemperatureSensor, 0)) { break; } } } } registerService(); HWSensorsInfoLog("started on %s", acpiDevice->getName()); return true; }
IOService *AppleUSBCDC::probe(IOService *provider, SInt32 *score) { IOUSBDevice *newDevice = NULL; UInt8 classValue = 0; OSNumber *classInfo = NULL; SInt32 newScore = 0; IOService *res; XTRACE(this, 0, *score, "probe"); OSBoolean *boolObj = OSDynamicCast(OSBoolean, provider->getProperty("kCDCDoNotMatchThisDevice")); if (boolObj && boolObj->isTrue()) { XTRACE(this, 0, *score, "probe - provider doesn't want us to match"); return NULL; } // Check the device class, we need to handle Miscellaneous or Composite class a little different classInfo = (OSNumber *)provider->getProperty("bDeviceClass"); if (classInfo) { classValue = classInfo->unsigned32BitValue(); if ((classValue == kUSBCompositeClass) || (classValue == kUSBMiscellaneousClass)) { newDevice = OSDynamicCast(IOUSBDevice, provider); if(!newDevice) { XTRACE(this, 0, 0, "probe - provider invalid"); } else { // Check if it has CDC interfaces if (checkDevice(newDevice)) { newScore = 1; // We need to see the device before the Composite driver does } else { XTRACE(this, 0, 0, "probe - Composite or Micsellaneous class but not CDC"); return NULL; // We're not interested } } } } *score += newScore; res = super::probe(provider, score); XTRACE(this, 0, *score, "probe - Exit"); return res; }/* end probe */
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; }
ApplePS2CypressTouchPad* ApplePS2CypressTouchPad::probe( IOService * provider, SInt32 * score ) { DEBUG_LOG("ApplePS2CypressTouchPad::probe entered...\n"); // // The driver has been instructed to verify the presence of the actual // hardware we represent. We are guaranteed by the controller that the // mouse clock is enabled and the mouse itself is disabled (thus it // won't send any asynchronous mouse data that may mess up the // responses expected by the commands we send it). // bool success = false; if (!super::probe(provider, score)) return 0; OSDictionary* list = OSDynamicCast(OSDictionary, getProperty(kPlatformProfile)); ApplePS2Device* d = (ApplePS2Device*)provider; OSDictionary* config = d->getController()->makeConfigurationNode(list, "Cypress Touchpad"); //ApplePS2Controller::makeConfigurationNode(list); if (config) { // if DisableDevice is Yes, then do not load at all... OSBoolean* disable = OSDynamicCast(OSBoolean, config->getObject(kDisableDevice)); if (disable && disable->isTrue()) { config->release(); return false; } #ifdef DEBUG // save configuration for later/diagnostics... setProperty(kMergedConfiguration, config); #endif } _device = (ApplePS2MouseDevice *) d; cypressReset(); success = cypressReadFwVersion(); if (success &&_touchPadVersion > 11) { _tapFrameMax = 11; _lockFrameMin = 80; // sync packet rate is superior on > 11 firmware ... should be good ... (not tested) ... } _device = 0; DEBUG_LOG("CYPRESS: ApplePS2CypressTouchPad::probe leaving.\n"); return (success) ? this : 0; }
IOReturn ApplePS2Mouse::setParamProperties( OSDictionary * config ) { if (NULL == config) return 0; const struct {const char *name; int *var;} int32vars[]={ {"DefaultResolution", &defres}, {"ResolutionMode", &resmode}, {"ScrollResolution", &scrollres}, {"MouseYInverter", &mouseyinverter}, {"WakeDelay", &wakedelay}, }; const struct {const char *name; int *var;} boolvars[]={ {"ForceDefaultResolution", &forceres}, {"ForceSetResolution", &forcesetres}, {"ActLikeTrackpad", &actliketrackpad}, {"DisableLEDUpdating", &noled}, }; const struct {const char* name; bool* var;} lowbitvars[]={ {"TrackpadScroll", &scroll}, {"OutsidezoneNoAction When Typing", &outzone_wt}, {"PalmNoAction Permanent", &palm}, {"PalmNoAction When Typing", &palm_wt}, }; OSNumber *num; OSBoolean *bl; // boolean config items for (int i = 0; i < countof(boolvars); i++) if ((bl=OSDynamicCast (OSBoolean,config->getObject (boolvars[i].name)))) *boolvars[i].var = bl->isTrue(); // lowbit config items for (int i = 0; i < countof(lowbitvars); i++) if ((num=OSDynamicCast (OSNumber,config->getObject(lowbitvars[i].name)))) *lowbitvars[i].var = (num->unsigned32BitValue()&0x1)?true:false; // 32-bit config items for (int i = 0; i < countof(int32vars);i++) if ((num=OSDynamicCast (OSNumber,config->getObject (int32vars[i].name)))) *int32vars[i].var = num->unsigned32BitValue(); // convert to IOFixed format... defres <<= 16; return super::setParamProperties(config); }
// 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 }
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; }
bool ApplePS2SentelicFSP::init(OSDictionary* dict) { // // Initialize this object's minimal state. This is invoked right after this // object is instantiated. // if (!super::init(dict)) return false; // find config specific to Platform Profile OSDictionary* list = OSDynamicCast(OSDictionary, dict->getObject(kPlatformProfile)); OSDictionary* config = ApplePS2Controller::makeConfigurationNode(list); if (config) { // if DisableDevice is Yes, then do not load at all... OSBoolean* disable = OSDynamicCast(OSBoolean, config->getObject(kDisableDevice)); if (disable && disable->isTrue()) { config->release(); return false; } #ifdef DEBUG // save configuration for later/diagnostics... setProperty(kMergedConfiguration, config); #endif } // initialize state _device = 0; _interruptHandlerInstalled = false; _packetByteCount = 0; _resolution = (100) << 16; // (100 dpi, 4 counts/mm) _touchPadModeByte = kModeByteValueGesturesDisabled; OSSafeRelease(config); return true; }
void ApplePS2Mouse::setParamPropertiesGated(OSDictionary * config) { if (NULL == config) return; const struct {const char *name; int *var;} int32vars[]={ {"DefaultResolution", &defres}, {"ResolutionMode", &resmode}, {"ScrollResolution", &scrollres}, {"MouseYInverter", &mouseyinverter}, {"ScrollYInverter", &scrollyinverter}, {"WakeDelay", &wakedelay}, {"MouseCount", &mousecount}, {"ButtonCount", &_buttonCount}, }; const struct {const char *name; int *var;} boolvars[]={ {"ForceDefaultResolution", &forceres}, {"ForceSetResolution", &forcesetres}, {"ActLikeTrackpad", &actliketrackpad}, {"DisableLEDUpdating", &noled}, {"FakeMiddleButton", &_fakemiddlebutton}, }; const struct {const char* name; bool* var;} lowbitvars[]={ {"TrackpadScroll", &scroll}, {"OutsidezoneNoAction When Typing", &outzone_wt}, {"PalmNoAction Permanent", &palm}, {"PalmNoAction When Typing", &palm_wt}, {"USBMouseStopsTrackpad", &usb_mouse_stops_trackpad}, }; const struct {const char* name; uint64_t* var; } int64vars[]={ {"MiddleClickTime", &_maxmiddleclicktime}, }; OSNumber *num; OSBoolean *bl; int oldmousecount = mousecount; bool old_usb_mouse_stops_trackpad = usb_mouse_stops_trackpad; // 64-bit config items for (int i = 0; i < countof(int64vars); i++) if ((num=OSDynamicCast(OSNumber, config->getObject(int64vars[i].name)))) { *int64vars[i].var = num->unsigned64BitValue(); setProperty(int64vars[i].name, *int64vars[i].var, 64); } // boolean config items for (int i = 0; i < countof(boolvars); i++) if ((bl=OSDynamicCast (OSBoolean,config->getObject (boolvars[i].name)))) { *boolvars[i].var = bl->isTrue(); setProperty(boolvars[i].name, *boolvars[i].var ? kOSBooleanTrue : kOSBooleanFalse); } // lowbit config items for (int i = 0; i < countof(lowbitvars); i++) if ((num=OSDynamicCast (OSNumber,config->getObject(lowbitvars[i].name)))) { *lowbitvars[i].var = (num->unsigned32BitValue()&0x1)?true:false; setProperty(lowbitvars[i].name, *lowbitvars[i].var ? 1 : 0, 32); } // 32-bit config items for (int i = 0; i < countof(int32vars);i++) if ((num=OSDynamicCast (OSNumber,config->getObject (int32vars[i].name)))) { *int32vars[i].var = num->unsigned32BitValue(); setProperty(int32vars[i].name, *int32vars[i].var, 32); } // check for special terminating sequence from PS2Daemon if (-1 == mousecount) { // when system is shutting down/restarting we want to force LED off if (ledpresent && !noled) setTouchpadLED(0x10); mousecount = oldmousecount; } // disable trackpad when USB mouse is plugged in // check for mouse count changing... if ((oldmousecount != 0) != (mousecount != 0) || old_usb_mouse_stops_trackpad != usb_mouse_stops_trackpad) { // either last mouse removed or first mouse added ignoreall = (mousecount != 0) && usb_mouse_stops_trackpad; updateTouchpadLED(); } // convert to IOFixed format... defres <<= 16; }
bool net_lundman_zfs_zvol_device::attach(IOService* provider) { OSDictionary *protocolCharacteristics = 0; OSDictionary *deviceCharacteristics = 0; OSDictionary *storageFeatures = 0; OSBoolean *unmapFeature = 0; OSString *dataString = 0; OSNumber *dataNumber = 0; if (super::attach(provider) == false) return (false); m_provider = OSDynamicCast(net_lundman_zfs_zvol, provider); if (m_provider == NULL) return (false); /* * We want to set some additional properties for ZVOLs, in * particular, "Virtual Device", and type "File" * (or is Internal better?) * * Finally "Generic" type. * * These properties are defined in *protocol* characteristics */ protocolCharacteristics = OSDictionary::withCapacity(3); if (!protocolCharacteristics) { IOLog("failed to create dict for protocolCharacteristics.\n"); return (true); } dataString = OSString::withCString( kIOPropertyPhysicalInterconnectTypeVirtual); if (!dataString) { IOLog("could not create interconnect type string\n"); return (true); } protocolCharacteristics->setObject( kIOPropertyPhysicalInterconnectTypeKey, dataString); dataString->release(); dataString = 0; dataString = OSString::withCString(kIOPropertyInterconnectFileKey); if (!dataString) { IOLog("could not create interconnect location string\n"); return (true); } protocolCharacteristics->setObject( kIOPropertyPhysicalInterconnectLocationKey, dataString); dataString->release(); dataString = 0; setProperty(kIOPropertyProtocolCharacteristicsKey, protocolCharacteristics); protocolCharacteristics->release(); protocolCharacteristics = 0; /* * We want to set some additional properties for ZVOLs, in * particular, physical block size (volblocksize) of the * underlying ZVOL, and 'logical' block size presented by * the virtual disk. Also set physical bytes per sector. * * These properties are defined in *device* characteristics */ deviceCharacteristics = OSDictionary::withCapacity(3); if (!deviceCharacteristics) { IOLog("failed to create dict for deviceCharacteristics.\n"); return (true); } /* Set logical block size to ZVOL_BSIZE (512b) */ dataNumber = OSNumber::withNumber(ZVOL_BSIZE, 8 * sizeof (ZVOL_BSIZE)); deviceCharacteristics->setObject(kIOPropertyLogicalBlockSizeKey, dataNumber); dprintf("logicalBlockSize %llu\n", dataNumber->unsigned64BitValue()); dataNumber->release(); dataNumber = 0; /* Set physical block size to match volblocksize property */ dataNumber = OSNumber::withNumber(zv->zv_volblocksize, 8 * sizeof (zv->zv_volblocksize)); deviceCharacteristics->setObject(kIOPropertyPhysicalBlockSizeKey, dataNumber); dprintf("physicalBlockSize %llu\n", dataNumber->unsigned64BitValue()); dataNumber->release(); dataNumber = 0; /* Set physical bytes per sector to match volblocksize property */ dataNumber = OSNumber::withNumber((uint64_t)(zv->zv_volblocksize), 8 * sizeof (uint64_t)); deviceCharacteristics->setObject(kIOPropertyBytesPerPhysicalSectorKey, dataNumber); dprintf("physicalBytesPerSector %llu\n", dataNumber->unsigned64BitValue()); dataNumber->release(); dataNumber = 0; /* Apply these characteristics */ setProperty(kIOPropertyDeviceCharacteristicsKey, deviceCharacteristics); deviceCharacteristics->release(); deviceCharacteristics = 0; /* * ZVOL unmap support * * These properties are defined in IOStorageFeatures */ storageFeatures = OSDictionary::withCapacity(1); if (!storageFeatures) { IOLog("failed to create dictionary for storageFeatures.\n"); return (true); } /* Set unmap feature */ unmapFeature = OSBoolean::withBoolean(true); storageFeatures->setObject(kIOStorageFeatureUnmap, unmapFeature); unmapFeature->release(); unmapFeature = 0; /* Apply these storage features */ setProperty(kIOStorageFeaturesKey, storageFeatures); storageFeatures->release(); storageFeatures = 0; /* * Set transfer limits: * * Maximum transfer size (bytes) * Maximum transfer block count * Maximum transfer block size (bytes) * Maximum transfer segment count * Maximum transfer segment size (bytes) * Minimum transfer segment size (bytes) * * We will need to establish safe defaults for all / per volblocksize * * Example: setProperty(kIOMinimumSegmentAlignmentByteCountKey, 1, 1); */ /* * Finally "Generic" type, set as a device property. Tried setting this * to the string "ZVOL" however the OS does not recognize it as a block * storage device. This would probably be possible by extending the * IOBlockStorage Device / Driver relationship. */ setProperty(kIOBlockStorageDeviceTypeKey, kIOBlockStorageDeviceTypeGeneric); 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 }
IOReturn com_evoluent_driver_VerticalMouse::StartFinalProcessing() { OSNumber *curResPtr, *resPrefPtr; UInt32 curResInt, resPrefInt; IOFixed curRes, resPref; IOReturn err = kIOReturnSuccess; OSBoolean * boolObj; OSObject * propertyObj = NULL; USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing", this); _switchBackOnRestart = FALSE; propertyObj = copyProperty("SwitchTo800DPI"); boolObj = OSDynamicCast( OSBoolean, propertyObj ); if ( boolObj && boolObj->isTrue() ) { // USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - found switchTo800DPI resolution property", this); _switchTo800dpiFlag = true; } if (propertyObj) propertyObj->release(); propertyObj = copyProperty("SwitchTo2000FPS"); boolObj = OSDynamicCast( OSBoolean, propertyObj ); if ( boolObj && boolObj->isTrue() ) { // USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - found switchTo2000fps resolution property", this); _switchTo2000fpsFlag = true; } if (propertyObj) propertyObj->release(); if ( _switchTo2000fpsFlag ) { IOUSBDevRequest devReq; // Write the 2000 FPS value to the mouse // devReq.bmRequestType = 0x40; devReq.bRequest = 0x01; devReq.wValue = 0x05AC; devReq.wIndex = 0xd810; devReq.wLength = 0x0000; devReq.pData = NULL; err = _device->DeviceRequest(&devReq, 5000, 0); if (err) { USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - sending 1st part of FPS change received error 0x%x", this, err); } else { devReq.bmRequestType = 0x40; devReq.bRequest = 0x01; devReq.wValue = 0x05AC; devReq.wIndex = 0xdc11; devReq.wLength = 0x0000; devReq.pData = NULL; err = _device->DeviceRequest(&devReq, 5000, 0); if (err) { USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - sending 2nd part of FPS change received error 0x%x", this, err); } } #if FORMOUSETESTING UInt8 hi,lo; UInt16 fps; // Read back the value: // devReq.bmRequestType = 0xc0; devReq.bRequest = 0x01; devReq.wValue = 0x05AC; devReq.wIndex = 0x0011; devReq.wLength = 1; devReq.pData = &hi; err = _device->DeviceRequest(&devReq, 5000, 0); if (err) USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - error reading hi byte: 0x%x", this, err); devReq.bmRequestType = 0xc0; devReq.bRequest = 0x01; devReq.wValue = 0x05AC; devReq.wIndex = 0x0010; devReq.wLength = 1; devReq.pData = &lo; err = _device->DeviceRequest(&devReq, 5000, 0); if (err) USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - read reading lo byte: 0x%x", this, err); fps = hi; fps = (fps << 8) | lo; USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - read : 0x%x", this, fps ); #endif err = super::StartFinalProcessing(); if (err) { USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - super returned error 0x%x", this, err); } } if ( _switchTo800dpiFlag ) { propertyObj = copyProperty(kIOHIDPointerResolutionKey); curResPtr = OSDynamicCast( OSNumber, propertyObj ); if (curResPtr) { curResInt = curResPtr->unsigned32BitValue(); USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - found current resolution property - value 0x%lx", this, curResInt); } else { curResInt = kDefaultFixedResolution; USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - no current property found - using default 0x%lx", this, curResInt); } if (propertyObj) propertyObj->release(); propertyObj = copyProperty(("xResolutionPref")); resPrefPtr = OSDynamicCast( OSNumber, propertyObj ); if (resPrefPtr) resPrefInt = resPrefPtr->unsigned32BitValue(); else { resPrefInt = kDefaultFixedResolution * 2; USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - no preference property found - using default 0x%lx", this, resPrefInt); } if (propertyObj) propertyObj->release(); resPref = (IOFixed) resPrefInt; curRes = (IOFixed) curResInt; if (resPref != curRes) { if (switchTo800dpi) { IOUSBDevRequest devReq; devReq.bmRequestType = 0x40; devReq.bRequest = 0x01; devReq.wValue = 0x05AC; devReq.wIndex = 0x0452; devReq.wLength = 0x0000; devReq.pData = NULL; err = _device->DeviceRequest(&devReq, 5000, 0); if (err) { USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - error (%x) setting resolution", this, err); } else { // with this mouse, we do NOT want to start reading on the interrupt pipe, nor do // we want to call super::start. We just want to wait for the device to get terminated USBLog(3, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - waiting for click mouse termination", this); } } } else { // If we are already at the correct resolution for OSX, OK. But what if we are going // back to OS 9? On restart, switch back to boot setup. Power Manager will tell us // when we are going to restart. // _switchBackOnRestart = TRUE; err = super::StartFinalProcessing(); if (err) { USBLog(1, "com_evoluent_driver_VerticalMouse[%p]::StartFinalProcessing - error (%p) from super::StartFinalProcessing", this, (void*)err); } } } return err; }
bool IT87x::start(IOService * provider) { DebugLog("starting ..."); if (!super::start(provider)) return false; InfoLog("found ITE %s", getModelName()); OSDictionary* list = OSDynamicCast(OSDictionary, getProperty("Sensors Configuration")); OSDictionary *configuration=NULL; OSData *data; IORegistryEntry * rootNode = fromPath("/efi/platform", gIODTPlane); if(rootNode) { data = OSDynamicCast(OSData, rootNode->getProperty("OEMVendor")); if (data) { bcopy(data->getBytesNoCopy(), vendor, data->getLength()); OSString * VendorNick = vendorID(OSString::withCString(vendor)); if (VendorNick) { data = OSDynamicCast(OSData, rootNode->getProperty("OEMBoard")); if (!data) { WarningLog("no OEMBoard"); data = OSDynamicCast(OSData, rootNode->getProperty("OEMProduct")); } if (data) { bcopy(data->getBytesNoCopy(), product, data->getLength()); OSDictionary *link = OSDynamicCast(OSDictionary, list->getObject(VendorNick)); if (link){ configuration = OSDynamicCast(OSDictionary, link->getObject(OSString::withCString(product))); InfoLog(" mother vendor=%s product=%s", vendor, product); } } } else { WarningLog("unknown OEMVendor %s", vendor); } } else { WarningLog("no OEMVendor"); } } if (list && !configuration) { configuration = OSDynamicCast(OSDictionary, list->getObject("Default")); WarningLog("set default configuration"); } if(configuration) { this->setProperty("Current Configuration", configuration); } // Temperature Sensors if (configuration) { for (int i = 0; i < 3; i++) { char key[8]; snprintf(key, 8, "TEMPIN%X", i); if(readTemperature(i)<MAX_TEMP_THRESHOLD) { // Need to check if temperature sensor valid if (OSString* name = OSDynamicCast(OSString, configuration->getObject(key))) { if (name->isEqualTo("CPU")) { if (!addSensor(KEY_CPU_HEATSINK_TEMPERATURE, TYPE_SP78, 2, kSuperIOTemperatureSensor, i)) { WarningLog("error adding heatsink temperature sensor"); } } else if (name->isEqualTo("System")) { if (!addSensor(KEY_NORTHBRIDGE_TEMPERATURE, TYPE_SP78, 2, kSuperIOTemperatureSensor,i)) { WarningLog("error adding system temperature sensor"); } } else if (name->isEqualTo("Ambient")) { if (!addSensor(KEY_AMBIENT_TEMPERATURE, TYPE_SP78, 2, kSuperIOTemperatureSensor,i)) { WarningLog("error adding Ambient temperature sensor"); } } } } } } else { if(readTemperature(0)<MAX_TEMP_THRESHOLD) // Need to check if temperature sensor valid if (!addSensor(KEY_CPU_HEATSINK_TEMPERATURE, TYPE_SP78, 2, kSuperIOTemperatureSensor, 0)) { WarningLog("error adding heatsink temperature sensor"); } if(readTemperature(1)<MAX_TEMP_THRESHOLD) // Need to check if temperature sensor valid if (!addSensor(KEY_AMBIENT_TEMPERATURE, TYPE_SP78, 2, kSuperIOTemperatureSensor, 1)) { WarningLog("error adding Ambient temperature sensor"); } if(readTemperature(2)<MAX_TEMP_THRESHOLD) // Need to check if temperature sensor valid if (!addSensor(KEY_NORTHBRIDGE_TEMPERATURE, TYPE_SP78, 2, kSuperIOTemperatureSensor, 2)) { WarningLog("error adding system temperature sensor"); } } // Voltage UInt8 tmp = readByte(address, ITE_ADC_CHANNEL_ENABLE); DebugLog("ADC Enable register = %X",tmp); vbat_updates = false; if(configuration) { OSBoolean* smartGuard = OSDynamicCast(OSBoolean, configuration->getObject("VBATNeedUpdates")); if(smartGuard && smartGuard->isTrue()) vbat_updates=true; } // Refresh VBAT reading on each access to the key if(vbat_updates) writeByte(address, ITE_CONFIGURATION_REGISTER, readByte(address, ITE_CONFIGURATION_REGISTER) | 0x40); if (configuration) { for (int i = 0; i < 9; i++) { char key[5]; OSString * name; long Ri=0; long Rf=1; long Vf=0; snprintf(key, 5, "VIN%X", i); if (process_sensor_entry(configuration->getObject(key), &name, &Ri, &Rf, &Vf)) { if (name->isEqualTo("CPU")) { if (!addSensor(KEY_CPU_VRM_SUPPLY0, TYPE_FP2E, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) WarningLog("error adding CPU voltage sensor"); } else if (name->isEqualTo("Memory")) { if (!addSensor(KEY_MEMORY_VOLTAGE, TYPE_FP2E, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) WarningLog("error adding memory voltage sensor"); } else if (name->isEqualTo("+5VC")) { if (!addSensor(KEY_5VC_VOLTAGE, TYPE_SP4B, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding AVCC Voltage Sensor!"); } } else if (name->isEqualTo("+5VSB")) { if (!addSensor(KEY_5VSB_VOLTAGE, TYPE_SP4B, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding AVCC Voltage Sensor!"); } } else if (name->isEqualTo("+12VC")) { if (!addSensor(KEY_12V_VOLTAGE, TYPE_SP4B, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding 12V Voltage Sensor!"); } } else if (name->isEqualTo("-12VC")) { if (!addSensor(KEY_N12VC_VOLTAGE, TYPE_SP4B, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding 12V Voltage Sensor!"); } } else if (name->isEqualTo("3VCC")) { if (!addSensor(KEY_3VCC_VOLTAGE, TYPE_FP2E, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding 3VCC Voltage Sensor!"); } } else if (name->isEqualTo("3VSB")) { if (!addSensor(KEY_3VSB_VOLTAGE, TYPE_FP2E, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding 3VSB Voltage Sensor!"); } } else if (name->isEqualTo("VBAT")) { if (!addSensor(KEY_VBAT_VOLTAGE, TYPE_FP2E, 2, kSuperIOVoltageSensor, i,Ri,Rf,Vf)) { WarningLog("ERROR Adding VBAT Voltage Sensor!"); } } } } } // Tachometers for (int i = 0; i < 5; i++) { OSString* name = NULL; char key[5]; if (configuration) { char key_temp[7]; snprintf(key_temp, 7, "FANIN%X", i); name = OSDynamicCast(OSString, configuration->getObject(key_temp)); } UInt32 nameLength = name ? (UInt32)strlen(name->getCStringNoCopy()) : 0; if (readTachometer(i) > 10 || nameLength > 0) { // Pff WTF ??? Add tachometer if it doesn't exist in a system but only the name defined in the config??? if (!addTachometer(i, (nameLength > 0 ? name->getCStringNoCopy() : 0))) // Need to look at this a bit later WarningLog("error adding tachometer sensor %d", i); } // Check if this chip support SmartGuardian feature hasSmartGuardian=false; if(configuration) { if(OSBoolean* smartGuard=OSDynamicCast(OSBoolean, configuration->getObject("SmartGuardian"))) if(smartGuard->isTrue()) hasSmartGuardian=true; } if(hasSmartGuardian) { // Ugly development hack started for (SuperIOSensorGroup) snprintf(key,5,KEY_FORMAT_FAN_TARGET_SPEED,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardPWMControl, i)) WarningLog("error adding PWM fan control"); snprintf(key,5,KEY_FORMAT_FAN_START_TEMP,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardTempFanStart, i)) WarningLog("error adding start temp fan control"); snprintf(key,5,KEY_FORMAT_FAN_OFF_TEMP,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardTempFanStop, i)) WarningLog("error adding stop temp fan control"); snprintf(key,5,KEY_FORMAT_FAN_FULL_TEMP,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardTempFanFullOn, i)) WarningLog("error adding full speed temp fan control"); snprintf(key,5,KEY_FORMAT_FAN_START_PWM,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardPWMStart, i)) WarningLog("error adding start PWM fan control"); snprintf(key,5,KEY_FORMAT_FAN_TEMP_DELTA,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardTempFanFullOff, i)) WarningLog("error adding temp full off fan control"); snprintf(key,5,KEY_FORMAT_FAN_CONTROL,i); if (!addSensor(key, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardTempFanControl, i)) WarningLog("error adding register fan control"); } } if(hasSmartGuardian) { if (!addSensor(KEY_FORMAT_FAN_MAIN_CONTROL, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardMainControl, 0)) WarningLog("error adding Main fan control"); if (!addSensor(KEY_FORMAT_FAN_REG_CONTROL, TYPE_UI8, 1, (SuperIOSensorGroup)kSuperIOSmartGuardRegControl, 0)) WarningLog("error adding Main fan control"); } return true; }
bool ACPISensors::start(IOService * provider) { ACPISensorsDebugLog("starting..."); if (!super::start(provider)) return false; if (!(acpiDevice = OSDynamicCast(IOACPIPlatformDevice, provider))) { ACPISensorsFatalLog("ACPI device not ready"); return false; } methods = OSArray::withCapacity(0); // Try to load configuration provided by ACPI device OSObject *object = NULL; // Use Kelvins? if (kIOReturnSuccess == acpiDevice->evaluateObject("KLVN", &object) && object) { if (OSNumber *kelvins = OSDynamicCast(OSNumber, object)) { useKelvins = kelvins->unsigned8BitValue() == 1; } OSSafeReleaseNULL(object); } // Allow the device to be completely disabled depending on Platform OSDictionary *configuration = getConfigurationNode(); if (configuration) { OSBoolean* disable = OSDynamicCast(OSBoolean, configuration->getObject("DisableDevice")); if (disable && disable->isTrue()) { return false; } } // Parse temperature table if (kIOReturnSuccess == acpiDevice->evaluateObject("TEMP", &object) && object) { addSensorsFromArray(OSDynamicCast(OSArray, object), kFakeSMCCategoryTemperature); OSSafeReleaseNULL(object); } else ACPISensorsDebugLog("temprerature description table (TEMP) not found"); // Parse voltage table if (kIOReturnSuccess == acpiDevice->evaluateObject("VOLT", &object) && object) { addSensorsFromArray(OSDynamicCast(OSArray, object), kFakeSMCCategoryVoltage); OSSafeReleaseNULL(object); } else ACPISensorsDebugLog("voltage description table (VOLT) not found"); // Parse amperage table if (kIOReturnSuccess == acpiDevice->evaluateObject("AMPR", &object) && object) { addSensorsFromArray(OSDynamicCast(OSArray, object), kFakeSMCCategoryCurrent); OSSafeReleaseNULL(object); } else ACPISensorsDebugLog("amperage description table (AMPR) not found"); // Parse power table if (kIOReturnSuccess == acpiDevice->evaluateObject("POWR", &object) && object) { addSensorsFromArray(OSDynamicCast(OSArray, object), kFakeSMCCategoryPower); OSSafeReleaseNULL(object); } else ACPISensorsDebugLog("power description table (POWR) not found"); // Parse tachometer table if (kIOReturnSuccess == acpiDevice->evaluateObject("TACH", &object) && object) { addSensorsFromArray(OSDynamicCast(OSArray, object), kFakeSMCCategoryFan); OSSafeReleaseNULL(object); } else ACPISensorsDebugLog("tachometer description table (TACH) not found"); // If nothing was found on ACPI device try to load configuration from info.plist if (object == NULL && configuration) { if (OSDictionary *temperatures = OSDynamicCast(OSDictionary, configuration->getObject("Temperatures"))) { if (OSBoolean *kelvins = OSDynamicCast(OSBoolean, temperatures->getObject("UseKelvins"))) { useKelvins = kelvins->isTrue(); } addSensorsFromDictionary(OSDynamicCast(OSDictionary, temperatures), kFakeSMCCategoryTemperature); } addSensorsFromDictionary(OSDynamicCast(OSDictionary, configuration->getObject("Voltages")), kFakeSMCCategoryVoltage); addSensorsFromDictionary(OSDynamicCast(OSDictionary, configuration->getObject("Currents")), kFakeSMCCategoryCurrent); addSensorsFromDictionary(OSDynamicCast(OSDictionary, configuration->getObject("Powers")), kFakeSMCCategoryPower); addSensorsFromDictionary(OSDynamicCast(OSDictionary, configuration->getObject("Tachometers")), kFakeSMCCategoryFan); } if (methods->getCount()) ACPISensorsInfoLog("%d sensor%s added", methods->getCount(), methods->getCount() > 1 ? "s" : ""); registerService(); ACPISensorsInfoLog("started"); return true; }
bool PTIDSensors::start(IOService * provider) { if (!super::start(provider)) return false; acpiDevice = (IOACPIPlatformDevice *)provider; if (!acpiDevice) { HWSensorsFatalLog("ACPI device not ready"); return false; } if (OSDictionary *configuration = getConfigurationNode()) { OSBoolean* disable = OSDynamicCast(OSBoolean, configuration->getObject("DisableDevice")); if (disable && disable->isTrue()) return false; } // On some computers (eg. RehabMan's ProBook 4530s), the system will hang on startup // if kernel cache is used, because of the early call to updateTemperatures and/or // updateTachometers. At least that is the case with an SSD and a valid pre-linked // kernel, along with kernel cache enabled. This 1000ms sleep seems to fix the problem, // enabling a clean boot with PTIDSensors enabled. IOSleep(1000); // Update timers temperaturesLastUpdated = ptimer_read() - NSEC_PER_SEC; tachometersLastUpdated = temperaturesLastUpdated; acpiDevice->evaluateInteger("IVER", &version); if (version == 0) { OSString *name = OSDynamicCast(OSString, provider->getProperty("name")); if (name && name->isEqualTo("INT3F0D")) version = 0x30000; else return false; } setProperty("version", version, 64); // Parse sensors switch (version) { case 0x30000: { OSObject *object = NULL; // Temperatures if(kIOReturnSuccess == acpiDevice->evaluateObject("TSDL", &object) && object) { if (OSArray *description = OSDynamicCast(OSArray, object)) { HWSensorsDebugLog("Parsing temperatures..."); for (UInt32 index = 1; index < description->getCount(); index += 2) { parseTemperatureName(OSDynamicCast(OSString, description->getObject(index)), (index - 1) / 2); } } else HWSensorsErrorLog("failed to parse TSDL table"); } else HWSensorsErrorLog("failed to evaluate TSDL table"); // Tachometers if(kIOReturnSuccess == acpiDevice->evaluateObject("OSDL", &object) && object) { if (OSArray *description = OSDynamicCast(OSArray, object)) { HWSensorsDebugLog("Parsing tachometers..."); for (UInt32 index = 2; index < description->getCount(); index += 3) { parseTachometerName(OSDynamicCast(OSString, description->getObject(index)), OSDynamicCast(OSString, description->getObject(index - 1)), (index - 2) / 3); } } else HWSensorsErrorLog("failed to parse OSDL table"); } else HWSensorsErrorLog("failed to evaluate OSDL table"); break; } case 0x20001: { OSObject *object = NULL; // Temperatures if(kIOReturnSuccess == acpiDevice->evaluateObject("TMPV", &object) && object) { if (OSArray *description = OSDynamicCast(OSArray, object)) { for (UInt32 index = 1; index < description->getCount(); index += 3) { parseTemperatureName(OSDynamicCast(OSString, description->getObject(index)), index + 1); } } else HWSensorsErrorLog("failed to parse TMPV table"); } else HWSensorsErrorLog("failed to evaluate TMPV table"); // Tachometers if(kIOReturnSuccess == acpiDevice->evaluateObject("OSDV", &object) && object) { if (OSArray *description = OSDynamicCast(OSArray, object)) { for (UInt32 index = 2; index < description->getCount(); index += 4) { parseTachometerName(OSDynamicCast(OSString, description->getObject(index)), OSDynamicCast(OSString, description->getObject(index - 1)), index + 1); } } else HWSensorsErrorLog("failed to parse OSDV table"); } else HWSensorsErrorLog("failed to evaluate OSDV table"); break; } default: HWSensorsFatalLog("usupported interface version: 0x%x", (unsigned int)version); break; } registerService(); HWSensorsInfoLog("started"); 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 }
void KLDBootstrap::loadKernelExternalComponents(void) { OSDictionary * extensionsDict = NULL; // must release OSCollectionIterator * keyIterator = NULL; // must release OSString * bundleID = NULL; // don't release OSKext * theKext = NULL; // don't release OSBoolean * isKernelExternalComponent = NULL; // don't release OSKextLog(/* kext */ NULL, kOSKextLogStepLevel | kOSKextLogLoadFlag, "Loading Kernel External Components."); extensionsDict = OSKext::copyKexts(); if (!extensionsDict) { return; } keyIterator = OSCollectionIterator::withCollection(extensionsDict); if (!keyIterator) { OSKextLog(/* kext */ NULL, kOSKextLogErrorLevel | kOSKextLogGeneralFlag, "Failed to allocate iterator for Kernel External Components."); goto finish; } while ((bundleID = OSDynamicCast(OSString, keyIterator->getNextObject()))) { const char * bundle_id = bundleID->getCStringNoCopy(); /* Skip extensions whose bundle IDs don't start with "com.apple.kec.". */ if (!bundle_id || (strncmp(bundle_id, COM_APPLE_KEC, CONST_STRLEN(COM_APPLE_KEC)) != 0)) { continue; } theKext = OSDynamicCast(OSKext, extensionsDict->getObject(bundleID)); if (!theKext) { continue; } isKernelExternalComponent = OSDynamicCast(OSBoolean, theKext->getPropertyForHostArch(kAppleKernelExternalComponentKey)); if (isKernelExternalComponent && isKernelExternalComponent->isTrue()) { OSKextLog(/* kext */ NULL, kOSKextLogStepLevel | kOSKextLogLoadFlag, "Loading kernel external component %s.", bundleID->getCStringNoCopy()); OSKext::loadKextWithIdentifier(bundleID->getCStringNoCopy(), /* allowDefer */ false); } } finish: OSSafeReleaseNULL(keyIterator); OSSafeReleaseNULL(extensionsDict); return; }
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; }
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; }
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; } methods = OSArray::withCapacity(0); OSNumber *interval = NULL; OSNumber *timeout = NULL; OSBoolean *logging = NULL; OSArray *list = NULL; // Try to load configuration from info.plist first if (OSDictionary *configuration = getConfigurationNode()) { OSBoolean* disable = OSDynamicCast(OSBoolean, configuration->getObject("DisableDevice")); if (disable && disable->isTrue()) return false; interval = OSDynamicCast(OSNumber, configuration->getObject("PollingInterval")); timeout = OSDynamicCast(OSNumber, configuration->getObject("PollingTimeout")); logging = OSDynamicCast(OSBoolean, configuration->getObject("LoggingEnabled")); list = OSDynamicCast(OSArray, configuration->getObject("Methods")); } // Try to load configuration provided by ACPI device else { OSObject *object = NULL; if (kIOReturnSuccess == acpiDevice->evaluateObject("INVL", &object) && object) interval = OSDynamicCast(OSNumber, object); if (kIOReturnSuccess == acpiDevice->evaluateObject("TOUT", &object) && object) timeout = OSDynamicCast(OSNumber, object); if (kIOReturnSuccess == acpiDevice->evaluateObject("LOGG", &object) && object) { if (OSNumber *number = OSDynamicCast(OSNumber, object)) { logging = OSBoolean::withBoolean(number->unsigned8BitValue() == 1); } } if (kIOReturnSuccess == acpiDevice->evaluateObject("LIST", &object) && object) list = OSDynamicCast(OSArray, object); else ACPISensorsErrorLog("polling methods table (LIST) not found"); } if (interval) { pollingInterval = (double)interval->unsigned64BitValue() / (double)1000.0; ACPISensorsInfoLog("polling interval %lld ms", interval->unsigned64BitValue()); if (pollingInterval) { if (timeout) { pollingTimeout = (double)timeout->unsigned64BitValue() / 1000.0; ACPISensorsInfoLog("polling timeout %lld ms", timeout->unsigned64BitValue()); } if (logging) { loggingEnabled = logging->isTrue(); ACPISensorsInfoLog("logging %s", loggingEnabled ? "enabled" : "disabled"); } if (list) { for (unsigned int i = 0; i < list->getCount(); i++) { if (OSString *method = OSDynamicCast(OSString, list->getObject(i))) { if (method->getLength() && kIOReturnSuccess == acpiDevice->validateObject(method->getCStringNoCopy())) { methods->setObject(method); ACPISensorsInfoLog("method \"%s\" registered", method->getCStringNoCopy()); } else ACPISensorsErrorLog("unable to register method \"%s\"", method->getCStringNoCopy()); } } } } else ACPISensorsWarningLog("polling interval is set to zero, driver will be disabled"); } //REVIEW_REHABMAN: just bail if no methods to call... no need to stick around... if (!methods->getCount()) return false; if (methods->getCount()) { // 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" : ""); } registerService(); ACPISensorsInfoLog("started"); return true; }
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; }
//============================================================================== // 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; }
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 ApplePS2Mouse::init(OSDictionary * dict) { // // Initialize this object's minimal state. This is invoked right after this // object is instantiated. // if (!super::init(dict)) return false; // find config specific to Platform Profile OSDictionary* list = OSDynamicCast(OSDictionary, dict->getObject(kPlatformProfile)); OSDictionary* config = ApplePS2Controller::makeConfigurationNode(list); if (config) { // if DisableDevice is Yes, then do not load at all... OSBoolean* disable = OSDynamicCast(OSBoolean, config->getObject(kDisableDevice)); if (disable && disable->isTrue()) { config->release(); return false; } #ifdef DEBUG // save configuration for later/diagnostics... setProperty(kMergedConfiguration, config); #endif } // initialize state... _device = 0; _interruptHandlerInstalled = false; _packetByteCount = 0; _lastdata = 0; _packetLength = kPacketLengthStandard; defres = 150 << 16; // (default is 150 dpi; 6 counts/mm) forceres = false; mouseyinverter = 1; // 1 for normal, -1 for inverting scrollyinverter = 1; // 1 for normal, -1 for inverting _type = kMouseTypeStandard; _buttonCount = 3; _mouseInfoBytes = (UInt32)-1; ignoreall = false; ledpresent = false; resmode = -1; forcesetres = false; scrollres = 10; actliketrackpad = false; keytime = 0; maxaftertyping = 500000000; buttonmask = ~0; scroll = true; noled = false; wakedelay = 1000; usb_mouse_stops_trackpad = true; mousecount = 0; _cmdGate = 0; // state for middle button _buttonTimer = 0; _mbuttonstate = STATE_NOBUTTONS; _pendingbuttons = 0; _buttontime = 0; _maxmiddleclicktime = 100000000; // load settings setParamPropertiesGated(config); OSSafeRelease(config); // remove some properties so system doesn't think it is a trackpad // this should cause "Product" = "Mouse" in ioreg. if (!actliketrackpad) { removeProperty("VendorID"); removeProperty("ProductID"); removeProperty("HIDPointerAccelerationType"); removeProperty("HIDScrollAccelerationType"); removeProperty("TrackpadScroll"); } IOLog("VoodooPS2Mouse Version 1.8.5 loaded...\n"); return true; }
static Boolean kextIsADependency(OSString * name) { Boolean result = true; OSDictionary * extensionsDict = 0; // don't release OSDictionary * extDict = 0; // don't release OSDictionary * extPlist = 0; // don't release OSBoolean * isKernelResourceObj = 0; // don't release OSData * driverCode = 0; // don't release OSData * compressedCode = 0; // don't release extensionsDict = getStartupExtensions(); if (!extensionsDict) { IOLog("kextIsADependency(): No extensions dictionary.\n"); LOG_DELAY(); result = false; goto finish; } extDict = OSDynamicCast(OSDictionary, extensionsDict->getObject(name)); if (!extDict) { IOLog("kextIsADependency(): " "Extension \"%s\" cannot be found.\n", name->getCStringNoCopy()); LOG_DELAY(); result = false; goto finish; } extPlist = OSDynamicCast(OSDictionary, extDict->getObject("plist")); if (!extPlist) { IOLog("getDependencyListForKmod(): " "Extension \"%s\" has no property list.\n", name->getCStringNoCopy()); LOG_DELAY(); result = false; goto finish; } /* A kext that is a kernel component is still a dependency, as there * are fake kmod entries for them. */ isKernelResourceObj = OSDynamicCast(OSBoolean, extPlist->getObject("OSKernelResource")); if (isKernelResourceObj && isKernelResourceObj->isTrue()) { result = true; goto finish; } driverCode = OSDynamicCast(OSData, extDict->getObject("code")); compressedCode = OSDynamicCast(OSData, extDict->getObject("compressedCode")); if (!driverCode && !compressedCode) { result = false; goto finish; } finish: return result; }