新字符设备驱动

新字符设备驱动原理

       分配和释放设备号

int major;                                // 主设备号
int minor;                                // 次设备号
dev_t devid;                              // 设备号

if(major)                                 // 定义主设备号
{
    devid = MKDEV(major, 0);                     // 构建次设备号

    // 起始设备号:devid
    // 申请数量:1
    // 设备名:text 
    register_chrdev_region(devid, 1, "test");    // 注册设备号
}
else                                      // 未定义主设备号
{
    alloc_chrdev_region(&devid, 0, 1, "text");    // 申请设备号
    major = MAJOR(devid);                         // 获取主设备号
    minor = MINOR(devid);                         // 获取次设备号
}


unregister_chrdev_region(devid, 1);               // 注销设备号

       新的字符设备注册方法

                 字符设备结构

// linux-5.5.4\linux-5.5.4\include\linux\cdev.h
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _LINUX_CDEV_H
#define _LINUX_CDEV_H

//...

struct cdev                            // 字符设备结构体
{
    struct kobject kobj;
    struct module *owner;
    const struct file_operations *ops;    // 字符设备文件操作函数集合
    struct list_head list;
    dev_t dev;                        // 设备号
    unsigned int count;
}__randomize_layout;

//...

#endif

          cdev_init 函数

struct cdev testcdev;

static struct file_operations test_fogs =    // 设备操作函数
{
    .owner = THIS_MODULE;
    //...
};

testcdev.owner = THIS_MODULE;

// 初始化cdev变量:testcdev
// 字符设备文件操作函数集合:test_fops
cdev_init(&testcdev,&test_fops);    //初始化cdev结构体变量


自动创建设备节点


设置文件私有数据

发布了51 篇原创文章 · 获赞 7 · 访问量 7888

猜你喜欢

转载自blog.csdn.net/qq_44226094/article/details/90234552