Purple Pi OH又开外挂!带你搭建编译环境及编译Android 11固件

描述

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开发板Purple

 

02 固件源码获取
 

2.1源码下载

当我们拿到一块Linux开发板时,我们就需要同步进行开发的初期准备。

首先就是获取资料,通常包括板子的芯片手册、数据手册、原理图等。

获取到资料后第二步就是通过查阅资料了解到源码的获取方式,其他的芯片资料可以先不看。因为通常源码都非常大,我们需要时间从网络上进行获取。

第三步即开发环境搭建,通常我们也是通过官方资料查阅编译SDK所需要的环境要求并搭建一个编译环境。

 

 

Purple

 

 

注意:所有的补丁都是基于1.1中的sdk整包生成。


 

Purple

 

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. 点击【编辑虚拟机设置】,选中【选项】即可查看到共享文件夹的设置,

如下图所示:

Purple
 

 

3. 点击【总是启用】,弹出下图中第二步的【添加共享文件夹向导】。

在电脑中选择合适的位置建立共享文件夹。这里我是和虚拟机位置放在一起的。

如下图所示:

Purple

 

4. 在设置好共享文件夹路径后,点击下一步时记得选中启用此共享。

如下图所示:

Purple

 

5. 接着我们在电脑资源管理器中访问位置即可查看到,此时往文件夹拖文件就可以在Linux中的/mnt/hgfs/文件夹下即可实时看到,如下图所示:

Purple

 

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即你想要解压到的文件夹路径。

效果如下图所示:

Purple

 

3.2uboot编译

接着我们进入SDK根目录下的文件夹u-boot执行如下命令:

  •  
  •  

cd u-boot./make.sh rk3566

 

执行命令后结果如下图所示:

Purple

若编译成功结果如下图所示:

Purple

 

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

分别是:

Purple Pi OH默认的配置文件,包含了该开发板的默认设置和选项;

Rockchip RK356x的配置文件,包含了针对该板的特定设置和选项;

Android 11版本的配置文件,包含了针对Android 11操作系统的特定设置和选项。

Purple

 

特别注意:

部分开发者遇到编译失败时,可能是虚拟机的内存分配不够,此时我们可以尝试调小并行任务数编译,例如 -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编译结果如下图所示:

Purple

 

3.4Android编译及固件生成步骤

使用如下命令编译

  •  
  •  
  •  

source build/envsetup.shlunch rk3566_r-userdebugmake -j10

 

编译过程如下图所示:

Purple

Android编译成功结果如下图所示:

Purple

 

需要编译内核选择的屏幕修改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


 

结果如下:

Purple


 

将所有分区镜像合并成单个的镜像,命令如下:

  •  
  •  

cd RKTools/linux/Linux_Pack_Firmware/rockdev/./mkupdate_rk356x.sh

 

结果如下:

Purple


 

执行mkupdate_rk356x.sh 命令后

会将各分区镜像合并成一个update.img 的镜像文件,如下图所示:

Purple


 

当我们做到这一步时,我们的固件编译就完成啦!

由于固件编译本身就是一个非常复杂和繁琐的活,因此本篇内容的篇幅较长,非常感谢有耐心看到这里的小伙伴!

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分