一、概述
和 OpenWRT编译 – 添加用户自定义app 类似 本笔记说明如何在 openwrt 中添加用户自定义的内核模块,其中 Makefile 部分相差不多,下面简单的说明一下具体的步骤和内容。
二、文件结构说明
在 openwrt 中,内核模块以及驱动文件都放置在目录
<OpenwrtRootDir>/package/kernel/ 下,本说明文档中主要的目录结构如下。
package/kernel/mydrv/
├── Makefile
└── src
├── Kconfig
├── Makefile
└── mydrv.c
1 directory, 6 files
三、创建文件夹以及相关文件
1、创建文件夹 mydrv ,创建 Makefile 等
$ mkdir mydrv ; code mydrv # 创建目录mydrv 并且以 vscode 的方式打开
2、编辑上层Makefile
首先,说到是编辑 Makefile ,其实严格来说是拷贝现成的Makefile然后修改而来的。经过修改后的 Makefile 的内容主要为如下内容。
#
# Copyright (C) 2008-2010 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:=mydrv
PKG_RELEASE:=3
PKG_VERSION:=1.0
PKG_LICENSE:=GPL-2.0
include $(INCLUDE_DIR)/package.mk
define KernelPackage/$(PKG_NAME)
CATEGORY := Songshuai Package
SUBMENU := Drivice Testing modules
TITLE := Songshuai mydrv driver
FILES := $(PKG_BUILD_DIR)/$(PKG_NAME).ko
KCONFIG :=
DEPENDS :=
MAINTAINER := Songshuai([email protected])
# AUTOLOAD := $(call AutoLoad,30,$(PKG_NAME),1)
endef
define KernelPackage/$(PKG_NAME)/description
If you can't figure out what this program does, you're probably \
brain-dead and need immediate medical attention.
endef
EXTRA_KCONFIG:= \
CONFIG_MYDRV=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:= \
$(KERNEL_MAKE_FLAGS) \
SUBDIRS="$(PKG_BUILD_DIR)" \
EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
$(EXTRA_KCONFIG)
define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" \
$(MAKE_OPTS) \
modules
endef
$(eval $(call KernelPackage,$(PKG_NAME)))
关于本Makefile,修改的部分为:
PKG_NAME:
表示软件包名称,修改成自己需要的名称。并且在后续用到的这个名称的地方,都使用 $(PKG_NAME)
来表示。
PKG_VERSION:
新增加的,可以省略不要
PKG_RELEASE:
表示 Makefile 的版本号。
是的,其实需要的修改的 也就 PKG_NAME 了,如果使用这个模板,那么后续的一般的 包 都可以只修改 PKG_NAME 就可以使用了。
3、创建子文件夹 src 、创建子 Makefile、mydrv.c 等
1)编辑内核模块的文件
mydrv.c
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
void userprint(char *str)
{
printk("%s\n", str);
}
void userprint(char *str)
{
printk("%s\n", str);
}
static int mydrv_init(void)
{
userprint("mydrv -- mydrv_init");
return 0;
}
static void mydrv_exit(void)
{
userprint("mydrv -- mydrv_exit");
}
module_init(mydrv_init);
module_exit(mydrv_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Songshuai");
2)编辑 Makefile 文件
在子级 Makefile 中写入下面的内容
obj-$(CONFIG_MYDRV) += mydrv.o
3)编辑 Kconfig文件
在 Kconfig 中写入下面的内容
config MYDRV
tristate "It is songshuai Test driver"
default "n"
help
It is songshuai Test driver
然后进行 make menuconfig 进行选择。
单独编译内核模块
$ make package/kernel/mydrv/compile V=99
将这个 .ipk 文件通过工具FileZilla传送到设备上, 并在设备上通过 opkg 安装,
# opkg install kmod-mydrv_4.14.127\+1.0-3_mipsel_24kc.ipk
安装效果如下图所示。
然后使用 modprobe 或者使用 insmod 加载模块。
# modprobe /lib/modules/4.14.127/mydrv.ko
加载显示效果如下图所示。
如果需要卸载应用,则可以使用rmmod 加载模块。
# rmmod mydrv
加载显示效果如下图所示。
如果需要模块随系统自动加载,则只需要将
# AUTOLOAD := $(call AutoLoad,30,$(PKG_NAME),1)
前面的 # 去掉,记得在修改成自动加载的时候,将前面 meke menuconfig 中的 M 修改为 Y 。然后再次编译该软件包即可。
可以看出来在系统启动的过程中,mydrv 已经自动安装完成了。
至此,完成咯!