当前位置:网站首页>自动生成设备节点
自动生成设备节点
2022-08-09 16:16:00 【酸菜。】
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/slab.h>
#include<linux/timer.h>
#include<linux/sched.h>
#include<linux/list.h>
#include<linux/interrupt.h>
#include<linux/cdev.h> //cdev_init() cdev_add() cdev_del()
#include<linux/types.h> //dev_t
#include<linux/kdev_t.h> //有两个宏获取主设备号和次设备号
MODULE_AUTHOR("Tan xujia");
MODULE_LICENSE("Dual BSD/GPL");
dev_t c_devt; //设备的主次设备号
/*定义一个结构体,包含了cdev,类似与继承,把这个设备文件的属性给继承过来*/
struct char_dev {
struct cdev c_dev;
char c;
};
/*定义一个变量*/
struct char_dev *cdev_p;
/*设备的操作方法*/
int
char_open(struct inode *inode, struct file *filp)
{
printk("char_open, %d, %d\n", iminor(inode), MINOR(inode->i_cdev->dev));
return 0;
}
ssize_t
char_read(struct file *filp, char __user *buf, size_t count, loff_t *fpos)
{
printk("char_read\n");
return 0;
}
ssize_t
char_write(struct file *filp, const char __user *buf, size_t count, loff_t *fpos)
{
printk("char_write\n");
return count;
}
int
char_release(struct inode *inode, struct file *filp)
{
printk("char_release\n");
return 0;
}
struct file_operations char_fops = {
.owner = THIS_MODULE,
.read = char_read,
.write = char_write,
.open = char_open,
.release = char_release,
};
struct class *cdev_class;
static
int __init hello_init (void)
{
printk("hello_init\n");
int ret = 0, index = 0;
ret = alloc_chrdev_region(&c_devt, 10, 2, "char_dev");
if(ret)
printk("alloc_chrdev_region fail\n");
printk("major = %d, minor = %d\n", MAJOR(c_devt), MINOR(c_devt));
cdev_p = kzalloc(sizeof(struct char_dev) * 2, GFP_KERNEL);
if(!cdev_p)
printk("alloc fail\n");
for(index = 0; index < 2; index++) {
cdev_init(&cdev_p[index].c_dev, &char_fops);
cdev_p[index].c_dev.owner = THIS_MODULE;
ret = cdev_add(&cdev_p[index].c_dev,
MKDEV(MAJOR(c_devt), MINOR(c_devt) + index), 1);
if(ret)
printk("cdev_add fail\n");
}
/*根据以下api替代mknod生成设备节点*/
cdev_class = class_create(THIS_MODULE, "c_dev");
if(!cdev_class)
printk("class_create fail\n");
for(index = 0; index < 2; index++) {
device_create(cdev_class, NULL,
MKDEV(MAJOR(c_devt), MINOR(c_devt) + index),
NULL, "c_dev%d", index);
}
return 0;
}
static
void __exit hello_exit (void)
{
printk("hello_exit\n");
int index = 0;
for(index = 0; index < 2; index++) {
device_destory(cdev_class,
MKDEV(MAJOR(c_devt), MINOR(c_devt) + index));
}
class_destory(cdev_class);
for(index = 0; index < 2; index++) {
cdev_del(&cdev_p[index].c_dev);
}
kfree(cdev_p);
unregister_chrdev_region(c_devt, 2);
}
module_init(hello_init);
module_exit(hello_exit);
/* MAJOR(dev_t dev) //获取主设备号 MINOR(dev_t dev) //获取次设备号 MKDEV(int major, int minor) //合成设备号 设备号的分配: int register_chrdev_region(dev_t first, unsigned int count, char *name) int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name) 设备号的释放: void unregister_chrdev_region(dev_t first, unsigned int count) */
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m :=cdev_register_node.o
all:
make -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.* .tmp_versions *.mod *.order *.symvers *.dwo
利用cat和echo测试可以看到相关的函数流程执行,使用dmesg可以看到相关的打印信息。
边栏推荐
- ceph2
- dotnet 6 为什么网络请求不跟随系统网络代理变化而动态切换代理
- 微信开发者工具报错,提示 未找到入口 app.json 文件
- 浅谈如何保证Mysql主从一致
- PGSQL backup tool, which is better?
- 二分法
- B44 - Based on stm32 bluetooth intelligent voice recognition classification broadcast trash
- Functions and Features of Smart Home Control System
- WinForm(三)揭开可视化控件的面纱
- Reasons for slow startup of IDEA (1)
猜你喜欢

基于CAP组件实现补偿事务与幂等性保障

nacos控制台权限管理

不安装运行时运行 .NET 程序

B44 - Based on stm32 bluetooth intelligent voice recognition classification broadcast trash

What is hardware integrated development?What are the cores of hardware integrated development?

MySQL 5.5 series installation steps tutorial (graphical version)

A42 - 基于51单片机的洗衣机设计

硬件开发的发展前景

期货开户交易所的手续费和查询方法

.NET MAUI 跨平台应用开发 I|.NET MAUI 跨平台基础
随机推荐
MySQL 5.5系列安装步骤教程(图解版)
B40 - 基于STM32单片机的电热蚊香蓝牙控制系统
<IDEA using tricks & & combined operation of common keys>
IDEA中Lombok插件的安装与使用
QuickSort(快速排序)&&MergeSort(归并排序)的效率比较[搭配LeetCode例题]
ceph部署
[ Kitex Source Code Interpretation ] Request to retry
【教程3】疯壳·ARM功能手机-整板资源介绍
什么是硬件集成开发?硬件集成开发的核心有哪些?
How to adjust futures account opening process and handling fee
打印星型图「建议收藏」
测试/开发程序员喜欢跳槽?跳了就能涨工资吗?
kubernetes之helm简介、安装、配置
.NET MAUI 跨平台应用开发 I|.NET MAUI 跨平台基础
kafka 通过 jdbc 从oracle抓取数据
数据可视化的类别及其重要性
【时序数据库InfluxDB】Windows环境下配置InfluxDB+数据可视化,以及使用 C#进行简单操作的代码实例...
PADS generates bitmap
Reasons for slow startup of IDEA (1)
快捷键修改typora字体----自制脚本