1.介绍

使用DEVICE_ATTR,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可.

然后在应用层就能通过cat和echo命令来对sys创建出来的文件进行读写驱动设备,实现交互.

2.DEVICE_ATTR()宏定义

DEVICE_ATTR()定义位于include/linux/device.h中,定义如下所示:

#define DEVICE_ATTR(_name, _mode, _show, _store) \
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

其中_mode定义如下:

  • 400    拥有者能够读,其他任何人不能进行任何操作;
  • 644    拥有者都能够读,但只有拥有者可以编辑;
  • 660    拥有者和组用户都可读和写,其他人不能进行任何操作;
  • 664    所有人都可读,但只有拥有者和组用户可编辑;
  • 700    拥有者能够读、写和执行,其他用户不能任何操作;
  • 744    所有人都能读,但只有拥有者才能编辑和执行;
  • 755    所有人都能读和执行,但只有拥有者才能编辑;
  • 777    所有人都能读、写和执行(该设置通常不是好想法)。

当然也可以用S_IWUSR(用户可写),S_IRUSR(用户可读)等宏代替.

以下面DEVICE_ATTR()定义为例:

static ssize_t show_my_device(struct device *dev,
struct device_attribute *attr, char *buf) //cat命令时,将会调用该函数
{
return buf;
} static ssize_t set_my_device(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len) //echo命令时,将会调用该函数.
{
return len;
}
static DEVICE_ATTR(my_device_test, S_IWUSR|S_IRUSR, show_my_device, set_my_device); //定义一个名字为my_device_test的设备属性文件

最终将宏展开为:

struct device_attribute dev_attr_my_device_test ={
.attr = {.name = "my_device_test", .mode = S_IWUSR|S_IRUSR },
.show = show_my_device,
.store = set_my_device,
}

然后再通过device_create_file()或者sysfs_create_file()便来创建上面my_device_test设备文件.

3.使用示例

示例代码如下:

#include <board.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/regulator/consumer.h>
#include <sound/soc.h>
#include <sound/jack.h> static char mybuf[]="";
static ssize_t show_my_device(struct device *dev,
struct device_attribute *attr, char *buf) //cat命令时,将会调用该函数
{
return sprintf(buf, "%s\n", mybuf);
} static ssize_t set_my_device(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t len) //echo命令时,将会调用该函数
{
sprintf(mybuf, "%s", buf);
return len;
}
static DEVICE_ATTR(my_device_test, S_IWUSR|S_IRUSR, show_my_device, set_my_device);
//定义一个名字为my_device_test的设备属性文件 struct file_operations mytest_ops={
.owner = THIS_MODULE,
}; static int major;
static struct class *cls;
static int mytest_init(void)
{
struct device *mydev;
major=register_chrdev(,"mytest", &mytest_ops);
cls=class_create(THIS_MODULE, "mytest_class");
mydev = device_create(cls, , MKDEV(major,),NULL,"mytest_device"); //创建mytest_device设备 if(sysfs_create_file(&(mydev->kobj), &dev_attr_my_device_test.attr)){ //在mytest_device设备目录下创建一个my_device_test属性文件
return -;} return ;
} static void mytest_exit(void)
{
device_destroy(cls, MKDEV(major,));
class_destroy(cls);
unregister_chrdev(major, "mytest");
} module_init(mytest_init);
module_exit(mytest_exit);
MODULE_LICENSE("GPL");

效果如下:

以后就可以无需写测试程序来读写驱动了,是不是很方便

47.Linux-DEVICE_ATTR()介绍及使用示例的更多相关文章

  1. 01 Linux入门介绍

    一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以及游戏支持度不足 L ...

  2. flume 1.4的介绍及使用示例

    flume 1.4的介绍及使用示例 本文将介绍关于flume 1.4的使用示例,如果还没有安装flume的话可以参考:http://blog.csdn.net/zhu_xun/article/deta ...

  3. [转]Linux中find常见用法示例

    Linux中find常见用法示例[转]·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;find命令的参 ...

  4. Linux Epoll介绍和程序实例

    Linux Epoll介绍和程序实例 1. Epoll是何方神圣? Epoll但是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select类似, ...

  5. Linux入门介绍

    Linux入门介绍 一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以 ...

  6. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  7. Linux 系统目录介绍

    bin : bin 是Binary 二进制的缩写,就是可执行文件了.Bin目录下是用户常用的命令. sbin: 此目录下也是二进制文件 ,不过这里的命令是 超级用户如 root 这样的用户使用的. e ...

  8. 【python】-- 协程介绍及基本示例、协程遇到IO操作自动切换、协程(gevent)并发爬网页

    协程介绍及基本示例 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他 ...

  9. Linux下安装GB2312的示例

    Linux下安装GB2312的示例 Step 1: 到Linux字符集的安装包目录下  [cd /usr/share/i18n/charmaps] Step 2: 解压该目录下的GB2312.gz   ...

  10. Linux中 find 常见用法示例

    Linux中find常见用法示例 #find path -option [ -print ] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出 #- ...

随机推荐

  1. Java学习前知识补充

    1  Java  面向对象的编程语言:为了实现人机交互需要语言的过渡(翻译)这时就需要Java虚拟机! 不同系统需要不同的虚拟机 2  学习语言第一件事 搭建环境(运行 Java需要的环境) 在甲骨文 ...

  2. WebPackBrows

    一个http工具,通过java编写 调用方法 s.y.webpackbrows.fac.WebPackFactor.getConnection 还会继续完善 下载位置 https://pan.baid ...

  3. 【HDU1000】A+B Problem

    题目来源:www.acm.hdu.edu.cn 题目编号:1000  A+B Problem /*----------------------------------------原题目-------- ...

  4. ZKWeb网页框架2.1正式发布

    2.1.0更新的内容有 更新引用类库 NHibernate 5.1.0 Npgsql 3.2.7 MySqlConnector 0.37.0 Dapper 1.50.4 Dommel 1.10.1 Z ...

  5. Java 线程池(ThreadPoolExecutor)原理解析

    在我们的开发中“池”的概念并不罕见,有数据库连接池.线程池.对象池.常量池等等.下面我们主要针对线程池来一步一步揭开线程池的面纱. 有关java线程技术文章还可以推荐阅读:<关于java多线程w ...

  6. Python面向对象3:面向对象的三大特性

    面向对象的三大特性- 封装- 继承- 多态1 封装 - 封装就是对对象的成员进行访问限制- 封装的三个级别: - 公开,public - 受保护的,protected - 私有的,private - ...

  7. 图片处理服务 ImageMagick 的安装和使用

    简介 该文章使用目前官方最新版本7.0.8,这里只记录下Windows系统下的安装. 官方网站:http://www.imagemagick.org/script/index.php. ImageMa ...

  8. 再谈spring的循环依赖是怎么造成的?

    老生常谈,循环依赖!顾名思义嘛,就是你依赖我,我依赖你,然后就造成了循环依赖了!由于A中注入B,B中注入A导致的吗? 看起来没毛病,然而,却没有说清楚问题!甚至会让你觉得你是不清楚spring的循环依 ...

  9. 简单读!spring-mvc源码之穿越http请求

    相信spring-mvc这种被玩坏了的架构理念,大家都烂熟于胸了,不过还是想来扒一扒他的细节. 一个http请求,怎么样被 spring 接收,又怎样做出响应呢? 一般地,我们会配置一个 web.xm ...

  10. 什么 是JavaScript中的变量? 部分2

    变量:是计算机存储数据的标识符 js中存储数据的方式 都是使用变量 js 中声明变量的方式都是var 存储数据,应该有对应的数据类型js中的字符串类型都用成对的单引号或者双引号包裹起来 变量 1. 变 ...