RK3568开发笔记(四):在虚拟机上使用SDK编译制作uboot、kernel和buildroot镜像
前言
上一篇搭建好了ubuntu宿主机开发环境,本篇的目标系统主要是开发linux+qt,所以需要刷上billdroot+Qt创建的系统,为了更好的熟悉原理和整个开发过程,选择从零开始搭建rk3568的sdk开发环境。
RK系列SDK简要介绍
目录结构
一个通用 Linux SDK (RV系类的sdk没有对工程目录包含有 buildroot、 debian、 app、 kernel、 u-boot、 device、 docs、 external等目录。
以下是RK系类的目录分类:
- app:存放上层应用 app,主要是 qcamera/qfm/qplayer/settings 等一些应用程序。
- buildroot:基于 buildroot (2018.02-rc3) 开发的根文件系统。
- debian:基于 debian 10 开发的根文件系统,支持部分芯片。
- device/rockchip:存放各芯片板级配置和 Parameter 文件,以及一些编译与打包固件的脚本和预备文件。
- docs:存放芯片模块开发指导文档、 平台支持列表、 芯片平台相关文档、 Linux 开发指南等。
- IMAGE:存放每次生成编译时间、 XML、 补丁和固件目录。
- external:存放第三方相关仓库,包括音频、 视频、 网络、 recovery 等。
- kernel:存放 kernel 4.4 或 4.19 开发的代码。
- prebuilts:存放交叉编译工具链。
- rkbin:存放 Rockchip 相关的 Binary 和工具。
- rockdev:存放编译输出固件。
- tools:存放 Linux 和 Windows 操作系统环境下常用工具。
- u-boot:存放基于 v2017.09 版本进行开发的 uboot 代码。
- yocto:基于 yocto gatesgarth 3.2 开发的根文件系统,支持部分芯片
相对于以上的,对比下RV1109&RV1126的SDK目录,如下图:

buildroot
Linux SDK中 buildroot的 版本是 Buildroot-2018.02,其包含了基于 Linux 系统开发
用到的各种系统源码,驱动,工具,应用软件包。

buildroot 优势:
- 通过源码构建, 有很大的灵活性
- 方便的交叉编译环境, 可以进行快速构建
- 方便各系统组件配置及定制开发
源码准备
从开发版提供的资料中拿到uboot,kernel,rootfs:
- uboot:uboot是引导程序,芯片运行跑起来,然后引入kernel
- kernel:linux的内核是加载后将会移植运行在内存中的核心
- rootfs:这是文件系统,文件系统是kernel运行时需要加载一些驱动,库,存储等相关的其他一切相关的东西;
&emsp编译uboot,kernel,然后制作文件系统:

(注意:一定要从购买开发板或者核心板的厂家获取,已经做好了ddr等外设的适配,包括开发板的外设,这是我们后续学习移植的基础,千万不要想着从零开始做,这个是不现实的,目前也没有人和公司这么做)
(注意:buildroot文件系统,并不是真的文件系统,是buildroot工具构建的文件系统,Yocto也是,Debian和Ubuntu则是真文件系统)
编译buildroot
步骤一:安装buildroot依赖环境
虚拟机安装编译buildroot环境,以下跟来回验证了:
sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop \
git-core curl u-boot-tools mtd-utils android-tools-fsutils openjdk-8-jdk device-tree-compiler \
gdisk m4 libz-dev git gnupg flex bison gperf libsdl1.2-dev libesd-java libwxgtk3.0-dev \
squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool \
libxml2 libxml2-utils xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev \
lib32ncurses5-dev lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip \
zip liblz4-tool repo git ssh make gcc libssl-dev liblz4-tool vim expect \
g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
unzip device-tree-compiler python-pip libncurses5-dev rsync subversion \
sed make binutils build-essential gcc g++ wget python libncurses5 bzr cvs git mercurial \
patch gzip bzip2 perl tar cpio unzip rsync file bc wget qemu-user-static live-build -y \
python3.8 python3.8-dev

步骤二:下载解压buildroot、uboot-kernel 传输到目标系统
windows上先解压,得到完整文件:


然后传送到ubuntu上(使用samba服务,不清楚的参考上一篇安装samba服务)。


虚拟机上:

步骤三:移动解压uboot-kernel
注意:文件较大,不建议copy,一是会增加虚拟机所占存储,二是复制的时间很久。
mv buildroot_20220510.tar.gz uboot_kernel_20220512.tar.gz ~/work/

先解压uboot_kernel:
tar xvf uboot_kernel_20220512.tar.gz

这是个挺漫长的时间,花费大致5分钟。
步骤四:使用buildroot系统
注意:rk3568支撑多个系统,按照SDK文档指定系统是相似的操作。
我们使用buildroot文件系统,将buildroot_20220510.tar.gz拷贝到rk356x文件夹:
cd ~/work
mv buildroot_20220510.tar.gz rk356x_linux

然后解压:
tar xvf buildroot_20220510.tar.gz
差不多也是五分钟。
步骤五:查看编译命令

编译uboot,编译内核,编译文件系统(buildroot)

步骤六:适配屏幕
屏幕,笔者使用的是厂家提供的lvds10.1寸屏幕,已经做好了驱动在sdk中,但是需要配置设备树:
cd ~/work/rk356x_linux/
我们此时做个额外学习,先不配置hdmi和vga,这样hdmi和vga就不能显示,后续等我们验证hdmi不能显示后,再重新配置 该文件,进行显示:

步骤七:编译整体
由于uboot,kernel是没有争议的,但是文件系统是由好几个参数,所以要根据开发文档来,有个环境变量RK_ROOTFS_SYSTEM,他是什么则是什么系统,由此可见,他实际上是build编译文件系统的参数:

然后开始编译:
./build.sh all

查看“入坑二”,最终,使用sdk定义的路径是可以通过的:

入坑
入坑一:编译所有,定位到是文件系统失败
问题
./build.sh all

编译错误:

解决
依次编译,开始哪里有错误:
./build.sh uboot

./build.sh kernel
内核报的警告,但是依然过了:

./build.sh buildroot

仔细看信息,找到问题依次解决:

过程中,还有其他的错误,…其实就是环境缺少一些依赖,文档前面已经补上全部的依赖环境了。
特别注意,解决后要./build.sh cleanall清理后再编译。
最终依赖环境是:
sudo apt-get install uuid uuid-dev zlib1g-dev liblz-dev liblzo2-2 liblzo2-dev lzop \
git-core curl u-boot-tools mtd-utils android-tools-fsutils openjdk-8-jdk device-tree-compiler \
gdisk m4 libz-dev git gnupg flex bison gperf libsdl1.2-dev libesd-java libwxgtk3.0-dev \
squashfs-tools build-essential zip curl libncurses5-dev zlib1g-dev pngcrush schedtool \
libxml2 libxml2-utils xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev \
lib32ncurses5-dev lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip \
zip liblz4-tool repo git ssh make gcc libssl-dev liblz4-tool vim expect \
g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib \
unzip device-tree-compiler python-pip libncurses5-dev rsync subversion \
sed make binutils build-essential gcc g++ wget python libncurses5 bzr cvs git mercurial \
patch gzip bzip2 perl tar cpio unzip rsync file bc wget qemu-user-static live-build -y \
python3.8 python3.8-dev
入坑二:编译buildroot失败
问题
编译buildroot出现编译库错误。
原因
新版本的buildroot添加了很多库,这些库跟/home/toppet/Linux的路径相关,配置的时候写成了绝对路径,所以编译buildroot无法通过。
解决
方案商技术支持说一定要使用文档说的路径才可以通过,重新全部来一遍后,确实可以过,如下图:

RK3568开发笔记(四):在虚拟机上使用SDK编译制作uboot、kernel和buildroot镜像的更多相关文章
- RK3568开发笔记(五):在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像
前言 buildroot虽然灵活,但是基于实际情况,本身是侧重驱动和应用定制开发的只定制一次文件系统投入有点多,还不如直接ubunt自己交叉编译依赖库,做一些库的移植裁剪. 于是本篇就使用ubu ...
- Django开发笔记四
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.邮箱激活 users app下,models.py: ...
- Qt+MPlayer音乐播放器开发笔记(一):ubuntu上编译MPlayer以及Demo演示
前言 在ubuntu上实现MPlayer播放器播放音乐. Demo Mplayer MPlayer是一款开源多媒体播放器,以GNU通用公共许可证发布.此款软件 ...
- 在虚拟机上安装gho、esd(wim)系统镜像文件
gho.esd(wim)等文件不能被虚拟机识别,但如果把它们打包成iso就可以了. 另外,还需用到能在虚拟机上运行的WinPE的iso文件,本文用的是微PE. 注意:安装虚拟机提示operating ...
- openwrt开发笔记一:源码下载与编译
1.1 环境要求 编译系统:Linux发行版(本文使用Ubuntu) 编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要: 一个纯净的OpenWrt编译系统大约需要200MB的空 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——翻译:ArcGIS Runtime SDK for Android 10.2.7发布
ArcGIS Runtime SDK for Android v10.2.7 released by Dan O'Neill on October 1, 2015(发布时间:2015年10月1日) W ...
- [APP] Android 开发笔记 006-使用短信验证SDK进行短信验证
1. 下载SDK (http://www.mob.com/#/download) SMS For Android Studio: http://www.mob.com/download/sms/and ...
- Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...
- 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...
随机推荐
- Linux中的RCU机制
什么是RCU? RCU(Read-Copy Update),顾名思义就是读-拷贝-修改,它是基于其原理命名的.对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝 ...
- 二、深入学习c++需要掌握的基础知识
一.掌握形参带默认值的函数 给定默认值的时候是从右向左给,因为函数在内存中的压栈顺序是按照形参列表的元素从右向左依次向内存中压栈 形参是否有默认值对调用效率的问题:如果有一个默认值,在函数调用的过程中 ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- 好客租房39-react组件基础总结
1组件的两种创建方式:函数组件和类组件 2无状态函数组件 负责静态结构展示 3有状态组件 负责更新ui 让页面动起来 4绑定事件注意this指向问题 5使用受控组件创建表单 6完全利用js语言的能够力 ...
- mysql查询关键字补充与多表查询
目录 查询关键字补充 having过滤 distinct去重 order by排序 limit分页 regexp正则 多表查询 子查询 连表查询 查询关键字补充 having过滤 关键字having和 ...
- 网易数帆 Envoy Gateway 实践之旅:坚守 6 年,峥嵘渐显
服务网格成熟度不断提升,云原生环境下流量处理愈发重要, Envoy Gateway 项目于近日宣布开源,"旨在大幅降低将 Envoy 作为 API 网关的使用门槛",引发了业界关注 ...
- DML数据操作语言
DML数据操作语言 用来对数据库中表的数据记录进行更新.(增删改) 插入insert -- insert into 表(列名1,列名2,列名3...) values (值1,值2,值3...):向表中 ...
- 基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- CabloyJS究竟是一款什么样的框架
CabloyJS是什么样的框架 CabloyJS 是一款自带工作流引擎的 Node.js 全栈框架,一款面向开发者的低代码开发平台,更是一款兼具低代码的开箱即用和专业代码的灵活定制的 PAAS 平台 ...
- Tarjan 连通性
Tarjan 连通性 Tarjan 爷爷的代表作,图的连通性问题直接解决 两个核心数组: \(dfn_u\):\(u\) 的 dfs 序 \(low_u\):\(u\) 及 \(u\) 的后代通过返祖 ...