Заключение
При компиляции только одного файла для модуля драйвера все работает.
Если я добавлю модуль .c / .h к предыдущему файлу, он снова скомпилируется.
Но я не могу загрузить модуль в ядро.
Подробнее
Я работаю над RPi3B + over ssh из моей системы Ubunto LTS 18.04 Host.
В настоящее время я не использую кросс-инструменты, а собираю прямо на RPi.
Я разрабатываю ядро moudle.
Теперь, когда мой модуль увеличился в размере, я бы хотел разделить его на разные модули .h / .c.
Для начала я реализовал пример из книги «Встроенный Linux, lernen mit dem Raspberry Pi». Однако это по-немецки.
Все работало нормально, пока я не добавил дополнительные объектные файлы в Makefile. До этого я мог загружать и выгружать модуль и видеть каждую форму вывода "printk ()". Также я могу воспроизвести это снова!
Но если я скомпилирую его с дополнительными файлами, все будет отлично, никаких ошибок и предупреждений. Но если я попытаюсь загрузить новый модуль с помощью «insmod».
Нет ответа от ядра на "dmesg".
Нет нового устройства в / dev /
Но «lsmod» это знает!
Есть ли что-то особенное, если я хочу добавить несколько файлов .c / .h в мой модуль драйвера?
Makefile
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
kernel_gpio.h
#ifndef KERNEL_GPIO_H
#define KERNEL_GPIO_H
MODULE_LICENSE("GPL");
void sayHello(void);
#endif // KERNEL_GPIO_H
kernel_gpio.c
#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");
Я полностью сбит с толку, потому что я не получаю ошибок от компилятора или insmod.
Я хотел бы знать, как скомпилировать модуль ядра с дополнительными файлами .c / .h.
Спасибо за ваш совет.