平头哥 TH1520 RISC-V BeagleV-Ahead使用Thead-Yocto自定义构建系统 最详细版本

使用Thead-Yocto自定义BeagleV-Ahead系统

Thead-Yocto简述

  • 官网:https://www.yoctoproject.org/

  • THE YOCTO PROJECT. IT’S NOT AN EMBEDDED LINUX DISTRIBUTION,IT CREATES A CUSTOM ONE FOR YOU.

  • YOCTO项目:他不是一个嵌入式Linux发行版,是一个专门创建属于你的自定义系统!

​ Yocto 项目 (YP) 是一个开源协作项目,可帮助开发人员创建基于 Linux 的定制系统,无论硬件架构如何。该项目提供了一套灵活的工具和空间,全世界的嵌入式开发人员可以共享技术、软件堆栈、配置和最佳实践,这些技术、软件堆栈、配置和最佳实践可用于为嵌入式和物联网设备或任何需要定制 Linux 操作系统的地方创建定制的 Linux 映像。

​ 下图介绍了 Yocto POKY参考示例的整个框架,其中 POKY 是一个 Yocto Project® 的参考发行版。它包含 OpenEmbedded 构建系统(BitBake 和 OpenEmbedded Core)以及一组meta,可帮助您开始构建自己的发行版。要使用 Yocto 项目工具,您可以下载 Poky 并使用它来引导您自己的发行版。请注意,Poky 不包含二进制文件 - 它是如何从源代码构建您自己的自定义 Linux 发行版的工作示例。

img

下图是Yocto-Project项目的一个完整的 构建嵌入式工作流,以右上角 颜色说明块 来阅读此图,分别从各种 Metadata 元数据(系统源码配置 软件包配置 板级包支持等) 以及上面黄色区域 是专门的 针对于 各个构建工程部分所需的源码获取,包含了 各种下载协议 以及方式,把下载下来所需的源码 保存起来, 之后通过 淡蓝色 Build System 来分别处理不同的源码和 元层 软件包 进行构建,最后输出 镜像 以及 多种格式软件包,和SDK 系统镜像等。为了方便理解,我这里专门使用红字 和红色箭头 做了简单的说明,因为整个yocto项目非常复杂,所以无法只通过一张图就能让大家完整理解。

image-20230721115850443

如果您对yocto很感兴趣,想深入学习使用可以直接访问 官方提供的 使用教程 https://docs.yoctoproject.org/ ,在这个页面内,官方针对于 整个yocto做了非常详细的图文教程,可以参考下图 Manuals 手册下不同章节后面红字 描述来选择合适的篇幅进行阅读学习。

image-20230721142305045

老版本的文档中心: https://docs.yoctoproject.org/1.8/ref-manual/ref-manual.html

配置开发环境

主机硬件配置

建议:

  • i7-7800K 以上架构,最少 8 核 16线程

  • 32GB DDR4 内存,主频 3200MHz以上(必选,不然会 llvm native 错误)

  • 存储 500G 建议固态/M2

ubuntu18 依赖安装

在使用ubuntu18安装如下依赖包之前,请确保你的Ubuntu18系统可以联网,且使用 sudo apt update 命令更新过软件源。之后在ubuntu18终端上执行如下命令即可自动安装,安装过程持续 5 -10分钟,主要根据自己的网络 性能而定。

sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev python3-subunit mesa-common-dev zstd liblz4-tool file locales sed make binutils    g++ bash patch gzip bzip2 perl  tar    file  bc  python  cvs  mercurial rsync  subversion android-tools-mkbootimg vim  libssl-dev  android-tools-fastboot libncurses5-dev   u-boot-tools android-sdk-platform-tools  open-vm-tools-desktop python3-distutils  repo bison flex  -y

image-20230721144338407

执行如下命令配置 当前终端的编码格式为 en_US.UTF-8 。

sudo locale-gen en_US.UTF-8

image-20230721144234169

配置完成后上述两个步骤,就可以开始下面的 编译工作了。

配置编译环境

上一节我们配置好了开发所需的ubuntu-18 主机环境,这一节 我们开始获取 BealgeV-Ahead Yocto源码,并进行配置,编译输出对应的 自定义系统,此章节操作起来有一定难度,建议有编译经验的同学参考。

  1. 因为构建时会从网络下载开源软件包,下载的时间依不同的网络和网速而不同切差异很大;有些开源软件位于 GitHub 仓库,受限于国内网络环境会下载失败。为了加速这一过程,可以直接获取我们这里提前准备好的所有软件包,拷贝到 ubuntu-18.04家 ~ 目录下,所有文件存放在 百度网盘 链接:https://pan.baidu.com/s/1GVpQoNwSpBkjaMZO2gZRrQ?pwd=rqm4 文件比较大,文件名称为 yocto-downloads_light-beagle_thead-image-linux.tar.gz
    拷贝到虚拟机 ~ 家目录后,使用如下命令进行解压缩,解压缩完成是一个名为 yocto-downloads 的文件夹 。
cd ~
tar -xvf  yocto-downloads_light-beagle_thead-image-linux.tar.gz
  1. 下载 BeagleV-Ahead Thead-Yocto meta元层数据 ,在ubuntu18.04 终端下执行如下命令,在 ~家目录下指定:
cd ~
git clone https://gitee.com/thead-yocto/xuantie-yocto.git -b Linux_SDK_V1.1.2
  1. 加载目标设备的配置文件,加载环境变量,如下所示进入到 上述步骤已经下载好的镜像里面,执行yocto系统编译前的环境配置操作。
cd xuantie-yocto
source openembedded-core/oe-init-build-env thead-build/light-fm

image-20230721160309007

同时 我们需要将提前解压好的软件包 软链接到 刚才配置完 编译环境的 thead-build/light-fm/downloads目录,这样可以避免 重复下载软件包的问题

ln -s ~/yocto-downloads ../downloads

image-20230721160651760

  • 参考页面 https://gitee.com/thead-yocto/documents

编译系统镜像

配置镜像

image-20230721162202265

开始编译

​ 配置好前面的步骤以后,就可以选择 我们需要编译的BeagleV-Ahead 开发板 配置项以及选择配套的 系统镜像了,我这里使用 MACHINE=light-beagle bitbake thead-image-linux 也就是表示 编译后的主板是 BeagleV-Ahead编译出来的系统是 thead-image-linux 如下,在刚才配置好 编译环境变量的下面 执行 MACHINE=light-beagle bitbake thead-image-linux 即可开始编译。

image-20230721162445535

​ 整个编译时间大概在 5 小时以上,具体要根据性能配置而定,我这里使用i7-13700K 16核心,32GB DDR5 ,M2固态 编译了大概10个小时,大家可以作为参考。编译过程中 很有可能会出现各种奇怪的错误,请不要着急,一般情况下是因为 配置不够,或者网络原因导致的,如果无法找到原因 可以在 https://forums.100ask.net/c/elinuxdev/yocto/76 页面提交您的问题!

​ 编译完成后 系统会弹出 一段类似 下图 蓝框所示的 信息,其中 最后会有 一个 succeeded 表示编译成功,这就表明已经完成,之后我们就可以去 tmp-glibc/deploy/images/light-beagle 查看编译输出的镜像文件了。

image-20230721151257810

编译完成后的镜像输出在 ~/xuantie-yocto/thead-build/light-fm/tmp-glibc/deploy/images/light-beagle

image-20230721141003369

烧写更新镜像

​ 编译成功后输出在 tmp-glibc/deploy/images/light-beagle的镜像可以直接通过 上一篇 系统评测文章介绍的,使用 fastboot来进行烧写更新,在这里,有些文件名称可能不太一样,所以我们要根据我们编译生成的镜像,来依次执行烧录命令。

如果你不想编译,只想体验一下yocto镜像的烧录过程,可以用我提前准备好的deploy压缩包 链接:https://pan.baidu.com/s/1OD3ApN5JtOX8EQDz7JW1hg?pwd=2t4c 上传到 ubuntu 虚拟机,使用 tar -xvf deploy-light-beagle_thead-image-linux.tar.gz 命令就可以解压缩 ,里面存放了 编译来的所有资源,包含镜像 SDK deb 等

烧录前准备

  1. 参考上一篇 将 BeagleV-Ahead进入烧录模式,连接 MicroUSB 3.0线至ubuntu系统。

Flash-eMMC

  1. 在Ubuntu下提前安装好烧录工具,如果参考上一篇安装过,可以执行fastboot --version命令来验证是否安装成功。

image-20230720162255544

开始烧录

  1. 进入到编译好的镜像文件夹,在 xuantie-yocto/ 目录下的 thead-build/light-fm/tmp-glibc/deploy/images/light-beagle/ 目录,之后依次执行如下命令进行烧录操作。
sudo fastboot  flash ram  u-boot-with-spl-light-beagle-2020.10-r0.bin
sudo fastboot reboot
sudo fastboot flash uboot u-boot-with-spl-light-beagle-2020.10-r0.bin 
sudo fastboot flash boot boot.ext4 
sudo fastboot flash root thead-image-linux-light-beagle-最新日期.rootfs.ext4

如下图所示,详细描述了整个编译步骤,需要留意 最后烧写的 rootfs.ext4 文件,名称会随着编译的时间而变化。

image-20230721164759262

烧录 完成后 系统会提示 finiashed 此时需要手动按下BeagleV-Ahead RESET 按钮,系统就会自动启动,使用串口登录,输入 用户名 root 就可以进入系统。

image-20230721164915443

启动BeagleV-Ahead

​ 因为 thead-image-linux 没有桌面环境,所以只能通过串口方式启动 进入系统,如下所示,输入用户名 root 即可进入 您最新烧写好的 yocto系统。

image-20230721170035371

生成SDK

编译生成

​ 如果您只是体验一下 yocto编译系统的过程,制作出来一个自己的系统,不需要给 专门搞应用开发的同事使用,或者您不需要后续开发应用,那么就不需要做这部分,相反,如果您需要后续在前面系统上 开发属于自己的 应用程序/产品,那么就需要构建出来一个 专门且配套的 SDK(交叉工具链 + 组件应用库和头文件) ,这样才可以使用配套的工具链来进行编译系统。

生成配套的SDK命令很简单,只需要在原来的 编译镜像命令 后 加上 -c populate_sdk 参数即可。如下所示,我需要给我最新编译出来的 beagleV-Ahead 单板 thead-image-linux 系统镜像 生成配套的SDK,那么只需要执行 MACHINE=light-beagle bitbake thead-image-linux -c populate_sdk 命令即可。

image-20230721141518200

整个编译过程比较快,正常30分钟以内,因为只是做一些打包处理工作,但是在编译时 可能会出现一些报错等问题,需要解决。

解决编译错误

​ 初次编译 生成配套的SDK会提示 packagegroup-cross-canadian-light-beagle : Depends: gdb-cross-canadian-riscv64 but it is not installable 错误,错误提示信息如下图所示,我们需要在 xuantie-yocto 目录对 openembedded-core/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb 进行修改。

image-20230721140834670

​ 修改方式如下,首先 回退到 上上级 xuantie-yocto 目录,之后使用 vim/nano/gedit 等文本编辑器 修改 openembedded-core/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb 文件。

image-20230721144457090

​ 删除掉 ${@all_multilib_tune_values(d, 'GDB')} \这句代码,如下红框所示,删除完成后,保存退出此界面,继续返回到编译界面,执行编译 SDK命令。

image-20230721144742304

​ 如下图所示,编辑完成后,继续执行 MACHINE=light-beagle bitbake thead-image-linux -c populate_sdk 编译生成SDK,等待编译完成。

image-20230721144935633

​ 编译完成后,系统会提示如下打印信息,其中主要 参考 蓝色长条框内, 红色框 succeeded 字符,既表示已经完成。

image-20230721151257810

SDK输出

​ 编译完成以后,生成的 sdk 在 xuantie-yocto/ 目录下的 thead-build/light-fm/tmp-glibc/deploy/sdk/ 目录,里面 oecore-x86_64-riscv64-toolchain-nodistro.0.sh是我们需要的SDK,后面只需要在 ubuntu等Linux发行版系统下执行 ./oecore-x86_64-riscv64-toolchain-nodistro.0.sh 即可安装使用,具体步骤我们会在后面介绍。

image-20230721151331729

  • 更多的参考 https://docs.yoctoproject.org/sdk-manual/working-projects.html

使用SDK开发LVGL

​ 如果你不想编译,只想体验一下yocto镜像的烧录过程,并且使用我们预先编译好的SDK来配合开发,可以用我提前准备好的deploy压缩包 链接:https://pan.baidu.com/s/1OD3ApN5JtOX8EQDz7JW1hg?pwd=2t4c 上传到 ubuntu 虚拟机,使用 tar -xvf deploy-light-beagle_thead-image-linux.tar.gz 命令就可以解压缩 ,里面存放了 编译来的所有资源,包含镜像 SDK deb 等。

安装SDK

​ 安装SDK这里可以理解为安装 工具链,Yocto工具自动把SDK工具链整合成了一个 .sh 脚本,只需要 在 终端任意目录执行 就可以自动安装。如下图所示。

image-20230721193247124

如下所示,按照提示说明,在同一终端下执行 . /usr/local/oecore-x86_64/environment-setup-riscv64-oe-linux 命令即可使其生效,生效后可以在当前终端下输入 riscv64-unknown-linux-gnu-gcc -v 来查看当前工具链的信息 如下图蓝框所示,这是一个 针对于 xuantie 900系列的专用工具链。

. /usr/local/oecore-x86_64/environment-setup-riscv64-oe-linux
riscv64-unknown-linux-gnu-gcc -v

image-20230721171422670

获取编译LVGL

源码示例所在仓库 https://gitee.com/weidongshan/BeagleV-Ahead_Lvg8-drm_Example 使用 git 命令在 ~ 家目录 clone,获取完成后进入到 BeagleV-Ahead_Lvg8-drm_Example 目录下即可开始编译。

cd ~
git clone  https://gitee.com/weidongshan/BeagleV-Ahead_Lvg8-drm_Example
cd BeagleV-Ahead_Lvg8-drm_Example
make

image-20230721195215076

  • 报错问题,提示找不到 libc.so等 C标准库

image-20230721193734997

​ 进入 /usr/local/oecore-x86_64/sysroots/riscv64-oe-linux/usr/lib 使用vim/nano/gedit等文本编辑器修改 libc.so 文件。

image-20230721194249929

​ 在 libc.so文件内修改GROUP整行为如下图所示,如果你的安装路径不是前面提示的默认 /usr/local/oecore-x86_64 ,则需要根据你的实际路径进行修改。

GROUP ( /usr/local/oecore-x86_64/sysroots/riscv64-oe-linux/lib/libc.so.6 /usr/local/oecore-x86_64/sysroots/riscv64-oe-linux/lib/libc_nonshared.a  AS_NEEDED ( /usr/local/oecore-x86_64/sysroots/riscv64-oe-linux/lib/ld-linux-riscv64xthead-lp64d.so.1 ) )

image-20230721191550350

​ 修改完成后回到 LVGL 目录,继续执行 make 命令,就可以编译完成,生成一个 最终的 可以在 BeagleV-Ahead 运行的 demo 程序,把这个demo 应用 拷贝到 BeagleV-Ahead开发板上,即可运行。

image-20230721194407318

上传程序

​ 因为BeagleV-Ahead Yocto系统网络不通,而且WIFI也无法使用,只能通过最原始的方式U盘挂载来进行数据的传输,使用U盘上传,首先把从ubuntu 编译出来的 LVGL demo程序拷贝到 U盘内,拷贝完成后 通过MicroUSB OTG线 连接到BeagleV-Ahead 并 使用mount命令进行挂载到 /mnt目录下。推荐 U盘格式化为 FAT32 格式,方便再BeagleV-Ahead挂载。

mount /dev/sda1 /mnt/
cd /mnt/
chmod +x demo

image-20230721201025514

运行程序

​ 在前面我们已经将 编译好的 demo 程序存放在了U盘,并挂载在了 BeagleV-Ahead 的 /mnt 目录下,因为BeagleV-Ahead Yocto系统 默认开机运行一个 weston 界面程序,所以我们要通过 kill -9 PID 命令来关闭它,才能运行 我们自己的 LVGL DEMO程序,首先 通过 ps -ef | grep “weston” 查找到当前进程的具体PID,得到PID号以后 就可以直接使用 kill -9 PID 来杀死他,如下截图。

image-20230721201348369

​ 关闭了默认的 weston 程序以后,就可以切换到 /mnt 目录下,执行 demo 示例程序,在当前路径下执行 需要 加上 ./ 如下图所示。

image-20230721201517258

​ 运行起来以后,可以观察显示屏,已经在运行了我们编译好的 LVGL DEMO示例。

d363eede7cddf6a3fc8d601b18ed9f2

  • 查找到当前进程的具体PID,得到PID号以后 就可以直接使用 kill -9 PID 来杀死他,如下截图。

[外链图片转存中…(img-zcT9CeWa-1690085570057)]

​ 关闭了默认的 weston 程序以后,就可以切换到 /mnt 目录下,执行 demo 示例程序,在当前路径下执行 需要 加上 ./ 如下图所示。

[外链图片转存中…(img-S6wWEu5y-1690085570057)]

​ 运行起来以后,可以观察显示屏,已经在运行了我们编译好的 LVGL DEMO示例。

[外链图片转存中…(img-FvB2qXo2-1690085570057)]

猜你喜欢

转载自blog.csdn.net/thisway_diy/article/details/131878174