一:什么是平台总线
相对于I2C SPI USB等总线实际存在的物理总线来说,平台总线是一种虚拟的总线,它并不对应实际的物理总线。
二:为什么需要平台总线
linux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线。平台总线中使用platform_device()来注册一个设备,使用platform_driver()来注册一个驱动。于传统的bus/device/driver机制相比,platform由内核进行统一管理,在驱动中使用资源,提高了代码的安全性和可移植性。个人理解,platform总线的作用就是用于将哪些不对应实际的物理总线的设备和驱动进行一个统一的管理。
三:platform总线的主要函数
1:platform_device_register():向platform总线注册设备,调用层次关系
platform_device_register()
platform_device_add()
device_add() // 向内核注册设备
2:platform_driver_register():向platform总线注册驱动,调用层次关系
platform_driver_register()
driver_register() //向内核注册驱动
3:platform_match():匹配函数,
<code>static</code> <code>int</code> <code>platform_match(</code><code>struct</code> <code>device *dev, </code><code>struct</code> <code>device_driver *drv)</code>
<code>{</code>
<code> </code><code>struct</code> <code>platform_device *pdev = to_platform_device(dev);</code>
<code> </code><code>struct</code> <code>platform_driver *pdrv = to_platform_driver(drv);</code>
<code> </code><code>/* match against the id table first */</code>
<code> </code><code>if</code> <code>(pdrv->id_table)</code>
<code> </code><code>return</code> <code>platform_match_id(pdrv->id_table, pdev) != NULL;</code>
<code> </code><code>/* fall-back to driver name match */</code>
<code> </code><code>return</code> <code>(</code><code>strcmp</code><code>(pdev->name, drv->name) == 0);</code>
<code>}</code>
分析可知,platform的匹配过程是:
先根据idtable的名字进行匹配,如果匹配失败,则再根据device和driver的名字进行匹配,如果匹配还匹配不成功,则说明驱动和设备不匹配,如果这里匹配失败,则会调用platform_driver_probe()函数
4:platform_driver_probe():驱动和设备匹配成功后自动执行的探测函数。
本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1952420