您的位置:首页 > 运维架构 > 网站架构

Platform 驱动架构

2015-06-09 17:47 459 查看
自从2.6以后版本的内核,出现了一个platform架构的驱动子系统,里面有两个基本的对象:platform_device,platform_driver;

Linux platformdriver机制和传统的device_driver机制相比,一个十分明显的优势在于platform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。

首先来分析platform中重要的结构体:

struct platform_device {
const char    *name;              名字,用于和driver配对,使用方法见platform_match
int        id;
bool        id_auto;
struct device    dev;             将device封装了一下
u32        num_resources;         具有的资源数
struct resource    *resource;     资源*ptr

const struct platform_device_id    *id_entry;    包含name和data两个成员:name代表device的类型描述,例如i2c,pci,spi等;data代表device的实例枚举数,例如0,42等
具有多个platform_device_id说明可以被不同的driver驱动,就是说具有硬件上应该有较好的兼容性;一般不会有多个值
/* MFD cell pointer */
struct mfd_cell *mfd_cell;

/* arch specific additions */
struct pdev_archdata    archdata;
};


struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;           将driver封装了一下
const struct platform_device_id *id_table;   这里一般会有值;具有多个platform_device_id时说明这个驱动可以支持多种类型的device
};

1 总线注册阶段:
内核启动初始化时的main.c文件中的kernel_init()-->do_basic_setup()-->driver_init()-->platform_bus_init()-->bus_register(&platform_bus_type),注册了一条platform总线(虚拟总线)。
2 添加设备时:
设备注册的时候Platform_device_register()-->platform_device_add()-->(pdev->dev.bus = &platform_bus_type)->device_add(),就这样把设备给挂到虚拟的总线上。
3 驱动注册时:
Platform_driver_register()-->driver_register()-->bus_add_driver()-->driver_attach()-->bus_for_each_dev(), 对在每个挂在虚拟的platform bus的设备作__driver_attach()--> driver_probe_device(),
判断drvàbusàmatch()是否执行成功,此时通过指针执行platform_match--> strncmp(pdev->name , drv->name , BUS_ID_SIZE),
如果相符就调用really_probe(实际就是执行相应设备的platform_driver->probe(platform_device)。)开始真正的探测,如果probe成功,则绑定设备到该驱动。

按照上面的顺序,我们可以推测在内核启动时的顺序一般就是:总线注册,device注册,driver注册;具体怎么查找还需要看代码。



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: