分离与分层

        我在写大多数驱动的时候一般喜欢用输入子系统,这样不仅可以省去很多麻烦(直接设置),而且很容易嵌入到内核中,很是方便。但是后来遇到一个问题,就是在修改寄存器的值得时候,不仅需要很麻烦去找寄存器映射所在位置,而且容易牵一发而动全身。这就不是我想要的了。不过好像大神们也遇到过这样的情况,所以就有开发出一个很溜的模型--分离分层

        所谓分离与分层,就是把驱动和设备分开来写,设备驱动只关心与之相关的寄存器、内存等设置,驱动只关心与上层系统的接口等问题,那么两者是如何联系起来的呢?这就需要一个媒介了,而总线驱动是再好不过了,设备通过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就能连接起来了。

       驱动程序只是实现与软件有关的函数,而设备程序只实现与硬件相关的程序,这样我在修改硬件寄存器器时,驱动程序就不需要大幅改动了。当我们实现多设备多驱动时这种模型的优势就不言而喻了。

下面是基于ARM335XD的触摸屏驱动。

http://www.oschina.net/code/snippet_2241389_55796


        

你可能感兴趣的:(分离与分层)