platform初始化的函数调用:
start_kernel-->rest_init-->kernel_init-->kernel_init_freeable-->do_base_setup--->driver_init--->platform_bus_init
初始化函数:
platform初始化函数:
int __init platform_bus_init(void)
{
int error;
//平台初始化前的一些清理工作
early_platform_cleanup();
//注册platform_bus设备
error = device_register(&platform_bus);
if (error)
return error;
//注册platform_bus_type总线
error = bus_register(&platform_bus_type);
if (error)
device_unregister(&platform_bus);
return error;
}
下面就分开解析初始化函数所作的工作。
1, eraly_platform_cleanup函数
早期清理工作,主要是清理early_platform_device_list链表
static __initdata LIST_HEAD(early_platform_driver_list);
static __initdata LIST_HEAD(early_platform_device_list);
void __init early_platform_cleanup(void)
{
struct platform_device *pd, *pd2;
//把early_platform_device_list链表中的元素删除,并把元素占据空间清零
list_for_each_entry_safe(pd, pd2, &early_platform_device_list,
dev.devres_head) {
list_del(&pd->dev.devres_head);
memset(&pd->dev.devres_head, 0, sizeof(pd->dev.devres_head));
}
}
2,platform设备的定义
struct device platform_bus = {
.init_name = "platform",
};
可以看到设备只是初始化了名字
3,platform总线的定义
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs,
.match = platform_match, //总线匹配函数(device和driver)
.uevent = platform_uevent, //事件(热插拔)函数
.pm = &platform_dev_pm_ops,//电源管理相关的操作函数
};
在这里对总线的定义主要是设置总线的操作函数
4,platform设备注册函数device_register
对于platform总线就是初始化了操作总线的函数。
/*设备的注册分为两个步骤
*第一步:初始化设备
*第二部:把设备加载到系统中
*/
int device_register(struct device *dev)
{
device_initialize