申请字符类设备号
- 静态申请设备号
头文件
/*定义module_param module_param_array的头文件*/
#include <linux/moduleparam.h>
/*定义module_param module_param_array中perm的头文件*/
#include <linux/stat.h>
/*MKDEV转换设备号数据类型的宏定义*/
#include <linux/kdev_t.h>
申请函数
/*输入主设备号*/
module_param(numdev_major,int,S_IRUSR);
/*输入次设备号*/
module_param(numdev_minor,int,S_IRUSR);
dev_t num_dev;
num_dev = MKDEV(numdev_major,numdev_minor); //主次设备号
register_chrdev_region(num_dev,DEVICE_MINOR_NUM,DEVICE_NAME); //序列化设备号,从设备个数,设备名
2 . 动态申请设备号
头文件
/*分配内存空间函数头文件*/
#include <linux/slab.h>
申请函数
alloc_chrdev_region(&num_dev,numdev_minor,DEVICE_MINOR_NUM,DEVICE_NAME); //获得序列化设备号,次设备号,设备个数,设备名
numdev_major = MAJOR(num_dev);
创建class
- 头文件
/*包含函数device_create 结构体class等头文件*/
#include <linux/device.h>
- 创建函数
static struct class *myclass;
myclass = class_create(THIS_MODULE,DEVICE_NAME);
注册设备
- 头文件
/*设备节点文件操作结构体*/
#include <linux/fs.h>
/*定义字符设备的结构体*/
#include <linux/cdev.h>
- 注册函数
struct file_operations my_fops = {
.owner = THIS_MODULE,
};
struct cdev cdev;
int devno = MKDEV(numdev_major,numdev_minor+index);
/*数据初始化*/
cdev_init(&cdev,&my_fops);
cdev.owner = THIS_MODULE;
cdev.ops = &my_fops;
/*注册到系统*/
cdev_add(&cdev,devno,1); //字符设备文件结构体,设备号,设备范围大小
创建设备节点
/*参数:所属设备类,设备的父设备,设备号,设备数据,设备名*/
device_create(myclass,NULL,MKDEV(numdev_major,numdev_minor+i),NULL,DEVICE_NAME"%d",i);
驱动删除
cdev_del(&cdev); //删除设备
device_destroy(myclass,MKDEV(numdev_major,numdev_minor+i)); //删除设备节点
class_destroy(myclass);
kfree(my_devices);
unregister_chrdev_region(MKDEV(numdev_major,numdev_minor),DEVICE_MINOR_NUM); //释放设备号