刷机 AYANEO Pocket S上的Linux移植

1000076168.jpg

系统信息

本人不对因使用本资源产生的任何硬件、软件问题负责,任何问题
应由使用者个人承担。使用本文章中的方法或资源即代表你同意本条款。

下载和安装​

准备​

  • 电脑
  • Platform Tools

相关资源​

  1. 系统和boot
  1. 内核和模块
  • linux仓库的release页面下载.
内核、模块已经打包到镜像中,所以无需下载。

安装​

  1. 下载Release页面中的ArchLinuxARM-APS1.img.7z和dualboot.img.gz.
  2. 重启aps到fastbootd
    1adb reboot fastboot
    BASH
  3. 解压系统文件和boot文件
  4. 刷入系统
    1fastboot flash rawdump ArchLinuxARM-APS1.img
    BASH
    请务必备份boot分区,因为ayaneo的系统更新机制意味着如果分区修改则
    安卓无法更新。你可以去QFIL备份分区,记得把_a和_b后缀的都备份了。
    详细的备份教程自己百度。
  5. 刷入boot
    如果Ayaneo没更新系统的话,那这个boot应该就是可以用的。
    1fastboot flash boot dualboot.img
    BASH
  6. 重启,开机的时候把右边的性能开关向上拨
    1fastboot reboot
    BASH
  7. 不出意外的话应该就进arch系统了
    用户信息
    • 默认用户: alarm
    • 密码: alarm
    • root默认密码: root

功能​

功能可用性备注
GPU
DP
扬声器
麦克风
游戏控制器
亮度调节睡眠有问题,概率开机没背光
风扇
SD卡
触摸
WiFi
蓝牙
传感器
指纹
GPU最高频率我设置成794mhz了,如果有需求的话可以尝试自己调最大频,不过我过热就给的比较保守。
参考设备树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
取消注释即可实现最大频率调节,最高为1Ghz。

Notes​

之后应该没有维护了,就先弄到这里了。

技术相关​

如果只是想安装,忽略下面的信息即可。
请不要直接复制粘贴里面的任何命令,在你不清楚他们是做什么的之前。
本人不对使用这里提供的样板命令导致的机器损坏负责。

内核编译​

通常你可能需要安装dkms或者需要修改内核config,这里给出方法
  1. 克隆内核源码
    1
    2
    git clone --depth=1 https://github.com/sunflower2333/linux linux-aps
    cd linux-aps
    BASH
  2. 安装工具链
    Ubuntu:
    1sudo apt install base-devel xmlto kmod bc libelf git cpio tar xz
    BASH
    Arch:
    1sudo pacman -S base-devel xmlto kmod bc libelf git cpio tar xz
    BASH
  3. 修改config
    O=指定编译产出路径,CROSS_COMPILE指定交叉编译器,-j指定线程数量,通常取CPU线程数量*1.2~1.5。
  • 采用GCC+GNU binutils编译:
    1make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=$PWD/../OUT -j$(nproc) menuconfig
    BASH
  • 采用LLVM+CLANG编译
    1make ARCH=arm64 LLVM=1 LLVM_IAS=1 O=$PWD/../OUT -j$(nproc) menuconfig
    BASH
    参考这里两者的区别,后面不在区分,统一以GCC为例。
  1. 编译
    修改完config或者源码之后,可以尝试编译内核了,只需要把menuconfig去掉。
    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
    然后你就可以拆掉deb获取你需要的那些东西了,模块,头文件,内核,设备树,etc。
  2. 保存defconfig
    如果想保存修改过的defconfig,使用一下命令。
    1make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- O=$PWD/../OUT -j$(nproc) savedefconfig
    BASH
    他会在OUT目录下生成一个defconfig文件,复制到arch/$arch/configs/your_defconfig以实现持久化保存。

打包Dualboot​

可能有些人会比较好奇dualboot镜像是如何打包的,当然也可能没有人。

准备​

十分明显的是,这个boot里面塞了一个安卓内核和一个uefi,然后uefi里面塞了一个linux内核和设备树。
至于为什么不用ABL+KernelWrapper直接启动,因为ABL要实现continous splash,不会关闭MDP的
时钟和IOMMU,所以我要用UEFI把这些东西关掉,不然起不来GPU。至于为什么不直接用ABL启动,除了
上面的原因外,还有需要擦dtbo分区等一大堆烂事,秉持着从简的原则(其实就是懒),你也
不想备份和擦除一些乱七八糟的分区吧。
介绍两个我们Project Aloha的项目,分别是mu_aloha_platforms
DualBootKernelPatcher,前者是移植高通的UEFI固件,后者是
基于内核头Patch的多启动实现。
参考上面两个项目的Readme来配置环境和编译,这里就不细说了,下面主要写如何把Linux和设备树塞到UEFI里面,还有Dualboot的生成。

构建UEFI FD​

  1. 把设备树文件复制到mu_aloha_platforms/Platforms/Device/ayaneo-aps/DeviceTreeBlob/Linux/
    1cp ~/kernel/OUT/arch/arm64/boot/dts/qcom/sm8550-ayaneo-ps.dtb ~/mu_aloha_platforms/Platforms/Device/ayaneo-aps/DeviceTreeBlob/Linux/
    BASH
  2. 用内核文件替换默认的UFP Menu.
    1cp ~/kernel/OUT/arch/arm64/boot/Image ~/mu_aloha_platforms/Platforms/AndromedaPkg/UFP/ufpdevicefw.efi
    BASH
  3. 扩容FV
    参考下面的Diff,修改Platforms/KailuaPkg/Kailua.fdf文件,具体大小依照你的内核大小来算。
    1
    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
    还有build_cfg/sm8550.json
    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
  4. 修改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
    9
    INF $(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
  1. 修改日志打印宏
    如果希望把日志打到屏幕,修改Platforms/KailuaPkg/KailuaNoSb.dsc,如果是secureboot启用的话,
    修改Platforms/KailuaPkg/KailuaNoSb.dsc。
    1
    2
    - USE_SCREEN_FOR_SERIAL_OUTPUT = 0
    + USE_SCREEN_FOR_SERIAL_OUTPUT = 1
    DIFF
  2. 编译
    只需要按照正常的流程编译就行了
    ./build_uefi.py -d ayaneo-aps -t DEBUG
  3. 测试
    那我问你,我的bootloader虽然本来就是解锁的,但是他什么命令都没有怎么办?比如没有
    fastboot flash和fastboot boot?没错,这台机器就是这样的,abl是userbuild,默认
    关闭了几乎所有命令。如果此时你没有从神奇海螺里掏出来一个公版的ABL,
    那你就老老实实备份你的boot,然后去fastbootd刷进boot分区测试,
    如果你没备份,那你可以考虑看一下下面的救砖部分了
    1
    2
    # 临时启动
    fastboot boot Build/KailuaPkg/ayaneo-aps.img
    BASH
    1
    2
    3
    4
    # 刷入测试
    adb reboot fastboot
    fastboot flash boot Build/KailuaPkg/ayaneo-aps.img
    fastboot reboot
    BASH

构建dualboot​

这里需要用到magiskboot或者其他解包工具,推荐使用Github上现成的magiskboot prebuilt.
  1. 解包内核
    去QFIL备份你的boot,ab槽都备份,我的机器这里当前处于b槽,下面以b槽为例,
    至于如果分辨当前处于ab哪个槽的话,去fastbootd执行:
    1fastboot getvar current-slot
    BASH
    解包boot
    1
    2
    3
    mkdir ayaboot && cd ayaboot
    /path/to/your/magiskboot unpack boot_b
    cp kernel okernel # 备份原内核
    BASH
    解包过程通常伴随以下日志,并且在当前目录生成kernel文件。
    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
  2. patch内核
    这里假定你已经按照项目的Readme编译完成dbkp.
    按照如下的diff修改DualBoot.Sm8550.cfg
    1
    2
    3
    StackBase=0xC7CC0000
    -StackSize=0x00400000
    +StackSize=0x03400000
    DIFF
    之后生成patch过的的kernel文件,参数分别为:
    1Usage: <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. 重新打包内核
    1
    2
    cd ~/ayaboot
    /path/to/your/magiskboot repack boot_b newboot
    SHELL
  2. 测试
    没办法用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刷那个包就行了,里面应该有附带教程。
如果你的ABL被你搞炸了,我指的是开机按音量-进不去fastboot,那你只能网购一条
高通工程线二代来进9008了。
完结撒花~ Congratulations!!! 🎉🎉🎉

原文链接 https://kancy.life/2025/06/06/APSLinux/
 
柚坛社区
你的玩机资源库
扫码用手机打开

-关注我们-

QQ Popup Image
WeChat Popup Image
Weibo Popup Image
Bilibili Popup Image
Douyin Popup Image
Kuaishou Popup Image