はじめに
本章では、ドライバのビルド設定に関わるファイルである、Makefile、Kernel Config、Kconfigについて説明します。
Makefile
まず、照度センサドライバであるltr578.cが格納されている以下フォルダを見てみましょう。
kernel/mediatek/4.4/drivers/misc/mediatek/sensors-1.0/alsps/ltr578/
Makefileに
obj-y := ltr578.o
の記載があります。ltr578.cから生成されるltr578.oをobj-yに追加することで、Linuxカーネル本体と静的にリンクしています。
1つ上の階層のMakefileを見てみましょう。
obj-$(CONFIG_MTK_LTR578) += ltr578/
の記載があります。ltr578のフォルダ自体をビルド対象にするかの記載で、これもobj-yにする必要があります。
Kernel Config
Makefileの$(CONFIG_MTK_LTR578)のCONFIGという部分を見て気づいた方もいらっしゃると思いますが、別のファイルで、この値にyを入れるか入れないかで、このドライバを有効にするかしないかを決める仕組みとなっています。これがKernel Configです。
Fire HD 10 (9th Generation)では「kernel/mediatek/4.4/arch/arm64/configs/maverick_defconfig
」が使われており、このファイルに値が記載されています。実際見てみると「CONFIG_MTK_LTR578=y」となっており、ltr578のフォルダ自体がビルド対象となっていることが分かります。
Kconfig
Kernel Configに関わるファイルとして、Kconfigというファイルもあります。ltr578.cが格納されているフォルダに戻って、Kconfigファイルを開いてみましょう。
config MTK_LTR578
bool "ltr578 alsps sensor for MediaTek package"
default n
の記載があり、CONFIG_MTK_LTR578の説明と、デフォルトで無効「default n」の記載があります。では、「default y」にしたらどうなるでしょうか。実は、先ほどKernel Configの値が記載されていたmaverick_defconfigに記載が無くとも、「CONFIG_MTK_LTR578=y」の動作になります。「default y」はあまり見ないですが、依存関係等が記載されており、他のconfigを有効にすることで、有効になるケース等は多々あります。
最後に
Kconfigがあるので最終的にどのconfigが有効になっているかは、maverick_defconfigを見ても実は分かりません。最終的なKernel Configは、実際に動いているデバイスでコマンドが実行できる状態であれば、「zcat /proc/config.gz
」を実行することで確認できます。以下が、Fire HD 10 (9th Generation)上で実行した結果です。CONFIG_MTK_LTR578もyである事が読み取れます。
maverick:/ $ zcat /proc/config.gz
#Automatically generated file; DO NOT EDIT.
#Linux/arm64 4.4.146 Kernel Configuration#
CONFIG_ARM64=y
CONFIG_64BIT=y
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_MMU=y
CONFIG_ARCH_MMAP_RND_BITS_MIN=18
CONFIG_ARCH_MMAP_RND_BITS_MAX=24
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11
CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MAX=16
<省略>
CONFIG_MTK_LTR303 is not set
CONFIG_MTK_STK3X1X_NEW=y
CONFIG_MTK_LTR578=y
CONFIG_MTK_STK3X1X_DUAL is not set
CONFIG_MTK_LTRX130A_DUAL is not set
<省略>
CONFIG_FONT_SUPPORT=y
CONFIG_FONT_8x16=y
CONFIG_FONT_AUTOSELECT=y
CONFIG_SG_SPLIT is not set
CONFIG_ARCH_HAS_SG_CHAIN=y
これまで、説明してきたobj-yは、Linuxカーネルと静的にリンクする方法です。もう一つ、obj-mという物があり、動的にリンクする方法で、カーネル本体とは別に、ローダブルモジュール、ko拡張子の別ファイルとしてビルドする方法もあります。動的にリンクするので、デバイスが起動した後に「modprobe」コマンド等を用いて後から追加していくことが可能です。これらは、後から追加していく都合上、前述の「zcat /proc/config.gz
」で確認できないケースもあります。代わりに「lsmod
」コマンドを用いれば、今ロードされているモジュールは以下の通り確認可能です。
maverick:/ $ lsmod
Module Size Used by
wlan_drv_gen3 1433600 0
wmt_chrdev_wifi 20480 1 wlan_drv_gen3
bt_drv 24576 0
wmt_drv 1122304 4 wlan_drv_gen3,wmt_chrdev_wifi,bt_drv
hid_ftv_bleremote 20480 0
perfinfo 16384 0
コメント