DEVICE_ATTR中权限位分析以及实例

在内核中, 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" 中完成的。

对于

#define DEVICE_ATTR(_name, _mode, _show, _store)

这个宏中得第二位mode权限位相信困扰了好多人。很多定义为:或者干脆数字 0644  0666  0444等。

不明百其中为什么会有这么多权限。下面以简单得实例分析。

权限位定义在;<include/linux/shm.h>和 <include/linux/stat.h>中有定义

如下#define S_IRWXU 00700

#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100

#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010

#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001

以0644为例:0644=0400 |0200|40|4

  S_IRUSR|  S_IWUSR|S_IRGRP|  S_IROTH  表示可以读写

如下存在实例可以用:

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);//解析字符串cp 中 8,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);

}

 




在之前得文章 I2c test中也有一个实例 可以进行对比看

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值