精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux設備驅動開發中兩個重要思想

Q4MP_gh_c472c21 ? 來源:互聯網 ? 作者:佚名 ? 2018-04-21 08:35 ? 次閱讀

嵌入式Linux設備驅動開發之驅動分層/分離思想

我們在學習I2CUSBSD驅動時,有沒有發現一個共性,就是在驅動開發時,每個驅動都分層三部分,由上到下分別是:

1、XXX 設備驅動

2、XXX 核心層

3、XXX 主機控制器驅動

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

一、設備驅動的分層思想

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

Linux內核完全由C語言匯編語言寫成,但是卻頻繁用到了面向對象的設計思想。在設備驅動方面,往往為同類的設備設計了一個框架,而框架中的核心層則實現了該設備通用的一些功能。同樣的,如果具體的設備不想使用核心層的函數,它可以重載之。舉個例子:

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的實現中,會檢查底層設備是否重載了funca(),如果重載了,就調用底層的代碼,否則,直接使用通用層的。這樣做的好處是,核心層的代碼可以處理絕大多數該類設備的funca()對應的功能,只有少數特殊設備需要重新實現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();

}

上述代碼假定為了實現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 XXX上的SPI控制器的寄存器來達到訪問SPI外設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));

...

}

如果按照這種方式來設計驅動,結果是對于任何一個SPI外設來講,它的驅動代碼都是CPU相關的。也就是說,當然用在CPU XXX上的時候,它訪問XXX的SPI主機控制寄存器,當用在XXX1的時候,它訪問XXX1的SPI主機控制寄存器:

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));

...

}

這顯然是不能接受的,因為這意味著外設YYY用在不同的CPU XXX和XXX1上的時候需要不同的驅動。那么,我們可以用如圖的思想對主機控制器驅動和外設驅動進行分離。這樣的結構是,外設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)等子系統都典型地利用了這種分離的設計思想。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5068

    文章

    19017

    瀏覽量

    303262
  • Linux
    +關注

    關注

    87

    文章

    11229

    瀏覽量

    208925

原文標題:嵌入式Linux設備驅動開發之驅動分層/分離思想

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux驅動開發:字符設備驅動開發理論

    大部分學習者的最終目的就是學習 Linux驅動開發Linux的外設驅動可以分為:字符
    發表于 10-26 09:53 ?1098次閱讀

    Linux設備驅動開發詳解

    #《Linux設備驅動開發詳解》電子書連載#第5章 Linux文件系統與設備文件系統,由于字符
    發表于 06-06 11:28

    Linux設備驅動程序開發 - Linux設備驅動類型

    的基本思想就是盡量抽取設備特性的共同點,把最復雜的設備驅動架構程序代碼交給Linux的內核和驅動
    發表于 04-16 14:31

    嵌入式Linux設備驅動開發思想進階之驅動分層與驅動分離

    的主要是設備驅動部分,主機控制器驅動部分也有少量編寫,二者進行交互主要時由核心層提供的接口來實現;這樣結構清晰,大大地有利于我們的驅動開發
    發表于 11-03 10:03

    嵌入式Linux設備驅動開發思想進階之驅動分層與驅動分離

    的主要是設備驅動部分,主機控制器驅動部分也有少量編寫,二者進行交互主要時由核心層提供的接口來實現;這樣結構清晰,大大地有利于我們的驅動開發
    發表于 11-07 14:43

    Linux設備驅動開發兩個重要思想解析

    嵌入式Linux設備驅動開發思想進階之驅動分層與驅動
    發表于 02-19 06:40

    Linux設備驅動開發詳解》第9章、Linux設備驅動的異步通知與異步IO

    Linux設備驅動開發詳解》第9章、Linux設備驅動
    發表于 10-27 11:33 ?0次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>詳解》第9章、<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>中</b>的異步通知與異步IO

    Linux設備驅動開發詳解》第8章、Linux設備驅動的阻塞與非阻塞IO

    Linux設備驅動開發詳解》第8章、Linux設備驅動
    發表于 10-27 11:35 ?9次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>詳解》第8章、<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>中</b>的阻塞與非阻塞IO

    Linux設備驅動開發詳解》第7章、Linux設備驅動的并發控制

    Linux設備驅動開發詳解》第7章、Linux設備驅動
    發表于 10-27 11:37 ?10次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>詳解》第7章、<b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>中</b>的并發控制

    Linux USB總線的兩個鏈表

    USB 總線引出兩個首要 的鏈表,一為 USB 設備鏈表,一為 USB 驅動鏈表。
    發表于 04-20 10:33 ?963次閱讀

    Linux設備驅動思想在STM32編程的應用

    這幾天看了一下Linux設備驅動,發現這套思想其實也可以用在普通的單片機編程上。這種思想較好的分割了驅動
    發表于 12-31 18:56 ?4次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>設備</b><b class='flag-5'>驅動</b><b class='flag-5'>思想</b>在STM32編程<b class='flag-5'>中</b>的應用

    Linux設備驅動開發詳解

    Linux設備驅動開發詳解
    發表于 10-28 11:03 ?50次下載

    Linux如何比較兩個文件的差異?

    Linux 如何比較兩個文件的差異?答案是使用 diff 命令。
    的頭像 發表于 01-17 17:30 ?5169次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>如何比較<b class='flag-5'>兩個</b>文件的差異?

    冷鏈運輸兩個重要環節

    冷鏈運輸兩個重要環節
    的頭像 發表于 01-28 17:13 ?1129次閱讀
    冷鏈運輸<b class='flag-5'>中</b>的<b class='flag-5'>兩個</b><b class='flag-5'>重要</b>環節

    Linux如何比較兩個文件的差異?

    Linux 如何比較兩個文件的差異?答案是使用 diff 命令。
    的頭像 發表于 01-30 16:04 ?1.2w次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>中</b>如何比較<b class='flag-5'>兩個</b>文件的差異?