驅動程式分層 分隔思想

2021-07-22 11:57:17 字數 2301 閱讀 3343

前面我們學習i2c、usb、sd驅動時,有沒有發現乙個共性,就是在驅動開發時,每個驅動都分層三部分,由上到下分別是:

1、*** 裝置驅動

2、*** 核心層

3、*** 主機控制器驅動

而需要我們編寫的主要是裝置驅動部分,主機控制器驅動部分也有少量編寫,二者進行互動主要時由核心層提供的介面來實現;這樣結構清晰,大大地有利於我們的驅動開發,這其中就是利用了linux裝置驅動開發中兩個重要思想,下面來一一解析

一、裝置驅動的分層思想

在物件導向的程式設計中,可以為某一類相似的事物定義乙個基類,而具體的事物可以繼承這個基類中的函式。如果對於繼承的這個事物而言,其某函式的實現與基類一致,那它就可以直接繼承基類的函式;相反,它可以過載之。這種物件導向的設計思想極大地提高了**的可重用能力,是對現實世界事物間關係的一種良好呈現。

linux核心完全由c語言和組合語言寫成,但是卻頻繁用到了物件導向的設計思想。在裝置驅動方面,往往為同類的裝置設計了乙個框架,而框架中的核心層則實現了該裝置通用的一些功能。同樣的,如果具體的裝置不想使用核心層的函式,它可以過載之。舉個例子:

return_type core_funca(***_device * bottom_dev, param1_type param1, param1_type param2)  

上述core_funca的實現中,會檢查底層裝置是否過載了funca(),如果過載了,就呼叫底層的**,否則,直接使用通用層的。這樣做的好處是,核心層的**可以處理絕大多數該類裝置的funca()對應的功能,只有少數特殊裝置需要重新實現funca()

再看乙個例子:

return_type core_funca(***_device * bottom_dev, param1_type param1, param1_type param2)  

上述**假定為了實現funca(),對於同類裝置而言,操作流程一致,都要經過「通用**a、底層ops1、通用**b、底層ops2、通用**c、底層ops3」這幾步,分層設計明顯帶來的好處是,對於通用**a、b、c,具體的底層驅動不需要再實現,而僅僅只關心其底層的操作ops1、ops2、ops3。圖1明確反映了裝置驅動的核心層與具體裝置驅動的關係,實際上,這種分層可能只有2層(圖1的a),也可能是多層的(圖1的b)。

這樣的分層化設計在linux的input、rtc、mtd、i2 c、spi、tty、usb等諸多裝置驅動型別中屢見不鮮。

二、主機驅動和外設驅動分離思想

主機、外設驅動分離的意義

在linux裝置驅動框架的設計中,除了有分層設計實現以外,還有分隔的思想。舉乙個簡單的例子,假設我們要通過spi匯流排訪問某外設,在這個訪問過程中,要通過操作cpu ***上的spi控制器的暫存器來達到訪問spi外設yyy的目的,最簡單的方法是:

return_type ***_write_spi_yyy(...)  

如果按照這種方式來設計驅動,結果是對於任何乙個spi外設來講,它的驅動**都是cpu相關的。也就是說,當然用在cpu ***上的時候,它訪問***的spi主機控制暫存器,當用在***1的時候,它訪問***1的spi主機控制暫存器:

return_type ***1_write_spi_yyy(...)  

這顯然是不能接受的,因為這意味著外設yyy用在不同的cpu ***和***1上的時候需要不同的驅動。那麼,我們可以用如圖的思想對主機控制器驅動和外設驅動進行分離。這樣的結構是,

外設a、b、c的驅動與主機控制器a、b、c的驅動不相關,主機控制器驅動不關心外設,而外設驅動也不關心主機,外設只是訪問核心層的通用的api進行資料傳輸,主機和外設之間可以進行任意的組合

如果我們不進行上圖的主機和外設分離,外設a、b、c和主機a、b、c進行組合的時候,需要9個不同的驅動。設想一共有m個主機控制器,n個外設,分離的結果是需要m+n個驅動,不分離則需要m*n個驅動。

linux spi、i2c、usb、asoc(alsa soc)等子系統都典型地利用了這種分離的設計思想。

6410之驅動程式的分層分離,匯流排裝置驅動模型

什麼是分離分層的概念?如前面的input子系統所述,分離分層概念可以如下圖所示 input.c和buttons.c,evdev.c形成分層的概念,buttons.c和evdev.c形成分離的概念,一邊是硬體相關的 由編寫驅動的人員編寫,一邊是純軟體是由linux核心所提供的。匯流排驅動裝置模型 該模...

Linux驅動開發 03 驅動程式的設計思想

簡單介紹一下linux驅動設計的思想發展 在夸夸其談之前,先看下i2c裝置的結構。圖摘自韋東山大大的 嵌入式linux應用開發完全手冊 80c51裡有乙個i2c控制器,其實也就是一組暫存器,用來控制i2c的資料線和訊號線上的訊號 高低電平 i2c裝置就是掛載i2c匯流排的裝置,或者說負載,比如ram...

linux 驅動程式 高階字元驅動程式

ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...