Platform 驱动架构
2015-06-09 17:47
459 查看
自从2.6以后版本的内核,出现了一个platform架构的驱动子系统,里面有两个基本的对象:platform_device,platform_driver;
Linux platformdriver机制和传统的device_driver机制相比,一个十分明显的优势在于platform机制将本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform_device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。
首先来分析platform中重要的结构体:
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注册;具体怎么查找还需要看代码。
相关文章推荐
- 如何快速开发网站?
- 收藏一些有用的的网站
- 逆战网站推广,你抓住体验优化了吗?
- 一个安卓开源项目网站
- 网站:阿里技术能力输出
- phpcms v9网站搬家更换域名的方法
- 南极时时彩源码全套下载-网站-前端-后端齐全下载
- 基于heartbeat v2 crm实现基于nfs的mysql高可用集群
- 软件架构杂谈(三) --- APNS
- 百度移动mobile type升级:自适应网站受捧
- 优化DNS解析和拆分域名 让网站打开速度更快技巧
- 动画效果网站
- 系统架构推荐专题文章及书籍-会持续更新
- MyBatis学习门户网站(一)
- 个人备案:原主体下其他网站内容不合格解决方法
- 最全最强解析:支付宝钱包系统架构内部剖析(架构图)
- 最全最强解析:支付宝钱包系统架构内部剖析(架构图)
- Ceph架构剖析
- 如何上谷歌,不多说,下面每个网站地址都可以
- 林仕鼎:系统架构领域的一些学习材料