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。
?
評論
查看更多