一,package 内添加 驱动模块
1,添加到 kernel other 分支
2,建立模块目录,路径是 package/kernel/hello
3, 在 hello 目录,建立 Makefile 文件
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=hello
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define KernelPackage/hello
SUBMENU:=Other modules
TITLE:=This is a hello driver
FILES:=$(PKG_BUILD_DIR)/hello.ko
AUTOLOAD:=$(call AutoLoad,30,hello)
KCONFIG:=
endef
define KernelPackage/hello/description
This is a hello device.
endef
EXTRA_KCONFIG:= \
CONFIG_HELLO=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,hello))
4,在 hello 目录下, 建立 src 目录,在 src 目录建立 hello.c ,Makefile , Kconfig
MODULE_LICENSE ("GPL") 添加 模块许可,否则提示错误 Unknown symbol in module
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk("driver hello:HelloWorld!\n");
return 0;
}
static void hello_exit(void)
{
printk("driver hello:Goodbye, world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("wenjin");
MODULE_DESCRIPTION("hello test");
MODULE_ALIAS("hello-wj");
5, Makefile
obj-${CONFIG_HELLO}+=hello.o
6, Kconfig
config HELLO
tristate "test hello"
help
This is a example, for debugging kernel model.
If unsure, say N.
7, make menuconfig -> kernel module -> other module -> kmod-hello (M)
8, make package/kernel/hello/compile V=s
二, 交叉编译 .ko 文件
1, 编写 hello.c 文件
如上
2, 编写 makefile 文件
ARCH 需要选择 arm64, 如果选择 arm, 会提示 error: unrecognized argument in option '-mabi=apcs-gnu'
obj-m += drv_regopt.o
CROSS_COMPILE="/home/wenjin/OpenwrtLede/lede/staging_dir/toolchain-aarch64_cortex-a72_gcc-8.4.0_musl/bin/aarch64-openwrt-linux-musl-"
KDIR="/home/wenjin/OpenwrtLede/lede/build_dir/target-aarch64_cortex-a72_musl/linux-bcm27xx_bcm2711/linux-5.4.101"
PWD=$(shell pwd)
all:
make ARCH=arm64 CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o