在代码中加入class_create(),class_device_create()函数,编译时华丽丽得报了一大堆错误:
make -C /usr/src/linux-source-4.4.0 M=/home/ubuntu/Documents/first_drv modules
make[1]: Entering directory '/usr/src/linux-source-4.4.0'
CC [M] /home/ubuntu/Documents/first_drv/firstdrv.o
/home/ubuntu/Documents/first_drv/firstdrv.c: In function ‘first_drv_init’:
/home/ubuntu/Documents/first_drv/firstdrv.c:50:23: error: implicit declaration of function ‘class_device_create’ [-Werror=implicit-function-declaration]
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0)
^
/home/ubuntu/Documents/first_drv/firstdrv.c:50:21: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0)
^
/home/ubuntu/Documents/first_drv/firstdrv.c: In function ‘first_drv_exit’:
/home/ubuntu/Documents/first_drv/firstdrv.c:62:2: error: implicit declaration of function ‘class_device_unregister’ [-Werror=implicit-function-declaration]
class_device_unregister(firstdrv_class_dev);
^
cc1: some warnings being treated as errors
scripts/Makefile.build:264: recipe for target '/home/ubuntu/Documents/first_drv/firstdrv.o' failed
make[2]: *** [/home/ubuntu/Documents/first_drv/firstdrv.o] Error 1
Makefile:1420: recipe for target '_module_/home/ubuntu/Documents/first_drv' failed
make[1]: *** [_module_/home/ubuntu/Documents/first_drv] Error 2
make[1]: Leaving directory '/usr/src/linux-source-4.4.0'
Makefile:19: recipe for target 'all' failed
make: *** [all] Error 2
网上搜索后发现是Linux内核版本不同的原因!早期的版本,使用的是上面说的两个函数,但是在2.6.29以后,使用的函数则变成了 class_create()和device_create(),并且要在声明中加入
#include <linux/device.h>
因为定义这些函数是在linux4.4.0/include/linux/device.h里面!
在first_drv_init()和first_drv_exit()函数中把class_device_create()、
class_device_unregister()函数修改为device_create()和device_unregister()后,error消失了,但还是有如下warning:
/home/ubuntu/Documents/first_drv/firstdrv.c:50:21: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
firstdrv_class_dev = device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL
^
/home/ubuntu/Documents/first_drv/firstdrv.c: In function ‘first_drv_exit’:
/home/ubuntu/Documents/first_drv/firstdrv.c:62:20: warning: passing argument 1 of ‘device_unregister’ from incompatible pointer type [-Wincompatible-pointer-types]
device_unregister(firstdrv_class_dev);
^
In file included from /home/ubuntu/Documents/first_drv/firstdrv.c:6:0:
include/linux/device.h:988:13: note: expected ‘struct device *’ but argument is of type ‘struct class_device *’
extern void device_unregister(struct device *dev);
^
Building modules, stage 2.
MODPOST 1 modules
CC /home/ubuntu/Documents/first_drv/firstdrv.mod.o
LD [M] /home/ubuntu/Documents/first_drv/firstdrv.ko
make[1]: Leaving directory '/usr/src/linux-source-4.4.0'
原因是
static struct class_device *firstdrv_class_dev;
这个结构体指针变量的声明也要进行修改,改为
static struct device *firstdrv_class_dev;
完成上述修改后,编译ok啦