使用DEVICE_ATTR宏,可以定义一个struct device_attribute设备属性,使用函数sysfs_create_group或sysfs_create_file便可以在设备目录下创建具有show和store方法的节点。能方便的进行调试。
一、使用DEVICE_ATTR构建device attribute
下面将顺着我们直接使用的DEVICE_ATTR来分析一下,这个宏究竟都做了哪些事情。
DEVICE_ATTR的定义:
1 2 |
|
而__ATTR宏的定义在include/linux/sysfs.h文件中,如下:
1 2 3 4 5 6 |
|
那么struct device_attribute的定义又是怎么样的呢?该结构体的定义在include /linux/device.h,其定义如下:
1 2 3 4 5 6 7 8 |
|
而其中的struct attribute的定义在include/linux/device.h中,如下:
1 2 3 4 5 6 7 8 9 |
|
总结一下:
|
1 2 3 4 5 6 |
|
其中:.show和.store的类型定义如下:
show函数的详细描述:
1 2 |
|
- 入参buf是需要我们填充的string即我们cat属性节点时要显示的内容;
- 函数的返回值是我们填充buf的长度,且长度应当小于一个页面的大小(4096字节);
- 其他参数一般不用关心。
例如:
1 2 3 4 5 |
|
store函数的详细描述:
1 2 |
|
- 入参buf是用户传入的字符串,即echo到属性节点的内容;
- 入参count是buf中字符串的长度。
- 函数的返回值通常返回count即可。
- 其他参数一般不用关心。
例如:
1 2 3 4 5 6 7 |
|
mode的权限定义在kernel/include/uapi/linux/stat.h中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
至此,我们已经定义好了.show和.store函数,那么就可以使用DEVICE_ATTR了。
1 |
|
二、将device attribute添加到sysfs中
上面我们已经创建好了所需要的device attribute,下面就要将这些attribute添加到sysfs中了,此处可用的函数由sysfs_create_file和sysfs_create_group。
1、只有一个节点的创建sysfs_create_file
此处在驱动的probe或module_init函数调用sysfs_create_file即可,在module_exit或remove函数中调用sysfs_remove_file来移除节点。
1 2 |
|
以下是全部的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
|
2、多个节点的创建sysfs_create_group
定义attribute属性结构体数组到属性组中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
下面就可以利用sysfs_create_group和sysfs_create_group来添加、移除属性节点组了。
定义如下:
1 2 |
|
全部代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
|