本文参考
https://wiki.openwrt.org/zh-cn/doc/devel/packages
http://blog.chinaunix.net/uid-9217288-id-3060464.html
前面介绍了openwrt添加用户态软件包的方法,现在来说说添加内核模块软件包的方法。
相关介绍
内核模块是一类扩展Linux内核功能的可安装程序。内核模块的加载发生在内核加载之后,(比如使用insmod命令)。
linux源代码包含了很多内核应用程序。在menuconfig时有3种选择,
1.编译进内核;
2.编译成可加载的内核模块;
3.不编译。
要包含这些内核模块,只要make menuconfig选择相应的内核模块选项。如果在make menuconfig时没有发现想要的内核模块,必须添加一个stanza到package/kernel/modules目录的一个文件中。下面是一个从package/kernel/modules/other.mk提取出来的例子。
define KernelPackage/loop
TITLE:=Loopback device support
DESCRIPTION:=Kernel module for loopback device support
KCONFIG:=$(CONFIG_BLK_DEV_LOOP)
SUBMENU:=$(EMENU)
AUTOLOAD:=$(call AutoLoad,30,loop)
FILES:=$(MODULES_DIR)/kernel/drivers/block/loop.$(LINUX_KMOD_SUFFIX)
endef
$(eval $(call KernelPackage,loop))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
此外,你还可以添加不属于Linux源码包的内核模块。在这种情况下,内核模块放在package/目录,跟通常的软件包是一样的。package/Makefile文件使用KernelPackage/xxx定义代替Package/xxx。
接下来没就来简单说一下添加不属于linux源码包的内核模块的添加。
- 创建模块目录
cd openwrt/package
mkdir example
- 1
- 2
- 1
- 2
2.进入example目录,创建Makefile文件和代码路径
cd example
touch Makefile
mkdir src
- 1
- 2
- 3
- 1
- 2
- 3
Makefile具体内容如下:(具体参数说明请看之前的文章)
#
# Copyright (C) 2008 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=example
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define KernelPackage/example
SUBMENU:=Other modules
TITLE:=example driver
DEPENDS:=@LINUX_2_6
FILES:=$(PKG_BUILD_DIR)/*.$(LINUX_KMOD_SUFFIX)
KCONFIG:=
endef
define KernelPackage/example/description
Kernel module to example
endef
EXTRA_KCONFIG:= \
CONFIG_EXAMPLE=m
EXTRA_CFLAGS:= \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
MAKE_OPTS:= \
ARCH="$(LINUX_KARCH)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
SUBDIRS="$(PKG_BUILD_DIR)" \
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
$(EXTRA_KCONFIG)
define Build/Prepare
mkdir -p $(PKG_BUILD_DIR)
$(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" \
$(MAKE_OPTS) \
modules
endef
$(eval $(call KernelPackage,example))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
3.进入src目录,创建代码路径和相关源文件
cd src
touch example.c Makefile
- 1
- 2
- 1
- 2
example.c具体内容如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/* hello_init ---- 初始化函数,当模块装载时被调用,如果成功装载返回0 否则返回非0值 */
static int __init hello_init(void)
{
printk("I bear a charmed life.\n");
return 0;
}
/* hello_exit ---- 退出函数,当模块卸载时被调用 */
static void __exit hello_exit(void)
{
printk("Out, out, brief candle\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
Makefile具体内如如下:
obj-$(CONFIG_EXAMPLE) += example.o
- 1
- 1
回到主路径 backfire/,编译选项配置保存并编译
make menuconfig
Kernel modules --->
Other modules --->
kmod-example
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
选项设置为M,保存退出
然后编译该模块:
make package/example/compile
- 1
- 1
最后找到我们需要的.ko文件
build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/example/example.ko
- 1
- 1
这个文件就是我们需要的.ko文件。
2573

被折叠的 条评论
为什么被折叠?



