当前位置:   article > 正文

基于RK3568的Linux开发_rk356x_linux_sdk

rk356x_linux_sdk

第一篇 RK3568 Linux系统移植

前言

本文主要介绍了如何编译官方的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包根目录下的文件夹参考如下:

 三、编译linux系统固件

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

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

查看编译脚本的帮助信息

./build.sh -h

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

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

./build.sh lunch

 

选择板级配置文件

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

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

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

2.编译Linux系统

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

./build.sh all

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

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

电源域配置所在的设备树文件为rk3568-evb.dtsi 该文件位为SDK包根目录下/kernel/arch/arm64/boot/dts/rockchip/目录下

设备树中的电源域默认配置如下:

  1. &pmu_io_domains {
  2. status = "okay";
  3. pmuio2-supply = <&vcc3v3_pmu>;
  4. vccio1-supply = <&vccio_acodec>;
  5. vccio3-supply = <&vccio_sd>;
  6. vccio4-supply = <&vcc_3v3>;
  7. vccio5-supply = <&vcc_3v3>;
  8. vccio6-supply = <&vcc_3v3>;
  9. vccio7-supply = <&vcc_3v3>;
  10. };

3.打包固件 

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

./mkfirmware.sh

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

./build.sh updateimg

四、系统移植和定制化

1.板级配置文件定制化

1)新建默认配置文件

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

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

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

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

2)新建设备树文件

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

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

将rk3568-evb1-ddr4-v10-linux.dts文件中的内容复制到rk3568-wheel-lpddr4.dts

内容如下

  1. // SPDX-License-Identifier: (GPL-2.0+ OR MIT)
  2. /*
  3. * Copyright (c) 2020 Rockchip Electronics Co., Ltd.
  4. *
  5. */
  6. #include "rk3568-evb1-ddr4-v10.dtsi"
  7. #include "rk3568-linux.dtsi"
  8. #include <dt-bindings/display/rockchip_vop.h>

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

3)新建板级配置文件

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

默认的板级配置文件为

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

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

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

修改后的内容如下

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

2.修改电源域

在SDK工程/kernel/arch/arm64/boot/dts/rockchip/目录下的rk3568-wheel-lpddr4.dts设备树文件中进行电源域的修改

电源域默认配置如下:

  1. &pmu_io_domains {
  2. status = "okay";
  3. pmuio2-supply = <&vcc3v3_pmu>;
  4. vccio1-supply = <&vccio_acodec>;
  5. vccio3-supply = <&vccio_sd>;
  6. vccio4-supply = <&vcc_3v3>;
  7. vccio5-supply = <&vcc_3v3>;
  8. vccio6-supply = <&vcc_3v3>;
  9. vccio7-supply = <&vcc_3v3>;
  10. };

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

 配置的电源域配置为

  1. &pmu_io_domains {
  2. status = "okay";
  3. //自己的板子电源域配置
  4. pmuio1-supply = <&vcc3v3_pmu>;
  5. pmuio2-supply = <&vcc3v3_pmu>;
  6. vccio1-supply = <&vccio_0v>;
  7. vccio3-supply = <&vccio_sd>;
  8. vccio4-supply = <&vccio_0v>;
  9. vccio5-supply = <&vcc_3v3>;
  10. vccio6-supply = <&vcc_1v8>;
  11. vccio7-supply = <&vcc_3v3>;
  12. };
  13. &i2c0 {
  14. rk809: pmic@20 {
  15. regulators {
  16. //自己的板子不输出电压
  17. vccio_0v: LDO_REG4 {
  18. regulator-always-off;
  19. regulator-boot-on;
  20. regulator-min-microvolt = <3300000>;
  21. regulator-max-microvolt = <3300000>;
  22. regulator-name = "vccio_0v";
  23. regulator-state-mem {
  24. regulator-off-in-suspend;
  25. };
  26. };
  27. /*
  28. //默认LDO_REG4节点配置
  29. vccio_acodec: LDO_REG4 {
  30. regulator-always-on;
  31. regulator-boot-on;
  32. regulator-min-microvolt = <3300000>;
  33. regulator-max-microvolt = <3300000>;
  34. regulator-name = "vccio_acodec";
  35. regulator-state-mem {
  36. regulator-off-in-suspend;
  37. };
  38. };
  39. */
  40. };
  41. };
  42. };

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设备树文件

修改如下:

  1. / {
  2. aliases {
  3. serial4 = &uart4; //添加uart4的配置
  4. ethernet0 = &gmac0;
  5. ethernet1 = &gmac1;
  6. mmc0 = &sdhci;
  7. mmc1 = &sdmmc0;
  8. mmc2 = &sdmmc1;
  9. };
  10. chosen {
  11. stdout-path = &uart4; //uart2->uart4
  12. u-boot,spl-boot-order = &sdmmc0, &sdhci, &nandc0, &spi_nand, &spi_nor;
  13. };
  14. };
  15. &uart4 { //uart2->uart4
  16. clock-frequency = <24000000>;
  17. u-boot,dm-spl;
  18. /delete-property/ pinctrl-names;
  19. /delete-property/ pinctrl-0;
  20. status = "okay";
  21. };

修改kernel的调试串口

在SDK工程对/kernel/arch/arm64/boot/dts/rockchip/目录下的rk3568-wheel-lpddr4.dts设备树文件中进行调试串口修改,修改后的调试串口节点如下:

  1. /{
  2. //调试串口配置uart2->uart4
  3. chosen:chosen {
  4. bootargs = "earlycon=uart8250,mmio32,0xfe680000 console=ttyFIQ0
  5. root=PARTUUID=614e0000-0000 rw rootwait"; //uart4的地址为0xfe680000
  6. };
  7. fiq-debugger { //uart2->uart4
  8. compatible = "rockchip,fiq-debugger";
  9. rockchip,serial-id = <4>; //uart4对应的serial-id为4
  10. rockchip,wake-irq = <0>;
  11. /* If enable uart uses irq instead of fiq */
  12. rockchip,irq-mode-enable = <1>;
  13. rockchip,baudrate = <1500000>; /* Only 115200 and 1500000 */
  14. interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_LOW>;
  15. pinctrl-names = "default";
  16. pinctrl-0 = <&uart4m1_xfer>; //uart4使用的GPIO
  17. status = "okay";
  18. };
  19. //关闭uart4普通串口功能
  20. &uart4 {
  21. status = "disabled";
  22. };

 更改完成后,需要对uboot和kernel进行重新编译

4.下载固件

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

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

 最后点击升级即可

5.查看调试信息

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

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

打开串口调试工具MobaXterm。

  1. 选择 session 为 Serial

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

  3. 设置 Speed (bsp) 为 1500000。

  4. 点击 OK 按钮。

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

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

根据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编译源码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/224001
推荐阅读
相关标签
  

闽ICP备14008679号