Yocto:无需补丁向内核源码添加驱动的可行方法
无需补丁在Yocto中添加内核源码文件的方法
当然有几种实操性强的方式可以跳过补丁步骤,直接添加自定义的.c/.h文件并让Yocto编译到内核或作为模块,下面是具体方案:
方案1:直接向内核源码树追加文件并编译
适合需要把代码整合进内核源码树(比如新增内置驱动)的场景:
- 在你的自定义layer中创建对应内核recipe的bbappend文件,比如
recipes-kernel/linux/linux-yocto_%.bbappend - 在layer的
files目录下放你的mydriver.c和mydriver.h文件 - 在bbappend中添加文件复制逻辑,将文件放到内核源码的指定目录:
SRC_URI += "file://mydriver.c file://mydriver.h" do_configure_prepend() { # 示例:把文件复制到网卡驱动目录 cp ${WORKDIR}/mydriver.c ${S}/drivers/net/ cp ${WORKDIR}/mydriver.h ${S}/drivers/net/ # 追加编译规则到对应目录的Makefile echo 'obj-$(CONFIG_MY_DRIVER) += mydriver.o' >> ${S}/drivers/net/Makefile } - 添加内核配置启用驱动:在
files目录创建mydriver.cfg,内容为CONFIG_MY_DRIVER=y(或=m编译为模块),然后在bbappend中追加:KERNEL_CONFIG_FRAGMENTS += "${WORKDIR}/mydriver.cfg"
方案2:编译外部内核模块(Out-of-Tree)
这是最灵活的方式,完全独立于内核源码树,不用修改任何内核文件:
- 创建独立的模块recipe,比如
recipes-kernel/mydriver/mydriver.bb,内容示例:SUMMARY = "Custom out-of-tree kernel module" LICENSE = "GPL-2.0-only" LIC_FILES_CHKSUM = "file://COPYING;md5=eb723b61539feef013de476e68b5c50a" SRC_URI = "file://mydriver.c file://mydriver.h file://Makefile" S = "${WORKDIR}" inherit module MODULES_INSTALL_TARGET = "/lib/modules/${KERNEL_VERSION}/extra/" - 对应的
files目录下放mydriver.c、mydriver.h和Makefile,Makefile内容:obj-m += mydriver.o KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules clean: $(MAKE) -C $(KERNELDIR) M=$(PWD) clean - 在你的镜像recipe中添加
IMAGE_INSTALL:append = " mydriver",模块就会被打包进镜像
方案3:用devtool本地管理源码(不生成补丁)
如果习惯用devtool,也能避免补丁生成:
- 执行
devtool modify linux-yocto将内核源码拉到本地工作区 - 在本地工作区直接新增
.c/.h文件,修改必要的Makefile/Kconfig - 开发完成后,执行
devtool finish linux-yocto <你的自定义layer>,devtool会把新增和修改的文件直接复制到layer的files目录,后续构建时Yocto会直接用这些文件覆盖内核源码树内容,无需生成补丁
这些方案都能简化开发流程,其中外部模块方案最适合独立驱动的开发和维护。
内容的提问来源于stack exchange,提问作者Antoni
相关产品推荐
相关产品推荐

