嵌入式学习之Linux驱动 设备节点概念:1.手动创建设备节点 2.自动创建设备节点

一.手动创建设备节点

二.自动创建设备节点

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

#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");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值