class

来源:互联网 发布:autodesk绘图软件 编辑:程序博客网 时间:2024/06/10 22:48


/**
 * struct class - device classes
 * @name: Name of the class.
 * @owner: The module owner.
 * @class_attrs: Default attributes of this class.
 * @dev_attrs: Default attributes of the devices belong to the class.
 * @dev_bin_attrs: Default binary attributes of the devices belong to the class.
 * @dev_kobj: The kobject that represents this class and links it into the hierarchy.
 * @dev_uevent: Called when a device is added, removed from this class, or a
 * few other things that generate uevents to add the environment
 * variables.
 * @devnode: Callback to provide the devtmpfs.
 * @class_release: Called to release this class.
 * @dev_release: Called to release the device.
 * @suspend: Used to put the device to sleep mode, usually to a low power
 * state.
 * @resume: Used to bring the device from the sleep mode.
 * @ns_type: Callbacks so sysfs can detemine namespaces.
 * @namespace: Namespace of the device belongs to this class.
 * @pm: The default device power management operations of this class.
 * @p: The private data of the driver core, no one other than the
 * driver core can touch this.
 *
 * A class is a higher-level view of a device that abstracts out low-level
 * implementation details. Drivers may see a SCSI disk or an ATA disk, but,
 * at the class level, they are all simply disks. Classes allow user space
 * to work with devices based on what they do, rather than how they are
 * connected or how they work.
 */
struct class {
const char *name;
struct module *owner;


struct class_attribute*class_attrs;
struct device_attribute*dev_attrs;
struct bin_attribute*dev_bin_attrs;
struct kobject*dev_kobj;


int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
char *(*devnode)(struct device *dev, umode_t *mode);


void (*class_release)(struct class *class);
void (*dev_release)(struct device *dev);


int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);


const struct kobj_ns_type_operations *ns_type;
const void *(*namespace)(struct device *dev);


const struct dev_pm_ops *pm;


struct subsys_private *p;
};



struct class就是设备驱动模型中通用的设备类结构体。

里面几个重要的属性:

struct class_attribute {
struct attribute attr;
ssize_t (*show)(struct class *class, struct class_attribute *attr,
char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr,
const char *buf, size_t count);
const void *(*namespace)(struct class *class,
const struct class_attribute *attr);
};


/* interface for exporting device attributes */
struct device_attribute {
struct attributeattr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
};


struct bin_attribute {
struct attributeattr;
size_t size;
void *private;
ssize_t (*read)(struct file *, struct kobject *, struct bin_attribute *,
char *, loff_t, size_t);
ssize_t (*write)(struct file *,struct kobject *, struct bin_attribute *,
char *, loff_t, size_t);
int (*mmap)(struct file *, struct kobject *, struct bin_attribute *attr,
   struct vm_area_struct *vma);
};


常用相关的宏定义:

/**
 * Use these macros to make defining attributes easier. See include/linux/device.h
 * for examples..
 */


#define __ATTR(_name,_mode,_show,_store) { \
.attr = {.name = __stringify(_name), .mode = _mode },\
.show = _show,\
.store = _store, \
}


#define __ATTR_RO(_name) { \
.attr = { .name = __stringify(_name), .mode = 0444 },\
.show = _name##_show,\
}


#define __ATTR_NULL { .attr = { .name = NULL } }


#define attr_name(_attr) (_attr).attr.name