探究linux設備驅動模型之——platform虛擬總線(一)


  說在前面的話 :      設備驅動模型系列的文章主要依據的內核版本是2.6.32的,因為我裝的Linux系統差不多就是這個版本的(實際上我用的fedora 14的內核版本是2.6.35.13的。)

  今天是今年的第256天,換句話來說,每年的第256天被定為——程序員節。本來我懶得再寫東西的了,但是今天好歹是個節日,所以在這時寫點東西是有些意義的。

  linux設備驅動模型本身就極具復雜性,所以第一次接觸這個東西的伙伴們千萬不要驚呆、不要氣餒。這方面的資料網上還是有很多的,但是真正寫的明白的其實很少,因為很多文章的作者自己也是對這個東西理不妥的。所以我們只能在這成堆的資料里面耐心地去尋找正確的指路燈。

  還有我打算開始寫我的第四本小說了(前三本都太監了),小說的男主決定名為:林納斯(linux)。僅以此名向我心愛的Linux致敬。這名字雖然聽起來比較別扭,不過內涵還是很豐富的(呵呵)。書名初步定為《仙妖記事》。書名隨便起的,看着順眼就行。

  言歸正傳。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 是給設備用的。

  明天師妹們就來了,可是明天哥居然要去補考專業外語,坑爹啊。

  最后再給全世界的程序員們說一句:程序員辛苦了,節日快樂!

  待續....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM