在MIPS平台上如何使用Yocto框架来定制嵌入式Linux发行版

Wi - Fi路由器、数码相机和电视有一些共同点,而这些共同点无形中带来了一些优势。在这些设备上运行的软件很有可能是高度定制的针对嵌入式系统的Linux。若要使用OS用作特定的任务,或优化工作流,那么,最理想的便是运行定制版Linux。

本文将简要阐述设计师如何使用Yocto开源基础设备,在MIPS平台上定制嵌入式Linux发行版——使设计师能聚焦于产品本身,而不是创建定制发行版带来的复杂性。

有很多方法可以创建定制嵌入式Linux发行版。首先,获取所需的软件库和开源软件包——这些可以轻松地在网上找到并下载。之后,则必须手动交叉编译并整合。为简化这个乏味的过程,有许多工具和框架可以用来协助开发人员。

最广为人知及成功的案例便是Yocto Project。Imagination一直致力于使用MIPS处理器进行定制。且这些建立在可用于MIPS的工具和软件上。

不过,在我们详细阐述MIPS定制Yocto时,有必要先对Yocto Project进行简要介绍。

Yocto Project简介

为描述Yocto Project,我们可以引述网站上的常见问题:

“Yocto Project提供了一个开源的、高质量的基础设备和工具,以帮助开发人员创建自己的定制Linux发行版,用于任何硬件架构及跨多个细分市场。Yocto Project旨在为开发人员提供一个良好的开端。Yocto Project还有其他一些项目,包括Poky构建系统、Autobuilder自动构建和测试系统及嵌入式GLIBC(EGLIBC)C库。”

或者,可以观看以下视频来了解:

对于那些熟悉Buildroot发布环境的人而言,Yocto是另一个框架,支持更多的功能,如更多的存储包等。所以,它要更加全面。

内部结构

Yocto分为三个主要的层次(还有其他层,但本文不作描述)。每一层的内容和配置由称作“recipes”的元数据定义。

以下是三个主要层:
基础层(开放嵌入式内核,OE-Core):这是在嵌入式Linux发行版中很常见的内核软件集合。例如BusyBox。软件可以在单一的可执行文件中提供一些定制的Unix工具

设备层:这一层增加了设备/开发板特定的元数据,如内核补丁、内核配置、引导装载程序等。
软件层:这一层添加了一个特定的软件集,如Gnome、XFCE、NodeJS等。

基础层OE-Core有创建功能齐全的嵌入式Linux发行版的元数据,且是基于Yocto框架任何发行版所需的内核。可以使用配置文件来添加更多的层。一旦这些层和元数据被配置,Bitbake创建工具便会解析这些元数据和配置文件,以进行下载和编译,由此创建发行版。

Yocto的起点是什么?

Yocto是一个全面的框架,支持包容和配置许多不同的工具和系统,但却没有具体的着手点。不过,Yocto可以提供了一个Linux发行版的参考Poky,它能提供很好的起点。Poky为无外设系统提供配置文件“core-image-minimal” 以及具有图像使用接口(GUI)的版本“core-image-sato”。

正是由于这些,产品开发人员只要关注产品的软件需要集成的元数据,其余的基础设备则由Yocto提供。

例如,我有一款含UI的软件系统,使用QT框架编写。我可以使用core-image-sato作为参考点,创建嵌入式Linux发行版。我将获取QT软件层,添加路径至我的配置文件中。同时,为我的软件应用程序编写一个定制的元数据,描述对QT的依赖性。Bitbake将理解及解析配置文件,并使用QT和我的定制软件,创建一个core-image-sato分布。有了这些配置文件和元数据,就有了嵌入式Linux发行版,且其支持基于软件UI的QT。

MIPS的定位

从历史上看,MIPS已经作为OE-Core层的一部分,包含在Yocto中。最近,Imagination扩展了这个支持,在2016年10月发行的Yocto2.2中,添加了新的MIPS R6指令集架构至OE-Core层。Imagination还创建了“meta-img”,即在GitHub上可用的设备层。这一层为不同的MIPS平台和QEMU添加了设备配置文件,包括 Creator Ci40、 MIPSfpga、SEAD-3 和Rhino Labs SDNA-7130 (UTM-8)。

使用Poky和meta-img层,我们就能很容易地建立一个基于系统的QEMU,启动运行并获得MIPS提示符。

以下是操作演练:
$ git clone git://git.yoctoproject.org/poky -b morty
$ cd poky
$ git clone https://github.com/MIPS/meta-img.git -b morty
$ source oe-init-build-env
(this will change the current directory to the build one. That is OK)
$ bitbake-layers add-layer ../meta-img
$ MACHINE=qemumips32r2el bitbake core-image-minimal

在接入互联网连接快速运行的设备中,这个过程耗时2小时。
完成上述操作以后,你将在tmp/images/deploy/qemumips32r2el中找到内核和根。

Yocto还可以编辑QEMU仿真器,提供带有正确参数且简单的脚本来运行。

使用 $ ../scripts/runqemu tmp/deploy/images/qemumips32r2el/ nographic
login: root 运行 qemu
(使用Ctrl-a X退出QEMU)

常用的调试笔记:
i) 如果创建时缺失依赖关系,错误报告通常会告知缺失的实用程序。可以使用数据包管理器来安装实用程序。
如果您获得的错误报告提到本地配置不是UTF-8,则可以尝试上述作为临时解决方案。
$ export LC_ALL=en_US.UTF-8

ii) 创建core-image-minimal 要求gcc >= 6(在Ubuntu中)

在根系统中添加定制包
现在,我们可以添加额外的数据包来定制系统。这可能是用于特定应用程序的,或配置后为专有固件加载二进制的一组数据包。这里添加的是“python”数据包:

i) 首先,尝试着在开放式嵌入层指引中找到python现有的元数据
https://layers.openembedded.org/layerindex/branch/master/recipes/?q=python

ii) 看看元数据在开放式嵌入内核层中是否可用。Poky中自动涵括了这一特定层。

iii) 我们所需要做的是,添加‘meta-img/conf/layer.conf’
CORE_IMAGE_EXTRA_INSTALL += “python”

在conf/bblayers.conf所有的配置层中搜索python元数据。
1. iv)Rebuild the QEMU image-minimal

$ cd “to the ‘build’ directory”
$ MACHINE=qemumips32r2el bitbake core-image-minimal
1. iv)重新创建QEMU image-minimal

$ cd “to the ‘build’ directory”
$ MACHINE=qemumips32r2el bitbake core-image-minimal
1. iv)Now when you start QEMU, the python package will have been included and available

$ ../scripts/runqemu tmp/deploy/images/qemumips32r2el/ nographic
login: root
$ python
Python 2.7.12 (default, Feb 7 2017, 15:08:17)
[GCC 6.2.0] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
>>>

启动QEMU,python包将涵括在内并可用

添加自定义固件

Yocto框架高度灵活,使设计师不仅能添加自定义固件到根文件系统中,还可以轻松使用元数据。以Creator Ci40为例。Ci40 Linux内核驱动程序预期Wi - Fi固件在根文件系统以下位置可用。

/lib/firmware/img/uccp420wlan/. There are two files MCP_LOADER.ldr and MAC_LOADER.ldr.
/lib/firmware/img/uccp420wlan/. 有两个文件 MCP_LOADER.ldr 和 MAC_LOADER.ldr.

将这些文件放入文件系统中所需的元数据非常简单,可以在GitHub的链接中获取。

DESCRIPTION = “Closed source binary firmware for the uccp420 wlan on the Ci40”
LICENSE = “CLOSED”
COMPATIBLE_MACHINE = “ci40”
# WiFi firmware version 6.0.4 from https://github.com/CreatorDev/openwrt/blob/target/linux/pistachio/base-f...
FILESEXTRAPATHS_prepend := “${THISDIR}/files:”
SRC_URI = “file://MAC_LOADER.ldr;name=MAC_LOADER;”
SRC_URI += “file://MCP_LOADER.ldr;name=MCP_LOADER;”

SRC_URI[MAC_LOADER.md5sum] = “90d45fdabe671ac84c23584022110391”
SRC_URI[MAC_LOADER.sha256sum] = “084c9ec49fd459d2b81926c26e81e427a0de64f30529ad52c9d17cb5dc526248”

SRC_URI[MCP_LOADER.md5sum] = “d3197e5156eb936c94547eda2447798e”
SRC_URI[MCP_LOADER.sha256sum] = “d235846a2a25e23d78a1fb0460561f7811fbeda90c1701f189ec93e8322ce330”
do_install() {
install -d ${D}/lib/firmware/img/uccp420wlan
install -m 0644 ${THISDIR}/files/MAC_LOADER.ldr ${D}/lib/firmware/img/uccp420wlan/MAC_LOADER.ldr
install -m 0644 ${THISDIR}/files/MCP_LOADER.ldr ${D}/lib/firmware/img/uccp420wlan/MCP_LOADER.ldr
}
FILES_${PN} += “/lib/firmware/img/uccp420wlan”

BitBake解析元数据和定义的名称值变量。SRC_URI变量可以告知文件的位置。这里,它们以与元数据同样的位置出现在子文件夹中。也可以通过使用HTTP、git、URL等其他方法引用。

SRC_URI变量也填充了固件文件的md5及sha256校验和。对于从独立位置或网络获取的固件文件而言,这一点非常有用。如果目标位置的固件变更了,sha256sum便会失效, BitBake将突出错误原因。这样,就可以提早发现错误,以防使用固件生成根文件系统后,由于变更发生错误。

do_install是安装后的一步,它将运行所需的命令,将固件文件复制至目标根中。

总结

MIPS平台上的Yocto提供了必要工具,使设计师能专注于产品本身,而不是花费精力来构建定制发布。本文简要概述了如何使用Yocto框架来定制嵌入式Linux发行版。想获取更详细的资讯,请阅读Yocto参考指南

本文作者系Imagination MIPS平台软件设计工程师Zubair Kakakhel和高级软件工程部主管Peter Wotton。

英文链接:
https://www.imgtec.com/blog/the-yocto-framework-and-mips/

声明:
本文为原创文章,转载需注明作者、出处及原文链接,否则,本网站将保留追究其法律责任的权利

精彩专辑《MIPS处理器》阅读同主题信息。
--电子创新网--
粤ICP备12070055号