RK3588运行Redroid时启用GPU加速

 

需要的内核配置

  • 内核版本 5.10/6.1 (需要自定义的6.1内核)
  • 【Mali CSF GPU 内核驱动】 或 【Mali 固件,置于/lib/firmware/下】
  • CONFIG_PSI=y CONFIG_ARM64_VA_BITS=39 CONFIG_ANDROID_BINDERFS=y
  • Android专有的 DMA-BUF 设备支持

你可以运行该脚本 envcheck.sh 来检查系统否满足要求这些要求。

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
# Armbian默认内核配置
# https://github.com/armbian/build/raw/main/config/kernel/linux-rk35xx-legacy.config
# https://github.com/armbian/build/raw/main/config/kernel/linux-rk35xx-vendor.config

# Redroid启用GPU加速内核配置需要动的地方
CONFIG_PSI=y
CONFIG_ARM64_VA_BITS=39
CONFIG_ANDROID_BINDERFS=y
CONFIG_MALI_BIFROST=y
CONFIG_MALI_CSF_INCLUDE_FW=y # 仅在 rk-6.1 中才存在

# Armbian默认的内核配置已有如上的配置项,仅需修改 CONFIG_ARM64_VA_BITS 即可
CONFIG_ARM64_VA_BITS_39=y
# CONFIG_ARM64_VA_BITS_48 is not set
CONFIG_ARM64_VA_BITS=39

# 也可直接用如下命令将将默认内核配置中的 CONFIG_ARM64_VA_BITS_48=y 改为39
sed -i 's/CONFIG_ARM64_VA_BITS_48=y/CONFIG_ARM64_VA_BITS_39=y/g' .config

# 该 CONFIG_ARM64_VA_BITS 配置项在内核配置菜单中的位置如下:
# General setup -> CPU/Task time and stats -> Pressure stall information tracking (PSI [=y])
# Kernel Features -> Virtual address space size -> 39-bit

# 在Armbian的vendor内核 rk-6.1-rkr* 中,如下信息适用
# 删除或禁用 /boot/armbianEnv.txt 中的 overlays=panthor-gpu 行,再重启便会有 /dev/mali0 设备了
# 需要 /dev/dma_heap/system-uncached 等,不需要 /lib/firmware/mali_csffw.bin
leux@6.1.84:~$ ls /dev/dma_heap/ # 有如下设备可正常连接
cma cma-uncached system system-dma32 system-uncached system-uncached-dma32
leux@6.1.99:~$ ls /dev/dma_heap/ # 可adb连接,但无法scrcpy连接
reserved system system-uncached

编译支持的内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo apt install git wget rsync dpkg-dev build-essential bc flex bison python-is-python3 libncurses-dev libelf-dev libssl-dev gcc-aarch64-linux-gnu

# 编译CNflysky提供的修改过dma-buf的内核源码,Armbian默认 6.1.99 内核源码可adb连接,但无法scrcpy连接
git clone --depth 1 -b rk-6.1-rkr4.1 https://github.com/CNflysky/linux-rockchip
cd linux-rockchip/
wget -O .config https://github.com/armbian/build/raw/main/config/kernel/linux-rk35xx-vendor.config
sed -i 's/CONFIG_ARM64_VA_BITS_48=y/CONFIG_ARM64_VA_BITS_39=y/g' .config

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)

# 开始安装内核到指定位置
KERNEL_PATH=$HOME/kernel && sudo mkdir -p ${KERNEL_PATH}/boot/
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install INSTALL_PATH=${KERNEL_PATH}/boot
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=${KERNEL_PATH} INSTALL_MOD_STRIP=1
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- headers_install INSTALL_HDR_PATH=${KERNEL_PATH}/usr
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs_install INSTALL_DTBS_PATH=${KERNEL_PATH}/boot/dtb-6.1.84

部署内核到系统

1
2
3
4
5
6
7
8
9
10
11
# 将上面交叉编译好的内核相关文件拷贝到RK3588系统中对应位置
sudo cp kernel/boot/* /boot && sudo cp -r kernel/lib/modules/6.1.84 /lib/modules/

KERNEL_VERSION=6.1.84 # 制作生成uInitrd文件
sudo mkinitramfs -c xz -o /boot/initrd.img-${KERNEL_VERSION} ${KERNEL_VERSION}
sudo mkimage -A arm64 -T ramdisk -C none -n uInitrd -d /boot/initrd.img-${KERNEL_VERSION} /boot/uInitrd-${KERNEL_VERSION}
cd /boot/ # 软链接内核文件以供uboot调用
sudo unlink dtb && sudo ln -sf dtb-${KERNEL_VERSION} dtb
sudo unlink Image && sudo ln -sf vmlinuz-${KERNEL_VERSION} Image
sudo unlink uInitrd && sudo ln -sf uInitrd-${KERNEL_VERSION} uInitrd

测试该Redroid

1
2
3
4
5
# 查看其他更多版本:https://hub.docker.com/r/cnflysky/redroid-rk3588/tags
sudo docker run -d --privileged --restart unless-stopped --name redroid \
-p 5555:5555 -v ~/redroid-data:/data cnflysky/redroid-rk3588:lineage-20 \
androidboot.redroid_height=1920 androidboot.redroid_width=1080

参数 描述 默认值
androidboot.redroid_fps 设置刷新率, 取值范围 (1,120) 60
androidboot.redroid_magisk 是否启用 Magisk 0
androidboot.redroid_fake_wifi 是否启用虚假 WiFi 0
androidboot.redroid_fake_wifi_ssid 设置虚假 WiFi SSID FakeWiFi
androidboot.redroid_fake_wifi_bssid 设置虚假 WiFi BSSID 66:55:44:33:22:11
androidboot.redroid_fake_wifi_mac 设置虚假 WiFi MAC 地址 11:22:33:44:55:66
androidboot.redroid_fake_wifi_speed 设置虚假 WiFi 速度(Mbps) 866
androidboot.redroid_adbd_bind_eth0 是否绑定ADB Socket到eth0上 1
ro.adb.secure 是否启用ADB调试授权认证 1
androidboot.redroid_create_secure_display 是否创建安全显示器 1
androidboot.redroid_enable_input_subsys 是否启用input子系统 0

添加到其他内核

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
# 以添加支持到Armbian的vendor内核 rk-6.1-rkr5 中为例,先查看支持功能的源码更改的内容
https://github.com/CNflysky/linux-rockchip/commit/c8b63e5eddbdebf16976e797334eaf5c5f845f34#diff-701540462f1f41f8bd7909c73f4271ec020cddfb3f0b5b09442bfbd08c419977

# 发现如下文件有改动
drivers/dma-buf/dma-buf-sysfs-stats.c # 可不动
drivers/dma-buf/dma-buf.c
drivers/dma-buf/dma-fence-unwrap.c
drivers/dma-buf/dma-heap.c # 关键点
drivers/dma-buf/dma-resv.c
drivers/dma-buf/sync_file.c
drivers/dma-buf/heaps/cma_heap.c
drivers/dma-buf/heaps/rk_cma_heap.c
drivers/dma-buf/heaps/rk_system_heap.c
drivers/dma-buf/heaps/system_heap.c # 可不动
include/linux/dma-buf.h
include/linux/dma-heap.h

# 新增了如下几个文件
drivers/dma-buf/heaps/deferred-free-helper.c
drivers/dma-buf/heaps/deferred-free-helper.h
drivers/dma-buf/heaps/page_pool.c
drivers/dma-buf/heaps/page_pool.h
include/linux/android_kabi.h


# 将【armbian_rkr5】和【CNflysky_rkr4.1】源码中上面对应的文件拷贝到新文件夹中对应位置来制作补丁
diff -Nur armbian-linux-rockchip/ redroid-linux-rockchip/ > $(KERNEL_PATCH_FILE)

# 将制作好的补丁打入【armbian_rkr5】的内核源码中
cd armbian-rk-6.1-rkr5
patch -p1 < $(KERNEL_PATCH_FILE) # -pN:打补丁时要忽略掉第N层目录