立创·泰山派:Linux内核5.10移植实战(设备树移植+源码获取)
【本文基于 立创·泰山派开发板 验证通过,注:需要编译老版本内核成功的SDK]
一、内核移植背景
1.1 为何选择Linux 5.10
- 长期支持:LTS版本
- 新特性:
- 改进的RISC-V架构支持
- 增强的电源管理(适合低功耗设备)
- 更新的驱动生态(WiFi/BT/GPU等)
1.2 移植目标
模块 | 版本 | 验证状态 |
---|---|---|
内核核心 | 5.10.160 | ✔️ |
设备树 | rockchip+tspi | ✔️ |
系统编译 | ubuntu20.04 | ✔️ |
二、源码获取与准备
2.1 官方源码仓库
# 进入泰山派工作目录,保存老内核目录
mv kernel kernel_old
# 克隆内核仓库,改名为 kernel
git clone --depth 1 -b 5.10.160-37 https://github.com/Joshua-Riek/linux-rockchip
mv linux-rockchip kernel
cd kernel
# 清除编译命令
make clean && make distclean
# 目录结构关键路径
├── arch/arm64/boot/ # Image
├── drivers/ # 驱动文件
└── arch/arm64/boot/dts/rockchip/ # 设备树文件
2.2 设备树文件备份与迁移(必看:关键操作)
# 从旧内核(4.19)复制设备树文件,当前在新的 kernel目录下
cp ../kernelold/arch/arm64/boot/.Image* ./arch/arm64/boot/
cp ../kernelold/arch/arm64/boot/Image* ./arch/arm64/boot/
cp ../kernelold/arch/arm64/boot/dts/rockchip/.tspi* ./arch/arm64/boot/dts/rockchip/
cp ../kernelold/arch/arm64/boot/dts/rockchip/tspi* ./arch/arm64/boot/dts/rockchip/
# 添加编译选项:
# 在 ./arch/arm64/boot/dts/rockchip/Makefile 内
# 在 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-rk817-tablet-v10.dtb 下一行添加
dtb-$(CONFIG_ARCH_ROCKCHIP) += tspi-rk3566-user-v10-linux.dtb
# 😀 问题3.1解决:目前在新建的 kernel 目录
# 在 ./Makefile 内
# 41 行 MAKEFLAGS 参数后 加一个 --include-dir=$(CURDIR)
MAKEFLAGS += -rR --include-dir=$(CURDIR)
# 384 行在 ARCH ?= $(SUBARCH) 下面 添加
ifeq ($(ARCH),arm64)
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu),)
CROSS_COMPILE ?= $(srctree)/../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
endif
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9),)
CROSS_COMPILE ?= $(srctree)/../prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-
endif
endif
ifeq ($(ARCH),arm)
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf),)
CROSS_COMPILE ?= $(srctree)/../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
endif
ifneq ($(wildcard $(srctree)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9),)
CROSS_COMPILE ?= $(srctree)/../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin/arm-linux-androidkernel-
endif
endif
# 😀 问题3.2解决:目前在新建的 kernel 目录
# 进入 ./drivers/media/i2c/Makefile 内
# 找到 obj-$(CONFIG_VIDEO_SC4210) += sc4210.o 在其上方加CFLAGS_REMOVE_sc4210.o := -mgeneral-regs-only:如
CFLAGS_REMOVE_sc4210.o := -mgeneral-regs-only
obj-$(CONFIG_VIDEO_SC4210) += sc4210.o
三、遇到的问题与解决方案
3.1 编译工具链问题
问题现象:
gcc:error:unrecognized command line option '-mlittle-endian'
make[2]: ***[scripts/Makefile.build:273:scripts/mod/empty.o] 错误1
make[2]: ***正在等待未完成的任务..
gcc:error:unrecognized command line option '-mlittle-endian'
make[2]:**[scripts/Makefile.build:117:scripts/mod/devicetable-offsets.s] 错误1
nake[1]:*[Makefile:1343:prepare0] 错误2
make[1]:*正在等待未完成的任务..
nake:**[arch/arm64/Makefile:214:tspi-rk3566-user-v10-linux.img]....
原因分析:
gcc 默认是小端模式,通常不需要显式指定 -mlittle-endian
,通常表明使用的是 gcc 或者其他工具链不匹配 ARM64 体系结构,
解决方案:
修改编译内核时使用的工具链
在SDK/kernel/Makefile
中使用 gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
编译工具链
具体操作在 👆问题3.1解决
3.2 浮点数运算不兼容
问题现象:
drivers/media/i2c/sc4210.c:In function 'sc4210_get_gain_reg':
drivers/media/i2c/sc4210.c:1687:13:error:'-mgeneral-regs-only'is incompatible with floating-point code
static void sc4210_get_gain_reg(u32 total_gain,u32 *again,u32 *again_fine,
drivers/media/i2c/sc4210.c:1687:13:error:'-mgeneral-regs-only'is incompatible with floating-point code
make[4]: ***[scripts/Makefile.build:273:drivers/media/i2c/sc4210.o] 错误1
make[3]: ***[scripts/Makefile.build:516:drivers/media/i2c] 错误2
make[2]: ***[scripts/Makefile.build:516:drivers/media] 错误2
make[2]:*正在等待未完成的任务..
原因分析:
-mgeneral-regs-only
选项告诉编译器只使用通用寄存器(整数寄存器),但 sc4210_get_gain_reg
这个函数(或者它调用的函数)可能使用了浮点数计算,导致编译失败
解决方案:
仅对 sc4210.c
禁用 -mgeneral-regs-only
,添加 CFLAGS_REMOVE_sc4210.o := -mgeneral-regs-only
具体操作:👆问题3.2解决
四、内核编译与烧录
4.1 编译命令
# 配置平台参数,查看目前的配置
./build.sh -h kernel
输出如下:
[ ###Current SDK Default [ kernel ] Build Command###
cd kernel
make ARCH=arm64 rockchip_linux_defconfig
make ARCH=arm64 tspi-rk3566-user-v10-linux.img -j16
]
# 如果不是 tspi-rk3566-user-v10-linux.img,运行
./build.sh lunch 进行选择
# 编译:
./build.sh kernel
4.2 烧录镜像
使用工具 RKDevTool.exe 烧录 boot.img
五、验证与调试
5.1 启动日志检查
# 查看内核版本
root@RK356X:/# uname -a
Linux RK356X 5.10.160 #1 SMP Thu Mar 27 14:31:45 CST 2025 aarch64 GNU/Linux
六、资源下载路径
资源类型 | 获取地址 |
---|---|
Linux 5.10内核源码 | 在github上获取 |
百度网盘获取 | |
配置好的内核源码 (只需编译) | 网盘获取 |
移植成果总结:
通过适配设备树,泰山派成功运行Linux 5.10内核,关键功能均通过验证。后续可针对具体应用场景进行深度优化,如配置WIFI,网卡,NPU,GPU等。
问题交流:
如在移植过程中遇到其他问题,欢迎在评论区留言,提供详细日志可获得针对性解答!