当只为一个驱动程序模块编译一个文件时,一切正常。 如果将.c / .h模块添加到先前的文件中,它将再次编译。 但是我无法将模块加载到内核中。
我正在通过Ubunto LTS 18.04主机系统上的ssh开发RPi3B +。 目前,我没有使用任何交叉工具,而是直接在RPi上构建。
我正在开发内核模块。 现在,我的模块增加了,我想将其分成不同的.h / .c模块。
首先,我实现了《嵌入式Linux,rernen mit dem Raspberry Pi》一书中的示例。但是它是德语的。
一切正常,直到我将其他目标文件添加到Makefile中为止。在此之前,我可以加载和卸载模块,并且可以看到每个输出形式“ printk()”。我也可以再次复制它!
但是,如果我使用其他文件进行编译,则一切正常,没有错误也没有警告。但是,如果我尝试使用“ insmod”加载新模块。 内核对“ dmesg”没有响应。 / dev /下没有新设备 但是“ lsmod”知道这一点!
如果要在驱动程序模块中添加几个.c / .h文件,有什么特别的地方吗?
ifneq ($(KERNELRELEASE),)
obj-m := kernel_nfc_module.o
kernel_nfc_module-objs := kernel_gpio.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -Wall -C $(KDIR) M=$(PWD) modules
endif
clean:
rm -rf *.ko *.o .*.cmd .tmp_versions Module.symvers
rm -rf modules.order *.mod.c
#ifndef KERNEL_GPIO_H
#define KERNEL_GPIO_H
MODULE_LICENSE("GPL");
void sayHello(void);
#endif // KERNEL_GPIO_H
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/gpio.h>
#include <linux/uaccess.h>
#include <linux/string.h>
#include "kernel_gpio.h"
#include "kernel_utils.h"
void sayHello(void)
{
printk("Hello Module");
}
MODULE_LICENSE("GPL");
我完全感到困惑,因为o没有收到来自编译器或insmod的错误。 我想知道如何使用其他.c / .h文件来编译内核模块。
感谢您的建议。
答案 0 :(得分:0)
感谢Tsyvarev的有用评论,我得以解决我的问题。
我有以下文件:
我必须为两个来源的组合目标文件添加一个新名称!
ifneq ($(KERNELRELEASE),)
obj-m := nfc_module.o
nfc_module-objs := kernel_nfc_module.o kernel_gpio.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -Wall -C $(KDIR) M=$(PWD) modules
endif
clean:
rm -rf *.ko *.o .*.cmd .tmp_versions Module.symvers
rm -rf modules.order *.mod.c