我在寫大多數驅動的時候通常喜歡用輸入子系統,這樣不只能夠省去不少麻煩(直接設置),並且很容易嵌入到內核中,非常方便。可是後來遇到一個問題,就是在修改寄存器的值得時候,不只須要很麻煩去找寄存器映射所在位置,並且容易牽一髮而動全身。這就不是我想要的了。不過好像大神們也遇到過這樣的狀況,因此就有開發出一個很溜的模型--分離分層。函數
所謂分離與分層,就是把驅動和設備分開來寫,設備驅動只關心與之相關的寄存器、內存等設置,驅動只關心與上層系統的接口等問題,那麼二者是如何聯繫起來的呢?這就須要一個媒介了,而總線驅動是再好不過了,設備經過device_add將設備掛接到總線鏈表中,驅動經過driver_register將驅動掛接到總線的另外一個鏈表中,而剛好總線驅動又提供一個match函數:int bus_match(struct device * dev, struct device_driver * drv),完成了從設備到驅動的匹配。在設備程序中咱們註冊一個platform_device,裏面有一個id能夠設置,在驅動程序中同時註冊一個platform_driver結構體,他的id成員必需要與platform_device的id一致,這樣match函數經過匹配id就能鏈接起來了。spa
驅動程序只是實現與軟件有關的函數,而設備程序只實現與硬件相關的程序,這樣我在修改硬件寄存器器時,驅動程序就不須要大幅改動了。當咱們實現多設備多驅動時這種模型的優點就不言而喻了。.net
下面是基於ARM335XD的觸摸屏驅動。code
http://www.oschina.net/code/snippet_2241389_55796orm