Platform机制
Platform总线Linux中一种虚拟总线。platform机制的本身使用并不复杂,由两部分组成:platform_device和platform_driver
Platform 驱动与传统的设备驱动模型相比,优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序使用这些资源时使用
统一的接口,这样提高了程序的
可移植性。
通过platform机制开发底层设备驱动的流程:
定义platform_device->注册platform_device->定义platform_driver->注册platform_driver
Platform机制使用了bus driver device模型,device是硬件相关代码,driver是比较稳定的代码,类似输入子系统里面,input.c是提供给上层的统一接口,buttons.c是硬件相关代码<-分离->evdev.c是纯软件比较稳定的代码。
1 分析drivers\base\platform.c
platform总线的注册在drivers\base\init.c中调用
void __init driver_init(void)
{
/* These are the core pieces */
devtmpfs_init();
devices_init();
buses_init();
classes_init();
firmware_init();
hypervisor_init();
/* These are also core pieces, but must come after the
* core core pieces.
*/
platform_bus_init();
system_bus_init();
cpu_dev_init();
memory_dev_init();
}
int __init platform_bus_init(void)
{
int error;
early_platform_cleanup();
error = device_register(&platform_bus); // 总线也是一个设备
if (error)
return error;
error = bus_register(&platform_bus_type); // 注册platform总线
if (error)
device_unregister(&platform_bus);
return error;
}
platform机制是基于Linux总线设备驱动模型实现的
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs, // 总线属性
.match = platform_match, // 用于匹配platform device和platform driver
.uevent = platform_uevent,
.pm = &platform_dev_pm_ops, // 电源管理相关
};
struct device platform_bus = {
.init_name = "platform",
};
static struct device_attribute platform_dev_attrs[] = {
__ATTR_RO(modalias),
__ATTR_NULL,
};
#define __ATTR_RO(_name) { \
.attr = { .name = __stringify(_name), .mode = 0444 }, \
.show = _name##_show, \
}
static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
char *buf)
{
struct platform_device *pdev = to_platform_device(dev);
int len = snprintf(buf, PAGE_SIZE, "platform:%s\n", pdev->name);
return (len