linux驱动创建节点文件(device和class方式)

这篇具有很好参考价值的文章主要介绍了linux驱动创建节点文件(device和class方式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

创建sys目录下的属性节点有三种方式

device_create_file
class_create_file
driver_create_file

我们常用的是第一个和第二个,这三者的主要区别在第一个参数上,device依赖于device节点,class依赖于class节点(class_create)

device_create_file 创建的属性节点在device设备节点对应的路径下,同理device也是

具体使用

class

我们一般是先创建class再创建device,所以以class创建设备节点为例

首先先创建类

class_create(owner, name)
  • owner:一般填写THIS_MODULE
  • name:class的名字,在sys/class/下的文件夹名称

再调用创建文件命令

class_create_file(struct class *class,
const struct class_attribute *attr)
  • class:我们创建返回的class结构体
  • attr: class_attribute结构体,也是我们下一步要填写的参数

class_attribute结构体如下:

struct class_attribute {
struct attribute attr;
ssize_t (*show)(struct class *class, struct class_attribute *attr,
char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr,
const char *buf, size_t count);
};
  • show也就是我们通过cat读取时所执行的函数
  • store是通过echo命令所执行的函数
  • attr:attribute结构体,里面有两个参数name也就是文件的名称,mode,对接口文件权限的设置

上面store、show函数的具体实现是需要我们按上面的格式自己编写函数

我们一般不会通过完成上面结构体的方式进行初始化,我们一般通过一下方式

static struct class_attribute k60168_Tran_With[] = {
    __ATTR(trans_with, 0664, NULL, k60168_trans_with),
    __ATTR_NULL,
};

__ATTR填入的就是我们上面所说的class_attribute的所有变量。

__ATTR_NULL也是必须的,具体是啥原因我也忘了

device

device节点依赖于class,所以device的创建也需要填写一些class的参数。

首先也是先创建device

device_create(struct class *cls, struct device *parent,
     dev_t devt, void *drvdata,
     const char *fmt, ...);
  • parent:父节点,一般为NULL
  • devt:设备号
  • drvdata:设备可能会使用到的数据,一般为NULL,正点是这么说的
  • fmt:在dev目录下创建的子目录的名称

然后再调用创建函数

int device_create_file(struct device *device,
      const struct device_attribute *entry);

其结构和上面的class类似就不多说了

device_attribute的结构体如下:

struct device_attribute {
struct attributeattr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
 const char *buf, size_t count);
};

也是通过如下的方式进行填充

static struct device_attribute k60168_Tran_With[] = {
    __ATTR(trans_with, 0664, NULL, k60168_trans_with),
    __ATTR_NULL,
};

注意是device_attribute不是class_attribute!!!,我自己踩过的坑文章来源地址https://www.toymoban.com/news/detail-787188.html

到了这里,关于linux驱动创建节点文件(device和class方式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 驱动开发--自动创建节点udev机制的实现过程分析

    1,mknod:手动创建设备节点 2,devfs:创建设备节点的逻辑在内核空间,2.5版本后淘汰 3,udev:自动创建设备节点的机制,逻辑在用户空间,常用 4,mdev:轻量级的udev机制 1,注册驱动,register_chrdev()函数 2,获取设备信息(设备树相关文件,目前为指定寄存器地址) 3,创建一

    2024年02月09日
    浏览(33)
  • Java面试题Class类的理解?创建类的对象的方式?

    1.类的加载过程: 程序经过 javac.exe 命令以后,会生成一个或多个字节码文件(.class结尾)。 接着我们使用 java.exe 命令对某个字节码文件进行解释运行。相当于将某个字节码文件 加载到内存中。此过程就称为类的加载 。加载到内存中的类,我们就称为运行时类,此运行时类,

    2024年02月10日
    浏览(36)
  • RK3568平台开发系列讲解(驱动基础篇)自动创建设备节点

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自动创建设备节点分为两个步骤: 步骤一:使用 class_create 函数创建一个类。 步骤二:使用 device_create 函数在我们创建的类下面创建一个设备。 Linux 驱动实验中,当我们通过 insmod 命令加载模块后,

    2023年04月12日
    浏览(65)
  • Linux内核中的UVC(USB Video Class)驱动

    V4L2(Video for Linux 2)是Linux内核中的视频设备驱动框架,而UVC(USB Video Class)是一种使用USB接口的摄像头设备通信协议。在Linux内核中,V4L2和UVC之间存在以下关系: 1. V4L2支持多种视频设备:V4L2是一个通用的视频设备驱动框架,它旨在支持各种类型的视频设备,包括USB摄像头

    2024年02月08日
    浏览(40)
  • Linux驱动设备节点查看

    Fang XS. 1452512966@qq.com 如果有错误,希望被指出 查看设备节点 驱动注册成功生成设备节点 ls /dev/ 查看设备号 主设备号 cat /proc/devices 包括字符设备和块设备 MISC设备驱动次设备号 cat /proc/misc 主次设备号等信息 ls /dev/dev_name -al class_create 函数创建成功后,使用命令 ls /sys/class 查看

    2024年02月11日
    浏览(40)
  • 【IMX6ULL驱动开发学习】01.编写第一个hello驱动+自动创建设备节点(不涉及硬件操作)

    目录 一、驱动程序编写流程 二、代码编写 2.1 驱动程序hello_drv.c 2.2 测试程序 2.3 编写驱动程序的Makefile 三、上机实验 3.1 NFS 挂载 3.2 测试示例 构造file_operations结构体 在里面填充open/read/write/ioctl成员 注册file_operations结构体 int major = register_chrdev(0, \\\"name\\\", fops); 入口函数:调用

    2024年02月13日
    浏览(40)
  • linux(centos7)离线安装A100显卡驱动cuda/cudnn 以及解决docker not select device driver...gpu

    1.确认GPU型号和操作系统版本,本示例中以A100以及操作系统为Centos 7.9进行操作。 准备GPU驱动和CUDA 11.2软件包,在nvidia官网进行驱动包和CUDA包下载 链接: link linux系统均选择 Linux 64-bit CUDA Toolkit选择最新版本 如您需要老版本CUDA,请前往老版本CUDA下载 本示例中使用CUDA 11.2。 访

    2024年02月15日
    浏览(47)
  • 韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点

    (1)学习韦东山老师的Linux,因为他讲的很精简,以至于很多人听不懂。接下来我讲介绍韦东山老师的驱动实验班的第二个Hello程序。 (2)注意,请先学习完视频再来看这个教程!本文仅供入门学习!如需深入,请搜索其他博客! (3)因为上一个教程已经讲的很详细了,所

    2024年02月05日
    浏览(47)
  • Java进阶(1)——JVM的内存分配 & 反射Class类的类对象 & 创建对象的几种方式 & 类加载(何时进入内存JVM)& 注解 & 反射+注解的案例

    1.java运行时的内存分配,创建对象时内存分配; 2.类加载的顺序,创建一个唯一的类的类对象; 3.创建对象的方式,new,Class.forName,clone; 4.什么时候加载.class文件进入JVM内存中,看到new,Class.forName; 5.如何加载?双亲委托(委派)机制:安全;AppClassLoader; 6.反射实质:能

    2024年02月14日
    浏览(41)
  • Java进阶(4)——结合类加载JVM的过程理解创建对象的几种方式:new,反射Class,克隆clone(拷贝),序列化反序列化

    1.类什么时候被加载到JVM中,new,Class.forName: Class.forName(“包名.类名”); 2.创建对象的方式,反射,本质是获得类的类对象Class; 3.克隆clone,深拷贝,浅拷贝的对比; 4.序列化和反序列化的方式; Hello h; // 此时没有用Hello,jvm并没有进行类加载 看到new : new Book() Class.forName:

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包