轉載: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 是給設備用的。