首页 > 系统相关 >linux驱动创建节点文件(device和class方式)

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

时间:2023-03-18 13:44:15浏览次数:43  
标签:struct 创建 attribute create 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!!!!!!,我自己踩过的坑

标签:struct,创建,attribute,create,linux,device,class
From: https://www.cnblogs.com/liming111/p/17229959.html

相关文章

  • C++ class struct
    classandstruct目录前文问题对象与引用引用的传递对象copyshallowcopydepthcopymemcpy(data,a.data,sizeof(T)*n);简单类型复杂类型指针类型的......
  • 使用 Linux screen 来在远程服务器上训练
    一般连接服务器,通过VNC或者SSH连接,都有一个问题:就是本机关机或者网络连接断掉时,服务器上的进程会被阻断。训练一个稍微大点的神经网络往往需要好几天,这时候就需要Li......
  • linux下的全局代理工具proxychain
    proxychain介绍本文介绍的是proxychains-ng项目在linux上运行一些命令的时候,经常访问到国外的网站,速度非常的慢,例如用git、wget等等,这个时候就可以通过proxychain工......
  • Linux进程通信 | 共享内存
    一、共享内存是什么在Linux系统中,共享内存是一种IPC(进程间通信)方式,它可以让多个进程在物理内存中共享一段内存区域。这种共享内存区域被映射到多个进程的虚拟地址空间中,......
  • Rocky Linux 系列6 --- inotify-tools
    一、概念1.环境(1)RockyLinux9.1(2)inotify-tools3.22.1.02.概念inotify用于监控文件或目录的改变,当文件或目录发生改变时inotify将触发通知。3.承上启下(1......
  • 在Linux终端管理你的密码!
    大家好,我是良许。现在是互联网时代,我们每天都要跟各种APP、网站打交道,而这些东西基本上都需要注册才可以使用。但是账号一多,我们自己都经常记不清对应的密码了。有些小伙......
  • 你对Linux窗口管理程序Tmux了解吗
    tmux是linux中一种管理窗口的程序,不同于iTerm2,它提供了一个Session随时存储和恢复的功能(Session概念后面会介绍),detachSession(保持Session后台运行),然后重新attachS......
  • Linux恢复文件双手锏
    当你在系统中有意或无意地使用 shift+delete 组合键、删除选项,或是清空回收站的方式来删除一个文件时,该文件的内容并没有从硬盘(或是其它存储设备)上直接销毁。它仅仅是......
  • 使用旧电脑玩Linux
    今天给大家讲讲使用旧电脑玩 ,大家应该都知道旧电脑的硬件一般比较落后,特别是一些非常老的电脑,目前还在使用的是机械硬盘,如是要跑 windows 可想而知,但是 Linux 系统对......
  • 如何使用一台windows远程控制一台正在运行Linux系统的服务器(OpenSSH的使用)
    什么是OpenSSHOpenSSH是一款用于远程登录的连接工具,它使用SSH协议1。SSH协议可以用来进行远程控制或在计算机之间传送文件,比传统的方式更安全2。Windows系统默认安装......