概述
一、概述
和 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(1109252300@qq.com)
# 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("%sn", str);
}
void userprint(char *str)
{
printk("%sn", 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 已经自动安装完成了。
至此,完成咯!
最后
以上就是健康烤鸡为你收集整理的OpenWRT编译 -- 添加用户自定义的内核模块的全部内容,希望文章能够帮你解决OpenWRT编译 -- 添加用户自定义的内核模块所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复