buildroot 重新编译内核
Posted Li-Yongjun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了buildroot 重新编译内核相关的知识,希望对你有一定的参考价值。
点灯
上篇文章我们使用 buildroot 编译出了 BananaPi M1 的镜像,烧录到 SD 卡,系统跑起来后,我便开始了内核设备树的探索。
先从点灯开始,进入到板子的 /sys/class/leds/ 目录看到
# cd /sys/class/leds/
# ls
bananapi:green:usr
其中 bananapi:green:usr
正是对应板子上的绿色 LED 灯,原理图如下
进入到 bananapi:green:usr
,我们向 brightness 文件写入 1,即可点亮绿色 LED 灯
# cd bananapi:green:usr/
# ls
brightness max_brightness subsystem uevent
device power trigger
# echo 1 > brightness
向 trigger 写入 heartbeat 就可以让绿色 LED 灯像心跳一样闪动
# echo heartbeat > trigger
设备树
我们使用 buildroot 编译的 Banana Pi M1 镜像,内核使用的是 linux-4.18.12 原始代码。既然研究设备树,那就先动手改一改设备树,跑一跑感受一下。
修改内核
于是我就把设备树中 LED 的名字改了一下
buildroot-2021.05/output/build/linux-4.18.12/arch/arm/boot/dts/sun7i-a20-bananapi.dts
leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&led_pins_bananapi>;
green {
/* label = "bananapi:green:usr"; */
label = "green";
gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>;
};
};
重新编译
$ make linux-rebuild
make[1]: 进入目录“/home/liyongjun/project/board/buildroot-2021.05”
rm -f /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.stamp_installed
rm -f /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.stamp_staging_installed
rm -f /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.stamp_target_installed
rm -f /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.stamp_images_installed
rm -f /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.stamp_host_installed
rm -f /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.stamp_built
>>> linux 4.18.12 Building
...
comm: /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.files-list.before: No such file or directory
comm: /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.files-list-staging.before: No such file or directory
comm: /home/liyongjun/project/board/buildroot-2021.05/output/build/linux-4.18.12/.files-list-host.before: No such file or directory
make[1]: 离开目录“/home/liyongjun/project/board/buildroot-2021.05”
报错了,提示没有 .files-list.before
、.files-list-staging.before
、.files-list-host.before
这三个文件。
看了下 Makefile,貌似是用来辅助打包镜像用的。
灵性操作
我在这里也是卡了大半天,buildroot 的 Makefile 还是稍显复杂的,找了半天都没找到出错的地方是 Makefile 的哪条语句。后来索性想,你不是需要这三个文件吗,那我就手动给你创建这三个文件试试,结果,还真就编译通过了。。
正规操作
后来才知道原来 buildroot 有个功能叫 OVERRIDE_SRCDIR,专门处理修改代码并同步的问题。
我们可以在 output 以外的位置修改源码,这也是一个好习惯,不然哪天不小心 make clean 了,辛辛苦苦修改的代码就没了。。
我们在 local.mk 里指定 linux-kernel 对应的源码目录
buildroot-2021.05/local.mk
LINUX_OVERRIDE_SRCDIR = /home/liyongjun/project/board/buildroot-2021.05/override/linux-4.18.12
这样,当我们进行 make linux-rebuild 的时候,buildroot 就会使用 rsync 将指定路径的代码同步到 output/build 中进行重新编译。
完善
不过,编译的时候还是出现了和上面一样缺少那三个文件的错误,为了方便日后编译,索性将创建这三个文件的动作写到 Makefile 中
buildroot-2021.05/package/pkg-generic.mk
# Rsync the source directory if the <pkg>_OVERRIDE_SRCDIR feature is
# used.
$(BUILD_DIR)/%/.stamp_rsynced:
@$(call step_start,rsync)
@$(call MESSAGE,"Syncing from source dir $(SRCDIR)")
@mkdir -p $(@D)
$(foreach hook,$($(PKG)_PRE_RSYNC_HOOKS),$(call $(hook))$(sep))
@test -d $(SRCDIR) || (echo "ERROR: $(SRCDIR) does not exist" ; exit 1)
rsync -au --chmod=u=rwX,go=rX $($(PKG)_OVERRIDE_SRCDIR_RSYNC_EXCLUSIONS) $(RSYNC_VCS_EXCLUSIONS) $(call qstrip,$(SRCDIR))/ $(@D)
touch $(@D)/.files-list.before ; touch $(@D)/.files-list-staging.before ; touch $(@D)/.files-list-host.before ;
$(foreach hook,$($(PKG)_POST_RSYNC_HOOKS),$(call $(hook))$(sep))
@$(call step_end,rsync)
$(Q)touch $@
再次 make linux-rebuild && make,不会报错了。
验证
烧录新编译的镜像,开机运行,进入到 /sys/class/leds/ 目录
# cd /sys/class/leds/
# ls
green
果然,名称变成了 green
说明我们修改 dts 成功,重新编译成功。
搞定!
以上是关于buildroot 重新编译内核的主要内容,如果未能解决你的问题,请参考以下文章