├── USBWakeFixup ├── USBWakeFixup.hpp ├── USBWakeFixup.cpp └── Info.plist ├── SSDT-USBW.dsl ├── README.md └── USBWakeFixup.xcodeproj └── project.pbxproj /USBWakeFixup/USBWakeFixup.hpp: -------------------------------------------------------------------------------- 1 | // 2 | // USBWakeFixup.hpp 3 | // USBWakeFixup 4 | // 5 | // Copyright © 2019 osy86. All rights reserved. 6 | // 7 | 8 | #ifndef USBWakeFixup_hpp 9 | #define USBWakeFixup_hpp 10 | 11 | #include 12 | 13 | class USBWakeFixup : public IOService { 14 | OSDeclareDefaultStructors(USBWakeFixup); 15 | public: 16 | virtual IOService *probe(IOService *provider, SInt32 *score) override; 17 | }; 18 | 19 | #endif /* USBWakeFixup_hpp */ 20 | -------------------------------------------------------------------------------- /SSDT-USBW.dsl: -------------------------------------------------------------------------------- 1 | /** 2 | * USB wakeup virtual device 3 | */ 4 | DefinitionBlock ("", "SSDT", 2, "OSY86 ", "USBW", 0x00001000) 5 | { 6 | External (\_SB.PCI0.XHC._PRW, MethodObj) 7 | 8 | // We only enable the device for OSX 9 | If (CondRefOf (\_OSI, Local0) && _OSI ("Darwin")) 10 | { 11 | Device (\_SB.USBW) 12 | { 13 | Name (_HID, "PNP0D10") // _HID: Hardware ID 14 | Name (_UID, "WAKE") // _UID: Unique ID 15 | 16 | Method (_PRW, 0, NotSerialized) // _PRW: Power Resources for Wake 17 | { 18 | Return (\_SB.PCI0.XHC._PRW ()) // Replace with path to your USB device 19 | } 20 | } 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /USBWakeFixup/USBWakeFixup.cpp: -------------------------------------------------------------------------------- 1 | // 2 | // USBWakeFixup.cpp 3 | // USBWakeFixup 4 | // 5 | // Copyright © 2019 osy86. All rights reserved. 6 | // 7 | 8 | #include "USBWakeFixup.hpp" 9 | #include 10 | #include 11 | 12 | #define super IOService 13 | 14 | OSDefineMetaClassAndStructors(USBWakeFixup, IOService); 15 | 16 | IOService *USBWakeFixup::probe(IOService *provider, SInt32 *score) { 17 | IOACPIPlatformDevice *acpiDevice = OSDynamicCast(IOACPIPlatformDevice, getProvider()); 18 | 19 | if (!acpiDevice) { 20 | IOLog("invalid parent, need IOACPIPlatformDevice\n"); 21 | return NULL; 22 | } 23 | IOLog("adding acpi-wake-type property\n"); 24 | acpiDevice->setProperty("acpi-wake-type", 0x1, 32); 25 | acpiDevice->setSystemWakeCapabilityEnable(true); 26 | return NULL; 27 | } 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | USBWakeFixup 2 | ============ 3 | 4 | On systems without a working Embedded Controller, waking up from a USB device 5 | might not wake up the display. A second key-press or mouse click is required 6 | to wake up the display. This extension is a workaround for that issue by 7 | creating a fake ACPI device with the right wakeup params. 8 | 9 | ## Shared GPE 10 | 11 | If multiple devices share a single GPE, then they will ALL cause display 12 | wakeup with this workaround installed. This is an unfortunate side-effect. If 13 | you have a Ethernet controller with WoL enabled and it happens to be the same 14 | GPE as your USB controller, then WoL will now wake the display. 15 | 16 | ## Details 17 | 18 | Check [here][1] for a more detailed technical writeup on how this works. You 19 | should only use this if injecting `acpi-wake-type` on XHCI does not work due 20 | to the Intel PCH bug. Please see [this issue][2] for more information. 21 | 22 | ## Installation 23 | 24 | 1. Build and install `SSDT-USBW.dsl` into your bootloader DSDT injection. 25 | You may need to modify it to point to your XHC device. 26 | 2. Install the kext. 27 | 28 | [1]: https://osy.gitbook.io/hac-mini-guide/details/usb-fix 29 | [2]: https://github.com/osy86/USBWakeFixup/issues/2 30 | -------------------------------------------------------------------------------- /USBWakeFixup/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | KEXT 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | IOKitPersonalities 22 | 23 | Fake XHCI 24 | 25 | CFBundleIdentifier 26 | $(PRODUCT_BUNDLE_IDENTIFIER) 27 | IOClass 28 | USBWakeFixup 29 | IONameMatch 30 | PNP0D10 31 | IOProviderClass 32 | IOACPIPlatformDevice 33 | IOPropertyMatch 34 | 35 | _UID 36 | WAKE 37 | 38 | 39 | 40 | NSHumanReadableCopyright 41 | Copyright © 2019 osy86. All rights reserved. 42 | OSBundleLibraries 43 | 44 | com.apple.iokit.IOACPIFamily 45 | 1.0d1 46 | com.apple.kpi.iokit 47 | 7.0 48 | com.apple.kpi.libkern 49 | 8.0d0 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /USBWakeFixup.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | CE587E392326E09C008318BD /* USBWakeFixup.hpp in Headers */ = {isa = PBXBuildFile; fileRef = CE587E382326E09C008318BD /* USBWakeFixup.hpp */; }; 11 | CE587E3B2326E09C008318BD /* USBWakeFixup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CE587E3A2326E09C008318BD /* USBWakeFixup.cpp */; }; 12 | /* End PBXBuildFile section */ 13 | 14 | /* Begin PBXFileReference section */ 15 | CE587E352326E09C008318BD /* USBWakeFixup.kext */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = USBWakeFixup.kext; sourceTree = BUILT_PRODUCTS_DIR; }; 16 | CE587E382326E09C008318BD /* USBWakeFixup.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = USBWakeFixup.hpp; sourceTree = ""; }; 17 | CE587E3A2326E09C008318BD /* USBWakeFixup.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = USBWakeFixup.cpp; sourceTree = ""; }; 18 | CE587E3C2326E09C008318BD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 19 | /* End PBXFileReference section */ 20 | 21 | /* Begin PBXFrameworksBuildPhase section */ 22 | CE587E322326E09C008318BD /* Frameworks */ = { 23 | isa = PBXFrameworksBuildPhase; 24 | buildActionMask = 2147483647; 25 | files = ( 26 | ); 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXFrameworksBuildPhase section */ 30 | 31 | /* Begin PBXGroup section */ 32 | CE587E2B2326E09C008318BD = { 33 | isa = PBXGroup; 34 | children = ( 35 | CE587E372326E09C008318BD /* USBWakeFixup */, 36 | CE587E362326E09C008318BD /* Products */, 37 | ); 38 | sourceTree = ""; 39 | }; 40 | CE587E362326E09C008318BD /* Products */ = { 41 | isa = PBXGroup; 42 | children = ( 43 | CE587E352326E09C008318BD /* USBWakeFixup.kext */, 44 | ); 45 | name = Products; 46 | sourceTree = ""; 47 | }; 48 | CE587E372326E09C008318BD /* USBWakeFixup */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | CE587E382326E09C008318BD /* USBWakeFixup.hpp */, 52 | CE587E3A2326E09C008318BD /* USBWakeFixup.cpp */, 53 | CE587E3C2326E09C008318BD /* Info.plist */, 54 | ); 55 | path = USBWakeFixup; 56 | sourceTree = ""; 57 | }; 58 | /* End PBXGroup section */ 59 | 60 | /* Begin PBXHeadersBuildPhase section */ 61 | CE587E302326E09C008318BD /* Headers */ = { 62 | isa = PBXHeadersBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | CE587E392326E09C008318BD /* USBWakeFixup.hpp in Headers */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | /* End PBXHeadersBuildPhase section */ 70 | 71 | /* Begin PBXNativeTarget section */ 72 | CE587E342326E09C008318BD /* USBWakeFixup */ = { 73 | isa = PBXNativeTarget; 74 | buildConfigurationList = CE587E3F2326E09C008318BD /* Build configuration list for PBXNativeTarget "USBWakeFixup" */; 75 | buildPhases = ( 76 | CE587E302326E09C008318BD /* Headers */, 77 | CE587E312326E09C008318BD /* Sources */, 78 | CE587E322326E09C008318BD /* Frameworks */, 79 | CE587E332326E09C008318BD /* Resources */, 80 | ); 81 | buildRules = ( 82 | ); 83 | dependencies = ( 84 | ); 85 | name = USBWakeFixup; 86 | productName = USBWakeFixup; 87 | productReference = CE587E352326E09C008318BD /* USBWakeFixup.kext */; 88 | productType = "com.apple.product-type.kernel-extension"; 89 | }; 90 | /* End PBXNativeTarget section */ 91 | 92 | /* Begin PBXProject section */ 93 | CE587E2C2326E09C008318BD /* Project object */ = { 94 | isa = PBXProject; 95 | attributes = { 96 | LastUpgradeCheck = 1030; 97 | ORGANIZATIONNAME = osy86; 98 | TargetAttributes = { 99 | CE587E342326E09C008318BD = { 100 | CreatedOnToolsVersion = 10.3; 101 | }; 102 | }; 103 | }; 104 | buildConfigurationList = CE587E2F2326E09C008318BD /* Build configuration list for PBXProject "USBWakeFixup" */; 105 | compatibilityVersion = "Xcode 9.3"; 106 | developmentRegion = en; 107 | hasScannedForEncodings = 0; 108 | knownRegions = ( 109 | en, 110 | ); 111 | mainGroup = CE587E2B2326E09C008318BD; 112 | productRefGroup = CE587E362326E09C008318BD /* Products */; 113 | projectDirPath = ""; 114 | projectRoot = ""; 115 | targets = ( 116 | CE587E342326E09C008318BD /* USBWakeFixup */, 117 | ); 118 | }; 119 | /* End PBXProject section */ 120 | 121 | /* Begin PBXResourcesBuildPhase section */ 122 | CE587E332326E09C008318BD /* Resources */ = { 123 | isa = PBXResourcesBuildPhase; 124 | buildActionMask = 2147483647; 125 | files = ( 126 | ); 127 | runOnlyForDeploymentPostprocessing = 0; 128 | }; 129 | /* End PBXResourcesBuildPhase section */ 130 | 131 | /* Begin PBXSourcesBuildPhase section */ 132 | CE587E312326E09C008318BD /* Sources */ = { 133 | isa = PBXSourcesBuildPhase; 134 | buildActionMask = 2147483647; 135 | files = ( 136 | CE587E3B2326E09C008318BD /* USBWakeFixup.cpp in Sources */, 137 | ); 138 | runOnlyForDeploymentPostprocessing = 0; 139 | }; 140 | /* End PBXSourcesBuildPhase section */ 141 | 142 | /* Begin XCBuildConfiguration section */ 143 | CE587E3D2326E09C008318BD /* Debug */ = { 144 | isa = XCBuildConfiguration; 145 | buildSettings = { 146 | ALWAYS_SEARCH_USER_PATHS = NO; 147 | CLANG_ANALYZER_NONNULL = YES; 148 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 149 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 150 | CLANG_CXX_LIBRARY = "libc++"; 151 | CLANG_ENABLE_MODULES = YES; 152 | CLANG_ENABLE_OBJC_ARC = YES; 153 | CLANG_ENABLE_OBJC_WEAK = YES; 154 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 155 | CLANG_WARN_BOOL_CONVERSION = YES; 156 | CLANG_WARN_COMMA = YES; 157 | CLANG_WARN_CONSTANT_CONVERSION = YES; 158 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 159 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 160 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 161 | CLANG_WARN_EMPTY_BODY = YES; 162 | CLANG_WARN_ENUM_CONVERSION = YES; 163 | CLANG_WARN_INFINITE_RECURSION = YES; 164 | CLANG_WARN_INT_CONVERSION = YES; 165 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 166 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 167 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 168 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 169 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 170 | CLANG_WARN_STRICT_PROTOTYPES = YES; 171 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 172 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 173 | CLANG_WARN_UNREACHABLE_CODE = YES; 174 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 175 | CODE_SIGN_IDENTITY = "-"; 176 | COPY_PHASE_STRIP = NO; 177 | DEBUG_INFORMATION_FORMAT = dwarf; 178 | ENABLE_STRICT_OBJC_MSGSEND = YES; 179 | ENABLE_TESTABILITY = YES; 180 | GCC_C_LANGUAGE_STANDARD = gnu11; 181 | GCC_DYNAMIC_NO_PIC = NO; 182 | GCC_NO_COMMON_BLOCKS = YES; 183 | GCC_OPTIMIZATION_LEVEL = 0; 184 | GCC_PREPROCESSOR_DEFINITIONS = ( 185 | "DEBUG=1", 186 | "$(inherited)", 187 | ); 188 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 189 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 190 | GCC_WARN_UNDECLARED_SELECTOR = YES; 191 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 192 | GCC_WARN_UNUSED_FUNCTION = YES; 193 | GCC_WARN_UNUSED_VARIABLE = YES; 194 | MACOSX_DEPLOYMENT_TARGET = 10.15; 195 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 196 | MTL_FAST_MATH = YES; 197 | ONLY_ACTIVE_ARCH = YES; 198 | SDKROOT = macosx; 199 | }; 200 | name = Debug; 201 | }; 202 | CE587E3E2326E09C008318BD /* Release */ = { 203 | isa = XCBuildConfiguration; 204 | buildSettings = { 205 | ALWAYS_SEARCH_USER_PATHS = NO; 206 | CLANG_ANALYZER_NONNULL = YES; 207 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 208 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 209 | CLANG_CXX_LIBRARY = "libc++"; 210 | CLANG_ENABLE_MODULES = YES; 211 | CLANG_ENABLE_OBJC_ARC = YES; 212 | CLANG_ENABLE_OBJC_WEAK = YES; 213 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 214 | CLANG_WARN_BOOL_CONVERSION = YES; 215 | CLANG_WARN_COMMA = YES; 216 | CLANG_WARN_CONSTANT_CONVERSION = YES; 217 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 218 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 219 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 220 | CLANG_WARN_EMPTY_BODY = YES; 221 | CLANG_WARN_ENUM_CONVERSION = YES; 222 | CLANG_WARN_INFINITE_RECURSION = YES; 223 | CLANG_WARN_INT_CONVERSION = YES; 224 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 225 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 226 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 227 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 228 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 229 | CLANG_WARN_STRICT_PROTOTYPES = YES; 230 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 231 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 232 | CLANG_WARN_UNREACHABLE_CODE = YES; 233 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 234 | CODE_SIGN_IDENTITY = "-"; 235 | COPY_PHASE_STRIP = NO; 236 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 237 | ENABLE_NS_ASSERTIONS = NO; 238 | ENABLE_STRICT_OBJC_MSGSEND = YES; 239 | GCC_C_LANGUAGE_STANDARD = gnu11; 240 | GCC_NO_COMMON_BLOCKS = YES; 241 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 242 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 243 | GCC_WARN_UNDECLARED_SELECTOR = YES; 244 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 245 | GCC_WARN_UNUSED_FUNCTION = YES; 246 | GCC_WARN_UNUSED_VARIABLE = YES; 247 | MACOSX_DEPLOYMENT_TARGET = 10.15; 248 | MTL_ENABLE_DEBUG_INFO = NO; 249 | MTL_FAST_MATH = YES; 250 | SDKROOT = macosx; 251 | }; 252 | name = Release; 253 | }; 254 | CE587E402326E09C008318BD /* Debug */ = { 255 | isa = XCBuildConfiguration; 256 | buildSettings = { 257 | CODE_SIGN_IDENTITY = ""; 258 | COMBINE_HIDPI_IMAGES = YES; 259 | CURRENT_PROJECT_VERSION = 1.0.0d1; 260 | DEVELOPMENT_TEAM = ""; 261 | INFOPLIST_FILE = USBWakeFixup/Info.plist; 262 | MODULE_NAME = com.osy86.USBWakeFixup; 263 | MODULE_VERSION = 1.0.0d1; 264 | PRODUCT_BUNDLE_IDENTIFIER = com.osy86.USBWakeFixup; 265 | PRODUCT_NAME = "$(TARGET_NAME)"; 266 | PROVISIONING_PROFILE_SPECIFIER = ""; 267 | WRAPPER_EXTENSION = kext; 268 | }; 269 | name = Debug; 270 | }; 271 | CE587E412326E09C008318BD /* Release */ = { 272 | isa = XCBuildConfiguration; 273 | buildSettings = { 274 | CODE_SIGN_IDENTITY = ""; 275 | COMBINE_HIDPI_IMAGES = YES; 276 | CURRENT_PROJECT_VERSION = 1.0.0d1; 277 | DEVELOPMENT_TEAM = ""; 278 | INFOPLIST_FILE = USBWakeFixup/Info.plist; 279 | MODULE_NAME = com.osy86.USBWakeFixup; 280 | MODULE_VERSION = 1.0.0d1; 281 | PRODUCT_BUNDLE_IDENTIFIER = com.osy86.USBWakeFixup; 282 | PRODUCT_NAME = "$(TARGET_NAME)"; 283 | PROVISIONING_PROFILE_SPECIFIER = ""; 284 | WRAPPER_EXTENSION = kext; 285 | }; 286 | name = Release; 287 | }; 288 | /* End XCBuildConfiguration section */ 289 | 290 | /* Begin XCConfigurationList section */ 291 | CE587E2F2326E09C008318BD /* Build configuration list for PBXProject "USBWakeFixup" */ = { 292 | isa = XCConfigurationList; 293 | buildConfigurations = ( 294 | CE587E3D2326E09C008318BD /* Debug */, 295 | CE587E3E2326E09C008318BD /* Release */, 296 | ); 297 | defaultConfigurationIsVisible = 0; 298 | defaultConfigurationName = Release; 299 | }; 300 | CE587E3F2326E09C008318BD /* Build configuration list for PBXNativeTarget "USBWakeFixup" */ = { 301 | isa = XCConfigurationList; 302 | buildConfigurations = ( 303 | CE587E402326E09C008318BD /* Debug */, 304 | CE587E412326E09C008318BD /* Release */, 305 | ); 306 | defaultConfigurationIsVisible = 0; 307 | defaultConfigurationName = Release; 308 | }; 309 | /* End XCConfigurationList section */ 310 | }; 311 | rootObject = CE587E2C2326E09C008318BD /* Project object */; 312 | } 313 | --------------------------------------------------------------------------------