struct bus_type{
const char *name;
const char *dev_name;
struct device *dev_root;
struct device_attribute *dev_attrs; /*Use dev_groups instead*/
const struct attribute_group **bus_groups;
const struct attribute_group **dev_groups;
const struct attribute_group **drv_groups;s
int (*match)(struct device *dev,struct device_driver *drv);
int (*uevent)(struct device *dev,struct kobj_uevent_env *env);
int (*remove)(struct device *dev);
void (*shutdown)(struct device *dev);
int(*online) (struct device *dev);
int(*offline)(struct device *dev);
const struct dev_pm_ops *pm;
struct iommu_ops *iomm_ops;
struct subsys_private *p;
struct lock_class_key lock_key;
};
struct device_type{
const char *name;
struct bus_type *bus;
struct module *owner;
const char *mod_name;
bool suppress_bind_attrs;
const struct of_device_id *of_match_table;
const struct acpi_device_id *acpi_match_table;
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
void (*shutdown)(struct device *dev);
int (*suspend) (struct device *dev,pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;
const struct dev_pm_ops *pm;
struct driver_private *p;
};
struct device{
struct device *parent;
struct device_private *p;
struct kobject kobj;
const char *init name;
const struct device_type *type;
struct mutex mutex;
struct bus_type *bus;/*type of bus device is on*/
struct device_driver *driver;
void *platform_data;
struct dev_pm info power;
struct dev_pm_domain *pm_domain;
#ifdef CONFIG_PINCTRL
struct dev_pin_info *pins;s
#endif
#ifdef CONFIG_NUMA
int numa_node;
#endif
u64 *dma_mask;
u64 coherent_dma_mask;
struct device_dma_parameters *dma_parms;s
struct list_head dma_pools;
struct dma_coherent_mem *dma_mem;
#ifdef
struct cma *cma_area;
#endif
/*arch specific addition*/
struct dev_archdata archdata;
struct device_node *of_node;
struct device_node *of_node;
struct acpi_dev_node *acpi_node;s
dev_t devt;
u32 id;
spinlock_t devers_lock;
struct list_head devers_head;
struct klist_node knode_class;
struct class *class;
const struct attribute_group **groups;
void (*release)(struct device *dev);
struct iommu_group *iommu_group;
boo offline_disabled:1
boo offline:1;
};
device_drivers和device分别表示 驱动和设备,而这两者都必须依赖于一种总线。因此都包含struct bus_type指针。
设备和驱动在内核当中是分开注册的,bus_type的match()成员函数将两者捆绑在一起。配对成功,xxx_driver的probe()
就会被执行。总线,驱动和设备最终都可以认为是kobject的派生类。一个kobject对应sysfs中的一个驱动。
今天更显到这里,爱你,YZ.
const char *name;
const char *dev_name;
struct device *dev_root;
struct device_attribute *dev_attrs; /*Use dev_groups instead*/
const struct attribute_group **bus_groups;
const struct attribute_group **dev_groups;
const struct attribute_group **drv_groups;s
int (*match)(struct device *dev,struct device_driver *drv);
int (*uevent)(struct device *dev,struct kobj_uevent_env *env);
int (*remove)(struct device *dev);
void (*shutdown)(struct device *dev);
int(*online) (struct device *dev);
int(*offline)(struct device *dev);
const struct dev_pm_ops *pm;
struct iommu_ops *iomm_ops;
struct subsys_private *p;
struct lock_class_key lock_key;
};
struct device_type{
const char *name;
struct bus_type *bus;
struct module *owner;
const char *mod_name;
bool suppress_bind_attrs;
const struct of_device_id *of_match_table;
const struct acpi_device_id *acpi_match_table;
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
void (*shutdown)(struct device *dev);
int (*suspend) (struct device *dev,pm_message_t state);
int (*resume) (struct device *dev);
const struct attribute_group **groups;
const struct dev_pm_ops *pm;
struct driver_private *p;
};
struct device{
struct device *parent;
struct device_private *p;
struct kobject kobj;
const char *init name;
const struct device_type *type;
struct mutex mutex;
struct bus_type *bus;/*type of bus device is on*/
struct device_driver *driver;
void *platform_data;
struct dev_pm info power;
struct dev_pm_domain *pm_domain;
#ifdef CONFIG_PINCTRL
struct dev_pin_info *pins;s
#endif
#ifdef CONFIG_NUMA
int numa_node;
#endif
u64 *dma_mask;
u64 coherent_dma_mask;
struct device_dma_parameters *dma_parms;s
struct list_head dma_pools;
struct dma_coherent_mem *dma_mem;
#ifdef
struct cma *cma_area;
#endif
/*arch specific addition*/
struct dev_archdata archdata;
struct device_node *of_node;
struct device_node *of_node;
struct acpi_dev_node *acpi_node;s
dev_t devt;
u32 id;
spinlock_t devers_lock;
struct list_head devers_head;
struct klist_node knode_class;
struct class *class;
const struct attribute_group **groups;
void (*release)(struct device *dev);
struct iommu_group *iommu_group;
boo offline_disabled:1
boo offline:1;
};
device_drivers和device分别表示 驱动和设备,而这两者都必须依赖于一种总线。因此都包含struct bus_type指针。
设备和驱动在内核当中是分开注册的,bus_type的match()成员函数将两者捆绑在一起。配对成功,xxx_driver的probe()
就会被执行。总线,驱动和设备最终都可以认为是kobject的派生类。一个kobject对应sysfs中的一个驱动。
今天更显到这里,爱你,YZ.