源码
#include <linux/init.h> //初始化头文件
#include <linux/module.h> //最基本的文件, 支持动态添加和卸载模块
#include <linux/miscdevice.h> //注册杂项设备头文件
#include <linux/fs.h> //注册设备节点的文件结构体
struct file_operations misc_fops={ //文件操作集
.owner = THIS_MODULE
};
struct miscdevice misc_dev = { //杂项设备结构体
.minor = MISC_DYNAMIC_MINOR, //动态申请的次设备号
.name = "hello_misc", //杂项设备名字是 hello_misc
.fops = &misc_fops, //文件操作集
};
static int misc_init(void){ //在初始化函数中注册杂项设备
int ret;
ret = misc_register(&misc_dev); //注册杂项设备
if(ret<0) //判断杂项设备是否注册成功
{
printk("misc registe is error \n"); //打印杂项设备注册失败
}
printk("misc registe is succeed \n"); //打印杂项设备注册成功
return 0;
}
static void misc_exit(void){ //在卸载函数中注销杂项设备
misc_deregister(&misc_dev); //注销杂项设备
printk("misc goodbye! \n"); //打印杂项设备注销成功
}
module_init(misc_init);
module_exit(misc_exit);
MODULE_LICENSE("GPL");
编写Makefile
obj-m += misc.o #先写生成的中间文件的名字是什么, -m 的意思是把我们的驱动编译成模块
KDIR:=/home/myzr/my-work/02_source/linux-4.1.15/
PWD?=$(shell pwd) #获取当前目录的变量
all:
make -C $(KDIR) M=$(PWD) modules #make 会进入内核源码的路径, 然后把当前路径下的代码编译成模块
把misc.ko拷贝到共享目录
sudo cp misc.ko /home/nfs/
在开发板上加载驱动模块
insmod misc.ko
驱动加载成功后,输入以下命令,查看注册的设备节点是否存在,如下图所示,设备节点存在。
ls /dev/h*
卸载驱动模块
rmmod misc