Linux裝置驅動 DMA 介面API

2021-10-22 18:30:59 字數 2928 閱讀 4314

目錄

dma概述

dma與cache的一致性

相關api

dma資料結構

dma是一種無需cpu的參加就可以讓外設與系統記憶體之間進行雙向資料傳輸的硬體機制。

它可以使系統cpu從實際的i/o資料傳輸過程中擺脫出來,大大提高系統的吞吐率,並且在傳輸期間,cpu還可以併發執行其他任務。

cache用作cpu針對記憶體的快取,避免cpu每一次都要與相對來說慢點的記憶體互動資料,從而來提高資料的訪問速率,而dma可以用作記憶體與外設之間傳輸資料的方式,資料不需要經過cpu周轉。

「假設裝置驅動程式把一些資料填充到記憶體緩衝區中,然後立刻命令硬體裝置利用dma傳送方式讀取該資料。如果dma訪問這些物理ram記憶體單元,而相應的硬體快取記憶體行的內容還沒有寫入ram中,那麼硬體裝置所讀取的至就是記憶體緩衝區中的舊值。」

現在有兩種方法來處理dma緩衝區:

一致性dma對映:書上講的比較抽象,通俗地說就是任何對dma緩衝區的改寫都會直接更新到記憶體中,也稱之為「同步的」或者「一致的」。

流式dma對映:根據個人的理解,這裡的流即輸入輸出流,我們需要事先指定dma緩衝區的方向。

啟動一次流式dma資料傳輸分為如下步驟(本dma驅動開發介紹僅適合s3c2410處理器型別):

注意:

申請函式:

alloc_pages(gfp_mask,order)返回第乙個所分配頁框描述符的位址,或者如果分配失敗則返回null。__get_free_pages(gfp_mask,order)類似於alloc_pages(),但它返回第乙個所分配頁的線性位址。如果需要獲得線性位址對應的頁框號,那麼需要呼叫virt_to_page(addr)巨集產生線性位址。
釋放函式:

__free_pages(page,order)這裡主要強調page是要釋放緩衝區的線性首位址所在的頁框號free_pages(page,order)這個函式類似於__free_pages(page,order),但是它接收的引數為要釋放的第乙個頁框的線性位址addr
dma驅動主要資料結構:

1)dma單個核心緩衝區資料結構:

typedef struct dma_buf_s  dma_buf_t;
2)dma暫存器資料結構:

/* dma control register structure */

typedef struct dma_regs_t;

3)dma裝置資料結構

/* dma device structre */

typedef struct dma_device_t;

4)dma通道資料結構

/* dma channel structure */

typedef struct s3c2410_dma_t;

dma驅動主要函式功能分析:

寫乙個dma驅動的主要工作包括:dma通道申請、dma中斷申請、控制暫存器設定、掛入dma等待佇列、清除dma中斷、釋放dma通道.

int s3c2410_request_dma(const char *device_id, dmach_t channel,

dma_callback_t write_cb, dma_callback_t read_cb) (s3c2410_dma_queue_buffer);

函式描述:申請某通道的dma資源,填充s3c2410_dma_t 資料結構的內容,申請dma中斷。

輸入引數

輸出引數:若channel通道已使用,出錯返回;否則,返回0

int s3c2410_dma_queue_buffer(dmach_t channel, void *buf_id,

dma_addr_t data, int size, int write) (s3c2410_dma_stop);

函式描述:這是dma操作最關鍵的函式,它完成了一系列動作:分配並初始化乙個dma核心緩衝區控制結構,並將它插入dma等待佇列,設定dma控制暫存器內容,等待dma操作觸發

輸入引數

輸出引數:操作成功,返回0;否則,返回錯誤號

int s3c2410_dma_stop(dmach_t channel)
函式描述:停止dma操作。

int s3c2410_dma_flush_all(dmach_t channel)
函式描述:釋放dma通道所申請的所有記憶體資源

void s3c2410_free_dma(dmach_t channel)
函式描述:釋放dma通道

因為各函式功能強大,乙個完整的dma驅動程式中一般只需呼叫以上3個函式即可。可在驅動初始化中呼叫s3c2410_request_dma,開始dma傳輸前呼叫s3c2410_dma_queue_buffer,釋放驅動模組時呼叫s3c2410_free_dma。

Linux裝置驅動 字元裝置驅動介面函式

核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是register chrdev region alloc chrdev region 和register chrdev 在linux2.6核心以前註冊字元裝置的函式介面是register chrdev,登出字元裝置介面函式是unregiste...

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動

一.簡介 作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者遮蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們檢視螢幕上的文件時,不用去管到底使用nvidia晶元,還是ati晶元的顯示卡,只需知道輸入命令後,需要的文字就顯示在螢幕上。硬體驅動程式是作業系統最基本...