Contribute
Register

A Beginner's Guide to Creating a Custom USB SSDT

Also, please bear in mind this isn't a support thread for Hackintool itself. @headkaze is the author who can give you deeper insights. I can only support the methods in this thread :thumbup:

Thanks @UtterDisbelief, I did read in past posts you don't give support for it, in fact I completely forgot USBPorts.kext was a kext produced by Hackintool. I'll definitely contact him, as I'll have the USB3 working.

So basically the kext injected are almost the same I previously uploaded in EFI folder, I'm just trying to add and remove someone for tests. For example I just removed the GenericUSB in favour of the ASMedia CalDigit* as suggested here, no luck again.

I also tried to install them, (not along, but one by one, in different tests), in S/L/E. No way to have the USB3.0 loaded.
Apart these tests, I didn't installed any kext on system, as I'm trying to have a reusable usb for future installations. I'm attaching anyway the status of the system kext.

Thanks a lot again for your help, I really appreciate it.
 

Attachments

  • EFI.zip
    27.6 MB · Views: 100
  • kextstat.txt
    21.2 KB · Views: 80
  • LE.txt
    675 bytes · Views: 62
  • SLE.txt
    19.8 KB · Views: 69
Thanks @UtterDisbelief, I did read in past posts you don't give support for it, in fact I completely forgot USBPorts.kext was a kext produced by Hackintool. I'll definitely contact him, as I'll have the USB3 working.

So basically the kext injected are almost the same I previously uploaded in EFI folder, I'm just trying to add and remove someone for tests. For example I just removed the GenericUSB in favour of the ASMedia CalDigit* as suggested here, no luck again.

I also tried to install them, (not along, but one by one, in different tests), in S/L/E. No way to have the USB3.0 loaded.
Apart these tests, I didn't installed any kext on system, as I'm trying to have a reusable usb for future installations. I'm attaching anyway the status of the system kext.

Thanks a lot again for your help, I really appreciate it.

Thanks.

Sorry, yes you had sent the EFI folder before, it was just the kext-lists I needed to see. My mistake :thumbup:

Okay. Remove the CalDigi USB kexts. I can understand why they didn't work ... There is a potential problem using these, or GenericUSBXHIC, and that is - Mojave. These kexts are old and, sadly, often do not work with the latest macOSs. Unfortunately the latter is no longer being updated. This might mean USB 3.0 on this board is touch and go.

A couple of points to note:

Looking in your ACPI 'patched' folder I see 8x *.aml files. Are these something you specifically need for your X79 ?

You do have USBInjectAll.kext installed in the EFI folder, BUT don't have the SSDT-UIAC.aml installed.

So in conclusion, you would expect to see the X79 chipset USB 2.0 ports, but that is all. Perhaps reinstate your port-limit removal patches as they have been disabled. I know you only have 12x USB 2.0 ports, but it might help.

:)
 
Last edited:
Thanks.



Okay. Remove the CalDigi USB kexts. I can understand why they didn't work ... There is a potential problem using these, or GenericUSBXHIC, and that is - Mojave. These kexts are old and, sadly, often do not work with the latest macOSs. Unfortunately they are no longer being updated. This might mean USB 3.0 on this board is touch and go.

Looking in your ACPI 'patched' folder I see 8x *.aml files. Are these something you specifically need for your X79 ?

What I can see:

You do have USBInjectAll.kext installed in the EFI folder, BUT don't have the SSDT-UIAC.aml installed.

So in conclusion, you would expect to see the X79 chipset USB 2.0 ports, but that is all. Perhaps reinstate your port-limit removal patches as they have been disabled. I know you only have 12x USB 2.0 ports, but it might help.

:)
Many thanks @UtterDisbelief ,
I found those *aml files in this old guide, I'm aiming to replace them. I actually use to overwrite it with the one produced with my Hackintool SSDT-UIAC.aml at any test I do with Hackintool. But the one I created with Hackintool doesn't work, as only the first USB2 hub is discovered with that. Apparently so far, those *aml are the only way to have at least the two UBS2.0 hubs working (not the USB3).
This guide ships an additional (*9.aml file) for my speedstep processor, the 4930k. I'm quite confused, as I can't understand how a different processor would needs a different .aml definition, and how to customize those parameters in my own *aml build. I thought the .aml definition was needed just for usb injecting, so that is really confusing me even more.

What I can understand, is why the controllers are not active. I expect to have all the three controllers active as I have the injectall text, but that doesn't happen. Maybe I'm wrong in understanding how it works though. How otherwise I would create the .aml, without having the controllers up, and being able to discover the ports? Is my assumption correct?

Also no trace of the type-c@pci, that is actually an ASMedia Chipset ASM1142 and ASM1543, according to the Amazon product description. I don't know what should bring up that controller, maybe the GenericUSBXHIC kext?

I tried removing the GenericUSBXHIC and CalDigi kext as suggested, and re-enabled the patches, no changes unfortunately.
 
Last edited:
Many thanks @UtterDisbelief ,
I found those *aml files in this old guide, I'm aiming to replace them. I actually use to overwrite it with the one produced with my Hackintool SSDT-UIAC.aml at any test I do with Hackintool. But the one I created with Hackintool doesn't work, as only the first USB2 hub is discovered with that. Apparently so far, those *aml are the only way to have at least the two UBS2.0 hubs working (not the USB3).
This guide ships an additional (*9.aml file) for my speedstep processor, the 4930k. I'm quite confused, as I can't understand how a different processor would needs a different .aml definition, and how to customize those parameters in my own *aml build. I thought the .aml definition was needed just for usb injecting, so that is really confusing me even more.

What I can understand, is why the controllers are not active. I expect to have all the three controllers active as I have the injectall text, but that doesn't happen. Maybe I'm wrong in understanding how it works though. How otherwise I would create the .aml, without having the controllers up, and being able to discover the ports? Is my assumption correct?

Also no trace of the type-c@pci, that is actually an ASMedia Chipset ASM1142 and ASM1543, according to the Amazon product description. I don't know what should bring up that controller, maybe the GenericUSBXHIC kext?

I tried removing the GenericUSBXHIC and CalDigi kext as suggested, and re-enabled the patches, no changes unfortunately.

Hi there. I'll try to clear away the confusion ...

Those ACPI patches you are using were from a 2014 build. Clover and Mojave have moved on since then. I would experiment removing them, one at a time until something breaks. You have the "plug-ins" CPU option enabled in your config.plist and that will help with your 4930k. Keep a UniBeast installer boot drive handy just in case ...

To be clear - USBInjectAll is used to open-up only your X79 chipset ports - not the ASMedia ones. When in place you then use the port-limit removal patches to make them visible in IORegistryExplorer. Once you have run through the port discovery process and created an SSDT-UIAC.aml, you put that file in the 'patched' folder and disable/remove the port-limit patches.

Check you are using the correct port-limit removal patches for your version of Mojave - there are different ones for each point upgrade.

You can see in the IOReg export that the PR* ports are attached to the EHC controllers by USBInjectAll, but the majority are not showing in the tree. This points to UIA identifying them all but something else is stopping them working.

As an idea, have you tried any other system-definitions, other than Mac Pro 6,1?

ASMedia ports are controlled by the ASM1142. Period. With earlier versions of macOS, GenericUSBXHCI.kext would make these ports appear in the IORegistryExplorer tree, but they were still not configurable. Nowadays the kext does not work reliably as it hasn't been updated.

Finally, you could double-check your USB hardware is actually fully functioning, and not faulty, by booting into Windows and testing.

:)
 
Last edited:
Hey all! Noob here trying to create my first SSDT. My problem is that I don't see any HS/SS items at all. Everything is HP. Here is an example entry from IORegistryExplorer (notice the HP21):

Code:
AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EH02@1A/EH02@1a000000/PR21@1a100000/IOUSBHostDevice@1a100000/AppleUSB20InternalHub@1a100000/HP21@1a110000

So how do I input this into the SSDT-USB-Template?
 
Hi there. I'll try to clear away the confusion ...

Those ACPI patches you are using were from a 2014 build. Clover and Mojave have moved on since then. I would experiment removing them, one at a time until something breaks. You have the "plug-ins" CPU option enabled in your config.plist and that will help with your 4930k. Keep a UniBeast installer boot drive handy just in case ...

To be clear - USBInjectAll is used to open-up only your X79 chipset ports - not the ASMedia ones. When in place you then use the port-limit removal patches to make them visible in IORegistryExplorer. Once you have run through the port discovery process and created an SSDT-UIAC.aml, you put that file in the 'patched' folder and disable/remove the port-limit patches.

Check you are using the correct port-limit removal patches for your version of Mojave - there are different ones for each point upgrade.

You can see in the IOReg export that the PR* ports are attached to the EHC controllers by USBInjectAll, but the majority are not showing in the tree. This points to UIA identifying them all but something else is stopping them working.

As an idea, have you tried any other system-definitions, other than Mac Pro 6,1?

ASMedia ports are controlled by the ASM1142. Period. With earlier versions of macOS, GenericUSBXHCI.kext would make these ports appear in the IORegistryExplorer tree, but they were still not configurable. Nowadays the kext does not work reliably as it hasn't been updated.

Finally, you could double-check your USB hardware is actually fully functioning, and not faulty, by booting into Windows and testing.

:)

Many thanks again for your help UtterDisbelief,
So yes, they are old, and that is why I'm trying to build my custom SSDT, but right now those are the only SSDTs that are in some way able to bring up the two USB2.0 controllers. If I remove them, or I boot with the SSDT I created, I lose one of the controllers, the EH02, as screenshot attached.

Regarding the port limit patch, I enabled it as suggested in this thread, but in the fourth page somebody is actually suggesting that it would not work on 10.14.6 that I'm running. I don't know how to verify the patches, but I didn't see any improvement after applying it.
 

Attachments

  • Screenshot 2019-10-16 at 17.32.26.png
    Screenshot 2019-10-16 at 17.32.26.png
    140 KB · Views: 68
  • config.plist
    7.9 KB · Views: 74
Many thanks again for your help UtterDisbelief,
So yes, they are old, and that is why I'm trying to build my custom SSDT, but right now those are the only SSDTs that are in some way able to bring up the two USB2.0 controllers. If I remove them, or I boot with the SSDT I created, I lose one of the controllers, the EH02, as screenshot attached.

Regarding the port limit patch, I enabled it as suggested in this thread, but in the fourth page somebody is actually suggesting that it would not work on 10.14.6 that I'm running. I don't know how to verify the patches, but I didn't see any improvement after applying it.

Fair enough. I don't know enough about what those miscellaneous patches do to know for sure. I'm only here for the USB ;)

The fact is though, that both your EHC controllers should appear simply because they are there, physically. IORegistryExplorer is your friend here. After you have the renames in place, check the output again. You should see them both.

For homework, I've read through a few of the other X79 User Builds we have on this site and no-one has mentioned a missing controller. If removing one of those other SSDT patches makes one EHC disappear, that's plain odd. I've only seen your Rampage.ioreg from before the EHCI patches were corrected when they still showed as EUSB and USBE etc. Check the output now.

As a thought: I haven't heard if the Supplemental Updates to 10.14.6 broke the PLR-Patches. That might be what they mean in the thread.

Remember, if you create a proper SSDT-UIAC then you don't need the PLR-Patches anyway, the only difficulty is configuring "blind" but I guess you have already done the port-discovery anyway :thumbup:
 
Last edited:
Hey all! Noob here trying to create my first SSDT. My problem is that I don't see any HS/SS items at all. Everything is HP. Here is an example entry from IORegistryExplorer (notice the HP21):

Code:
AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EH02@1A/EH02@1a000000/PR21@1a100000/IOUSBHostDevice@1a100000/AppleUSB20InternalHub@1a100000/HP21@1a110000

So how do I input this into the SSDT-USB-Template?

Holy Cow Hey Caleb :D So funny running to you here..
This may be a case of the blind leading the blind, but I used this guide to get my SSDT running (https://www.tonymacx86.com/threads/guide-creating-a-custom-ssdt-for-usbinjectall-kext.211311/)
On that page you can find this url linked (https://www.tonymacx86.com/threads/guide-10-11-usb-changes-and-solutions.173616/) there is a guide for each class of cpu/mobo, with a list of requirements for that class of chip/mobo. I found it helpful.

I do have a Skylake 100 series board though so I don't have to deal with the EHCI->EH. With the guide I could finally figure it out. I guess time will tell if its truly correct :D.

Enjoy your channel as always.
 
Last edited:
Holy Cow Hey Caleb :D So funny running to you here..

Haha! Good seeing you too! Man... Really having a hard time with this! Tried creating the SSDT file but I don't think it is working right. Here are some grabs of what I see in IORegistryExplorer after applying the file.

Now USB 3.0 isn't working. No idea how to move forward at this point.

Here is the code I used for my SSDT USB file:

Code:
DefinitionBlock ("SSDT-USB.aml", "SSDT", 1, "sample", "USBFix", 0x00003000)
{
    // "USBInjectAllConfiguration" : override settings for USBInjectAll.kext
    Device(UIAC)
    {
        Name(_HID, "UIA00000")
        // "RehabManConFiguration"
        Name(RMCF, Package()
        {
            // XHC overrides for 100-series boards
            "8086_8cb1", Package()
            {
                "port-count", Buffer() { 15, 0, 0, 0}, // Highest port number is SS** at 0xNN
                "ports", Package()
                {   // TO COMPLETE THIS FILE, ADD ALL YOUR PORTS BELOW HERE, THEN SET port-count ABOVE
                    "HP11", Package() // USB2 device on a USB3 port located on the front right side of the case by the power buttons..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 1, 0, 0, 0 },
                    },
                    "HP12", Package() // USB2 device on a USB3 port located on the front of the case all the way to the left..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 2, 0, 0, 0 },
                    },
                    "HP13", Package() // USB2 device on a USB3 port located on the bottom left most USB on the rear of the case (just above the audio i/o..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 3, 0, 0, 0 },
                    },
                    "HP14", Package() // USB2 device on a USB3 port located directly to the left of the ethernet jack..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 4, 0, 0, 0 },
                    },
                    "HP15", Package() // USB2 device on a USB3 port located right below the HDMI output on the left..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 5, 0, 0, 0 },
                    },
                     "HP16", Package() // USB2 device on a USB3 port located just to the right of HP05/SS05 (down and to the right on the HDMI)..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 6, 0, 0, 0 },
                    },
                  

                    "SS01", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 10, 0, 0, 0 },
                    },
                    "SS02", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 11, 0, 0, 0 },
                    },
                    "SS03", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 12, 0, 0, 0 },
                    },
                    "SS04", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 13, 0, 0, 0 },
                    },
                    "SS05", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 14, 0, 0, 0 },
                    },
                    "SS06", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 15, 0, 0, 0 },
                    },
                },
            },
        })
    }
}
 

Attachments

  • Screen Shot 2019-10-16 at 3.45.07 PM.png
    Screen Shot 2019-10-16 at 3.45.07 PM.png
    26.1 KB · Views: 51
  • Screen Shot 2019-10-16 at 3.44.47 PM.png
    Screen Shot 2019-10-16 at 3.44.47 PM.png
    109.9 KB · Views: 77
Haha! Good seeing you too! Man... Really having a hard time with this! Tried creating the SSDT file but I don't think it is working right. Here are some grabs of what I see in IORegistryExplorer after applying the file.

Now USB 3.0 isn't working. No idea how to move forward at this point.

Here is the code I used for my SSDT USB file:

Code:
DefinitionBlock ("SSDT-USB.aml", "SSDT", 1, "sample", "USBFix", 0x00003000)
{
    // "USBInjectAllConfiguration" : override settings for USBInjectAll.kext
    Device(UIAC)
    {
        Name(_HID, "UIA00000")
        // "RehabManConFiguration"
        Name(RMCF, Package()
        {
            // XHC overrides for 100-series boards
            "8086_8cb1", Package()
            {
                "port-count", Buffer() { 15, 0, 0, 0}, // Highest port number is SS** at 0xNN
                "ports", Package()
                {   // TO COMPLETE THIS FILE, ADD ALL YOUR PORTS BELOW HERE, THEN SET port-count ABOVE
                    "HP11", Package() // USB2 device on a USB3 port located on the front right side of the case by the power buttons..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 1, 0, 0, 0 },
                    },
                    "HP12", Package() // USB2 device on a USB3 port located on the front of the case all the way to the left..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 2, 0, 0, 0 },
                    },
                    "HP13", Package() // USB2 device on a USB3 port located on the bottom left most USB on the rear of the case (just above the audio i/o..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 3, 0, 0, 0 },
                    },
                    "HP14", Package() // USB2 device on a USB3 port located directly to the left of the ethernet jack..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 4, 0, 0, 0 },
                    },
                    "HP15", Package() // USB2 device on a USB3 port located right below the HDMI output on the left..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 5, 0, 0, 0 },
                    },
                     "HP16", Package() // USB2 device on a USB3 port located just to the right of HP05/SS05 (down and to the right on the HDMI)..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 6, 0, 0, 0 },
                    },
                

                    "SS01", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 10, 0, 0, 0 },
                    },
                    "SS02", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 11, 0, 0, 0 },
                    },
                    "SS03", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 12, 0, 0, 0 },
                    },
                    "SS04", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 13, 0, 0, 0 },
                    },
                    "SS05", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 14, 0, 0, 0 },
                    },
                    "SS06", Package() // USB3 port located ..., port <NN 00 00 00>
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 15, 0, 0, 0 },
                    },
                },
            },
        })
    }
}

I really hope others with more expertise than me chime in soon. But perhaps something will jump out and lead you to the right file..

Only things I can think of:

see my file below

-I didn't change the definition block, yours looks a bit different, perhaps a different template.¯\_(ツ)_/¯
-This part here ""8086_a12f", Package()" I picked based on the device id for the root XHC device in my case. I guess for you it would be root EH (in IOREG)
-I left the "port-count", Buffer() { 26, 0, 0, 0 }, even though I only have <= 15 total ports
-I assume your .dsl compiled into an .aml without errors?

snippet of mine.. of course different chipset so it doesn't help u that much..

my .dsl before compile
Code:
DefinitionBlock ("", "SSDT", 2, "hack", "_UIAC", 0)
{
    Device(UIAC)
    {
        Name(_HID, "UIA00000")
        Name(RMCF, Package()
        {
            "8086_a12f", Package()
            {
                "port-count", Buffer() { 26, 0, 0, 0 },
                "ports", Package()
                {
                    "HS03", Package() //top of pc middle usb3port (running at 2.0 since SS03 never showed up) USB2 speed
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 3, 0, 0, 0 },
                    },
                    "HS04", Package() //top of pc SIDE USB 3 port (running at 2.0 since SS04 never showed up) USB2 speed
                    {
                        "UsbConnector", 3,
                        "port", Buffer() { 4, 0, 0, 0 },
                    },

my .aml after compile.. If yours is an .aml then there is quite a few differences:
Code:
DefinitionBlock ("", "SSDT", 2, "hack", "_UIAC", 0x00000000)
{
    Device (UIAC)
    {
        Name (_HID, "UIA00000")  // _HID: Hardware ID
        Name (RMCF, Package (0x02)
        {
            "8086_a12f",
            Package (0x04)
            {
                "port-count",
                Buffer (0x04)
                {
                     0x1A, 0x00, 0x00, 0x00                         
                },

                "ports",
                Package (0x1E)
                {
                    "HS03",
                    Package (0x04)
                    {
                        "UsbConnector",
                        0x03,
                        "port",
                        Buffer (0x04)
                        {
                             0x03, 0x00, 0x00, 0x00                         
                        }
                    },

                    "HS04",
                    Package (0x04)
                    {
                        "UsbConnector",
                        0x03,
                        "port",
                        Buffer (0x04)
                        {
                             0x04, 0x00, 0x00, 0x00                         
                        }
                    },

Only things I can think of atm...
 
Back
Top