Linux设备驱动之设备模型(4)

总线Buses是处理器和设备的通道。在设备模型中,所有设备都是通过总线连接在一起的,哪怕是一个内部虚拟的platform总线。

/* defined in <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); /*在为用户空间产生热插拔事件之前,这个方法允许总线添加环境变量(参数和 kset 的uevent方法相同)*/ int (*uevent)(struct device *dev, struct kobj_uevent_env *env); ... struct subsys_private *p; /* 一个很重要的域,包含了device链表和drivers链表 */ } /* 定义bus_attrs的快捷方式 */ BUS_ATTR(name, mode, show, store); /* bus属性文件的创建移除 */ int bus_create_file(struct bus_type *bus, struct bus_attribute *attr); void bus_remove_file(struct bus_type *bus, struct bus_attribute *attr); /* 总线注册 */ int bus_register(struct bus_type *bus); void bus_unregister(struct bus_type *bus); /* 遍历总线上的设备与驱动 */ int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, int(*fn)(struct device *, void *)); int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void *data, int(*fn)(struct device_driver *, void *)); Devices

Linux中,每一个底层设备都是structure device的一个实例:

struct device { struct device *parent; /* 父设备,总线设备指定为NULL */ struct device_private *p; /* 包含设备链表,driver_data(驱动程序要使用数据)等信息 */ struct kobject kobj; const char *init_name; /* 初始默认的设备名 */ struct bus_type *bus; /* type of bus device is on */ struct device_driver *driver; /* which driver has allocated this device */ ... void (*release)(struct device *dev); }; int device_register(struct device *dev); void device_unregister(struct device *dev); DEVICE_ATTR(name, mode, show, store); int device_create_file(struct device *device,struct device_attribute *entry); void device_remove_file(struct device *dev,struct device_attribute *attr); Drivers

设备模型跟踪所有系统已知的驱动。

struct device_driver { const char *name; /* 驱动名称,在sysfs中以文件夹名出现 */ struct bus_type *bus; /* 驱动关联的总线类型 */ int (*probe) (struct device *dev); /* 查询设备的存在 */ int (*remove) (struct device *dev); /* 设备移除回调 */ void (*shutdown) (struct device *dev); ... } int driver_register(struct device_driver *drv); void driver_unregister(struct device_driver *drv); DRIVER_ATTR(name, mode, show, store); int driver_create_file(struct device_driver *drv,struct driver_attribute *attr); void driver_remove_file(struct device_driver *drv,struct driver_attribute *attr); Classes

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14652.html