一、设备驱动的分层思想
:以platform设备驱动、input设备驱动为例看看他们在分层思想上的体现
【1】在核心层 :一类设备总线通用的功能特性,如果某一设备支持的总线比较特别可以不使用这些功能特性,在自己的设备总线结构体中
进行重载。
例(1)platform核心层 :定义在drivers/base/platform.c文件
Linux内核对设备总线先进行了一次全局的抽象,即概括了所有设备驱动总线具有的功能特性:
仔细的我们发现platform总线中并没有probe成员,可以认为该总线中并没有或不需要这么一种功能。
经过内核的初始化调用:
int __init platform_bus_init(void);
例(2)input核心层 :对输入设备的管理进行总体抽
【1】在核心层 :一类设备总线通用的功能特性,如果某一设备支持的总线比较特别可以不使用这些功能特性,在自己的设备总线结构体中
进行重载。
例(1)platform核心层 :定义在drivers/base/platform.c文件
Linux内核对设备总线先进行了一次全局的抽象,即概括了所有设备驱动总线具有的功能特性:
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; //设备具有不同特性--这本身就是一种共性
};
针对platform设备,内核并没有去实现上面这些通用的功能属性,毕竟在现实中大多数情况,设备的不同功能还是比较多,除非是要在一个cpu下控制批量相同的设备,这只是我个人的看法
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs,
.match = platform_match,
.uevent = platform_uevent,
.pm = PLATFORM_PM_OPS_PTR,
};
也就是说内核认为platform设备在多数情况下具备的通用功能特性有上面5个方面并给他们赋予了默认方案,
仔细的我们发现platform总线中并没有probe成员,可以认为该总线中并没有或不需要这么一种功能。
经过内核的初始化调用:
int __init platform_bus_init(void);
bus_register(&platform_bus_type);platform总线上就具有这类设备的一套默认的方案。
例(2)input核心层 :对输入设备的管理进行总体抽