第23章Linux裝置驅動的移植之巧用同類裝置驅動

2021-08-21 00:24:29 字數 2199 閱讀 2687

23.2 巧用同類裝置驅動

23.2.1 巧用 demo 板驅動

對於推出的重要晶元,晶元廠商會同時提供一套 demo 板。這樣的 demo 板不僅在硬體設計中被硬體工程師充分利用並進行參考,而且其提供的驅動程式在新設計的硬體系統中被參考。

借用 demo 板驅動的方法主要是尋找共性中的差異,例如共性是晶元相同,差異則可能體現在所使用的 i/o 記憶體(片選)、中斷和 dma 資源不同,在這種情況下,修改 i/o 記憶體基位址、中斷號以及 dma 通道,demo 板的驅動就可以用在目標電路板上。而如果除了晶元相同以外,外圍晶元與 cpu 連線所用的記憶體、中斷和 dma 資源都相同的話,則 demo 板驅動基本上不加任何修改可以搬到目標電路板上。

如果 demo 板和目標電路板所用資源不同,而 demo 板對應裝置被定義為 pltaform_device,且其資源並定義在 resource 結構體陣列中,則直接修改 resource 結構體即可,如下所示:

static struct resource *** _ resource = ,

[1] =

同時,在編寫新驅動時要牢記的設計理念是:將硬體和平台相關的資訊(記憶體位址、中斷號、dma 通道、硬體設定等)放入 bsp 中,作為 platform 資訊、spi board 資訊、i 2 c board 資訊等,而不是直接放在驅動裡面。

23.2.2 巧用類似晶元的驅動程式

任何驅動工程師都沒有必要在面對新裝置驅動編寫需求時一切從頭開始,因為核心源** drivers 目錄(音訊裝置的驅動在 sound 目錄)中已經包含了大量現成的類似晶元驅動的源**,是極好的參考模板,不需要「re-invent the wheel」。實際上,在核心源**許多後期編寫的驅動程式中,就直接參考了之前的驅動原始碼,所以同類裝置的驅動往往呈現出非常相似的架構和資料結構定義。來看看 sound/oss/ au1550_ac97.c 檔案最開始的一段注釋:

and some from the powermac dbdma driver.

* we assume the processor can do memory coherent dma.

...*/

這段注釋很清楚地說明其絕大多數**都來自 au1000.c 驅動,還有一些來自 powermac dbdma驅動。

開啟 sound/oss 目錄下的 au1550_ac97.c(alchemy au1550 mips 處理器的音訊驅動)、es1370.c

(ensoniq es1370/asahi kasei ak4531 音效卡驅動)、es1371.c(reative ensoniq es1371 音效卡驅動)、

cs46xx.c(crystal soundfusion cs46xx 音效卡驅動),發現如下相似之處。

1、它們全都自定義了全域性的 ***_state 結構體例項用於封裝音訊裝置的鎖、訊號量、緩衝區、id 等資訊,這幾個結構體分別是:au1550_state、es1370_state、es1371_state、cs_state。

2、它們的核心函式都使用了完全相同的實現方法,au1550_ac97.c 的 au1550_read()和es1370.c 的 es1370_read()的處理流程是一致的。

可以看出,核心中看似神秘的、龐大的裝置驅動原始碼也是互相學習、互相借鑑的結果。

23.2.3 借用晶元廠商的範例程式

外圍晶元上市之前,晶元廠商進行了嚴格的驗證,在驗證過程中,必然會編寫**去訪問和控制這些晶元。很多時候,這些**稍經整理就被晶元廠商隨同 datasheet 一起在**上作為參考**發布。

範例程式停留在無作業系統的層次上,只是最底層的硬體操作**,這一部分**對驅動工程師的意義如下。

1、幫助工程師進一步理解晶元與 cpu 的介面原理、晶元的訪問和控制方法。

2、直接加以改進後搬到 linux 裝置驅動中。      

linux 裝置驅動的硬體操作方法會與無作業系統時的硬體操作方法有如下差異。

1、無作業系統的硬體訪問方法中沒有實體地址到虛擬位址的對映過程,搬到linux 系統中時,要注意以靜態對映或 ioremap()等方式對映到虛擬位址。

2、硬體訪問中夾雜著延時,在無作業系統的原始碼中,經常出現***_delay()的 for 迴圈延遲,這些**應該被核心中的 ndelay()或 udelay()替換。如果延遲時間達到數十 ms,應該使用msleep()或 msleep_interruptible()等函式。

3、晶元範例程式只是對晶元的操作方法進行示範,並不會考慮真實應用場景中對 cpu 的資源占用以及**的時間效能。

第1章Linux裝置驅動簡介二

1.2 劃分核心 在 unix 系統中,幾個併發的程序專注於不同的任務.每個程序請求系統資源,比如計算能力,記憶體,網路連線,或者一些別的資源.核心是個大塊的可執行檔案,負責處理所有這樣的請求.儘管不同核心任務間的區別常常不是能清楚劃分,核心的角色可以劃分成下列幾個部分 如圖1.1 1 程序管理 核...

第1章 裝置驅動概述

本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第1章 裝置驅動概述 1.1 裝置驅動的作用 沒有硬體的軟體是空中樓閣,而沒有軟體的硬體則是一堆廢鐵。計算機系統的軟硬體互相成就了對方。對裝置驅動最通俗的解釋就是 驅動硬體裝置行動 ...

第19章 Flash裝置驅動

本文摘自 偶有較小改動 linux 裝置驅動開發詳解 宋寶華 編著 人民郵電出版社 留作紀念。living park 第19章 flash裝置驅動 19.1 linux flash驅動結構 19.1.1 linux mtd系統層次 在linux系統中,提供了mtd memory technology...