buildroot重新编译内核(代码片段)

Li-Yongjun Li-Yongjun     2022-12-15     265

关键词:

点灯

上篇文章我们使用 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使用介绍(代码片段)

buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件... 查看详情

shdkmslinux内核模块在ubuntu上重新编译(代码片段)

查看详情

使用buildroot编译构建系统(代码片段)

使用buildroot编译构建系统buildrootgithub仓库地址https://github.com/100askTeam/neza-d1-buildroot.gitopensbigitee仓库地址https://gitee.com/weidongshan/NezaD1-opensbi.gitu-bootgitee仓库地址https://gitee.com/weidongshan/Neza 查看详情

使用buildroot制作根文件系统(代码片段)

...移植。为了简便我就找大佬沟通了一下,大佬推荐了Buildroot工具来制作根文件系统。平台开发板:正点原子阿尔法Ubuntu版本:16.04buildroot工具来源:正点原子提供的资料包中uboot:原厂制作的uboot内核:原厂... 查看详情

buildroot使用总结与添加本地app到项目(代码片段)

...片平台:瑞芯微RV1126系统架构:uboot+kernel+buildrootBuildroot是Linux平台上一个构建嵌入式Linux系统的框架,整个Buildroot是由Makefile脚本和Kconfig配置文件构成。可以和编译Linux内核一样,通过buildroot配置,menuconf... 查看详情

buildroot构建交叉编译工具链(代码片段)

2.1介绍2.1.1工具链简介一个编译工具链模块是允许为系统编译代码的一组工具。它由一个编译器(在我们的例子中是gcc)、像汇编器和链接器这样的二进制utils(一般是binutils)和一个C标准库(例如GNULibc,uClibc-ng)组成。一个交叉编译工具... 查看详情

为旧内核设置 buildroot

】为旧内核设置buildroot【英文标题】:Setupbuildrootforoldkernels【发布时间】:2012-03-1001:26:28【问题描述】:我正在尝试设置buildroot以交叉编译自定义应用程序。/#uname-aLinuxVenus2.6.12.6-VENUS#323634WedMay2513:40:36CST2011mipsunknown到目前为止,... 查看详情

linux基于imx6ull移植buildroot(代码片段)

文章目录1.Buildroot简介2.获取buildroot源码3.编译环境配置4.通过buildroot编译imx6ull5.修改默认配置适配imx6ullbootloader6.修改默认配置适配imx6ullkernel8.编译烧录验证1.Buildroot简介Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Bui... 查看详情

buildroot构建指南——linux内核

Buildroot可以从LinuxKernel的官网(kernel.org)下载并编译内核,也可以使用用户自己的定制化内核。使用官方内核使用官方的内核构建系统非常简单,事实上,mini2440_defconfig就是采用官方的内核进行构建的。makemenuconfig-->Ke... 查看详情

瑞芯微rv1126buildroot开发学习笔记(代码片段)

1、BuildRoot如何增加一个包?参考<TheBuildrootUserManual.pdf>第17章2、BuildRoot如何单独编译某一个包?如果修改了源码,在编译前运行make<package>-dirclean如果只是修改output目录下的东西,编译前运行make<package>... 查看详情

瑞芯微rv1126buildroot开发学习笔记(代码片段)

1、BuildRoot如何增加一个包?参考<TheBuildrootUserManual.pdf>第17章2、BuildRoot如何单独编译某一个包?如果修改了源码,在编译前运行make<package>-dirclean如果只是修改output目录下的东西,编译前运行make<package>... 查看详情

最快的方式建立自己的linux环境-buildroot-qemu(代码片段)

...快方法。我说最快吗?然后开始:$gitclonegit://git.buildroot.net/buildroot$cdbuildroot/$makeqemu_arm_versatile_defconfig其中qemu_arm_versatile_defconfig是buildroot/configs目录中的文件和defconfig名称。下一个:$makemenuconfig出现类似于Linux内核menuco... 查看详情

android内核编译(代码片段)

...发异常而导致中断。如果是使用的是MacOS,必须在要重新划分磁盘分区,以区分大小写,原有的磁盘不区分大小写,没法编译软件&# 查看详情

rk3568开发笔记:在虚拟机上使用sdk编译制作ubootkernel和buildroot镜像(代码片段)

...p; 一个通用LinuxSDK(RV系类的sdk没有对工程目录包含有buildroot、de 查看详情

我们只能在内核源代码树中重新编译内核模块吗?

】我们只能在内核源代码树中重新编译内核模块吗?【英文标题】:Canweonlyrecompileakernelmoduleinkernelsourcetree?【发布时间】:2013-08-2905:34:47【问题描述】:假设我们安装一个内核2.6.32.el6,然后我们下载2.6.32.el6.src.rpm,我们可以只安... 查看详情

buildroot构建项目---buildroot介绍

1.1什么是buildroot  Buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器... 查看详情

rk3568开发笔记:在虚拟机上使用sdk编译制作ubootkernel和buildroot镜像(代码片段)

若该文为原创文章,转载请注明原文出处本文章博客地址:https://hpzwl.blog.csdn.net/article/details/125844240红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软... 查看详情

根文件系统构建(buildroot方式)(代码片段)

目录何为buildroot?buildroot简介buildroot下载buildroot构建根文件系统配置buildroot编译buildrootbuildroot根文件系统测试buildroot第三方软件和库的配置buildroot下的busybox配置busybox配置busybox中文字符的支持编译busybox根文件系统测试前面我... 查看详情