Linux設備驅動開發-platform虛擬總線

轉載:https://www.cnblogs.com/Blue-Moon/p/3332304.html

 

platform是內核的一個虛擬總線,它不像usb總線、PCI總線那樣真實存在的,platform總線完全是虛擬出來的。我們先看看內核是如何定義這個虛擬總線的:  

struct bus_type platform_bus_type = {

  .name  = "platform",

  .dev_attrs = platform_dev_attrs,

  .match  = platform_match,

  .uevent  = platform_uevent,

  .pm  = &platform_dev_pm_ops,

  };

  bus_type是內核的總線結構體,內核所有的總線都是由這個結構體定義的。 我們只關注name和match這兩個成員變量,其中name被賦值爲"platform",毋庸置疑,這表示定義了一個名爲“platform”的總線。match方法在總線、驅動、設備這三者中扮演着十分重要的角色。

  在這裏我簡單說一下match方法何時被調用(理解這一點對於理解整個設備驅動模型起到一定的幫助)。當一個驅動掛接到該總線的時候,該總線的match方法被調用,在這裏,platform總線的match方法被賦值爲platform_match,也就是說platform_match將被調用,platform_match將會幫驅動找到匹配的設備。同樣的,當一個設備掛接到該總線時,platform_match也會被調用,platform_match也會幫該設備找到匹配的驅動。用一句話來說就是,platform_match既幫驅動找對象,也幫設備找對象。當驅動和對象匹配上了,platform_match可是會收兩家的媒婆錢,黑心的很。

  那麼對於platform總線來說,驅動和設備如何掛接到該總線上呢。platform總線分別提供了兩個函數給驅動和設備使用。如下所示:

  int platform_driver_register(struct platform_driver *drv)

  int platform_device_register(struct platform_device *pdev)

  很顯然platform_driver_register 是給驅動使用的,platform_device_register 是給設備用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章