首先创建一个class结构体指针

static struct class *sensor_class;

然后在module_init的模块加载函数中调用以下接口:

sensor_class = class_create(THIS_MODULE, "sensor_class");
ret = class_create_file(sensor_class, &class_attr_gyro_lsm9ds1);if (ret) {printk(KERN_ERR "%s:Fail to creat gyro class file\n", __func__);return ret;}

然后调用CLASS_ATTR创建节点,这里是gyro_lsm9ds1:

static CLASS_ATTR(gyro_lsm9ds1, 0664, gyro_lsm9ds1_show, gyro_lsm9ds1_store);

然后创建读写函数(adb使用cat或者echo可以操作节点读写):

1、读函数(cat):

 376 static ssize_t gyro_lsm9ds1_show(struct class *class,377                 struct class_attribute *attr, char *buf)378 {379         struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL]; // gyro no device, so use SENSOR_TYPE_ACCEL380381         if(sensor == NULL)382                 return sprintf(buf, "no gyro sensor find\n");383384         if (sensor->status_cur == SENSOR_OFF)385                 dev_err(&sensor->client->dev, "%s: status_cur: off[%d]\n", __func__, SENSOR_OFF);386387         if (sensor->status_cur == SENSOR_ON)388                 return sprintf(buf, "[gyro-x-]: %d\n \n[gyro-y-]: %d\n \n[gyro-z-]: %d\n", gyro_lsm9ds1_x, gyro_lsm9ds1_y, gyro_lsm9ds1_z);389390         return sprintf(buf, "temhum: read error with SENSOR_OFF\n");391392 }

2、写函数(echo):

 394 static ssize_t gyro_lsm9ds1_store(struct class *class,395         struct class_attribute *attr, const char *buf, size_t count)396 {397         struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];398         int val, ret;399400         if (sensor == NULL)401                 return -1;402403         ret = kstrtoint(buf, 10, &val);404         if (ret) {405                 dev_err(&sensor->client->dev, "%s: kstrtoint error return %d\n", __func__, ret);406                 return -1;407         }408409         mutex_lock(&sensor->operation_mutex);410         if (val == 1) {411                 if (sensor->status_cur == SENSOR_OFF)412                         sensor_enable(sensor, SENSOR_ON);413         } else if (val == 0) {414                 if (sensor->status_cur == SENSOR_ON)415                         sensor_enable(sensor, SENSOR_OFF);416         }417         mutex_unlock(&sensor->operation_mutex);418419         dev_err(&sensor->client->dev, "[%s()]check ret[%d] with value[%d]\n", __func__, ret, val);420421         return ret ? ret : count;422423 }

然后就可以在adb操作节点读到数据:

rk3399_all:/ # cat sys/class/sensor_class/gyro_lsm9ds1
[gyro-x-]: 69[gyro-y-]: -10[gyro-z-]: 156
rk3399_all:/ #

Linux使用CLASS_ATTR创建节点相关推荐

  1. linux 杂项设备,Linux下自动创建节点的字符杂项设备 misc_register

    Linux下自动创建节点的字符杂项设备 misc_register admin • 2020 年 01 月 07 日 杂项设备 Linux里面的misc杂项设备是主设备号为10的驱动设备 定义头文件: ...

  2. Linux下Netfilter创建自己的Hook,让数据包可以发送到用户层,然后统计节点负载信息

    Linux下Netfilter创建自己的Hook函数,让数据包可以发送到用户层,然后统计节点的负载信息 写在最前面,我的linux内核版本是4.4.0-31-generic,版本是Ubuntu 16. ...

  3. 《Linux驱动:设备节点文件的创建过程》

    文章目录 一.前言 二.uevent机制 2.1 Sysfs文件系统 2.2 Kobject的事件类型 三.mdev应用程序 3.1 mdev的配置文件 四.实例分析 4.1 uevent机制 4.2 ...

  4. linux的文件系统及节点表

    linux的文件系统及节点表 一  linux的文件系统 1 我们都知道当我们安装linux时会首先给系统分区,然后我们会把分区格式化成EXT3格式的文件系统.那么在linux系统中还有没有其他的文件 ...

  5. linux下usb设备节点名不固定,解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点...

    解决Linux下USB设备节点ttyUSB名不固定的问题,生成固定USB转串口设备节点 2018-09-19 http://blog.sina.com.cn/s/blog_8b58097f0102wx ...

  6. linux用pipe创建的文件类型,linux文件类型之 管道

    inux 管道管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管 ...

  7. linux中怎么创建管道文件,Linux  管道文件

    管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别.有名管道叫named ...

  8. linux命令 - ln - 创建和删除软、硬链接

    linux命令 - ln - 创建和删除软.硬链接 在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件 ...

  9. Linux设备树特殊节点(aliases、chosen)介绍

    引用一个特定的节点通常使用全路径,aliases 节点可以用于指定一个设备全路径的别名.例如: 1 2 3 4 aliases {         ethernet0 = ð0;         se ...

  10. Elasticsearch——Windows下ES集群部署 Linux下ES单节点、集群部署

    1.开篇 在之前的两篇文章中,说白了就是在windows下部署的ES单节点的环境. 这篇文章主要是说一下windows下部署ES集群.Linux下单节点部署. 单台 Elasticsearch 服务器 ...

最新文章

  1. STM8单片机定时器驱动的深度解析
  2. 来客推开源商城与你浅析:B2B2C多商户商城系统
  3. Visual C++ dll
  4. 关于c语言的符号常量以下叙述中正确的是,关于C语言的符号常量,以下叙述中正确的是( )...
  5. (转)C# 根据当前时间获取,本周,本月,本季度等时间段 .Net中Exception
  6. 2019斯坦福CS224n深度学习自然语言处理笔记(3)反向传播与计算图
  7. Linux下配置安装NFS
  8. python3及wxpythonGUI多线程防假死与线程消息传递消息(最新)
  9. listary文件查找程序下载和使用
  10. 用C语言实现PID控制代码
  11. LED字体下载,可视化大屏,数据可视化必备
  12. C++关键字分析系列
  13. spring boot中使用websocket实现点对点通信与服务器推送
  14. wps临时文件不自动删除_windows 里面TEP文件夹里面的临时文件有的不能删除怎么办?...
  15. 中国十大电子商务网站排名
  16. 亲测-分享最新微信付费进群收费进群系统源码-附带搭建教
  17. .py文件图标为白纸以及右键没有Edit with IDLE的解决办法
  18. 用python画哆啦a梦的身体_每天一个Python小技巧,用Python 画个多啦A梦,小猪佩奇,文末还有Python入门学习视频...
  19. C# Settings.settings的用处
  20. Angular Material 学习笔记 Chips

热门文章

  1. 【Oracle】Oracle基本数据类型总结
  2. (通用版)salesforce中soql及sosl的伪‘Like’模糊检索
  3. 大数据学习资源(上)
  4. OLEDB, ODEB, ADO.NET Abbreviation
  5. 我的缺点,(不断补充中...)
  6. 在 Windows下使用 fastText
  7. BertSum-基于BERT模型的抽取式文本摘要
  8. 18家机构批量刷新SOTA!T5 is all you need!
  9. 面试 AI 算法岗,你被要求复现顶会了嘛?
  10. 【GNN】百度「NLP」面试的一点总结