【Linux设备驱动】--0x02字符设备模块-使用alloc_chrdev_region接口

简介: 源代码 #include #include #include #include

源代码

alloc_chrdev_regionregister_chrdev_region的区别在于,
前者不知道主设备号,由操作系统自动分配
后者由人工设置主设备号!!

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>

#include <linux/slab.h>   // kfree,kmalloc
#include <linux/cdev.h>   // cdev_xxx
#include <linux/device.h> // device_xxx

static dev_t g_simple_cdev_dev_no;
static struct cdev *g_simple_cdev;
static struct class *g_simple_cdev_class;
static struct device *g_simple_cdev_device;

static int simple_cdev_open(struct inode *inode, struct file *file)
{
    return 0;
}

static int simple_cdev_release(struct inode *inode, struct file *file)
{
    return 0;
}

/* File operations struct for character device */
static const struct file_operations g_simple_cdev_fops = {
    .owner   = THIS_MODULE,
    .open    = simple_cdev_open,
    .release = simple_cdev_release,
};

static int __init simple_cdev_init(void)
{
    int ret;

    ret = alloc_chrdev_region(&g_simple_cdev_dev_no, 0, 1, "simple_cdev");
    if (ret < 0) {
        return ret;
    }

    g_simple_cdev = cdev_alloc();
    if (g_simple_cdev == NULL) {
        return -1;
    }
    g_simple_cdev->owner = THIS_MODULE;
    g_simple_cdev->ops   = &g_simple_cdev_fops;

    ret = cdev_add(g_simple_cdev, g_simple_cdev_dev_no, 1);
    if (ret < 0) {
        return ret;
    }

    g_simple_cdev_class  = class_create(THIS_MODULE, "simple_cdev");
    g_simple_cdev_device = device_create(g_simple_cdev_class, NULL, g_simple_cdev_dev_no, NULL, "simple_cdev");

    return 0;
}

static void __exit simple_cdev_exit(void)
{
    device_destroy(g_simple_cdev_class, g_simple_cdev_dev_no);
    class_destroy(g_simple_cdev_class);
    cdev_del(g_simple_cdev);
    unregister_chrdev_region(g_simple_cdev_dev_no, 1);
}

MODULE_LICENSE("GPL");
module_init(simple_cdev_init);
module_exit(simple_cdev_exit);
目录
相关文章
|
5月前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
300 0
|
11月前
|
缓存 安全 Linux
Linux系统查看操作系统版本信息、CPU信息、模块信息
在Linux系统中,常用命令可帮助用户查看操作系统版本、CPU信息和模块信息
2105 23
|
Linux 开发工具 Perl
Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
【10月更文挑战第20天】Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
321 4
|
Unix Linux 网络安全
python中连接linux好用的模块paramiko(附带案例)
该文章详细介绍了如何使用Python的Paramiko模块来连接Linux服务器,包括安装配置及通过密码或密钥进行身份验证的示例。
765 1
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
245 6
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
272 5
|
Ubuntu NoSQL Linux
Linux内核和驱动
Linux内核和驱动
176 2
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
640 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
531 0
|
Linux API
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】
Linux里的高精度时间计时器(HPET)驱动 【ChatGPT】