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. Drools为什么没有规则流Flow Flie

    哪个大神能告诉我,我安装的是Drools7.7.0,为什么没有网上说的flow file啊?怎么才能出来规则流呢? 上图是我本地的显示,下图是网上的图片.

  2. leetcode第一天-merge two binary trees

    有段时间没有写代码了,脑子都生锈了,今后争取笔耕不辍(立flag,以后打脸) 随机一道Leecode题, Merge Two Binary Trees,题目基本描述如下: Given two bina ...

  3. jQuery-少见获取元素的方式

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. W3C标准和规范

    W3C标准万维网联盟标准. 万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behav ...

  5. Python基础理论 - 函数

    函数是第一类对象:可以当做数据来传 1.  可以被引用 2.  可以作为函数参数 3.  可以作为函数返回值 4.  可以作为容器类型的元素 小例子: def func1(): print('func ...

  6. pycharm激活码

    MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...

  7. Web browser发展演变

    浏览器是指可以显示网页服务器或者文件系统的HTML文件内容,并让用户与这些文件交互的一种软件.网页浏览器主要通过HTTP协议与网页服务器交互并获取网页,这些网页由URL指定,文件格式通常为HTML.大 ...

  8. 2.AsyncQueryHandler、内容提供者

    会话页面 Test :测试 public class Test extends AndroidTestCase{ public void test(){ Uri uri = Uri.parse(&qu ...

  9. springmvc的Controller里实现转发的同时弹出提示对话框

    以前写servlet时就用到这个,但是现在学了springMVC+hibernate后就不知道怎么实现了,后来在网上找了好多,看了好多,最后经过自己实践成功的如下: 1.首先是Controller控制 ...

  10. Tools - 正版Windows7系统的下载与安装

    下载 微软原版系统下载地址:https://msdn.itellyou.cn/ 根据系统类型.语言和版本,下载合适的系统ISO文件. 例如: Windows 7 Professional with S ...