AYANEO Pocket S上的Linux移植
- 福建省
系统信息
本人不对因使用本资源产生的任何硬件、软件问题负责,任何问题
应由使用者个人承担。使用本文章中的方法或资源即代表你同意本条款。
下载和安装
准备
- 电脑
- Platform Tools
相关资源
- 系统和boot
- 在alarm-aps仓库的release页面下载.
- 内核和模块
- 在linux仓库的release页面下载.
安装
- 下载Release页面中的ArchLinuxARM-APS1.img.7z和dualboot.img.gz.
- 重启aps到fastbootd
1 adb reboot fastboot
BASH - 解压系统文件和boot文件
- 刷入系统
请务必备份boot分区,因为ayaneo的系统更新机制意味着如果分区修改则1 fastboot flash rawdump ArchLinuxARM-APS1.img
BASH
安卓无法更新。你可以去QFIL备份分区,记得把_a和_b后缀的都备份了。
详细的备份教程自己百度。 - 刷入boot
如果Ayaneo没更新系统的话,那这个boot应该就是可以用的。
1 fastboot flash boot dualboot.img
BASH - 重启,开机的时候把右边的性能开关向上拨
1 fastboot reboot
BASH - 不出意外的话应该就进arch系统了
用户信息- 默认用户: alarm
- 密码: alarm
- root默认密码: root
功能
| 功能 | 可用性 | 备注 |
|---|---|---|
| GPU | ✅ | |
| DP | ✅ | |
| 扬声器 | ✅ | |
| 麦克风 | ✅ | |
| 游戏控制器 | ✅ | |
| 亮度调节 | ✅ | 睡眠有问题,概率开机没背光 |
| 风扇 | ✅ | |
| SD卡 | ✅ | |
| 触摸 | ✅ | |
| WiFi | ✅ | |
| 蓝牙 | ❌ | |
| 传感器 | ❌ | |
| 指纹 | ❌ |
参考设备树sm8550-ayaneo-ps.dts如下部分:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | &gpu_opp_table { /* Additional speedbin for Adreno A32 719000000 RPMH_REGULATOR_LEVEL_SVS_L2 746000000 RPMH_REGULATOR_LEVEL_NOM 794000000 RPMH_REGULATOR_LEVEL_NOM_L1 827000000 RPMH_REGULATOR_LEVEL_TURBO 860000000 RPMH_REGULATOR_LEVEL_TURBO_L1 1000000000 RPMH_REGULATOR_LEVEL_TURBO_L2 */ opp-719000000 { opp-hz = /bits/ 64 <719000000>; opp-level = <RPMH_REGULATOR_LEVEL_SVS_L2>; opp-peak-kBps = <10687500>; // Level 7 }; opp-746000000 { opp-hz = /bits/ 64 <746000000>; opp-level = <RPMH_REGULATOR_LEVEL_NOM>; opp-peak-kBps = <10687500>; // Level 7 }; opp-794000000 { opp-hz = /bits/ 64 <794000000>; opp-level = <RPMH_REGULATOR_LEVEL_NOM_L1>; opp-peak-kBps = <14398438>; // Level 8 }; // opp-827000000 { // opp-hz = /bits/ 64 <827000000>; // opp-level = <RPMH_REGULATOR_LEVEL_TURBO>; // opp-peak-kBps = <16500000>; // Level 9 // }; // opp-860000000 { // opp-hz = /bits/ 64 <860000000>; // opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L1>; // opp-peak-kBps = <16500000>; // Level 9 // }; // opp-1000000000 { // opp-hz = /bits/ 64 <1000000000>; // opp-level = <RPMH_REGULATOR_LEVEL_TURBO_L2>; // opp-peak-kBps = <16500000>; // Level 9 // }; }; C |
Notes
之后应该没有维护了,就先弄到这里了。技术相关
如果只是想安装,忽略下面的信息即可。请不要直接复制粘贴里面的任何命令,在你不清楚他们是做什么的之前。
本人不对使用这里提供的样板命令导致的机器损坏负责。
内核编译
通常你可能需要安装dkms或者需要修改内核config,这里给出方法
- 克隆内核源码
1
2git clone --depth=1 https://github.com/sunflower2333/linux linux-aps
cd linux-aps
BASH - 安装工具链
Ubuntu:
Arch:1 sudo apt install base-devel xmlto kmod bc libelf git cpio tar xz
BASH
1 sudo pacman -S base-devel xmlto kmod bc libelf git cpio tar xz
BASH - 修改config
O=指定编译产出路径,CROSS_COMPILE指定交叉编译器,-j指定线程数量,通常取CPU线程数量*1.2~1.5。
- 采用GCC+GNU binutils编译:
1 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=$PWD/../OUT -j$(nproc) menuconfig
BASH - 采用LLVM+CLANG编译
参考这里两者的区别,后面不在区分,统一以GCC为例。1 make ARCH=arm64 LLVM=1 LLVM_IAS=1 O=$PWD/../OUT -j$(nproc) menuconfig
BASH
- 编译
修改完config或者源码之后,可以尝试编译内核了,只需要把menuconfig去掉。
然后你就可以拆掉deb获取你需要的那些东西了,模块,头文件,内核,设备树,etc。1
2
3
4# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=$PWD/../OUT -j$(nproc)
# 打包deb,没在arch上面测试过
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=$PWD/OUT -j$(nproc) q_defconfig bindeb-pkg
BASH - 保存defconfig
如果想保存修改过的defconfig,使用一下命令。
他会在OUT目录下生成一个defconfig文件,复制到arch/$arch/configs/your_defconfig以实现持久化保存。1 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=$PWD/../OUT -j$(nproc) savedefconfig
BASH
打包Dualboot
可能有些人会比较好奇dualboot镜像是如何打包的,当然也可能没有人。
准备
介绍两个我们Project Aloha的项目,分别是mu_aloha_platforms和十分明显的是,这个boot里面塞了一个安卓内核和一个uefi,然后uefi里面塞了一个linux内核和设备树。
至于为什么不用ABL+KernelWrapper直接启动,因为ABL要实现continous splash,不会关闭MDP的
时钟和IOMMU,所以我要用UEFI把这些东西关掉,不然起不来GPU。至于为什么不直接用ABL启动,除了
上面的原因外,还有需要擦dtbo分区等一大堆烂事,秉持着从简的原则(其实就是懒),你也
不想备份和擦除一些乱七八糟的分区吧。
DualBootKernelPatcher,前者是移植高通的UEFI固件,后者是
基于内核头Patch的多启动实现。
参考上面两个项目的Readme来配置环境和编译,这里就不细说了,下面主要写如何把Linux和设备树塞到UEFI里面,还有Dualboot的生成。
构建UEFI FD
- 把设备树文件复制到mu_aloha_platforms/Platforms/Device/ayaneo-aps/DeviceTreeBlob/Linux/
1 cp ~/kernel/OUT/arch/arm64/boot/dts/qcom/sm8550-ayaneo-ps.dtb ~/mu_aloha_platforms/Platforms/Device/ayaneo-aps/DeviceTreeBlob/Linux/
BASH - 用内核文件替换默认的UFP Menu.
1 cp ~/kernel/OUT/arch/arm64/boot/Image ~/mu_aloha_platforms/Platforms/AndromedaPkg/UFP/ufpdevicefw.efi
BASH - 扩容FV
参考下面的Diff,修改Platforms/KailuaPkg/Kailua.fdf文件,具体大小依照你的内核大小来算。
还有build_cfg/sm8550.json1
2
3
4
5
6
7
8-Size = 0x00400000|gArmTokenSpaceGuid.PcdFdSize #The size in bytes of the FLASH Device
+Size = 0x03400000|gArmTokenSpaceGuid.PcdFdSize #The size in bytes of the FLASH Device
...
-NumBlocks = 0x400
+NumBlocks = 0x3400
...
-0x00000000|0x00400000
+0x00000000|0x3400000
DIFF
1
2
3
4
5
6
7
8
9--- a/build_cfg/sm8550.json
+++ b/build_cfg/sm8550.json
@@ -3,6 +3,6 @@
"package": "KailuaPkg",
"bootshim": {
"UEFI_BASE": "0xC7CC0000",
- "UEFI_SIZE": "0x00400000"
+ "UEFI_SIZE": "0x03400000"
}
DIFF - 修改APS驱动相关参数
- Platforms/KailuaPkg/Device/ayaneo-aps/PcdsFixedAtBuild.dsc.inc
1
2-gAndromedaPkgTokenSpaceGuid.PcdDisplayCallerExitDisableDisplay|FALSE
+gAndromedaPkgTokenSpaceGuid.PcdDisplayCallerExitDisableDisplay|TRUE
DIFF - APRIORI.inc
1
2
3
4
5
6
7
8
9INF $(PACKAGE_NAME)/Device/$(TARGET_DEVICE)/Binaries/QcomPkg/Drivers/DDRInfoDxe/DDRInfoDxe.inf
+ INF $(PACKAGE_NAME)/Device/$(TARGET_DEVICE)/PatchedBinaries/DisplayDxe.inf
+ INF AndromedaPkg/Driver/DisplayCallerDxe/DisplayCallerDxe.inf
# INF $(PACKAGE_NAME)/Device/$(TARGET_DEVICE)/Binaries/QcomPkg/Drivers/TzDxe/FeatureEnablerDxe.inf
...
- INF AndromedaPkg/Driver/SimpleFbDxe/SimpleFbDxe.inf
+ #INF AndromedaPkg/Driver/SimpleFbDxe/SimpleFbDxe.inf
DIFF - DXE.inc
1
2
3
4
5
6
7
8-INF AndromedaPkg/Driver/SimpleFbDxe/SimpleFbDxe.inf
+#INF AndromedaPkg/Driver/SimpleFbDxe/SimpleFbDxe.inf
INF AndromedaPkg/Driver/RamPartitionDxe/RamPartitionDxe.inf
...
INF $(PACKAGE_NAME)/Device/$(TARGET_DEVICE)/PatchedBinaries/PmicDxeLa.inf
#INF $(PACKAGE_NAME)/Device/$(TARGET_DEVICE)/PatchedBinaries/QcomChargerDxeLA.inf
+INF $(PACKAGE_NAME)/Device/$(TARGET_DEVICE)/PatchedBinaries/DisplayDxe.inf
+INF AndromedaPkg/Driver/DisplayCallerDxe/DisplayCallerDxe.inf
DIFF
- 修改日志打印宏
如果希望把日志打到屏幕,修改Platforms/KailuaPkg/KailuaNoSb.dsc,如果是secureboot启用的话,
修改Platforms/KailuaPkg/KailuaNoSb.dsc。
1
2- USE_SCREEN_FOR_SERIAL_OUTPUT = 0
+ USE_SCREEN_FOR_SERIAL_OUTPUT = 1
DIFF - 编译
只需要按照正常的流程编译就行了
./build_uefi.py -d ayaneo-aps -t DEBUG - 测试
那我问你,我的bootloader虽然本来就是解锁的,但是他什么命令都没有怎么办?比如没有
fastboot flash和fastboot boot?没错,这台机器就是这样的,abl是userbuild,默认
关闭了几乎所有命令。如果此时你没有从神奇海螺里掏出来一个公版的ABL,
那你就老老实实备份你的boot,然后去fastbootd刷进boot分区测试,
如果你没备份,那你可以考虑看一下下面的救砖部分了。
1
2# 临时启动
fastboot boot Build/KailuaPkg/ayaneo-aps.img
BASH1
2
3
4# 刷入测试
adb reboot fastboot
fastboot flash boot Build/KailuaPkg/ayaneo-aps.img
fastboot reboot
BASH
构建dualboot
这里需要用到magiskboot或者其他解包工具,推荐使用Github上现成的magiskboot prebuilt.- 解包内核
去QFIL备份你的boot,ab槽都备份,我的机器这里当前处于b槽,下面以b槽为例,
至于如果分辨当前处于ab哪个槽的话,去fastbootd执行:
解包boot1 fastboot getvar current-slot
BASH
解包过程通常伴随以下日志,并且在当前目录生成kernel文件。1
2
3mkdir ayaboot && cd ayaboot
/path/to/your/magiskboot unpack boot_b
cp kernel okernel # 备份原内核
BASH
1
2
3
4
5
6
7
8
9
10
11❯ ~/magiskboot_x86 unpack boot_b
Parsing boot image: [boot_b]
HEADER_VER [4]
KERNEL_SZ [46955008]
RAMDISK_SZ [0]
OS_VERSION [13.0.0]
OS_PATCH_LEVEL [2023-06]
PAGESIZE [4096]
CMDLINE []
KERNEL_FMT [raw]
VBMETA
LOG - patch内核
这里假定你已经按照项目的Readme编译完成dbkp.
按照如下的diff修改DualBoot.Sm8550.cfg
之后生成patch过的的kernel文件,参数分别为:1
2
3StackBase=0xC7CC0000
-StackSize=0x00400000
+StackSize=0x03400000
DIFF
1 Usage: <Kernel Image to Patch> <UEFI FD Image> <Patched Kernel Image Destination> <Config File> <Shell Code File>
XML
| 1 2 | cd DualBootKernelPatcher/out/ ./DualBootKernelPatcher ~/ayaboot/okernel ~/mu_aloha_platforms/Build/KailuaPkg/DEBUG_CLANGPDB/FV/SM8550_EFI.fd ~/ayaboot/kernel ../Config/DualBoot.Sm8550.cfg ShellCode/ShellCode.AYAPS.bin BASH |
- 重新打包内核
1
2cd ~/ayaboot
/path/to/your/magiskboot repack boot_b newboot
SHELL - 测试
没办法用fastboot boot测试的话,就去fastbootd里flash到boot分区进行测试。
如果一切顺利,当启动的时候抬起性能开关,系统会进入Linux。
卸载 Alarm
卸载很简单,刷回你之前备份的boot,清空Rawdump就行。| 1 2 3 | adb reboot fastboot fastboot flash boot boot_b fastboot erase rawdump SHELL |
救砖
如果你不小心把你的aps弄砖了,如果你时时刻刻清楚你执行每条命令的后果的话,这怎么可能会发生呢~如果你的ABL没有损坏,参考下面:
救砖包链接:https://ayaneo.com.cn/support/download
- 长按电源键,强制重启APS,大约十五秒左右,同时按住音量+-进入9008刷机模式。
- 去QFIL刷那个包就行了,里面应该有附带教程。
高通工程线二代来进9008了。
完结撒花~ Congratulations!!! 🎉🎉🎉
原文链接 https://kancy.life/2025/06/06/APSLinux/
8,199 浏览