level 9
浩淼56
楼主
1、对于Linux驱动开发来说,设备模型的理解是根本,顾名思义设备模型是关于设备的模型,设备的概念就是总线和与其相连的各种设备了。
总线、设备、驱动,也就是bus、device、driver,在内核里都会有它们自己专属的结构,在include/linux/device.h里定义。
首先是总线,bus_type.
struct bus_type {
constchar *name; --总线名
structbus_attribute *bus_attrs; --总线属性
structdevice_attribute *dev_attrs; --总线设备属性
structdriver_attribute *drv_attrs; --总线驱动属性
以下的函数会在设备注册或驱动注册的时候调用。
int (*match)(struct device *dev, structdevice_driver*drv); --实现设备与驱动的匹配。不同的总线实现匹配的方法不同,如platform总线采用name匹配,而usb_bus采用id匹配
int (*uevent)(struct device *dev, structkobj_uevent_env *env);
int (*probe)(structdevice*dev); --在2.6的内核中实现一个设备与驱动的探测。主要是因为热插拔的设备的增多。
int (*remove)(structdevice*dev); --移除设备
void (*shutdown)(structdevice*dev); --关闭设备
int (*suspend)(struct device *dev,pm_message_tstate);
int (*suspend_late)(struct device *dev,pm_message_t state);
int (*resume_early)(structdevice*dev);
int (*resume)(struct device *dev);
structdev_pm_ops*pm; --电源管理
struct bus_type_private*p; --bus_type私有成员,这个结构体中主要包括了kset以及klist,用于管理其挂载其总线下的设备和驱动
};
下面是设备device的定义:
struct device{
struct device* parent; //父设备,一般一个bus也对应一个设备。
structkobject kobj;//代表自身
charbus_id[BUS_ID_SIZE];
structbus_type * bus;
structdevice_driver *driver;
void*driver_data;
void*platform_data;
///更多字段忽略了
};
下面是设备驱动定义:
structdevice_driver {
const char *name;
structbus_type * bus;//所属总线
structcompletion unloaded;
structkobject kobj;//代表自身
struct klistklist_devices;//设备列表
structklist_node knode_bus;
struct module* owner;
int (*probe)(struct device * dev);
int (*remove)(struct device * dev);
void(*shutdown) (struct device * dev);
int(*suspend) (struct device * dev, pm_message_tstate);
int (*resume)(struct device * dev);
};
2015年04月15日 13点04分
1
总线、设备、驱动,也就是bus、device、driver,在内核里都会有它们自己专属的结构,在include/linux/device.h里定义。
首先是总线,bus_type.
struct bus_type {
constchar *name; --总线名
structbus_attribute *bus_attrs; --总线属性
structdevice_attribute *dev_attrs; --总线设备属性
structdriver_attribute *drv_attrs; --总线驱动属性
以下的函数会在设备注册或驱动注册的时候调用。
int (*match)(struct device *dev, structdevice_driver*drv); --实现设备与驱动的匹配。不同的总线实现匹配的方法不同,如platform总线采用name匹配,而usb_bus采用id匹配
int (*uevent)(struct device *dev, structkobj_uevent_env *env);
int (*probe)(structdevice*dev); --在2.6的内核中实现一个设备与驱动的探测。主要是因为热插拔的设备的增多。
int (*remove)(structdevice*dev); --移除设备
void (*shutdown)(structdevice*dev); --关闭设备
int (*suspend)(struct device *dev,pm_message_tstate);
int (*suspend_late)(struct device *dev,pm_message_t state);
int (*resume_early)(structdevice*dev);
int (*resume)(struct device *dev);
structdev_pm_ops*pm; --电源管理
struct bus_type_private*p; --bus_type私有成员,这个结构体中主要包括了kset以及klist,用于管理其挂载其总线下的设备和驱动
};
下面是设备device的定义:
struct device{
struct device* parent; //父设备,一般一个bus也对应一个设备。
structkobject kobj;//代表自身
charbus_id[BUS_ID_SIZE];
structbus_type * bus;
structdevice_driver *driver;
void*driver_data;
void*platform_data;
///更多字段忽略了
};
下面是设备驱动定义:
structdevice_driver {
const char *name;
structbus_type * bus;//所属总线
structcompletion unloaded;
structkobject kobj;//代表自身
struct klistklist_devices;//设备列表
structklist_node knode_bus;
struct module* owner;
int (*probe)(struct device * dev);
int (*remove)(struct device * dev);
void(*shutdown) (struct device * dev);
int(*suspend) (struct device * dev, pm_message_tstate);
int (*resume)(struct device * dev);
};