首页 > 其他分享 >5 - 设备文件创建

5 - 设备文件创建

时间:2024-02-22 20:59:12浏览次数:29  
标签:文件创建 创建 dev device include class 设备

Device File Creation

原文链接

我的博客

创建字符设备设备文件

在上一个小节中,我们知道了如何分配主副设备号,但是到此为止,只是创建主副设备号。并未在 /dev 目录下创建设备文件。

设备文件

设备文件可以实现用户空间应用与硬件的通讯。它们并不是普通文件,只是从编程视角来看是一个文件,可以读,可以写,可以 mmap 等。当访问这类文件时,内核识别这样的 I/O 请求,并将请求给到设备驱动。

执行下面的命令可以查看 /dev 目录中的设备:

ls -l /dev

这一命令会列出设备类型,设备权限,主副设备号。

创建设备文件

可以使用两种方式创建设备文件:

  • 手动
  • 自动

手动创建设备文件

可以使用 mknod 手动创建设备文件:

mknod -m <permissions> <name> <device type> <major> <minor>

其中:

  • name,/dev 下的设备文件名
  • device type,设备类型,选择 cb 为字符设备或块设备
  • major,对应的驱动主号
  • minor,对应的驱动副号
  • permissions,设置新设备的权限

例:

sudo mknod -m 666 /dev/mydevice c 246 0

如果不希望给定权限,可以在创建文件成功后,使用 chmod 命令修改设备文件权限。

使用如下命令删除节点:

sudo rm -f /dev/mydevice

优点

使用手动创建设备文件的方法的优点是:

  • 任何人可以使用这个方法创建设备文件
  • 可以在加载驱动之间就创建设备文件

自动创建设备文件

可以使用 udev 方法自动创建设备文件,udev 可以在 /dev 目录下动态创建/移除设备文件,步骤如下:

  1. 内核源码中包含头文件 linux/device.hlinux/kdev_t.h
  2. 创建结构体类
  3. 使用结构体类创建设备

创建 class

这将为设备驱动创建 class 结构,这将会在 /sys/class/ 下创建对应的结构。

struct class *class_create(struct module *owner, const char *name);
  • owner,指向拥有这个 class 结构体的模块
  • name,指向 class 的名字串

创建设备

下面的函数可以用来创建字符设备文件,这将会在 sysfs 中创建设备,并注册指定 class

struct device *device_create(struct *class, struct device *parent, dev_t dev, void *drvdata, const char *fmt, ...);
  • class,设备要注册的 class
  • parent,这个设备的父设备结构体指针
  • dev,字符设备绑定的 dev
  • drvdata,添加数据,用作回调
  • fmt,设备名
  • ...,变量参数

编程

手动
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>

#define DRV_NAME "mydrv"

dev_t dev = 0;

static int __init dev_init(void)
{
    if ((alloc_chrdev_region(&dev, 0, 1, DRV_NAME)) < 0) {
        printk(KERN_ERR "alloc major number failed\n");
        return -1;
    }
    
    printk(KERN_INFO "kernel module create successfully\n");
    
    return 0;
}

static void __exit dev_exit(void)
{
    unregister_chrdev_region(dev, 1);
    printk(KERN_INFO "kernel module removed successfully\n");
}

module_init(dev_init);
module_exit(dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xdd");
MODULE_DESCRIPTION("A device driver");
MODULE_VERSION("1.0");
$ cat /proc/devices | grep mydrv
239 mydrv
$ sudo mknod -m 666 /dev/mydevice c 239 0
$ ls -l /dev | grep "mydevice"
crw-rw-rw-  1 root root    239,     0 Feb 19 21:09 mydevice
$ sudo rm /dev/mydevice
自动
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>
#include <linux/err.h>
#include <linux/device.h>

#define DRV_NAME "mydrv"
#define DEV_CLASS "mydrvclass"
#define DEV_NAME "mydev"

dev_t dev = 0;
static struct class *dev_class;

static int __init dev_init(void)
{
    if ((alloc_chrdev_region(&dev, 0, 1, DRV_NAME)) < 0) {
        printk(KERN_INFO "alloc device number failed\n");
        return -1;
    }
    printk(KERN_INFO "Major: %d Minor: %d \n", MAJOR(dev), MINOR(dev));
    
    dev_class = class_create(THIS_MODULE, DEV_CLASS);
    if (IS_ERR(dev_class)) {
        printk(KERN_INFO "create class failed\n");
        goto f_class;
    }
    
    if (IS_ERR(device_create(dev_class, NULL, dev, NULL, DEV_NAME))) {
        printk(KERN_INFO "create device failed\n");
        goto f_device;
    }
    
    printk(KERN_INFO "device create success\n");
    return 0;
    
f_device:
    class_destory(dev_class);
f_class:
    unregister_chrdev_region(dev, 1);
    return -1;
}

static void __exit dev_exit(void)
{
    device_destroy(dev_class, dev);
    class_destroy(dev_class);
    unregister_chrdev_region(dev, 1);
    
    printk(KERN_INFO "device removed success\n");
}

module_init(dev_init);
module_exit(dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xdd");
MODULE_DESCRIPTION("A device driver");
MODULE_VERSION("1.0");
$ ls -l /dev/mydev
crw------- 1 root root 239, 0 Feb 19 21:14 /dev/mydev

标签:文件创建,创建,dev,device,include,class,设备
From: https://www.cnblogs.com/arvin-blog/p/18028127

相关文章

  • 智慧安防平台easy1400视图平台设备级联操作指南
    在当今数字化时代,有效的内容管理和设备协同已经成为企业和组织运营的关键因素。内容图库作为信息存储和展示的核心,为企业提供了便捷的视觉内容管理解决方案。与此同时,设备级联技术实现了不同平台和设备之间的高效协同工作。本文将深入探讨内容图库和设备级联技术的应用及优势。 ......
  • MDS100-16-ASEMI单相交流用电设备MDS100-16
    编辑:llMDS100-16-ASEMI单相交流用电设备MDS100-16型号:MDS100-16品牌:ASEMI封装:M18最大重复峰值反向电压:1600V最大正向平均整流电流(Vdss):100A功率(Pd):大功率芯片个数:5引脚数量:5类型:整流模块、整流桥正向浪涌电流:920A正向电压:1.90V最大输出电压(RMS):封装尺寸:如图工作温......
  • 智能诊断设备迅为IMX6Q核心板解决方案
    在科技飞速发展的今天,智能诊断设备已经成为了医疗领域不可或缺的一部分。其中,这款IMX6Q核心板在智能诊断设备中也有广泛的使用。  IMX6Q核心板作为一款高性能的处理器,具有强大的数据处理能力和高效的能源管理功能。在智能诊断设备中,它可以快速处理大量的医疗数据,为医生提供准......
  • 智慧安防平台easy1400视图平台用户登录及设备注册功能详解
    用户登录视图库平台后,首先会看到一个整洁的首页界面,上面清晰地展示了各种功能菜单和操作按钮。在这里,用户可以轻松地进行以下操作:添加采集设备:选择左侧的“采集设备”菜单,并点击“添加”按钮。系统会弹出一个对话框,要求用户填写设备ID、名称和用户口令等信息。请确保设备ID的11~1......
  • 微软:符合条件设备将自动更新至Win11 23H2!
    今天微软发布公告表示,目前依然停留在Windows1121H2和22H2,但符合升级条件的设备,将会自动更新至最新的23H2更新。微软在公告中表示,Windows1123H2更新已进入新的部署阶段,符合升级条件的Windows11设备自动升级到23H2。此次自动更新针对的是已达到或即将达到服务期限的Windows1......
  • 智慧安防/视频监控汇聚平台EasyCVR如何通过接口调用获取设备录像回看流地址?
    视频云存储/视频融合/安防监控EasyCVR视频汇聚系统可兼容各品牌的IPC、NVR、移动单兵、智能手持终端、移动执法仪、无人机、布控球等设备的接入,支持的接入协议包括:国标GB28181、RTSP/Onvif、RTMP,以及厂家的私有协议与SDK,如:海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云s......
  • home-assistant core 源码粗读--对设备历史的处理(三)
    我们已经知道User等保存是直接以json的形式直接保存到文件中。先说结论:设备的检测历史默认保存在sqlite中Thedefault,andrecommended,databaseengineis SQLite whichdoesnotrequireanyconfiguration.ThedatabaseisstoredinyourHomeAssistantconfigurati......
  • appium inspector 连接安卓设备
    首先找到app的包名和activity。查看包名adbshell"dumpsyswindow|grepmCurrentFocus"查看包对应的activity,输入下面的命令,再找到cmpadbshellmonkey-pcom.jingdong.app.mall-vvv1启动appiumserver启动inspector,配置信息{"platformName":"Android","a......
  • 如何确保U盘等设备不成为数据泄露渠道?
    在高速信息流动的时代,移动存储设备如U盘的便捷性改变了我们的工作方式,但同时也带来了数据安全的风险。如何有效地防止U盘等设备成为数据泄露渠道,已经成为每个企业亟需解决的问题。首要的一步,就是通过华企盾DSC数据防泄密系统,从源头上管理与控制设备的接入和使用。后台对U盘等移......
  • 【Azure Notification Hub】如何手动删除 Notification Hub 中已注册的设备
    问题描述在NotificationHub中注册了设备后,从Azure门户上没有找到相应的入口来删除已注册设备(ActiveDevices)如果使用C#SDK是否有办法删除呢? 问题解答可以的,查看NotificationHub的文档,可以通过注册ID来删除一个注册设备:https://docs.azure.cn/zh-cn/notification-hubs......