设备模型:总线、驱动、设备
设备模型三要素:总线,驱动,设备。
一、总线
1、总线:总线是处理器和设备之间的通道,在设备模型中, 所有的设备都通过总线相连,
甚至是内部的虚拟“platform”总线。 在 Linux 设备模型中, 总线由 bus_type 结构表示,
定义在 <linux/device.h>
struct bus_type
{
const char *name; /*总线名称*/
struct bus_attribute *bus_attrs; /*总线属性*/
struct device_attribute *dev_attrs; /*设备属性*/
struct driver_attribute *drv_attrs; /*驱动属性*/
int (*match)(struct device *dev, struct device_driver *drv);
int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
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 (*suspend_late)(struct device *dev, pm_message_t state);
int (*resume_early)(struct device *dev);
int (*resume)(struct device *dev);
struct dev_pm_ops *pm;
struct bus_type_private *p;
}
2、总线注册和删除:
总线的注册使用:
bus_register(struct bus_type * bus)//若成功,新的总线将被添加进系统,并可在sysfs 的 /sys/bus 下看到。
总线的删除使用:
void bus_unregister(struct bus_type *bus)
3、总线方法:
int (*match)(struct device * dev, struct device_driver * drv)//当一个新设备或者驱动被添加到这个总线
时,该方法被调用。用于判断指定的驱动程序是否能处理指定的设备。若可以,则返回非零值。即设备和驱动是否对应
int (*uevent)(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size) //在为用户空间产生热插拔事件之前,这个
方法允许总线添加环境变量。
4、总线属性由结构bus_attribute 描述,定义如下:
struct bus_attribute
{
struct attribute attr;
ssize_t (*show)(struct bus_type *, char * buf);
ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
}
bus_create_file(struct bus_type *bus, struct bus_attribute *attr)//创建属性
bus_remove_file(struct bus_type *bus, struct bus_attribute *attr)//删除属性
二、设备
1、Linux 系统中的每个设备由一个 struct device 描述:
struct device
{
……
struct kobject kobj;
char bus_id[BUS_ID_SIZE];/*在总线上唯一标识该设备的字符串 */
struct bus_type *bus; /* 设备所在总线 */
struct device_driver *driver; /*管理该设备的驱动*/
void *driver_data; /*该设备驱动使用的私有数据成员 */
struct klist_node knode_class;
struct class *class;
struct attribute_group **groups;
void (*release)(struct device *dev);
}
2、设备注册和注销
device_register(struct device *dev) //注册设备
device_unregister(struct device *dev)//注销设备
说明:**一条总线也是个设备,也必须按设备注册**
3、设备属性
设备属性由struct device_attribute 描述:
struct device_attribute
{
struct attribute attr;
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);
}
device_create_file(struct device *device, struct device_attribute * entry)// 创建属性
device_remove_file(struct device * dev, struct device_attribute * attr)//删除属性
三、驱动
1、驱动程序由struct device_driver 描述 :
struct device_driver
{
const char *name; /*驱动程序的名字( 体现在 sysfs 中 )*/
struct bus_type *bus; /*驱动程序所在的总线*/
struct module *owner;
const char *mod_name;
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);
struct attribute_group **groups;
struct dev_pm_ops *pm;
struct driver_private *p;
}
2、驱动注册和注销
int driver_register(struct device_driver *drv)// 注册驱动
void driver_unregister(struct device_driver *drv)// 注销驱动
3、驱动属性
驱动的属性使用struct driver_attribute 来描述:
struct driver_attribute
{
struct attribute attr;
ssize_t (*show)(struct device_driver *drv, char *buf);
ssize_t (*store)(struct device_driver *drv, const char *buf, size_t count);
}
int driver_create_file(struct device_driver * drv, struct driver_attribute * attr) // 创建属性
void driver_remove_file(struct device_driver * drv, struct driver_attribute * attr)// 删除属性