當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]嵌入式Linux設(shè)備驅(qū)動開發(fā)之驅(qū)動分層/分離思想 我們在學(xué)習(xí)I2C、USB、SD驅(qū)動時,有沒有發(fā)現(xiàn)一個共性,就是在驅(qū)動開發(fā)時,每個驅(qū)動都分層三部分,由上到下分別是: 1、XXX 設(shè)備驅(qū)動 2、XXX 核心層 3、XXX 主機(jī)控制器驅(qū)動

嵌入式Linux設(shè)備驅(qū)動開發(fā)之驅(qū)動分層/分離思想

我們在學(xué)習(xí)I2C、USB、SD驅(qū)動時,有沒有發(fā)現(xiàn)一個共性,就是在驅(qū)動開發(fā)時,每個驅(qū)動都分層三部分,由上到下分別是:

1、XXX 設(shè)備驅(qū)動

2、XXX 核心層

3、XXX 主機(jī)控制器驅(qū)動

而需要我們編寫的主要是設(shè)備驅(qū)動部分,主機(jī)控制器驅(qū)動部分也有少量編寫,二者進(jìn)行交互主要時由核心層提供的接口來實現(xiàn);這樣結(jié)構(gòu)清晰,大大地有利于我們的驅(qū)動開發(fā),這其中就是利用了Linux設(shè)備驅(qū)動開發(fā)中兩個重要思想,下面來一一解析

一、設(shè)備驅(qū)動的分層思想

在面向?qū)ο蟮某绦蛟O(shè)計中,可以為某一類相似的事物定義一個基類,而具體的事物可以繼承這個基類中的函數(shù)。如果對于繼承的這個事物而言,其某函數(shù)的實現(xiàn)與基類一致,那它就可以直接繼承基類的函數(shù);相反,它可以重載之。這種面向?qū)ο蟮脑O(shè)計思想極大地提高了代碼的可重用能力,是對現(xiàn)實世界事物間關(guān)系的一種良好呈現(xiàn)。

Linux內(nèi)核完全由C語言和匯編語言寫成,但是卻頻繁用到了面向?qū)ο蟮脑O(shè)計思想。在設(shè)備驅(qū)動方面,往往為同類的設(shè)備設(shè)計了一個框架,而框架中的核心層則實現(xiàn)了該設(shè)備通用的一些功能。同樣的,如果具體的設(shè)備不想使用核心層的函數(shù),它可以重載之。舉個例子:

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

{

if (bottom_dev->funca)

return bottom_dev->funca(param1, param2);

/* 核心層通用的funca代碼 */

...

}

上述core_funca的實現(xiàn)中,會檢查底層設(shè)備是否重載了funca(),如果重載了,就調(diào)用底層的代碼,否則,直接使用通用層的。這樣做的好處是,核心層的代碼可以處理絕大多數(shù)該類設(shè)備的funca()對應(yīng)的功能,只有少數(shù)特殊設(shè)備需要重新實現(xiàn)funca()。

再看一個例子:

copyreturn_type core_funca(xxx_device * bottom_dev, param1_type param1, param1_type param2)

{

/*通用的步驟代碼A */

...

bottom_dev->funca_ops1();

/*通用的步驟代碼B */

...

bottom_dev->funca_ops2();

/*通用的步驟代碼C */

...

bottom_dev->funca_ops3();

}

上述代碼假定為了實現(xiàn)funca(),對于同類設(shè)備而言,操作流程一致,都要經(jīng)過“通用代碼A、底層ops1、通用代碼B、底層ops2、通用代碼C、底層ops3”這幾步,分層設(shè)計明顯帶來的好處是,對于通用代碼A、B、C,具體的底層驅(qū)動不需要再實現(xiàn),而僅僅只關(guān)心其底層的操作ops1、ops2、ops3。圖1明確反映了設(shè)備驅(qū)動的核心層與具體設(shè)備驅(qū)動的關(guān)系,實際上,這種分層可能只有2層(圖1的a),也可能是多層的(圖1的b)。

這樣的分層化設(shè)計在Linux的input、RTC、MTD、I2 C、SPI、TTY、USB等諸多設(shè)備驅(qū)動類型中屢見不鮮。

二、主機(jī)驅(qū)動和外設(shè)驅(qū)動分離思想

主機(jī)、外設(shè)驅(qū)動分離的意義

在Linux設(shè)備驅(qū)動框架的設(shè)計中,除了有分層設(shè)計實現(xiàn)以外,還有分隔的思想。舉一個簡單的例子,假設(shè)我們要通過SPI總線訪問某外設(shè),在這個訪問過程中,要通過操作CPU XXX上的SPI控制器的寄存器來達(dá)到訪問SPI外設(shè)YYY的目的,最簡單的方法是:

copyreturn_type xxx_write_spi_yyy(...)

{

xxx_write_spi_host_ctrl_reg(ctrl);

xxx_ write_spi_host_data_reg(buf);

while(!(xxx_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));

...

}

如果按照這種方式來設(shè)計驅(qū)動,結(jié)果是對于任何一個SPI外設(shè)來講,它的驅(qū)動代碼都是CPU相關(guān)的。也就是說,當(dāng)然用在CPU XXX上的時候,它訪問XXX的SPI主機(jī)控制寄存器,當(dāng)用在XXX1的時候,它訪問XXX1的SPI主機(jī)控制寄存器:

return_type xxx1_write_spi_yyy(...)

{

xxx1_write_spi_host_ctrl_reg(ctrl);

xxx1_ write_spi_host_data_reg(buf);

while(!(xxx1_spi_host_status_reg()&SPI_DATA_TRANSFER_DONE));

...

}

這顯然是不能接受的,因為這意味著外設(shè)YYY用在不同的CPU XXX和XXX1上的時候需要不同的驅(qū)動。那么,我們可以用如圖的思想對主機(jī)控制器驅(qū)動和外設(shè)驅(qū)動進(jìn)行分離。這樣的結(jié)構(gòu)是,外設(shè)a、b、c的驅(qū)動與主機(jī)控制器A、B、C的驅(qū)動不相關(guān),主機(jī)控制器驅(qū)動不關(guān)心外設(shè),而外設(shè)驅(qū)動也不關(guān)心主機(jī),外設(shè)只是訪問核心層的通用的API進(jìn)行數(shù)據(jù)傳輸,主機(jī)和外設(shè)之間可以進(jìn)行任意的組合。

如果我們不進(jìn)行上圖的主機(jī)和外設(shè)分離,外設(shè)a、b、c和主機(jī)A、B、C進(jìn)行組合的時候,需要9個不同的驅(qū)動。設(shè)想一共有m個主機(jī)控制器,n個外設(shè),分離的結(jié)果是需要m+n個驅(qū)動,不分離則需要m*n個驅(qū)動。

Linux SPI、I2C、USB、ASoC(ALSA SoC)等子系統(tǒng)都典型地利用了這種分離的設(shè)計思想。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉