在内核中, sysfs 属性一般是由 __ATTR 系列的宏来声明的,如对设备的使用 DEVICE_ATTR ,对总线使用 BUS_ATTR ,对驱动使用 DRIVER_ATTR ,对类别(class)使用 CLASS_ATTR, 这四个高级的宏来自于 <include/linux/device.h>, 都是以更低层的来自
<include/linux/sysfs.h> 中的 __ATTR/__ATRR_RO 宏实现。

在adb shell 终端查看到接口,当我们将数据 echo 到接口中时,在上层实际上完成了一次 write 操作,对应到 kernel ,调用了驱动中的 “store”。同理,当我们cat 一个 接口时则会调用 “show” 。到这里,只是简单的建立了 android 层到 kernel 的桥梁,真正实现对硬件操作的,还是在 "show" 和 "store" 中完成的。

实现办法,例一:

#include <linux/platform_device.h>

1)

static ssize_t rohm_proximity_show_debug(struct device* cd,struct device_attribute *attr, char* buf)

{

    ssize_t ret = 0;

    

    sprintf(buf, "ROHM Debug %d\n",debug_level);//将格式数据写到缓冲里面,此处为buf

    

    ret = strlen(buf) + 1;

return ret;

}

static ssize_t rohm_proximity_store_debug(struct device* cd, struct device_attribute *attr,

               const char* buf, size_t len)

{

    unsigned long on_off = simple_strtoul(buf, NULL, 10);//,10,16 进制数字   ,返回值是解析的数字,endp 指向字符串起始处,base
:进制

    debug_level = on_off;

printk("%s: debug_level=%d\n",__func__, debug_level);

    

    return len;

}

2)

static DEVICE_ATTR(debug, S_IRUGO | S_IWUSR, rohm_proximity_show_debug, rohm_proximity_store_debug);

3)

static int rohm_proximity_create_sysfs(struct platform_device *client)

{

    struct device *dev = &(client->dev);

    int err = 0;

PS_DBG("%s\n", __func__);

if ((err = device_create_file(dev, &dev_attr_control)))

        goto err_out;

if ((err = device_create_file(dev, &dev_attr_debug)))

        goto err_out;

return 0;

err_out:

    return err;

}

4)

static int rohm_proximity_probe(struct platform_device *pdev)

{

rohm_proximity_create_sysfs(pdev);

}

实现办法,例二:

1)

static ssize_t mc32x0_threshold_show(struct device *dev,

                     struct device_attribute *attr, char *buf)

{

#ifdef MC32X0_DEBUG

       printk("mcube %s\n",__FUNCTION__);

#endif

return sprintf(buf, "%d\n", mc32x0_get_threshold(dev));

}

static ssize_t mc32x0_threshold_store(struct device *dev,

                      struct device_attribute *attr,

                      const char *buf, size_t count)

{

    unsigned long threshold;

#ifdef MC32X0_DEBUG

       printk("mcube %s\n",__FUNCTION__);

#endif

threshold = simple_strtoul(buf, NULL,10);

        if (threshold >= 0 && threshold <= ABSMAX_8G) {

        mc32x0_set_threshold(dev, threshold);

        }

return count;

}

2)

static DEVICE_ATTR(threshold, 0666,    mc32x0_threshold_show, mc32x0_threshold_store);

static struct attribute *mc32x0_attributes[] = {

  //  &dev_attr_enable.attr,

   // &dev_attr_delay.attr,

  //  &dev_attr_position.attr,

    &dev_attr_threshold.attr,

};

3)

static struct attribute_group mc32x0_attribute_group = {

    .attrs = mc32x0_attributes

};

4)

static int mc32x0_probe(struct i2c_client *client, const struct i2c_device_id *id)

{

err = sysfs_create_group(&mc32x0->input->dev.kobj, &mc32x0_attribute_group);//.probe中生成

if (err < 0) {

        goto error_2;

    }

//sysfs_remove_group(&mc32x0->input->dev.kobj, &mc32x0_attribute_group);//.remove中移除

}

adb下输入:(以下节点为DEVICE_ATTR(debug,,)同为,位置在/sys/devices/platform/rohm_proximity/,在要/目录下find . -name "debug"查找)

#cat debug         //此端口下会输出"ROHM Debug XX",XX为此处值。注:另一adb端口cat /proc/kmsg不会显示此字符

#echo 01>debug //在另外一个adb端口下cat /proc/kmsg会显示"rohm_proximity_store_debug: debug_level=1"。

注:echo 01>debug值为1,echo 1>debug值为0,echo 0>debug无效.

此时已给此端口写1,再#cat debug,端口下会输出"ROHM Debug 1"

参考文档:http://blog.chinaunix.net/uid-26413351-id-3180609.html

DEVICE_ATTR实例分析的更多相关文章

  1. RPC原理及RPC实例分析

    在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...

  2. java基础学习05(面向对象基础01--类实例分析)

    面向对象基础01(类实例分析) 实现的目标 1.如何分析一个类(类的基本分析思路) 分析的思路 1.根据要求写出类所包含的属性2.所有的属性都必须进行封装(private)3.封装之后的属性通过set ...

  3. (转)实例分析:MySQL优化经验

    [IT专家网独家]同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力,严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月.MySQL使用是很具伸缩性的算法,因此你通 ...

  4. sql注入实例分析

    什么是SQL注入攻击?引用百度百科的解释: sql注入_百度百科: 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具 ...

  5. 实例分析ELF文件静态链接

    参考文献: <ELF V1.2> <程序员的自我修养---链接.装载与库>第4章 静态链接 开发平台: [thm@tanghuimin static_link]$ uname ...

  6. 用实例分析H264 RTP payload

    用实例分析H264 RTP payload H264的RTP中有三种不同的基本负载(Single NAL,Non-interleaved,Interleaved) 应用程序可以使用第一个字节来识别. ...

  7. nodejs的模块系统(实例分析exprots和module.exprots)

    前言:工欲善其事,必先利其器.模块系统是nodejs组织管理代码的利器也是调用第三方代码的途径,本文将详细讲解nodejs的模块系统.在文章最后实例分析一下exprots和module.exprots ...

  8. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  9. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

随机推荐

  1. 微信小程序发布

    一.操作步骤 (1)打开[微信开发者工具]->新建一个默认项目->点击[项目]->点击[上传] (2)使用微信小程序公众平台管理员扫描二维码,在手机微信上点击[确认上传] (3)输入 ...

  2. JAVA面向对象-----包机制

    JAVA面向对象-–包机制 问题: 当定义了多个类的时候,可能会发生类名的重复问题. 在java中采用包机制处理开发者定义的类名冲突问题. 怎么使用java的包机制呢? 1.使用package 关键字 ...

  3. FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-TU

    ===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...

  4. Swift基础之对FMDB第三方的使用方法

    相信大家都熟悉OC使用FMDB第三方库,进行数据库操作,增.删.改.查,现在我就来利用代码展示一下Swift对此库的使用方法,我是通过Pods添加的第三方库,如果手动添加记得创建桥接文件,在文件中调用 ...

  5. 关于在eclipse开发环境上打开手机data文件

    使用Eclipse开发Android上的数据库应用,需要把数据库文件放到/data/data/mynamespace/database文件夹下,普通手机通过ROOT后经常还是看不到这个文件夹,这时需要 ...

  6. TBschedule入门

    tbschedule 淘宝的wiki: http://code.taobao.org/p/tbschedule/wiki/index/ 截取内容如下: 此文档内部包括: 1.设计目标说明 2.主要概念 ...

  7. OpenCV实时美颜摄像并生成H264视频流

    为什么美颜摄像这么简单的功能,OpenCV这个开源项目网上很少有代码呢?对于在windows平台下,生成h264视频流也比价麻烦,没有现成的api可以使用,需要借助MinGw编译libx264,或者f ...

  8. 【ShaderToy】基础篇之再谈抗锯齿(antialiasing,AA)

    写在前面 在之前的基础篇中,我们讲到了在绘制点线时如何处理边缘的锯齿,也就是使用smoothstep函数.而模糊参数是一些定值,或者是跟屏幕分辨率相关的数值,例如分辨率宽度的5%等等.但这种方法其实是 ...

  9. android程序崩溃后重启

    有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 应用这个问题困恼了我很久,今天终于解决了该问 ...

  10. UNIX网络编程——常用服务器模型总结

    下面有9种服务器模型分别是: 迭代服务器. 并发服务器,为每个客户fork一个进程. 预先派生子进程,每个子进程都调用accept,accept无上锁保护. 预先派生子进程,以文件锁的方式保护acce ...