Linux字符设备驱动

申请字符类设备号

  1. 静态申请设备号
    头文件
/*定义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

  1. 头文件
/*包含函数device_create 结构体class等头文件*/
#include <linux/device.h>
  1. 创建函数
static struct class *myclass;
myclass = class_create(THIS_MODULE,DEVICE_NAME);

注册设备

  1. 头文件
/*设备节点文件操作结构体*/
#include <linux/fs.h>
/*定义字符设备的结构体*/
#include <linux/cdev.h>
  1. 注册函数
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); //释放设备号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值