点灯

上篇文章我们使用 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 中进行重新编译。

并且我们可以在 rsync 位置加一行命令去创建上面提到的缺失的三个文件,这样就不用每次手动创建了
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 成功,重新编译成功。
搞定!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐