一、platform设备模型
从Linux 2.6起引入了一套新的驱动管理和注册机制:platform_device和platform_driver。Linux中大部分的设备驱动,都可以使用这套机制,设备用platform_device表示,驱动用platform_driver进行注册。
Linux platform. driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform. device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。
platform机制的本身使用并不复杂,由两部分组成:platform_device和platfrom_driver。通过platform机制开发底层设备驱动的大致流程如图所示。
二、platform的初始化
首先系统启动的时候会调用platform_bus_init来初始化这个虚拟总线,然后向虚拟总线注册设备(即将挂载这条总线上的设备)。Platform_bus_type部分是内核为为我们实现好的,我们只关系platform_device与platform_driver就行了。
drivers/base/platform.c, line 964
964 struct bus_type platform_bus_type = { 965 .name = \"platform\", 966 .dev_attrs = platform_dev_attrs, 967 .match = platform_match, 968 .uevent = platform_uevent, 969 .pm = PLATFORM_PM_OPS_PTR, 970 };
971 EXPORT_SYMBOL_GPL(platform_bus_type); 972 973 int __init platform_bus_init(void) 974 { 975 int error; 976 977 early_platform_cleanup(); 978 979 error = device_register(&platform_bus); 980 if (error) 981 return error; 982 error = bus_register(&platform_bus_type); 983 if (error) 984 device_unregister(&platform_bus); 985 return error; 986 }
三、重要的结构体
platform机制中三个最重要的结构体:
platform_device
resource
platform_driver
platform_device结构体用来描述设备的名称、资源信息等。该结构被定义在include/linux/platform_device.h中,定义原型如下:
17 struct platform_device { 18 const char * name; //设备名 19 int id; //设备编号,配合设备名使用 20 struct device dev; 21 u32 num_resources; 22 struct resource * resource; //设备资源 23 24 struct platform_device_id *id_entry; 25 };