この記事は SmartDrive Advent Calendar 2017 の 23 日目の記事です。
SmartDrive でバックエンドエンジニアをしている @ahoki です。
弊社では、デバイスのファームウェアの開発をしており、一部のデバイスでは Yocto を使用してカスタマイズして組込 Linux の環境を構築しています。
Yocto ではいろいろなパッケージを自分で簡単に追加することができますが、パッケージをそのまま使うのではなくて、ソースコードに手を入れて使用したいということが度々起こりえます。
本記事では NXP 社の i.MX7 の Yocto Linux を例としてパッチを当てる方法を紹介したいと思います。
パッチをあてるところ
今回は例として、i.MX7 のプロセッサのクロックをデフォルト設定よりも低くできるようにします。
具体的にはソースコード (Device Tree Source) の下記になります。
/tmp/work/imx7dsabresd-poky-linux-gnueabi/linux-imx/4.1.15-r0/git/arch/arm/boot/dts/imx7d.dtsi*
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
operating-points = <
/* KHz uV */
1200000 1225000
996000 1075000
792000 975000
396000 975000 ★追記
198000 975000 ★追記
>;
clock-latency = <61036>; /* two CLK32 periods */
clocks = <&clks IMX7D_ARM_A7_ROOT_CLK>, <&clks IMX7D_ARM_A7_ROOT_SRC>,
<&clks IMX7D_PLL_ARM_MAIN_CLK>, <&clks IMX7D_PLL_SYS_MAIN_CLK>;
clock-names = "arm", "arm_root_src", "pll_arm", "pll_sys_main";
};
安直にパッチを当てる方法
一番単純な方法はダウンロードして展開先のファイルを直接書き換えてビルドし直す方法です。
下では DISTRO="X11"
, MACHINE="sato"
のケースを例としています。
vi tmp/work-shared/imx7dsabresd/kernel-source/arch/arm/boot/dts/imx7d-sdb.dts ★ファイルを編集
bitbake linux-imx -c compile -f
bitbake core-image-sato
${YOCTO_ROOTDIR}
直下の tmp/work
または tmp/work-shared
に展開されたソースコードがあるのでそれを直接編集しています。
その後、bitbake
コマンドに -f
をつけることで強制的に指定したパッケージに対してコンパイルし直しています。
ただし、この方法はちょっとしたお試しでやるにはいいですが、新たにビルドする度にファイルを編集する必要があるため、継続的に使用する環境では現実的ではありません。
レシピを使ったパッチの当てる方法
パッチの適用を構成管理できるようにするためにはレシピを作成する必要があります。
Gitフォーマットパッチの作成
まず、下記のようにパッチファイルを作成します。
cd tmp/work-shared/imx7dsabresd/kernel-source
vi arch/arm/boot/dts/imx7d-sdb.dts ★ファイルを編集
git add arch/arm/boot/dts/imx7d-sdb.dts
git commit -s -m "Add cpu clock down options"
git format-patch -1
レシピファイルの作成
次に作成したパッチファイルをあてるためのレシピを作成します。
レシピファイルは <パッケージ名>_<バージョン>.bbappend
という形式のファイル名にするのが習わしです。 (今回は linux-imx_4.1.15.bbappend
)
また、パッチファイルは <パッケージ名>-<バージョン>/
ディレクトリ以下に置きます。
mkdir -p meta-example/recipe-kernel/linux/linux-<version>
cd meta-example/recipe-kernel/linux/
cp <patch file> linux-imx-4.1.15
vi linux-imx_4.1.15.bbappend
<version>
の部分については適宜自分が使っている Linux の Kernel バージョンに合わせて記載します。
linux_<version>.bbappend
は下記のように記載します。
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:"
SRC_URI += " \
file://0001-Add-cpu-clock-down-options.patch \ |
"
先頭一行目はパッチファイルを置いたディレクトリを指定しています。
また、 SRC_URI
はパッチファイル名を指定しています。
Yocto ビルドにレシピファイルの置き場を指定する
このままでは Bitbake でレシピファイルが見つけられないので、ありかを教えてあげる必要があります。
そのためには、conf/bblayers.conf
に下記を追記します。
BBLAYERS += " ${BSPDIR}/meta-example "
構成管理
本例では meta-example
以下および conf/bblayers.conf
を構成管理しておけばパッチを適用済みの環境を繰り返し構築することができます。
まとめ
手順を示したようにレシピを使ってパッチを適用するのは結構面倒です。
まずはソースコードを直接書き換えてビルドすることで、パッチの効果を確認した上でレシピを作成して管理することをおすすめします。