OpenWRT编译 -- 添加用户自定义的内核模块

一、概述

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 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 已经自动安装完成了。
在这里插入图片描述

至此,完成咯!

猜你喜欢

转载自blog.csdn.net/zhemingbuhao/article/details/104049712