天天看點

platform總線

一:什麼是平台總線

    相對于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-&gt;id_table)</code>

<code>        </code><code>return</code> <code>platform_match_id(pdrv-&gt;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-&gt;name, drv-&gt;name) == 0);</code>

<code>}</code>

分析可知,platform的比對過程是:

    先根據idtable的名字進行比對,如果比對失敗,則再根據device和driver的名字進行比對,如果比對還比對不成功,則說明驅動和裝置不比對,如果這裡比對失敗,則會調用platform_driver_probe()函數

4:platform_driver_probe():驅動和裝置比對成功後自動執行的探測函數。

本文轉自 菜鳥養成記 51CTO部落格,原文連結:http://blog.51cto.com/11674570/1952420

繼續閱讀