(创建页面,内容为“=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是一个主要难题。
参考文献
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/linux/cmdline.html#id1
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/linux/cmdline.html#id2
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/windows/touch.html#id1
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/windows/touch.html#tsc1-part
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/windows/touch.html#i2c-part
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#id1
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#fastbootedk2
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#memorymap
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#id2
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#efi
- ↑ https://renegade-doc.readthedocs.io/zh-cn/latest/edk2/Overview.html#windows