构建orangePi r1 plus (RK3328)系统的整个过程

构建orangePi r1 plus (RK3328)系统的整个过程

======================================

前言

 本内容是用于构建orangePi r1 plus系统的,不使用官方脚本构建,而是使用官方源码一点一点构建起来,适用有编译linux基础的开发者。

下载toolchain

地址
解压之后 添加到环境变量中

export PATH=$PATH:/home/lan/orangePi/tools/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin

下载orange_build

因为编译内核需要使用到相关的工具,这些工具可以在orangepi的官方下载到,也就是在下range_build中,点击链接
需要修改一下文件scripts/general.sh 修改内容如下图:
在这里插入图片描述

修改之后就不会下载全部的工具链,根据官方文档的教程编译一下uboot,和kernel,时间比较长。

编译自己的内核

下载linux内核

点击进入下载

 解压(比较喜欢用ubuntu自带的文件管理器解压,比较方便,直接右键提取到此目录)。
为了方便,需要先修改顶层makefile文件,打开makefile,在适合的地方添加上:

ARCH=arm64
CROSS_COMPILE=aarch64-none-linux-gnu-

拷贝config文件

cp /home/lan/orangePi/orangepi-build/external/config/kernel/linux-rockchip64-current.config /home/lan/orangePi/linux-orangepi-orange-pi-5.8-rockchip64/.config

然后 执行下面的命令:

cd /home/lan/orangePi/linux-orangepi-orange-pi-5.8-rockchip64
make menconfig  #进入之后配置自己需要的功能,比如nfs挂载文件系统,mac驱动编译到内核等等。 保存之后就可以开始编译了。
make -j8

等待编译完毕。之后在arch/arm64/boot 里会有一个Image未压缩的镜像文件,最终也是使用这个文件启动内核。(arm
64的内核是不压缩的。)

==========================

编译u-boot

下载uboot 下载
与前面一样解压、进入文件夹
同样先修改顶层makefile,但是有点不一样需要添加到makefile的内容如下:

ARCH=arm
CROSS_COMPILE=aarch64-none-linux-gnu-

执行命令

make orangepi_r1_plus_rk3328_defconfig 

修改.congfig

默认的config是将uboot的环境变量存储在mmc0上,设备不存在mmc0所以会保存失败。要修改config使环境变量保存在mmc1中也就是sd卡。
用文本编辑器打开.config 搜索CONFIG_SYS_MMC_ENV_DEV ,然后修改值为1如:CONFIG_SYS_MMC_ENV_DEV=1 ,
搜索CONFIG_BOOTDELAY 将其值改为3。

make -j4

还需要修改一下配置参数,make menuconfig 搜索 CONFIG_OF_LIST 然后按1,会显示如下:

(rk3328-orangepi-r1-plus) Default Device Tree for DT control
(rk3328-orangepi-r1-plus) List of device tree files to include for DT control

Symbol: OF_LIST [=rk3328-orangepi-r1-plus]
│ Type : string
│ Prompt: List of device tree files to include for DT control
│ -> Location:
│ ----> Device Tree Control

将这两个参数都改成对应的设备树 rk3328-orangepi-r1-plus,如果不修改设备树,板子会检查DDR发生错误无法启动。

========================================================================================

说明一下最后生成的文件:
u-boot:由个个builtin.a链接而成的ubot原始文件可执行
u-boot-nodtb.bin:u-boot经过objcopy转换,并且添加一些段(section)之后的文件
u-boot-dtb.bin:cat u-boot-nodtb.bin dts/dt.dtb > u-boot-dtb.bin 其中dts/dt.dtb来自rk3328-orangepi-r1-plus.dtb,就是前面设置的设备树
u-boot-dtb.img:由tools/mkimage工具将设备树和u-boot-nodtb.bin两个文件整合成新的镜像文件。
u-boot.img:与u-boot-dtb.img的制作方式完全相同,这两个是一样的文件。这个也是我们最终要烧写的uboot镜像文件

以上是正常的uboot文件,下面介绍spl和tpl的镜像文件

tpl是最初的一级启动,用于初始化DDR,spl是二级引导启动,引导最终的uboot完整程序。
~~关于tpl和spl的文件在目录下的tpl、spl文件夹中。
编译之后会生成包含设备树的tpl镜像——u-boot-tpl-rockchip.bin 包含设备树的spl镜像——u-boot-spl-dtb.bin
idbloader.img:cat tpl/u-boot-tpl-rockchip.bin spl/u-boot-spl.bin > idbloader.img,spl和tpl合成了一个镜像。
u-boot-rockchip.bin:idbloader.img经过objcopy,添加段,填充FF之后生成u-boot-rockchip.bin,这个也是我们要烧写的一级、二级引导。

========================================================================================

修正 无法初始化SD卡的问题

使用闪迪的sd卡时,uboot默认的spl程序是无法初始化的,最后会启动失败

用orangepi_build带的工具制作一二级启动引导程序(其实在uboot中也有这个工具)
新建一个 mkimage.sh

vim mkimage.sh

输入以下内容,具体的文件根据自己的路径进行修改。
#/bin/bash

export PATH=$PATH:/home/lan/orangePi/orangepi-build/external/cache/sources/rkbin-tools/tools
mkimage -n rk3328 -T rksd -d /home/lan/orangePi/orangepi-build/external/cache/sources/rkbin-tools/rk33/rk3328_ddr_333MHz_v1.16.bin idbloader.bin
cat /home/lan/orangePi/orangepi-build/external/cache/sources/rkbin-tools/rk33/rk3328_miniloader_v2.46.bin >> idbloader.bin
loaderimage --pack --uboot /home/lan/orangePi/orangepi-build/u-boot/v2020.10-rockchip64/u-boot-dtb.bin uboot.img 0x200000

idbloader.bin 是合并了rk3328_ddr_333MHz_v1.16.bin rk3328_miniloader_v2.46.bin两个程序,适用于uboot引导。这是瑞芯微官方给的引导启动程序,不能使用uboot编译出来的spl 和tpl程序,spl程序在初始化sd卡的时候有问题,无法初始化。如果有能力修改的话也可以将它修复。

======================================================================================

构建根文件系统

根文件系统的构建网上很多,这里采用了正点原子的linux驱动开发教程38.2节,按照教程可以成功构建。
等我摸清楚busybox 会专门出一章。

系统烧录

这里的系统烧录是直接将SD卡直接制作成启动盘使用,没有制作烧录文件,这样可以很清楚知道uboot、kernel、rootfs、dtb的存放位置具体步骤如下:
1、磁盘分区
安装一个ubuntu下运行的软件,当然会使用mkfs命令也一样能做。

sudo apt-get install gparted 

安装好,插入读卡器,然后打开软件(可以使用Ubuntu的启动,ubuntu18在右下角点开启动,搜索gparted双击启动),右上角,切换盘符/dev/sdb,如下:
在这里插入图片描述

这里我已经做好分区了,具体步骤如下:

1、卸载SD卡
2、点击设备、创建分区,然后确定,选择gpt。
3、新建分区,格式为fat32,前留16M,分区大小112M,然后确定。 如下图

在这里插入图片描述

3、新建分区,分区类型为ext4,可以把后面的大小全部给这个分区,这是用于存放文件系统的。
4、修改卷标fat32分区改为boot,ext4分区改为rootfs
5、上方点击打勾

具体的分区表查看下图
在这里插入图片描述


烧写uboot

将sd卡连接到Ubuntu下,在命令行下输入以下指令:

sudo dd if=idbloader.bin of=/dev/sdb seek=64  
sudo dd if=boot.img of=/dev/sdb seek=16384

拷贝内核和设备树

先要挂载才能拷贝或者直接断开SD,再连接,之后会在media下自动挂载。

sudo cp -r /home/lan/orangePi/linux-orangepi-orange-pi-5.8-rockchip64/arch/arm64/boot/Image /media/lan/BOOT 
sudo cp -r /home/lan/orangePi/linux-orangepi-orange-pi-5.8-rockchip64/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1plus.dtb /media/lan/BOOT 
sudo cp -r /home/lan/orangePi/rootfs/* /media/lan/rootfs

启动内核

插入sd卡上电启动设备,连接串口看到打印信息,串口波特率为1500000。
在出现 Hit any key to stop autoboot: 3 之后按回车进入uboot的命令行。

修改 bootcmd 和bootargs

setenv  bootargs console=ttyS2,1500000 earlyprintk root=/dev/mmcblk0p2 rootwait rw
setenv  bootcmd 'mmc dev 1;fatload mmc 1:1 02080000 Image;fatload mmc 1:1 01f00000 rk3328-orangepi-r1plus.dtb;booti 02080000 - 01f00000;'
saveenv
boot

这样就能启动系统里。

总结

至此就完成了整个系统的制作,如果制作过程中出现了什么问题,可以在下方留言。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值