
一.手动创建设备节点


二.自动创建设备节点


宏定义是预处理器做的“文本替换工作”,不占运行时资源,但要注意类型和括号问题。


#include <linux/module.h>
#include <linux/init.h> // 初始化函数支持
#include <linux/moduleparam.h> // 支持模块参数传递
#include <linux/fs.h> // file_operations 结构体
#include <linux/kdev_t.h>
#include <linux/cdev.h> // 字符设备注册相关
#include <linux/device.h>
//全局变量定义
dev_t dev_num;
struct cdev cdev_test; // 表示一个字符设备对象
struct class *class; // 设备类,用于自动创建设备节点
struct device *device; // 表示最终创建的设备
//文件操作函数定义(file_operations)
static int cdev_test_open(struct inode *inode , struct file *file){
printk("This is cdev_test_open\n");
return 0;
}
static ssize_t cdev_test_read(struct file *file, char __user *buf, size_t size, loff_t *off){
printk("This is cdev_test_read\n");
return 0;
}
static ssize_t cdev_test_write(struct file *file, const char __user *buf, size_t size, loff_t *off){
printk("This is cdev_test_write\n");
return 0;
}
static int cdev_test_release(struct inode *inode, struct file *file){
printk("This is cdev_test_realease\n");
return 0;
}
//文件操作函数定义(file_operations)
static struct file_operations cdev_test_ops={
.owner=THIS_MODULE,
.open=cdev_test_open,
.read=cdev_test_read,
.write=cdev_test_write,
};
//初始化函数:modulecdev_init
static int modulecdev_init(void)
{
int ret;
int major, minor;
ret = alloc_chrdev_region(&dev_num, 0, 1, "WLD");
if(ret<0)
{
printk("register_chrdev_region is error\n");
}
printk("register_chrdev_region is ok\n");
major=MAJOR(dev_num);
minor=MINOR(dev_num);
printk("major is %d\n", major);
printk("minor is %d\n", minor);
cdev_test.owner = THIS_MODULE;
cdev_init(&cdev_test, &cdev_test_ops);
cdev_add(&cdev_test, dev_num, 1);
// 创建 class 和 device,用于在 /dev 下自动生成设备节点
class=class_create(THIS_MODULE,"test");
device=device_create(class,NULL,dev_num,NULL, "test");
return 0;
}
//file_operations 结构体绑定接口函数
static void moduleparam_exit(void)
{
unregister_chrdev_region(dev_num,1);
cdev_del(&cdev_test);
device_destroy(class,dev_num);
class_destroy(class);
printk("bye bye\n");
}
//模块宏定义
module_init(modulecdev_init);
module_exit(moduleparam_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FASHI");
MODULE_VERSION("V1.0");
1728

被折叠的 条评论
为什么被折叠?



