1、device中建立属性文件
(1)函数调用关系:
/**************************************************************/
device_create_file
sysfs_create_file
/*************************************************************/
(2)相关的数据结构:
1 struct attribute { 2 const char *name; // 属性文件的名字 3 struct module *owner; // 属性文件的所有者 4 mode_t mode; 5 #ifdef CONFIG_DEBUG_LOCK_ALLOC 6 struct lock_class_key *key; 7 struct lock_class_key skey; 8 #endif 9 };
1 struct device_attribute { 2 struct attribute attr; // 内置的attribute 结构体 3 ssize_t (*show)(struct device *dev, struct device_attribute *attr, // 属性文件的show方法(也就是读) 4 char *buf); 5 ssize_t (*store)(struct device *dev, struct device_attribute *attr, // 属性文件的store方法(也就是写) 6 const char *buf, size_t count); 7 };
(3) 相关的宏定义
/**************************************************************/
#define DEVICE_ATTR(_name, _mode, _show, _store)
struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
#define __ATTR(_name,_mode,_show,_store) {
.attr = {.name = __stringify(_name), .mode = _mode },
.show = _show,
.store = _store,
/*************************************************************/
由此可知这个宏定义就是定义了一个 device_attribute 类型的变量并进行了初始化。
总结:我们如果需要给device添加属性文件,那么我们可以通过device_create_file函数去添加,我们需要提供相应的device属性文件描述信息,
也就是一个device_attribute 结构体变量。
2、class建立属性文件
(1)函数调用关系
/**********************************************************/
class_create_file
sysfs_create_file
/***********************************************************/
(2)相关的数据结构
1 struct class_attribute { 2 struct attribute attr; // 内置的 attribute 结构体变量 3 ssize_t (*show)(struct class *class, struct class_attribute *attr, // 属性文件的show操作方法 4 char *buf); 5 ssize_t (*store)(struct class *class, struct class_attribute *attr, // 属性文件的store操作方法 6 const char *buf, size_t count); 7 };
(3)相关的宏定义
/******************************************************************************/
#define CLASS_ATTR(_name, _mode, _show, _store)
struct class_attribute class_attr_##_name = __ATTR(_name, _mode, _show, _store)
/******************************************************************************/
3、bus建立属性文件
(1)函数调用关系
/**********************************************************/
bus_create_file
sysfs_create_file
/*********************************************************/
(2)相关的数据结构
1 struct bus_attribute { 2 struct attribute attr; 3 ssize_t (*show)(struct bus_type *bus, char *buf); 4 ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count); 5 };
(3)相关的宏定义
#define BUS_ATTR(_name, _mode, _show, _store)
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)
4、一次建立多个属性文件的方法
上面说的那些函数一次只能建立一个属性文件,其实在内核中还提供了另一个可以一次建立多个属性文件的函数,所以既然是建立多个,那么我们肯定是需要提供相应的数组。
(1)一次建立多个device属性
static int device_add_attributes(struct device *dev, struct device_attribute *attrs)
(2)一次建立多个bus属性文件
static int device_add_attrs(struct bus_type *bus, struct device *dev)
/*************************************************************************************/