Linux 设备总线驱动模型
1.基本概念
从 Linux2.6 起引入了一套新的驱动管理和注册机制:Platform_device 和
Platform_driver。Linux 中大部分的设备驱动,都可以使用这套机制,设备
Platform_device 表示,驱动用 Platform_driver 进行注册。
Linux platform driver 机制和传统的 device driver 机制(即:通过 driver_register 函数
进行注册)相比,一个十分明显的优势在于 platform 机制将设备本身的资源注册进内
核,由内核统一管理,在驱动程序中用使用这些资源时,通过 platform device 提供的
标准接口进行申请并使用。
和传统的驱动一样,platform 机制也分为三个步骤:
(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 成功,则绑定设备到该驱动。
2.写一个简单的 platform 驱动
以 led 为例,实现基于 platform 架构的 led 驱动。
2.1 platform device 部分
代码如下:
#include <linux/init.h>
#include <linux/module.h>