基於AM335X的EDMA 驅動程式開發

來源:互聯網
上載者:User
0 簡介

       EDMA即TI自訂的加強版DMA資料轉送模式,經過簡單的瞭解,本質上它設計一種非常高效的可以合并多次DMA傳輸的模式。 1 協議簡介

       協議的簡單介紹可以參考http://blog.chinaunix.net/uid-28818752-id-3749701.html和http://blog.chinaunix.net/uid-24567872-id-3161827.html。

       基於linux核心提供的API可以參考http://blog.chinaunix.net/uid-28818752-id-3750016.html。

       簡單的將EDMA用作DMA的驅動工程,可以參考http://www.cnblogs.com/imapla/p/4122609.html。

       希望完整的使用EDMA驅動,還需要一些準備工作,如核心提供哪些編譯選項等,關於這部分可以參考http://processors.wiki.ti.com/index.php/AM335x_EDMA_Driver's_Guide。根據這個連結,可以發現官方推薦的參考代碼是AM335x PSP Package Contents中的edma-test.c,但很可惜暫時沒有找到。

2 工程開發過程記錄 2.1 環境介紹

       硬體是基於am335x晶片的beaglebone-black平台,軟體是linux-3.8.13核心。 2.2 記錄 2.2.1 驅動程式說明:

       AM335X使用的是EDMA控制器,而不是DMA,基本原理與DMA一致掌握源、目的、長度即可,只不過傳輸的模式多樣化了,而且理論上會是更高效的。

       使用預設的設定檔應該是配置了CONFIG_EDMA,如下圖所示。


       主要參考的驅動檔案說明

arch/arm/common/edma.cEDMA Controller提供的主要介面實現檔案;

driver/dma/edma.c   一個使用edma api 的參考驅動daemon;

driver/dma/virt-dma.c 

       三者的連接思想有點類似於dev-platform-bus 匯流排的關係;

注意,實際上edma.c與virt-dma.c暫時並沒有發現有什麼用,但是當我試圖從編譯選項中去除時,整個系統無法啟動,猜測“TI EDMA Support”不僅使能了編譯virt-dma.c和edma.c檔案,應該還牽涉很多其它的內容。另外,系統啟動後,發現預設載入了driver/dma/edma.c的驅動,一直有其列印資訊(通過選上“DMA Engine verbose debugging”還有降低列印閾值可以觀察到)。

程式架構

       首先,驅動載入成功後會立即申請一個4MB的連續的物理地址的地址空間,申請的原因是,每次DMA傳輸使用的地址是物理地址,一般而言的應用描述情境可能是“應用程式需要使用DMA將xxxx地址的大小xxxx位元組的內容拷貝到我的緩衝區中”,如此xxx地址是物理地址,但緩衝區是應用程式空間使用的虛擬位址,由於申請大多數可能是malloc所以物理空間上是不連續的(所以即使使用API將虛擬位址轉成物理地址也是沒有意義的,非連續)。所以驅動程式使用一個4MB的大小緩衝區作為中轉空間(之所以基於驅動程式完成該功能是因為應用程式是沒有辦法得到4MB連續的物理地址空間的),先使用DMA傳輸至該緩衝區,然後傳輸完畢後,使用者程式讀操作函數中將其拷貝至應用程式層指定的非連續的虛擬位址空間。這個拷貝操作相對較快(已經驗證),猜測只是修改了虛擬位址到物理地址的映射關係,並不是真正意義的拷貝。另外,由於在不改變核心的基礎上,只能申請到最大空間為4MB,所以限定了一次DMA傳輸的資料量需要小於4MB,如果需求大於4MB則需要在驅動程式中建立策略完成。

       其次,提供給使用者使用的介面包括,通過ioctl設定源物理地址,長度,啟動DMA傳輸,關閉DMA傳輸(釋放資源),讀操作(將資料拷貝至應用程式空間)。另外ioctl使用的命令字並不規範,之前測試0x0000002就一直報BAD ADDREESS的錯誤,測試是該數字不能使用ioctl的cmd。

       最後,應用程式層程式通過調用ioctl設定參數啟動傳輸,再調用read將資料拷貝出來。同時通過mmap對DMA傳輸資料的正確性驗證。需要注意的是,根據資料手冊可以知道am335x的地址映射是將0x8000_0000~0xBfff_ffff映射,同時beaglebone-black的裝置樹檔案中對memory節點的控制是8000_0000~9000_0000,所以搬運的物理地址如果使用的是SDRAM那麼範圍就應該是8000_0000~9000_0000。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.