wangdongfreesky 发表于 2023-2-15 14:29

DSDT疑难杂症解决,包括台式机出现电池选项,不能重启,定制USB,屏蔽串口设备等

好多黑苹果出现某名奇妙的问题,是因为机器的ACPI表不规范或者符合macos的标准,只要将ACPI表定制完美即可解决很多问题,建议每个搞黑苹果的网友手头留一套白果的ioreg和dsdt文件作为参考,下面不多说,都是干货,每层楼解决一个黑果问题

wangdongfreesky 发表于 2023-2-15 14:40

本帖最后由 wangdongfreesky 于 2023-2-15 16:18 编辑

问题一、明明是台式机,机型设置的smbios为macmini,imac,macpro,可是在系统中却出现了电池选项
这个问题在于acpi表中的facp表
请看facp表
               FACS Address : EC919000
               DSDT Address : EC792000
                        Model : 00
                   PM Profile : 01
                SCI Interrupt : 0009
             SMI Command Port : 000000B2
            ACPI Enable Value : A0
         ACPI Disable Value : A1

这里的PM Profile后面的代码01代表台式机没有电池选项,而有些主板的这里定义的是02代表笔记本,尤其是一些小主机,使用的是笔记本的主板,而厂家没有对该表做修改
修正方法如下:
occ或OCAT在acpi选项中添加补丁
查找:00020900 B2000000 A0A1
替换为:00010900 B2000000 A0A1
acpi表签名:FACP
ocat,TableSignature:46414350 注:46414350就是FACP的十六进

nsby494 发表于 2023-2-15 14:53

期待中,学习一下,加油

wangdongfreesky 发表于 2023-2-15 14:59

问题二、重启不能,或者重启为软重启,设备没有完全初始化问题同样出在FACP表中
请看facp表
               Reset Register :
                Space ID : 01
                Bit Width : 08
                Bit Offset : 00
                Encoded Access Width : 00
               Address : 00000000000000B2

               Value to cause reset : BE
               ARM Flags (decoded below) : 0000
                                    PSCI Compliant : 0
                                    Must use HVC for PSCI : 0

注意:Value to cause reset后面的参数即为重启代码:06为重启,0E为硬重启,设备会重新初始化,我的这个机器是AMD的小主机没有出现问题,但是我的另一台7080mff出现问题,问题表现为重启后直接跳过usb的UEFI引导,说明usb设备在弹出后并没有重新初始化
解决办法:
用occ或ocat打开配置文件在acpi设置里添加补丁:
查找:01080001 B2000000 00000000 73 (这是针对7080mff的,如果是上面的facp表应该为01080000 B2000000 00000000 BE)参照自己的facp表来查找,是有规律的,很简单的,注意地址要反过来写
替换为:01080001 F90C0000 00000000 0E (硬重启或叫full reset)或 01080001 F90C0000 00000000 06(软重启)
occ表签名:FACP
OCAT:46414350
原理:告诉操作系统,向0xCF9的IO口,写入6或0E

ydhmq 发表于 2023-2-15 15:02

都是干货,每层楼解决一个黑果问题

wangdongfreesky 发表于 2023-2-15 15:36

问题三、定制USB,一般的USB定制我们可以使用hackintool或者usbmap,但是有些usb端口就是不显示,即使在Windows下定制了,在hackintool下也看不到该端口,请看下面问题代码
Device (PRT4)
            {
                Name (_ADR, 0x04)// _ADR: Address
                Name (UPC1, Package (0x04) //
                {
                   Zero,//
                  0xFF,
                  Zero,
                  Zero
                })
                Method (_UPC, 0, Serialized)
                {
                  Return (UPC1) /* \_SB_.PCI0.GP17.XHC_.RHUB.PRT4.UPC1 */
                }

                Name (PLD1, Package (0x01)
                {
                  Buffer (0x14)
                  {
                        /* 0000 */0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// ........
                        /* 0008 */0x91, 0x1D, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00,// ........
                        /* 0010 */0xFF, 0xFF, 0xFF, 0xFF                           // ....
                  }
                })
                Method (_PLD, 0, Serialized)// _PLD: Physical Location of Device
                {
                  Return (PLD1) /* \_SB_.PCI0.GP17.XHC_.RHUB.PRT4.PLD1 */
                }

原有的acpi XHC设备下的端口4是不显示不启用的,我的这台主机该端口实际上连接了usbaudio,导致没有声音
我详细的说明一下,每个USB端口都有一个_UPC函数,该函数传递了一个参数,该参数对USB的类型做了相关说明
                Name (UPC1, Package (0x04) //
                {
                   Zero,//Zero为不启用,0x FF为启用
                   0xFF, //USB类型:Zero为USB2,0x03为USB3,0x FF为内建,0x09为type-c自动切换正反,0x0A为type- C区分正反
                  Zero,
                  Zero
                })

这里说明一下typec接口,typec接口分两种,一种自动切换正反,也就是你吧typec接口的u盘正反插都是这个端口,而区分正反的是当你u盘反过来插后会出现在另一个端口上
有了以上的基础,我是这样用DSDT来定制USB端口的,可以解决不识别,免Kext,改机型不需重新定制usb,最大程度接近百果本身的USB定制效果
第一步、屏蔽原有的_UPC函数,利用occ打补丁重命名的办法
occ或ocat打开配置文件在acpi设置里添加补丁
查找:5F555043
替换为:5A555043
表名:DSDT或SSDT (这里强调一下,有些机器的USB端口的UPC函数在DSDT中定义,有些机器的USB端口的UPC函数在SSDT表中,如果在DSDT中,该补丁的表名就为DSDT,如果在SSDT中,该补丁的表名就为SSDT)
这样原有的UPC就通过改名为ZUPC而失效了,下面我们要重写UPC函数
重写完的DSDT我们命名为SSDT-FixUSB.aml大概是如下形式(不同设备的usb端口命名和路径不同参照修改和编写):
DefinitionBlock ("", "SSDT", 2, "hack", "FixUSB", 0x00000000)
{
    External (_SB_.PCI0.XHC_.RHUB.HS01, DeviceObj)
一、开头包含你的需要使用的usb端口的路径,把你使用的端口路径写上,不使用的usb端口不添加即可实现了屏蔽,注意数量不能超过15个,要符合macos的规范数量。

二、定义端口类型的参数
Name (UPC3, Package (0x04)。//USB3
    {
      0xFF,
      0x03,
      Zero,
      Zero
    })
    Name (UPSW, Package (0x04) //typc自动切换正反
    {
      0xFF,
      0x09,
      Zero,
      Zero
    })
    Name (UPCC, Package (0x04) //typec不切换正反
    {
      0xFF,
      0x0A,
      Zero,
      Zero
    })
    Name (UPCF, Package (0x04) //内建端口给USBaudio和蓝牙
    {
      0xFF,
      0xFF,
      Zero,
      Zero
    })

注意:XHC下没有USB2,EHCI下才有,即使是XHC下的usb2端口也要定义为USB3而不是USB2,好多教程都是错的,用usb2设备和usb3设备分别插各个端口,usb2设备出现的端口就定义为usb2,这是错的!!XHC的usb3.1控制器下都是USB3!!
三、为不同的端口的UPC函数返回不同类型的参数即可
Scope (\_SB.PCI0.XHC.RHUB.HS01)
    {
      Method (_UPC, 0, Serialized)// _UPC: USB Port Capabilities
      {
            Return (UPC3) /* \UPC3 */
      }
    }

    Scope (\_SB.PCI0.XHC.RHUB.HS02)
    {
      Method (_UPC, 0, Serialized)// _UPC: USB Port Capabilities
      {
            Return (UPCC) /* \UPCC */
      }
    }

然后将编译好的SSDT-FixUSB.aml放入EFI中的ACPI目录,OC配置文件加载SSDT-FixUSB.aml文件,注意:之前upc改名的补丁也要勾选加载!

wangdongfreesky 发表于 2023-2-15 15:51

问题四:系统偏好设置里-网络设置中出现了一个电话图标,网络中添加服务中除了以太网和WI-FI还多了一个串口设备解决方法:该设备通过hackintool的pcie设备列表中没有发现,通过ioreg查找发现ACPI下有一个U AR3设备,屏蔽该设备即可
打开dsdt搜索该设备,代码如下:
Device (UAR3)
                {
                  Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)// _HID: Hardware ID
                  Name (_UID, 0x02)// _UID: Unique ID
                  Name (LDN, 0x0B)
                  Method (_STA, 0, NotSerialized)// _STA: Status
                  {
                      If ((SSPD == Zero))
                        {
                            Return (Zero)//注意这两行,将SSPD参数设置为Zero,即可屏蔽该设备
                        }
                        Else
                        {
                            Return (^^SIO1.ESTA (0x11))
                        }
                  }

制作SSDT-DisUAR3.aml
代码如下:
DefinitionBlock ("", "SSDT", 2, "OCLT", "DisUAR3", 0x00000000)
{
    External (SSPD, IntObj)


    Scope (_SB)
    {
      If (_OSI ("Darwin"))
      {
            SSPD = Zero
      }
    }
}

注意:如果你已经安装了系统,那么要在系统偏好设置里删除该服务,否则你正确加载了该ssdt后由于系统没有这个设备,反而删除不掉了,如果删不了,你就把这个ssdt先禁用一下,删完再启用。如果是新装系统,那么没有问题

washion1993 发表于 2023-2-15 16:42

加精预备!!!

remyxo 发表于 2023-2-15 17:22

干货!迫切等待精彩继续。

kevon2013 发表于 2023-2-15 17:23

码字辛苦了,楼主

zhyw78 发表于 2023-2-15 17:44

谢谢分享   

maosheng 发表于 2023-2-15 17:50

这个干货的确不错的哟,谢谢楼主了。

wangdongfreesky 发表于 2023-2-15 18:05

问题五:不实用DSDT,屏蔽不能驱动的核显或独显,对于不能驱动的AMD核显APU或着不能驱动的Nvida独显,可以快捷的用OC属性来屏蔽,方法如下
用OCC打开配置文件,在设备属性一览中的PCI设备列表中选择要屏蔽的设备,在属性中只需添加两行代码
class-code类型DATAFFFFFFFF
name          类型DATA0000000A

wangdongfreesky 发表于 2023-2-15 18:09

问题六:HDMI或DP无音频
解决方法:给appleALC打补丁
用OCC打开配置文件转到内核设置,添加一个补丁,内容如下:
标识符:as.vit9696.AppleALC
查找:0E0000B8 709D0000 EB0690
替换:0E0000B8 48A30000 EB0690
解决hackintool中hdmi音频设备不显示,系统音频设置中无HDMI输出的问题

shbin0713 发表于 2023-2-15 18:14

这个帖子牛逼了,技术大佬呀,顶起来

wangdongfreesky 发表于 2023-2-15 18:18

问题七:没有节能五项,加载PMCR和PPMC两个SSDT,这个大家基本都懂,就是有一项需要插U盘才显示,特此说明,另外好多新装机器,在安装好系统后不显示音频设备,请使用SSDTTime工具为acpi打上IRQ和HPET补丁,该补丁会生成一个配置文件,在该配置文件的acpi选项的补丁一栏中将补丁粘贴过来,如果生成了SSDT文件也要复制到你的efi中并加载

本拉登他爹 发表于 2023-2-15 18:32

使用DSDT或SSDT定制USB端口不需要U盘插拔?

jianghu_y 发表于 2023-2-15 19:13

麻烦问下! OSX 下关闭电脑 无法通过开机键开机!拔掉电源插头,再次插上才能正常开机!这个是什么问题! WIN下就不会有这个问题!

Tian羽 发表于 2023-2-15 19:16

感谢分享,学到真东西

wangdongfreesky 发表于 2023-2-15 19:29

本拉登他爹 发表于 2023-2-15 18:32 https://bbs.pcbeta.com/static/image/common/back.gif
使用DSDT或SSDT定制USB端口不需要U盘插拔?

需要,实际上是正常USB定制后,知道了各个端口的类型后,改为dsdt
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: DSDT疑难杂症解决,包括台式机出现电池选项,不能重启,定制USB,屏蔽串口设备等