基于RK3568的Linux开发

第一篇 RK3568 Linux系统移植

文章目录

目录

第一篇 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系统进行移植和裁剪。

一、编译环境搭建

1.编译环境介绍

操作系统:Ubuntn18.04

内存:4GB及其以上

2.安装依赖

在安装依赖之前,对操作系统进行更新

 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_SDK包

1.解压RK356X_Linux_SDK压缩包

将下载好的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/

2.目录结构

SDK包根目录下的文件夹参考如下:

基于RK3568的Linux开发_第1张图片

 三、编译linux系统固件

注意:以下操作均在SDK包的根目录下进行

瑞芯微为我们提供了一个很方便的编译脚本build.sh.可进行分步编译和一键编译。

查看编译脚本的帮助信息

./build.sh -h

基于RK3568的Linux开发_第2张图片

1 选择合适的板级配置文件

查看系统默认的板级配置文件

./build.sh lunch

 基于RK3568的Linux开发_第3张图片

选择板级配置文件

根据自己板子芯片和内存的选型,选择和板子适配的板级配置文件

方便后期进行系统移植和定制化

例如:我们使用的芯片为RK3568,内存为DDR4,因此选择第5个配置文件

2.编译Linux系统

由于我们是第一次进行编译,选择全自动编译,确保SDK包可以使用

./build.sh all

在编译kernel的过程中,系统会弹出电源域的图形化界面,所以需要对设备树中的电源域配置进行再次确认,找到对应的设备树文件,与之一一对应即可。

电源域的图形化界面如图所示:

基于RK3568的Linux开发_第4张图片

电源域配置所在的设备树文件为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>;
};

3.打包固件 

执行以下命令,生成的镜像将会被打包到rockdev 目录下

./mkfirmware.sh

执行以下命令,在rockdev 目录下生成update.img

./build.sh updateimg

四、系统移植和定制化

1.板级配置文件定制化

1)新建默认配置文件

RK3568的默认配置文件存放在SDK工程kernel/arch/arm64/configs/目录下

在当前目录下,新建一个名为wheel_linux_defconfig的默认配置文件(可根据自己要求进行命名)

基于RK3568的Linux开发_第5张图片

将rockchip_linux_defconfig文件中的内容复制到wheel_linux_defconfig,在板级配置文件会将默认的配置文件更改为新建的配置文件

在进行驱动开发时,我们可以通过内核的图形化界面和直接更改默认配置文件的方式,选择驱动是编译进内核还是编译成模块,亦或者是不编译。使用自己的默认配置文件可以实现驱动的定制化。

2)新建设备树文件

RK3568的设备树文件存放在SDK工程kernel/arch/arm64/boot/dts/rockchip/目录下

在当前目录下,新建一个名为rk3568-wheel-lpddr4.dts的设备树文件(一般命名格式为:芯片名称-厂商名称-内存类型.dts)

基于RK3568的Linux开发_第6张图片

将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 

使用自己的设备树文件,可以根据自己的需求对内核的功能进行定制化。对于需要修改的设备节点,只需要在自己的设备树文件当中修改即可。这样既可以保证原始设备树的完整性,又与其他不同厂商制作板卡的设备树文件相互独立,互不干扰。

3)新建板级配置文件

RK3568的板级配置文件存放在SDK工程device/rockchip/rk356x目录下

默认的板级配置文件为

基于RK3568的Linux开发_第7张图片

其中我们主要需要关注的内容如下:

基于RK3568的Linux开发_第8张图片

新建一个BoardConfig-rk3568-wheel-lpddr4.mk板级配置文件

基于RK3568的Linux开发_第9张图片

复制BoardConfig-rk3568-evb1-ddr4-v10.mk文件的内容到BoardConfig-rk3568-wheel-lpddr4.mk板级配置文件当中,并对其进行修改

修改后的内容如下

基于RK3568的Linux开发_第10张图片

到此,通过修改自己的板级配置文件,简单现了Linux内核的定制化,接下来,便是针对自己的板卡,对内核进行裁剪和移植。

2.修改电源域

在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>;
};

根据自制板卡的原理图,对电源域进行配置

基于RK3568的Linux开发_第11张图片

 配置的电源域配置为

&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;
				};
			};
            */
        };
    };
};

3.更改调试串口

修改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进行重新编译

4.下载固件

使用瑞芯微开发工具RKDevTool,它提供分立升级固件及整个 update 升级固件功能

基于RK3568的Linux开发_第12张图片

 点击升级固件。点击固件,选择编译好的update.img镜像文件

基于RK3568的Linux开发_第13张图片

 最后点击升级即可

基于RK3568的Linux开发_第14张图片

5.查看调试信息

串口调试工具MobaXterm下载地址:https://mobaxterm.mobatek.net/

使用串口调试器连接PC端USB和板卡的UART4

打开串口调试工具MobaXterm。

  1. 选择 session 为 Serial

  2. 将 Serial port 修改为在设备管理器中找到的 COM 端口。

  3. 设置 Speed (bsp) 为 1500000。

  4. 点击 OK 按钮。

基于RK3568的Linux开发_第15张图片

给板子上电,接收调试信息

基于RK3568的Linux开发_第16张图片

根据调试信息,定位系统出现问题的位置,对内核进行相应的修改

根据SDK工程docs/Common/DDR目录下的Rockchip_Trouble_Shooting_DDR_CN.pdf(DDR问题排查手册)的描述。尝试通过降低内存的运行频率的方式来提高系统的稳定性。

6.降低内存的运行频率

找到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

 7.更新固件

配置生效后,重新编译内核并打包update.img系统镜像

./mkfirmware.sh

./build.sh updateimg

使用RKDevTool将新编译好的固件下载到板子当中(详细操作见4.4小节)

重新给板子上电,系统正常运行。成功进入buildrootGUI界面

五、debian根文件系统的构建

1.配置环境变量

export RK_ROOTFS_SYSTEM=debian 

//如果是yocto 就export RK_ROOTFS_SYSTEM=yocto

2.编译debian

./build.sh debian

3.更新固件

执行以下命令,生成新的update.img

./mkfirmware.sh

./build.sh updateimg

使用RKDevTool将新编译好的固件下载到板子当中(详细操作见4.4小节)

参考教程

1. 编译 Linux 固件 — Firefly Wiki (t-firefly.com)

2. RK3568下载SDK编译源码

你可能感兴趣的:(debian,linux)