是否有关于如何在设备驱动程序中进行静态编译的示例包?
我知道obj-y用于静态编译而不是obj-m。我现在在buildroot包中构建了一个可动态加载的模块。该动态模块完全按照我的预期工作。我甚至想通知我可以更改模块makefile以使用obj-y,并添加一个buildroot选项,如果我点击它,它会在drivers / Makefile中附加一行。输出似乎表明我的模块已经构建。但是在我看来我的驱动程序的init函数在启动时没有被执行,因为我没有在/ dev中看到我的设备文件。
答案 0 :(得分:2)
假设您在driver.c
中有一个驱动程序,以及一个名为STATICDRVR
的buildroot包,您可以使用以下Config.in和STATICDRVR.mk文件添加一个静态模块,以便在内核时生成建成:
Config.in
config BR2_PACKAGE_STATICDRVR
bool "Build & link static driver?"
help
This is a driver that blah blah greatness whatever
STATICDRVR.mk
STATICDRVR_VERSION = master
STATICDRVR_SITE = /location/to/STATICDRVR_containing_src
STATICDRVR_SITE_METHOD = local
STATICDRVR_MODULE_SUBDIRS = src
STATICDRVR_INSTALL_TARGET = YES
STATICDRVR_LICENSE = GPLv2
STATICDRVR_LICENSE_FILES = COPYING
STATICDRVR_NAME = STATICDRVR
STATICDRVR_DEPENDENCIES = linux
define STATICDRVR_BUILD_CMDS
#make sure that obj-y += STATICDRVR/ is only in the build makefile once
sed -i '/obj-y += STATICDRVR/d' $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/Makefile
echo "obj-y += STATICDRVR/" >> $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/Makefile
rm -rf $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR
cp -r $(@D)/src $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR
echo "obj-y += driver.o" > $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR/Makefile
endef
define STATICDRVR_INSTALL_STAGING_CMDS
endef
define STATICDRVR_INSTALL_TARGET_CMDS
endef
endif
define STATICDRVR_DEVICES
endef
define STATICDRVR_PERMISSIONS
endef
define STATICDRVR_USERS
endef
$(eval $(kernel-module))
$(eval $(generic-package))
答案 1 :(得分:1)
无法将外部模块与内核静态链接。为此,您必须修补内核并在那里添加模块。