platform设备和驱动注册调用probe的流程
来源:互联网 发布:网络卖服装营销策划书 编辑:程序博客网 时间:2024/05/19 04:51
Linux platform driver机制和传统的device driver机制(即:通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中用使用这些资源时,通过platform device提供的标准接口进行申请并使用。
platform是一个虚拟的地址总线,相比PCI、USB,它主要用于描述SOC上的片上资源。platform所描述的资源有一个共同点:在CPU的总线上直接取址。平台设备会分到一个名称(用在驱动绑定中)以及一系列诸如地址和中断请求号(IRQ)之类的资源。
platform总线下驱动的开发步骤是:
1、设备
需要实现的结构体是:platform_device。
1)初始化resource结构变量
2)初始化platform_device结构变量
3)向系统注册设备:platform_device_register。
以上三步,必须在设备驱动加载前完成,即执行platform_ device _register()之前,原因是驱动注册时需要匹配内核中所有已注册的设备名。platform_ device _register()中添加device到内核最终还是调用的device_add函数。
Platform_device_add和device_add最主要的区别是多了一步insert_resource(p, r),即将platform资源(resource)添加进内核,由内核统一管理。
platform_device的注册过程:(与下方的platform_driver类似)
① platform_device_add(struct platform_device *pdev)
② device_add(&pdev->dev);
③ bus_add_device(dev);
④ bus_probe_device(dev);
⑤ device_attach(dev);
⑥ bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
⑦ __device_attach(struct device_driver *drv, void *data) // match()在这里
⑧ driver_probe_device(drv, dev);
⑨ really_probe(dev, drv);
really_probe先判断总线是否有probe函数,如果没有就调用具体platform的probe函数
2、驱动
驱动注册中,需要实现的结构体是:platform_driver。
在驱动程序的初始化函数中,调用了platform_driver_register()注册platform_driver。需要注意的是:platform_driver中的structdevice_driver里面的name和platform_device中的name变量的值必须是相同的(这是由于总线的match函数就是判断这两个的值是否相等)。这样在platform_driver_register()注册时,会将当前注册的platform_driver中的name变量的值和已注册的所有platform_device中的name变量的值进行比较,只有找到具有相同名称的才会调用platform_driver结构元素probe函数指针。
platform_driver_register实际也是封装了driver_register();
platform_driver的注册过程:
1 platform_driver_register(&s3c2410fb_driver)
2 driver_register(&drv->driver)
3 bus_add_driver(drv)
4 driver_attach(drv)
5 bus_for_each_dev(drv->bus, NULL, drv, __driver_attach)
6 __driver_attach(struct device * dev, void * data)
7 driver_probe_device(drv, dev)
8 really_probe(dev, drv)
在really_probe()中:为设备指派管理该设备的驱动:dev->driver = drv,调用probe()函数初始化设备:drv->probe(dev)
备注:
在加载serial设备驱动后,在sysfs中会发现如下结点:
/sys/bus/platform/devices/serial8250/ 链接到下下的那个serial8250
/sys/bus/platform/drivers/serial8250/
/sys/devices/platform/ serial8250/
以及会生成一些属性文件
- platform设备和驱动注册调用probe的流程
- platform设备和驱动的注册(1)
- platform设备和驱动的注册(2)
- platform设备和驱动的注册(3)
- platform设备和驱动的注册机制
- platform设备注册的时候,去platform总线上寻找相应驱动的流程
- linux 下platform设备和驱动注册的先后顺序
- linux 下platform设备和驱动注册的先后顺序
- linux 下platform设备和驱动注册的先后顺序
- platform_driver_register,什么时候调用PROBE函数 注册后如何找到驱动匹配的设备
- platform_driver_register,什么时候调用PROBE函数 注册后如何找到驱动匹配的设备
- linux-i2c驱动 之 i2c设备层的注册过程probe函数如何被调用分析
- 从USB设备插上到驱动probe调用流程分析
- 从USB设备插上到驱动probe调用流程分析
- 从USB设备插上到驱动probe调用流程分析
- 从USB设备插上到驱动probe调用流程分析
- Linux 驱动注册(driver_register)流程probe方法的选择
- 小记:platform总线注册设备和设备驱动
- SQLServer元数据操作
- ArrayList[集合类]、遍历Hsahtable【怎么搞的今天网是有了,怎么老断电呢~!本来好好的心情学习着,破电给人添堵】
- MyISAM和InnoDB你必知必会的几点区别。面试题哦
- Visual Studio 2012 does not support BI
- 第三周 任务1.1 递归求值
- platform设备和驱动注册调用probe的流程
- 最近做的一个oracle数据迁移功能,如有更好的方案,请各位大虾也能告诉小弟。
- HDU 4272 lianliankan
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- mxgraph-官方demo(1)
- 文本转换为图片
- 调用栈和各种调用约定的总结对比
- 将数据库优化进行到底!!
- qemu使用