使用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 发行版的工作示例。
下图是Yocto-Project项目的一个完整的 构建嵌入式工作流,以右上角 颜色说明块 来阅读此图,分别从各种 Metadata 元数据(系统源码配置 软件包配置 板级包支持等) 以及上面黄色区域 是专门的 针对于 各个构建工程部分所需的源码获取,包含了 各种下载协议 以及方式,把下载下来所需的源码 保存起来, 之后通过 淡蓝色 Build System 来分别处理不同的源码和 元层 软件包 进行构建,最后输出 镜像 以及 多种格式软件包,和SDK 系统镜像等。为了方便理解,我这里专门使用红字 和红色箭头 做了简单的说明,因为整个yocto项目非常复杂,所以无法只通过一张图就能让大家完整理解。
如果您对yocto很感兴趣,想深入学习使用可以直接访问 官方提供的 使用教程 https://docs.yoctoproject.org/ ,在这个页面内,官方针对于 整个yocto做了非常详细的图文教程,可以参考下图 Manuals 手册下不同章节后面红字 描述来选择合适的篇幅进行阅读学习。
老版本的文档中心: 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
执行如下命令配置 当前终端的编码格式为 en_US.UTF-8 。
sudo locale-gen en_US.UTF-8
配置完成后上述两个步骤,就可以开始下面的 编译工作了。
配置编译环境
上一节我们配置好了开发所需的ubuntu-18 主机环境,这一节 我们开始获取 BealgeV-Ahead Yocto源码,并进行配置,编译输出对应的 自定义系统,此章节操作起来有一定难度,建议有编译经验的同学参考。
- 因为构建时会从网络下载开源软件包,下载的时间依不同的网络和网速而不同切差异很大;有些开源软件位于 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
- 下载 BeagleV-Ahead Thead-Yocto meta元层数据 ,在ubuntu18.04 终端下执行如下命令,在 ~家目录下指定:
cd ~
git clone https://gitee.com/thead-yocto/xuantie-yocto.git -b Linux_SDK_V1.1.2
- 加载目标设备的配置文件,加载环境变量,如下所示进入到 上述步骤已经下载好的镜像里面,执行yocto系统编译前的环境配置操作。
cd xuantie-yocto
source openembedded-core/oe-init-build-env thead-build/light-fm
同时 我们需要将提前解压好的软件包 软链接到 刚才配置完 编译环境的 thead-build/light-fm/downloads目录,这样可以避免 重复下载软件包的问题
ln -s ~/yocto-downloads ../downloads
- 参考页面 https://gitee.com/thead-yocto/documents
编译系统镜像
配置镜像
开始编译
配置好前面的步骤以后,就可以选择 我们需要编译的BeagleV-Ahead 开发板 配置项以及选择配套的 系统镜像了,我这里使用 MACHINE=light-beagle bitbake thead-image-linux 也就是表示 编译后的主板是 BeagleV-Ahead编译出来的系统是 thead-image-linux 如下,在刚才配置好 编译环境变量的下面 执行 MACHINE=light-beagle bitbake thead-image-linux 即可开始编译。
整个编译时间大概在 5 小时以上,具体要根据性能配置而定,我这里使用i7-13700K 16核心,32GB DDR5 ,M2固态 编译了大概10个小时,大家可以作为参考。编译过程中 很有可能会出现各种奇怪的错误,请不要着急,一般情况下是因为 配置不够,或者网络原因导致的,如果无法找到原因 可以在 https://forums.100ask.net/c/elinuxdev/yocto/76 页面提交您的问题!
编译完成后 系统会弹出 一段类似 下图 蓝框所示的 信息,其中 最后会有 一个 succeeded 表示编译成功,这就表明已经完成,之后我们就可以去 tmp-glibc/deploy/images/light-beagle 查看编译输出的镜像文件了。
编译完成后的镜像输出在 ~/xuantie-yocto/thead-build/light-fm/tmp-glibc/deploy/images/light-beagle
烧写更新镜像
编译成功后输出在 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 等
烧录前准备
- 参考上一篇 将 BeagleV-Ahead进入烧录模式,连接 MicroUSB 3.0线至ubuntu系统。
- 在Ubuntu下提前安装好烧录工具,如果参考上一篇安装过,可以执行fastboot --version命令来验证是否安装成功。
开始烧录
- 进入到编译好的镜像文件夹,在 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 文件,名称会随着编译的时间而变化。
烧录 完成后 系统会提示 finiashed 此时需要手动按下BeagleV-Ahead RESET 按钮,系统就会自动启动,使用串口登录,输入 用户名 root 就可以进入系统。
启动BeagleV-Ahead
因为 thead-image-linux 没有桌面环境,所以只能通过串口方式启动 进入系统,如下所示,输入用户名 root 即可进入 您最新烧写好的 yocto系统。
生成SDK
编译生成
如果您只是体验一下 yocto编译系统的过程,制作出来一个自己的系统,不需要给 专门搞应用开发的同事使用,或者您不需要后续开发应用,那么就不需要做这部分,相反,如果您需要后续在前面系统上 开发属于自己的 应用程序/产品,那么就需要构建出来一个 专门且配套的 SDK(交叉工具链 + 组件应用库和头文件) ,这样才可以使用配套的工具链来进行编译系统。
生成配套的SDK命令很简单,只需要在原来的 编译镜像命令 后 加上 -c populate_sdk 参数即可。如下所示,我需要给我最新编译出来的 beagleV-Ahead 单板 thead-image-linux 系统镜像 生成配套的SDK,那么只需要执行 MACHINE=light-beagle bitbake thead-image-linux -c populate_sdk 命令即可。
整个编译过程比较快,正常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 进行修改。
修改方式如下,首先 回退到 上上级 xuantie-yocto 目录,之后使用 vim/nano/gedit 等文本编辑器 修改 openembedded-core/meta/recipes-core/packagegroups/packagegroup-cross-canadian.bb 文件。
删除掉 ${@all_multilib_tune_values(d, 'GDB')} \
这句代码,如下红框所示,删除完成后,保存退出此界面,继续返回到编译界面,执行编译 SDK命令。
如下图所示,编辑完成后,继续执行 MACHINE=light-beagle bitbake thead-image-linux -c populate_sdk 编译生成SDK,等待编译完成。
编译完成后,系统会提示如下打印信息,其中主要 参考 蓝色长条框内, 红色框 succeeded 字符,既表示已经完成。
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 即可安装使用,具体步骤我们会在后面介绍。
- 更多的参考 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 脚本,只需要 在 终端任意目录执行 就可以自动安装。如下图所示。
如下所示,按照提示说明,在同一终端下执行 . /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
获取编译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
- 报错问题,提示找不到 libc.so等 C标准库
进入 /usr/local/oecore-x86_64/sysroots/riscv64-oe-linux/usr/lib 使用vim/nano/gedit等文本编辑器修改 libc.so 文件。
在 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 ) )
修改完成后回到 LVGL 目录,继续执行 make 命令,就可以编译完成,生成一个 最终的 可以在 BeagleV-Ahead 运行的 demo 程序,把这个demo 应用 拷贝到 BeagleV-Ahead开发板上,即可运行。
上传程序
因为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
运行程序
在前面我们已经将 编译好的 demo 程序存放在了U盘,并挂载在了 BeagleV-Ahead 的 /mnt 目录下,因为BeagleV-Ahead Yocto系统 默认开机运行一个 weston 界面程序,所以我们要通过 kill -9 PID 命令来关闭它,才能运行 我们自己的 LVGL DEMO程序,首先 通过 ps -ef | grep “weston” 查找到当前进程的具体PID,得到PID号以后 就可以直接使用 kill -9 PID 来杀死他,如下截图。
关闭了默认的 weston 程序以后,就可以切换到 /mnt 目录下,执行 demo 示例程序,在当前路径下执行 需要 加上 ./ 如下图所示。
运行起来以后,可以观察显示屏,已经在运行了我们编译好的 LVGL DEMO示例。
- 查找到当前进程的具体PID,得到PID号以后 就可以直接使用 kill -9 PID 来杀死他,如下截图。
[外链图片转存中…(img-zcT9CeWa-1690085570057)]
关闭了默认的 weston 程序以后,就可以切换到 /mnt 目录下,执行 demo 示例程序,在当前路径下执行 需要 加上 ./ 如下图所示。
[外链图片转存中…(img-S6wWEu5y-1690085570057)]
运行起来以后,可以观察显示屏,已经在运行了我们编译好的 LVGL DEMO示例。
[外链图片转存中…(img-FvB2qXo2-1690085570057)]