工控網首頁
>

應用設計

>

基于Openembedded開發環境打內核補丁

基于Openembedded開發環境打內核補丁

Linux

簡介

盡管 OpenEmbedded/Yocto 一個用于生成鏡像文件的很好的工具,但是利用這個編譯系統來測試微小軟件更改,卻會變得復雜和緩慢。我建議可以單獨更改內核然后編譯,在項目的最后測試所有的變更,再往 OpenEmbedded/Yocto 中添加所做的修改。

為了演示這個方法,我們將往 Toradex 計算機模塊 Colibri VF61 使用的內核中添加 NXP(之前的 Freescale)的慣性測量器 mma8653 驅動。

步驟

首選需要安裝好 OpenEmbedded 以及所需的軟件。你可以參考這個說明操作。

為了確定你的開發板所使用的內核版本,首先你可以查看不同開發板使用的內核 recipes。在本博文中,你也可以找到這些信息。

cd stuff
find . -wholename "*recipes-kernel/linux*.bb"

在這些結果中,我們感謝興趣的文件位于 meta-toradex/recipes-kernel/linux/ 目錄。對應目錄中的文件如圖 1 所示:

Page where a new repo is created

圖 1:meta-toradex/recipes-kernel/linux/ 目錄

正如你看到的,有許多不同版本的內核。在上面的目錄中,使用下面命令查看,你的開發板使用的哪一個內核。結果如圖 2 所示:

grep -nre "COMPATIBLE_MACHINE" *

Commands for synchronization

圖 2: kernel recipes 和相應的開發板

有些開發板會使用多個內核。為了快速確定開發板正在使用的內核版本,你可以進入 build 目錄,針對 kernel recipes 執行 bitbake 命令,這里使用 linux-toradex。在運行的過程中仔細觀察,你會發現正在使用的 recipe,如圖 3 所示(你也可以查找 PREFERRED_PROVIDER_virtual/kernel 變量):

bitbake linux-toradex

GitHub repositories tab

圖 3:使用 bitbake 命令查看開發板使用的內核版本

現在我們知道所使用的 recipe,我們打開這個文件。下面是 stuff/meta-toradex/recipes-kernel/linux/linux-toradex_4.4.bb

require recipes-kernel/linux/linux-imx.inc
require recipes-kernel/linux/linux-dtb.inc

SUMMARY = "Linux kernel for Toradex Colibri VFxx Computer on Modules"

SRC_URI = "git://git.toradex.com/linux-toradex.git;protocol=git;branch=${SRCBRANCH} \
                      file://defconfig"

KERNEL_MODULE_AUTOLOAD += "${@bb.utils.contains('COMBINED_FEATURES', 'usbgadget', ' libcomposite', '',d)}"

LOCALVERSION = "-v2.6b2"
SRCBRANCH = "toradex_vf_4.4"
SRCREV = "efe965a5dad66bd14219cdc9474ea75eda783456"
DEPENDS += "lzop-native bc-native"
COMPATIBLE_MACHINE = "(vf)"

我們感興趣的是 SRC_URI、SRCBRANCH 和 RCREV 變量。SRC_URI 指明從哪里下載內核源碼以及使用哪一個配置文件。SRCBRANCH 是 SRC_URI 中 git repository 指向的分支。SRCREV 是分支使用的 commit。

我們復制相同的分支到電腦主機上,查看最后 5 個 commit 內容。結果如圖 4 所示:

git clone -b 2015.04-toradex git://git.toradex.com/linux-toradex.git

git log -5 --pretty=oneline

GitHub repositories tab

圖 4:內核源碼中最后 5 個 commit

你需要選擇和 OpenEmbedded 使用同樣 commit 號的分支。SRCREV(以 efe 開頭) 變量中有的 commit hash 值和 recipe的 SERCREV 是一致的。你可以使用 git branch --contains 命令看到。確保你使用了正確的分支。你可以創建新的分支來做更改:

git branch -b toradex_vf_4.4_mydev

進行更改并添加到 OpenEmbedded

本文章中將以 mma8653 加速度傳感器驅動為例,并且也會將其添加到開發板的 device tree 中。

首先,針對開發板加載默認的配置:

export ARCH=arm
make colibri_vf_defconfig

然后,根據你的需要配置內核以及修改源代碼。使用 menuconfig 使能加速度傳感器驅動,如下面圖 5 所示:

make menuconfig

GitHub repositories tab

圖 5:使能 mma8452Q(兼容 mma8653)加速度傳感器內核驅動

使用下面命令將配置保持到新的文件中: make savedefconfig

目前的開發板配置將會使用保存到 defconfig 文件中。為了查看更改的內容,我們將配置文件和之前的備份文件做對比。結果如圖 6 所示:

meld defconfig arch/arm/configs/colibri_vf_defconfig

GitHub repositories tab

圖 6:使能 mma8452 驅動前后對比

唯一的更改是設置了 CONFIG_MMA8452。保持新的配置文件:

mv defconfig arch/arm/configs/colibri_vf_mma_8653_defconfig

同樣 device tree 也需要一些修改。打開 arch/arm/boot/dts/vf-colibri-eval-v3.dtsi,修改 &i2c0 節點(127行)。紅色的部分是所添加的內容:

&i2c0 {
        status = "okay";

        /* TouchRevolution Fusion 7 and 10 multi-touch controller */
        touch: touchrevf0710a@10 {
                compatible = "touchrevolution,fusion-f0710a";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_gpiotouch>;
                reg =<0x10>;
                gpios = <&gpio0 30 GPIO_ACTIVE_HIGH /* SO-DIMM 28, Pen down interrupt */
                                &gpio0 23 GPIO_ACTIVE_LOW /* SO-DIMM 30, Reset interrupt */
                                >;
                status = "disabled";
        };

        /* M41T0M6 real time clock on carrier board */
        rtc: m41t0m6@68 {
                compatible = "st,m41t00";
                reg =<0x68>;
        };};

并且添加下面的代碼。放在 &iomuxc 節點中,位于文件的結尾處。更多關于 device tree 的定制信息可以從開發者中心網站查詢到。

pinctrl_mma: mma {
                        fsl,pins = <
                                VF610_PAD_PTB19__GPIO_41        0x22ed
                        > ;
                };

提交你做的更改并創建一個補丁文件:

git commit -m "mma8653 accelerometer"
git format-patch --signoff HEAD~1

如果你有多個提交,可以改變上面數字 1 為你所作提交的次數。

復制補丁文件和 defconfig 文件到你使用 recipe 所在的目錄,從而把相應的更改添加到 OpenEmbedded:

cp 0001-mma8653-accelerometer.patch /home/prjs/oe-core/stuff/meta-toradex/recipes-kernel/linux/linux-toradex-4.4/

cp arch/arm/configs/colibri_vf_mma8653 /home/prjs/oe-core/stuff/meta-toradex/recipes-kernel/linux/linux-toradex-4.4/defconfig

編輯 recipe 文件應用補丁,在 SRC_URI 中添加如下內容:

SRC_URI = "git://git.toradex.com/linux-toradex.git;protocol=git;branch=${SRCBRANCH} \
                      file://0001-mma8653-accelerometer.patch \
                      file://defconfig"

最后編譯內核:

bitbake -c clean linux-toradex
bitbake virtual/kernel

內核和 device tree 都會部署到 out-glibc/deploy/images/colibri-vf/ 目錄,如圖 7 所示。你可以通過這篇文章的方法把他們部署到開發板上。

GitHub repositories tab

圖 7:內核鏡像、編譯的模塊和 device tree。

總結

正如文章開頭所說的,在編譯框架中編譯內核是可行的,盡管有一些復雜。有對應的命令實現這種功能,但是需要對 OpenEmbedded/Yocto 有很好的了解,確保所需要的更改。

本文的主旨是向您演示可以在編譯框架外通過編譯和定制內核來隔離問題。希望本文對您有所幫助,下次見!

投訴建議

提交

查看更多評論
其他資訊

查看更多

通過 Docker 部署測試 CODESYS PLC示例

Yocto layer 使用 TI AM62 安全啟動功能

定制 Linux Kernel Driver 編譯示例

在 NXP i.MX 95 上運行 Zephyr 實現非對稱多核處理

HDMI 顯示器熱插拔對應顯示應用啟停測試