目录
第一篇 RK3568 Linux系统移植
文章目录
前言
一、编译环境搭建
1.编译环境介绍
2.安装依赖
二、获取官方的RK356X_Linux_SDK包
1.解压RK356X_Linux_SDK压缩包
2.目录结构
三、编译linux系统固件
1 选择合适的板级配置文件
2.编译Linux系统
3.打包固件
四、系统移植和定制化
1.板级配置文件定制化
1)新建默认配置文件
2)新建设备树文件
3)新建板级配置文件
2.修改电源域
3.更改调试串口
4.下载固件
5.查看调试信息
6.降低内存的运行频率
7.更新固件
五、debian根文件系统的构建
1.配置环境变量
2.编译debian
3.更新固件
参考教程
本文主要介绍了如何编译官方的RK356X_Linux_SDK包。针对自制的RK3568板卡对Linux系统进行移植和裁剪。
操作系统:Ubuntn18.04
内存:4GB及其以上
在安装依赖之前,对操作系统进行更新
sudo apt update
安装依赖
sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \
expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake \
unzip device-tree-compiler python-pip ncurses-dev python-pyelftools
确保所有依赖安装成功后,才能进行下一步
将下载好的RK356X_LINUX_20220831文件放到/home/user目录下,如图所示:
进入RK356X_LINUX_20220831目录:
user@ubuntu18:~$ cd RK356X_LINUX_20220831/
解压RK356X_Linux_SDK压缩包
user@ubuntu18:~/RK356X_LINUX_20220831$ sudo cat x* | tar xz
解压后的文件如图所示:
进入SDK包根目录
user@ubuntu18:~/RK356X_LINUX_20220831$ cd RK356X_LINUX_SDK_V1.3.0_20220620/RK356X_LINUX_SDK_V1.3.0_20220620/
SDK包根目录下的文件夹参考如下:
注意:以下操作均在SDK包的根目录下进行
瑞芯微为我们提供了一个很方便的编译脚本build.sh.可进行分步编译和一键编译。
查看编译脚本的帮助信息
./build.sh -h
查看系统默认的板级配置文件
./build.sh lunch
选择板级配置文件
根据自己板子芯片和内存的选型,选择和板子适配的板级配置文件
方便后期进行系统移植和定制化
例如:我们使用的芯片为RK3568,内存为DDR4,因此选择第5个配置文件
由于我们是第一次进行编译,选择全自动编译,确保SDK包可以使用
./build.sh all
在编译kernel的过程中,系统会弹出电源域的图形化界面,所以需要对设备树中的电源域配置进行再次确认,找到对应的设备树文件,与之一一对应即可。
电源域的图形化界面如图所示:
电源域配置所在的设备树文件为rk3568-evb.dtsi 该文件位为SDK包根目录下/kernel/arch/arm64/boot/dts/rockchip/目录下
设备树中的电源域默认配置如下:
&pmu_io_domains {
status = "okay";
pmuio2-supply = <&vcc3v3_pmu>;
vccio1-supply = <&vccio_acodec>;
vccio3-supply = <&vccio_sd>;
vccio4-supply = <&vcc_3v3>;
vccio5-supply = <&vcc_3v3>;
vccio6-supply = <&vcc_3v3>;
vccio7-supply = <&vcc_3v3>;
};
执行以下命令,生成的镜像将会被打包到rockdev 目录下
./mkfirmware.sh
执行以下命令,在rockdev 目录下生成update.img
./build.sh updateimg
RK3568的默认配置文件存放在SDK工程kernel/arch/arm64/configs/目录下
在当前目录下,新建一个名为wheel_linux_defconfig的默认配置文件(可根据自己要求进行命名)
将rockchip_linux_defconfig文件中的内容复制到wheel_linux_defconfig,在板级配置文件会将默认的配置文件更改为新建的配置文件
在进行驱动开发时,我们可以通过内核的图形化界面和直接更改默认配置文件的方式,选择驱动是编译进内核还是编译成模块,亦或者是不编译。使用自己的默认配置文件可以实现驱动的定制化。
RK3568的设备树文件存放在SDK工程kernel/arch/arm64/boot/dts/rockchip/目录下
在当前目录下,新建一个名为rk3568-wheel-lpddr4.dts的设备树文件(一般命名格式为:芯片名称-厂商名称-内存类型.dts)
将rk3568-evb1-ddr4-v10-linux.dts文件中的内容复制到rk3568-wheel-lpddr4.dts
内容如下
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
* Copyright (c) 2020 Rockchip Electronics Co., Ltd.
*
*/
#include "rk3568-evb1-ddr4-v10.dtsi"
#include "rk3568-linux.dtsi"
#include
使用自己的设备树文件,可以根据自己的需求对内核的功能进行定制化。对于需要修改的设备节点,只需要在自己的设备树文件当中修改即可。这样既可以保证原始设备树的完整性,又与其他不同厂商制作板卡的设备树文件相互独立,互不干扰。
RK3568的板级配置文件存放在SDK工程device/rockchip/rk356x目录下
默认的板级配置文件为
其中我们主要需要关注的内容如下:
新建一个BoardConfig-rk3568-wheel-lpddr4.mk板级配置文件
复制BoardConfig-rk3568-evb1-ddr4-v10.mk文件的内容到BoardConfig-rk3568-wheel-lpddr4.mk板级配置文件当中,并对其进行修改
修改后的内容如下
到此,通过修改自己的板级配置文件,简单现了Linux内核的定制化,接下来,便是针对自己的板卡,对内核进行裁剪和移植。
在SDK工程/kernel/arch/arm64/boot/dts/rockchip/目录下的rk3568-wheel-lpddr4.dts设备树文件中进行电源域的修改
电源域默认配置如下:
&pmu_io_domains {
status = "okay";
pmuio2-supply = <&vcc3v3_pmu>;
vccio1-supply = <&vccio_acodec>;
vccio3-supply = <&vccio_sd>;
vccio4-supply = <&vcc_3v3>;
vccio5-supply = <&vcc_3v3>;
vccio6-supply = <&vcc_3v3>;
vccio7-supply = <&vcc_3v3>;
};
根据自制板卡的原理图,对电源域进行配置
配置的电源域配置为
&pmu_io_domains {
status = "okay";
//自己的板子电源域配置
pmuio1-supply = <&vcc3v3_pmu>;
pmuio2-supply = <&vcc3v3_pmu>;
vccio1-supply = <&vccio_0v>;
vccio3-supply = <&vccio_sd>;
vccio4-supply = <&vccio_0v>;
vccio5-supply = <&vcc_3v3>;
vccio6-supply = <&vcc_1v8>;
vccio7-supply = <&vcc_3v3>;
};
&i2c0 {
rk809: pmic@20 {
regulators {
//自己的板子不输出电压
vccio_0v: LDO_REG4 {
regulator-always-off;
regulator-boot-on;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-name = "vccio_0v";
regulator-state-mem {
regulator-off-in-suspend;
};
};
/*
//默认LDO_REG4节点配置
vccio_acodec: LDO_REG4 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-name = "vccio_acodec";
regulator-state-mem {
regulator-off-in-suspend;
};
};
*/
};
};
};
修改uboot的调试串口
找到SDK工程中rkbin/tools/目录下的ddrbin_param.txt文件
对其进行如下的修改:
uart id=4
uart iomux=1
在rkbin/tools/目录下执行以下命令,使新配置生效
./ddrbin_tool ddrbin_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.13.bin
修改uboot设备树中调试串口的配置
找到SDK工程u-boot/arch/arm/dts/目录下的rk3568-u-boot.dtsi设备树文件
修改如下:
/ {
aliases {
serial4 = &uart4; //添加uart4的配置
ethernet0 = &gmac0;
ethernet1 = &gmac1;
mmc0 = &sdhci;
mmc1 = &sdmmc0;
mmc2 = &sdmmc1;
};
chosen {
stdout-path = &uart4; //uart2->uart4
u-boot,spl-boot-order = &sdmmc0, &sdhci, &nandc0, &spi_nand, &spi_nor;
};
};
&uart4 { //uart2->uart4
clock-frequency = <24000000>;
u-boot,dm-spl;
/delete-property/ pinctrl-names;
/delete-property/ pinctrl-0;
status = "okay";
};
修改kernel的调试串口
在SDK工程对/kernel/arch/arm64/boot/dts/rockchip/目录下的rk3568-wheel-lpddr4.dts设备树文件中进行调试串口修改,修改后的调试串口节点如下:
/{
//调试串口配置uart2->uart4
chosen:chosen {
bootargs = "earlycon=uart8250,mmio32,0xfe680000 console=ttyFIQ0
root=PARTUUID=614e0000-0000 rw rootwait"; //uart4的地址为0xfe680000
};
fiq-debugger { //uart2->uart4
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <4>; //uart4对应的serial-id为4
rockchip,wake-irq = <0>;
/* If enable uart uses irq instead of fiq */
rockchip,irq-mode-enable = <1>;
rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
interrupts = ;
pinctrl-names = "default";
pinctrl-0 = <&uart4m1_xfer>; //uart4使用的GPIO
status = "okay";
};
//关闭uart4普通串口功能
&uart4 {
status = "disabled";
};
更改完成后,需要对uboot和kernel进行重新编译
使用瑞芯微开发工具RKDevTool,它提供分立升级固件及整个 update 升级固件功能
点击升级固件。点击固件,选择编译好的update.img镜像文件
最后点击升级即可
串口调试工具MobaXterm下载地址:https://mobaxterm.mobatek.net/
使用串口调试器连接PC端USB和板卡的UART4
打开串口调试工具MobaXterm。
选择 session
为 Serial
。
将 Serial port
修改为在设备管理器中找到的 COM 端口。
设置 Speed (bsp)
为 1500000。
点击 OK
按钮。
给板子上电,接收调试信息
根据调试信息,定位系统出现问题的位置,对内核进行相应的修改
根据SDK工程docs/Common/DDR目录下的Rockchip_Trouble_Shooting_DDR_CN.pdf(DDR问题排查手册)的描述。尝试通过降低内存的运行频率的方式来提高系统的稳定性。
找到SDK工程中rkbin/tools/目录下的ddrbin_param.txt文件
对其进行如下的修改:
/* Please get help from ddrbin_tool_user_guide.txt and './ddrbin_tool -h' */
start tag=0x12345678
ddr2_freq=
lp2_freq=
ddr3_freq=
lp3_freq=
ddr4_freq=
lp4_freq=1000 //将lpddr4的最高频率设置为1000Mhz
lp4x_freq=
lp5_freq=
在rkbin/tools/目录下执行以下命令,使新配置生效
./ddrbin_tool ddrbin_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.13.bin
配置生效后,重新编译内核并打包update.img系统镜像
./mkfirmware.sh
./build.sh updateimg
使用RKDevTool将新编译好的固件下载到板子当中(详细操作见4.4小节)
重新给板子上电,系统正常运行。成功进入buildrootGUI界面
export RK_ROOTFS_SYSTEM=debian
//如果是yocto 就export RK_ROOTFS_SYSTEM=yocto
./build.sh debian
执行以下命令,生成新的update.img
./mkfirmware.sh
./build.sh updateimg
使用RKDevTool将新编译好的固件下载到板子当中(详细操作见4.4小节)
1. 编译 Linux 固件 — Firefly Wiki (t-firefly.com)
2. RK3568下载SDK编译源码