Renegade Project移植指南:修订间差异

来自Uotan Wiki · 刷机百科
(创建页面,内容为“=Linux= ---- ==内核 cmdline == === 必要参数 <ref>https://renegade-doc.readthedocs.io/zh-cn/latest/linux/cmdline.html#id1</ref>=== pd_ignore_unused clk_ignore_unused efi=novamap * <code>pd_ignore_unused</code> 保持所有已由引导加载程序启用的电源域处于打开状态,即使没有驱动程序声明它们。 * <code>clk_ignore_unused</code> 即使没有驱动程序认领启动时钟,也要保持启动时钟开启。 * <code>efi=nova…”)
 
无编辑摘要
 
(未显示同一用户的1个中间版本)
第29行: 第29行:
=Windows=
=Windows=
----
----
==适配触摸屏<ref>https://renegade-doc.readthedocs.io/zh-cn/latest/windows/touch.html#id1</ref>==
''首先,您需要确保您的DSDT表不是很坏,并且qcep等核心驱动程序能够正确加载。''
DSDT中的以下部分演示了如何在Oneplus 6t上实现Synaptics触摸。
===TSC1 Part<ref>https://renegade-doc.readthedocs.io/zh-cn/latest/windows/touch.html#tsc1-part</ref>===
        Scope (\_SB.PEP0)
        {
            Method (LPMX, 0, NotSerialized)
            {
                Return (LPXC)
            }
            Name (LPXC, Package (0x01)
            {
                Package (0x04)
                {
                    "DEVICE",
                    "'''\\'''_SB.TSC1",
                    Package (0x0B)
                    {
                        "DSTATE",
                        Zero,
                        // Enable the 2.8V regulator on LDO28_A
                        Package (0x02)
{
"PMICVREGVOTE",
Package (0x06)
{
"PPP_RESOURCE_ID_LDO28_A",
One,
2856000,
One,
0x07,
Zero
}
},
// Delay 10ms
                        Package (0x02)
                        {
                            "DELAY",
                            Package (0x01)
                            {
                                10000
                            }
                        },
                        // enable the v1p8 GPIO
                        Package (0x02)
                        {
                            "TLMMGPIO",
                            Package (0x06)
                            {
                                88,
                                One,
                                Zero,
                                One,
                                Zero,
                                Zero
                            }
                        },
// enable the 2v8 GPIO
// '''not''' actually a thing on fajita
// no 1v8 i2c regulator either
// sleep 10ms
                        Package (0x02)
                        {
                            "DELAY",
                            Package (0x01)
                            {
                                10000
                            }
                        },
// reset the device
Package (0x02)
                        {
                            "TLMMGPIO",
                            Package (0x06)
                            {
                                99,
                                One,
                                Zero,
                                One,
                                Zero,
                                Zero
                            }
                        },
                       
// sleep 10ms
                        Package (0x02)
                        {
                            "DELAY",
                            Package (0x01)
                            {
                                10000
                            }
                        },
                       
Package (0x02)
                        {
                            "TLMMGPIO",
                            Package (0x06)
                            {
                                99,
                                Zero,
                                Zero,
                                One,
                                Zero,
                                Zero
                            }
                        },
                       
                        Package (0x02)
                        {
                            "DELAY",
                            Package (0x01)
                            {
                                10000
                            }
                        },
                       
Package (0x02)
                        {
                            "TLMMGPIO",
                            Package (0x06)
                            {
                                99,
                                One,
                                Zero,
                                One,
                                Zero,
                                Zero
                            }
                        },
                    },
                    Package (0x04)
                    {
                        "DSTATE",
                        0x03,
Package (0x02)
                        {
// set reset low
                            "TLMMGPIO",
                            Package (0x06)
                            {
                                99,
                                Zero,
                                Zero,
                                One,
                                Zero,
                                Zero
                            },                           
                        },
                       
                        // set v1p8 low
Package (0x02)
                        {
// set reset low
                            "TLMMGPIO",
                            Package (0x06)
                            {
                                88,
                                Zero,
                                Zero,
                                One,
                                Zero,
                                Zero
                            },                           
                        },
                    }
                }
            })
        }
        Device (TSC1)
        {
            Name (_HID, "MSHW1003")  // _HID: Hardware ID
            Name (_UID, One)  // _UID: Unique ID
            Name (_DEP, Package (0x03)  // _DEP: Dependencies
            {
                \_SB.PEP0,
                \_SB.GIO0,
                \_SB.IC13
            })
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Name (RBUF, ResourceTemplate ()
                {
                    I2cSerialBusV2 (0x0020, ControllerInitiated, 0x00061A80,
                        AddressingMode7Bit, "'''\\'''_SB.IC13",
                        0x00, ResourceConsumer, , Exclusive,
                        )
                    GpioInt (Edge, ActiveLow, ExclusiveAndWake, PullUp, 0x0000,
                        "'''\\'''_SB.GIO0", 0x00, ResourceConsumer, ,
                        )
                        {  // Pin list
                            0x007D
                        }
                    GpioIo (Exclusive, PullNone, 0x0000, 0x0000, IoRestrictionNone,
                        "'''\\'''_SB.GIO0", 0x00, ResourceConsumer, ,
                        )
                        {  // Pin list
                            0x0063
                        }
                })
                Return (RBUF) /* \_SB_.TSC1._CRS.RBUF */
            }
           
            Name (PGID, Buffer (0x0A)
            {
                "'''\\'''_SB.TSC1"
            })
            Name (DBUF, Buffer (DBFL){})
            CreateByteField (DBUF, Zero, STAT)
            CreateByteField (DBUF, 0x02, DVAL)
            CreateField (DBUF, 0x18, 0xA0, DEID)
            Method (_S1D, 0, NotSerialized)  // _S1D: S1 Device State
            {
                Return (0x03)
            }
            Method (_S2D, 0, NotSerialized)  // _S2D: S2 Device State
            {
                Return (0x03)
            }
            Method (_S3D, 0, NotSerialized)  // _S3D: S3 Device State
            {
                Return (0x03)
            }
            Method (_PS0, 0, NotSerialized)  // _PS0: Power State 0
            {
                DEID = Buffer (ESNL){}
                DVAL = Zero
                DEID = PGID /* \_SB_.TSC1.PGID */
                If (\_SB.ABD.AVBL)
                {
                    \_SB.PEP0.FLD0 = DBUF /* \_SB_.TSC1.DBUF */
                }
            }
            Method (_PS3, 0, NotSerialized)  // _PS3: Power State 3
            {
                DEID = Buffer (ESNL){}
                DVAL = 0x03
                DEID = PGID /* \_SB_.TSC1.PGID */
                If (\_SB.ABD.AVBL)
                {
                    \_SB.PEP0.FLD0 = DBUF /* \_SB_.TSC1.DBUF */
                }
            }
        }
=== I2C Part <ref>https://renegade-doc.readthedocs.io/zh-cn/latest/windows/touch.html#i2c-part</ref>===
        Device (IC13)
        {
            Name (_HID, "QCOM0220")  // _HID: Hardware ID
            Alias (\_SB.PSUB, _SUB)
            Name (_UID, 0x0D)  // _UID: Unique ID
            Name (_DEP, Package (0x01)  // _DEP: Dependencies
            {
                \_SB.PEP0
            })
            Name (_CCA, Zero)  // _CCA: Cache Coherency Attribute
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Name (RBUF, ResourceTemplate ()
                {
                    Memory32Fixed (ReadWrite,
                        0x00A90000,        // Address Base
                        0x00004000,        // Address Length
                        )
                    Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
                    {
                        0x00000185,
                    }
                })
                Return (RBUF) /* \_SB_.IC13._CRS.RBUF */
            }
        }
=EDK2=
----
==项目概要<ref>https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#id1</ref>==
<code>edk2-sdm845</code> 是一个自定义的UEFI固件,用来在骁龙845平台上以EL1权限运行任何操作系统。正如README中所说的那样,他相当不完善,但我们只将它作为一个引导程序来使用。在这方面,它足以启动Windows。
== 从Fastboot到EDK2 <ref>https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#fastbootedk2</ref>==
在大多数比较新的高通设备上有两个分区,分别叫做xbl和abl。
<code>xbl</code> 作为高通平台上的UEFI固件,内含基于EFI的程序和驱动(如fastboot)。对于LA平台,如果开机时Fastboot模式未被触发,xbl将会立即加载abl。
<code>abl</code> 只在高通LA平台上存在,其源代码可以在CodeAurora上被找到,它内含一个名叫<code>LinuxLoader.efi</code>的EFI程序,用来加载并启动位于boot分区里的安卓Linux内核。
不幸的是,在进入市场的大多数零售设备上,xbl与abl均需经过厂商签名,我们不能对其作任何修改。因此,用设备自带的bl是不可能直接启动Windows的。
我们所采取的途径是将我们的UEFI固件伪装成一个Linux内核。通过在映像的开头添加一段代表Linux内核的代码,并在尾部附加设备树(device tree),abl就能很高兴地加载UEFI映像了。
== MemoryMap<ref>https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#memorymap</ref> ==
EDK2需要MemoryMap以正常工作。你可以参考xbl中的 <code>uefiplat.cfg</code> 。 需要注意的是仅仅复制粘贴是没有用的,你需要做额外的修复。
== 显示 <ref>https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#id2</ref>==
xbl已经初始化了设备上与显示有关的硬件,并提供了一个framebuffer。故而我们使用SimpleFbDxe以避免麻烦。
== EFI驱动 <ref>https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#efi</ref>==
正如我们在前面提到的那样,xbl是基于UEFI的。所以我们可以从中提取出二进制的EFI驱动,并把它们插入新的固件。然而像这样操作的话很多驱动都并不会工作,如按键、USB、PMIC等。万幸的是,UFS能正常工作,让我们得以继续下去。
== Windows <ref>https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#windows</ref>==
就如X86平台上运行的Windows一样,Windows on Arm需要由固件提供的一系列特定的ACPI。简单来说,ACPI用来描述你的设备的硬件组成和相关的配置。
然而,不是随便拿一台WoA笔记本并提取其ACPI就完事了。当ACPI所描述的与真实硬件存在不相符的地方时,高通的驱动程序会感到十分困惑,并扔给你一个蓝屏。
修复ACPI是一个主要难题。
=参考文献=

2024年2月15日 (四) 23:34的最新版本

Linux


内核 cmdline

必要参数 [1]

pd_ignore_unused clk_ignore_unused efi=novamap 
  • pd_ignore_unused

保持所有已由引导加载程序启用的电源域处于打开状态,即使没有驱动程序声明它们。

  • clk_ignore_unused

即使没有驱动程序认领启动时钟,也要保持启动时钟开启。

  • efi=novamap

在ExitBootServices()之后未调用SetVirtualAddressMap()

可选参数 [2]

earlycon=efifb,mem video=efifb:off debug panic=10
  • earlycon=efifb,mem

启用EFI帧缓冲区上的早期内核消息输出。非常有用,建议用于早期内核调试。

  • video=efifb:off

禁用efifb帧缓冲区。由于未知原因,efifb严重影响了我手机的性能。禁用它可以提高性能。除非您有其他fb,例如simplefb,否则不要禁用

Windows


适配触摸屏[3]

首先,您需要确保您的DSDT表不是很坏,并且qcep等核心驱动程序能够正确加载。

DSDT中的以下部分演示了如何在Oneplus 6t上实现Synaptics触摸。

TSC1 Part[4]

        Scope (\_SB.PEP0)
        {
            Method (LPMX, 0, NotSerialized)
            {
                Return (LPXC)
            }

            Name (LPXC, Package (0x01)
            {
                Package (0x04)
                {
                    "DEVICE", 
                    "\\_SB.TSC1", 
                    Package (0x0B)
                    {
                        "DSTATE", 
                        Zero, 
                        // Enable the 2.8V regulator on LDO28_A
                        Package (0x02)
						{
							"PMICVREGVOTE", 
							Package (0x06)
							{
								"PPP_RESOURCE_ID_LDO28_A", 
								One, 
								2856000, 
								One, 
								0x07, 
								Zero
							}
						},
						// Delay 10ms
                        Package (0x02)
                        {
                            "DELAY", 
                            Package (0x01)
                            {
                                10000
                            }
                        }, 
                        // enable the v1p8 GPIO
                        Package (0x02)
                        {
                            "TLMMGPIO", 
                            Package (0x06)
                            {
                                88, 
                                One, 
                                Zero, 
                                One, 
                                Zero, 
                                Zero
                            }
                        }, 
						// enable the 2v8 GPIO
						// not actually a thing on fajita
						// no 1v8 i2c regulator either
						
						// sleep 10ms
                        Package (0x02)
                        {
                            "DELAY", 
                            Package (0x01)
                            {
                                10000
                            }
                        }, 

						// reset the device
						Package (0x02)
                        {
                            "TLMMGPIO", 
                            Package (0x06)
                            {
                                99, 
                                One, 
                                Zero, 
                                One, 
                                Zero, 
                                Zero
                            }
                        }, 
                        
						// sleep 10ms
                        Package (0x02)
                        {
                            "DELAY", 
                            Package (0x01)
                            {
                                10000
                            }
                        }, 
                        
						Package (0x02)
                        {
                            "TLMMGPIO", 
                            Package (0x06)
                            {
                                99, 
                                Zero, 
                                Zero, 
                                One, 
                                Zero, 
                                Zero
                            }
                        }, 
                        
                        Package (0x02)
                        {
                            "DELAY", 
                            Package (0x01)
                            {
                                10000
                            }
                        }, 
                        
						Package (0x02)
                        {
                            "TLMMGPIO", 
                            Package (0x06)
                            {
                                99, 
                                One, 
                                Zero, 
                                One, 
                                Zero, 
                                Zero
                            }
                        }, 
                    }, 

                    Package (0x04)
                    {
                        "DSTATE", 
                        0x03, 
						Package (0x02)
                        {
							// set reset low
                            "TLMMGPIO", 
                            Package (0x06)
                            {
                                99, 
                                Zero, 
                                Zero, 
                                One, 
                                Zero, 
                                Zero
                            },                            
                        },
                        
                        // set v1p8 low
						Package (0x02)
                        {
							// set reset low
                            "TLMMGPIO", 
                            Package (0x06)
                            {
                                88, 
                                Zero, 
                                Zero, 
                                One, 
                                Zero, 
                                Zero
                            },                            
                        },
                    }
                }
            })
        }


        Device (TSC1)
        {
            Name (_HID, "MSHW1003")  // _HID: Hardware ID
            Name (_UID, One)  // _UID: Unique ID
            Name (_DEP, Package (0x03)  // _DEP: Dependencies
            {
                \_SB.PEP0,
                \_SB.GIO0, 
                \_SB.IC13
            })
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Name (RBUF, ResourceTemplate ()
                {
                    I2cSerialBusV2 (0x0020, ControllerInitiated, 0x00061A80,
                        AddressingMode7Bit, "\\_SB.IC13",
                        0x00, ResourceConsumer, , Exclusive,
                        )
                    GpioInt (Edge, ActiveLow, ExclusiveAndWake, PullUp, 0x0000,
                        "\\_SB.GIO0", 0x00, ResourceConsumer, ,
                        )
                        {   // Pin list
                            0x007D
                        }
                    GpioIo (Exclusive, PullNone, 0x0000, 0x0000, IoRestrictionNone,
                        "\\_SB.GIO0", 0x00, ResourceConsumer, ,
                        )
                        {   // Pin list
                            0x0063
                        }
                })
                Return (RBUF) /* \_SB_.TSC1._CRS.RBUF */
            }
            

            Name (PGID, Buffer (0x0A)
            {
                "\\_SB.TSC1"
            })
            Name (DBUF, Buffer (DBFL){})
            CreateByteField (DBUF, Zero, STAT)
            CreateByteField (DBUF, 0x02, DVAL)
            CreateField (DBUF, 0x18, 0xA0, DEID)
            Method (_S1D, 0, NotSerialized)  // _S1D: S1 Device State
            {
                Return (0x03)
            }

            Method (_S2D, 0, NotSerialized)  // _S2D: S2 Device State
            {
                Return (0x03)
            }

            Method (_S3D, 0, NotSerialized)  // _S3D: S3 Device State
            {
                Return (0x03)
            }

            Method (_PS0, 0, NotSerialized)  // _PS0: Power State 0
            {
                DEID = Buffer (ESNL){}
                DVAL = Zero
                DEID = PGID /* \_SB_.TSC1.PGID */
                If (\_SB.ABD.AVBL)
                {
                    \_SB.PEP0.FLD0 = DBUF /* \_SB_.TSC1.DBUF */
                }
            }

            Method (_PS3, 0, NotSerialized)  // _PS3: Power State 3
            {
                DEID = Buffer (ESNL){}
                DVAL = 0x03
                DEID = PGID /* \_SB_.TSC1.PGID */
                If (\_SB.ABD.AVBL)
                {
                    \_SB.PEP0.FLD0 = DBUF /* \_SB_.TSC1.DBUF */
                }
            }
        }

I2C Part [5]

        Device (IC13)
        {
            Name (_HID, "QCOM0220")  // _HID: Hardware ID
            Alias (\_SB.PSUB, _SUB)
            Name (_UID, 0x0D)  // _UID: Unique ID
            Name (_DEP, Package (0x01)  // _DEP: Dependencies
            {
                \_SB.PEP0
            })
            Name (_CCA, Zero)  // _CCA: Cache Coherency Attribute
            Method (_CRS, 0, NotSerialized)  // _CRS: Current Resource Settings
            {
                Name (RBUF, ResourceTemplate ()
                {
                    Memory32Fixed (ReadWrite,
                        0x00A90000,         // Address Base
                        0x00004000,         // Address Length
                        )
                    Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
                    {
                        0x00000185,
                    }
                })
                Return (RBUF) /* \_SB_.IC13._CRS.RBUF */
            }
        }

EDK2


项目概要[6]

edk2-sdm845 是一个自定义的UEFI固件,用来在骁龙845平台上以EL1权限运行任何操作系统。正如README中所说的那样,他相当不完善,但我们只将它作为一个引导程序来使用。在这方面,它足以启动Windows。

从Fastboot到EDK2 [7]

在大多数比较新的高通设备上有两个分区,分别叫做xbl和abl。

xbl 作为高通平台上的UEFI固件,内含基于EFI的程序和驱动(如fastboot)。对于LA平台,如果开机时Fastboot模式未被触发,xbl将会立即加载abl。

abl 只在高通LA平台上存在,其源代码可以在CodeAurora上被找到,它内含一个名叫LinuxLoader.efi的EFI程序,用来加载并启动位于boot分区里的安卓Linux内核。

不幸的是,在进入市场的大多数零售设备上,xbl与abl均需经过厂商签名,我们不能对其作任何修改。因此,用设备自带的bl是不可能直接启动Windows的。

我们所采取的途径是将我们的UEFI固件伪装成一个Linux内核。通过在映像的开头添加一段代表Linux内核的代码,并在尾部附加设备树(device tree),abl就能很高兴地加载UEFI映像了。

MemoryMap[8]

EDK2需要MemoryMap以正常工作。你可以参考xbl中的 uefiplat.cfg 。 需要注意的是仅仅复制粘贴是没有用的,你需要做额外的修复。

显示 [9]

xbl已经初始化了设备上与显示有关的硬件,并提供了一个framebuffer。故而我们使用SimpleFbDxe以避免麻烦。

EFI驱动 [10]

正如我们在前面提到的那样,xbl是基于UEFI的。所以我们可以从中提取出二进制的EFI驱动,并把它们插入新的固件。然而像这样操作的话很多驱动都并不会工作,如按键、USB、PMIC等。万幸的是,UFS能正常工作,让我们得以继续下去。

Windows [11]

就如X86平台上运行的Windows一样,Windows on Arm需要由固件提供的一系列特定的ACPI。简单来说,ACPI用来描述你的设备的硬件组成和相关的配置。

然而,不是随便拿一台WoA笔记本并提取其ACPI就完事了。当ACPI所描述的与真实硬件存在不相符的地方时,高通的驱动程序会感到十分困惑,并扔给你一个蓝屏。

修复ACPI是一个主要难题。

参考文献