完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本内容是用于构建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 这样就能启动系统里。 总结 至此就完成了整个系统的制作,如果制作过程中出现了什么问题,可以在下方留言。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1567 浏览 1 评论
synopsys 的design ware:DW_fpv_div,浮点数除法器,默认32位下,想提升覆盖率(TMAX),如果用功能case去提升覆盖率呢?
1790 浏览 1 评论
RK3588 GStreamer调试四路鱼眼摄像头四宫格显示报错
4465 浏览 1 评论
【飞凌嵌入式OK3576-C开发板体验】RKNN神经网络-YOLO图像识别
254 浏览 0 评论
【飞凌嵌入式OK3576-C开发板体验】SSH远程登录网络配置及CAN通讯
1336 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 14:40 , Processed in 0.625958 second(s), Total 73, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号