内核 RK3328
怎样去构建orangePi r1 plus (RK3328)系统呢?其过程是怎样的?
回帖(1)
2022-3-9 14:38:12
本内容是用于构建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
这样就能启动系统里。
总结
至此就完成了整个系统的制作,如果制作过程中出现了什么问题,可以在下方留言。
本内容是用于构建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
这样就能启动系统里。
总结
至此就完成了整个系统的制作,如果制作过程中出现了什么问题,可以在下方留言。
举报