01介绍
今天的文章主题是分享与探讨关于Purple Pi OH开发板Android开发之搭建编译环境及编译Android固件。
如果你是刚开始接触嵌入式Linux开发,也许你会非常疑惑?
为什么同样是ARM架构的芯片,我以前开发STM32的时候只需要在Windows里的MDK5点一点就可以了。现在我想要使用Purple Pi OH开发板进行RK3566芯片开发,反而要使用虚拟机,要使用Linux黑乎乎的终端敲打一长串的命令,要关注内核版本、编译工具链的安装和配置、开发环境是否支持编译等等!对比习惯了Windows开发的人员一时之间也是无法快速上手的。
因此在今天的文章中小智会跟你说为什么同样是嵌入式开发,我们需要学习如此多的知识和做这么多的准备。
在Linux虚拟机环境中进行RK3566开发有很多原因,这里我只例举比较重要的几个原因:
PC虚拟机通常具有比嵌入式硬件更强的计算和内存资源,这意味着在虚拟机上编译内核和程序可以大幅缩短编译时间。
使用虚拟机可以确保开发环境的一致性,有助于减少因环境差异导致的问题,尤其是在团队成员之间同步工作环境时。
通过虚拟机,可以将开发环境与主机系统隔离开来,避免对主机系统的潜在影响,如系统崩溃或数据丢失等风险。
在开发过程中,可能需要频繁地测试和修改系统配置,这可能会带来安全风险。使用虚拟机可以在一个封闭的环境中进行这些操作,从而保护主机系统不受潜在的恶意软件或误操作的影响。
某些开发工具和编译器可能只在特定的Linux发行版上提供最佳支持,使用虚拟机可以轻松地安装和运行这些工具。
综上所述,搭建Linux虚拟机环境对于RK3566开发来说是非常有益的,它不仅能够提高编译效率,还能提供一个安全、一致且易于管理的开发环境。
来看我们用到的开发板长什么样子
Purple Pi OH开发板
02 固件源码获取
2.1源码下载
当我们拿到一块Linux开发板时,我们就需要同步进行开发的初期准备。
首先就是获取资料,通常包括板子的芯片手册、数据手册、原理图等。
获取到资料后第二步就是通过查阅资料了解到源码的获取方式,其他的芯片资料可以先不看。因为通常源码都非常大,我们需要时间从网络上进行获取。
第三步即开发环境搭建,通常我们也是通过官方资料查阅编译SDK所需要的环境要求并搭建一个编译环境。
注意:所有的补丁都是基于1.1中的sdk整包生成。
2.2开发环境搭建
接下来我们需要使用VMWare或者VirtualBox创建虚拟机,环境搭建的教程通常在网上搜索即可获取大量资料。
只要根据要求配置编译环境即可,以下是Android11推荐编译主机配置:
1.Ubuntu18.04 操作系统
2.64 位 CPU
3.16GB 物理内存+交换内存
4.250GB 空闲的磁盘空间
2.3VMWare文件传输
在完成源码获取和编译环境搭建后,我们需要将源码拖动到虚拟机内,这就涉及到Windows和Linux虚拟机之间的传输文件方式,通常我们可以通过共享文件夹、FTP或SFTP、网络传输工具等方式,我通常使用的是共享文件夹方式,其配置简单且速度快,方便开发。
它可以直接在Windows资源管理器中访问,即Linux虚拟机和Windows共享一块存储空间,两边都可以直接访问和操作。过去我总是在Windows下直接通过VScode打开文件夹进行编码,在Linux中进入文件夹直接编译或者复制出来在其他地方编译都可。
接下来我将讲解如何创建与配置共享文件夹:
1. 首先将VMWare Tools安装好,安装详细流程可以在网上搜索并学习。
2. 点击【编辑虚拟机设置】,选中【选项】即可查看到共享文件夹的设置,
如下图所示:
3. 点击【总是启用】,弹出下图中第二步的【添加共享文件夹向导】。
在电脑中选择合适的位置建立共享文件夹。这里我是和虚拟机位置放在一起的。
如下图所示:
4. 在设置好共享文件夹路径后,点击下一步时记得选中启用此共享。
如下图所示:
5. 接着我们在电脑资源管理器中访问位置即可查看到,此时往文件夹拖文件就可以在Linux中的/mnt/hgfs/文件夹下即可实时看到,如下图所示:
03SDK编译3.1源码解压
将源码传输进Linux中后,
我们通过如下命令可以将源码压缩文件解压缩至我们想要的路径:
cat purple_pi_android11.tar.gza* | tar -xz -C target_path
语句意思为在当前文件夹下查看全部以
“purple_pi_android11.tar.gza”开头的文件,
并将其结果使用tar命令解压至[ target_path ],target_path即你想要解压到的文件夹路径。
效果如下图所示:
3.2uboot编译
接着我们进入SDK根目录下的文件夹u-boot执行如下命令:
cd u-boot./make.sh rk3566
执行命令后结果如下图所示:
若编译成功结果如下图所示:
3.3kernel编译
内核配置文件路径:kernel/arch/arm64/configs/rockchip_purple_pi_3566_defconfig设备树文件路径:kernel/arch/arm64/boot/dts/rockchip/
我们提供了两种显示屏的适配,分别是:
1. “ido-pi-oh3566-v1.dts”,显示屏驱动适配HDMI接口;
2. “ido-pi-oh3566-v1-dsi0-mipi.dts”,显示屏驱动适配MIPI接口;
我们以编译HDMI屏内核为例,编译命令如下:
cd kernel make ARCH=arm64 rockchip_purple_pi_3566_defconfig rk356x_evb.config android-11.configmake ARCH=arm64 ido-pi-oh3566-v1.img -j10
命令解释:
分别是:
Purple Pi OH默认的配置文件,包含了该开发板的默认设置和选项;
Rockchip RK356x的配置文件,包含了针对该板的特定设置和选项;
Android 11版本的配置文件,包含了针对Android 11操作系统的特定设置和选项。
特别注意:
部分开发者遇到编译失败时,可能是虚拟机的内存分配不够,此时我们可以尝试调小并行任务数编译,例如 -j10调整为 –j4 或 –j1。
如果编译提示选择io_domain电压,vccio4和vccio5选择1.8v,其它选择3.3v。
以上方式编译完成后,kernel目录生成的boot.img文件不能直接烧录。
需要使用build.sh -K 命令来编译kernel,编译后烧写rockdev/Image-rk3566_r/boot.img。
单独编译kernel生成可直接烧录的boot.img。
此处的编译方法的前提已存在rockdev/Image-rk3566_r/boot.img文件(即Android代码已经完全编译过一次或者执行过build.sh -K)。
编译的原理为在kernel目录下将编译生成的 kernel.img 和 resource.img 替换到旧的 boot.img 中,命令如下:
cd kernel make ARCH=arm64 rockchip_purple_pi_3566_defconfig rk356x_evb.config android-11.configmake ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3566_r/boot.img ido-pi-oh3566-v1.img -j10
使用此方法编译出kernel/boot.img文件可以直接用于烧录至boot分区,kernel编译结果如下图所示:
3.4Android编译及固件生成步骤
使用如下命令编译
source build/envsetup.shlunch rk3566_r-userdebugmake -j10
编译过程如下图所示:
Android编译成功结果如下图所示:
需要编译内核选择的屏幕修改Android主显和系统方向时可以修改如下参数:
1)HDMI: A)device/rockchip/rk356x/rk3566_r/rk3566_r.mk PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=HDMI-A-1 B)device/rockchip/rk356x/BoardConfig.mk SF_PRIMARY_DISPLAY_ORIENTATION := 0
2)MIPI: A)device/rockchip/rk356x/rk3566_r/rk3566_r.mk PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI B)device/rockchip/rk356x/BoardConfig.mk SF_PRIMARY_DISPLAY_ORIENTATION := 270
3.5固件打包
编译完成后,执行 SDK 根目录下的 mkimage.sh 脚本生成固件,所有烧写所需的各分区镜像将都
rockdev/Image-rk3566_r/目录下,
命令如下:
./mkimage.sh
结果如下:
将所有分区镜像合并成单个的镜像,命令如下:
cd RKTools/linux/Linux_Pack_Firmware/rockdev/./mkupdate_rk356x.sh
结果如下:
执行mkupdate_rk356x.sh 命令后
会将各分区镜像合并成一个update.img 的镜像文件,如下图所示:
当我们做到这一步时,我们的固件编译就完成啦!
由于固件编译本身就是一个非常复杂和繁琐的活,因此本篇内容的篇幅较长,非常感谢有耐心看到这里的小伙伴!
全部0条评论
快来发表一下你的评论吧 !