1. 程式人生 > >基於AM335X的EDMA 驅動程式開發

基於AM335X的EDMA 驅動程式開發

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

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

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

相關推薦

基於AM335X的EDMA 驅動程式開發

0 簡介        EDMA即TI自定義的加強版DMA資料傳輸模式,經過簡單的瞭解,本質上它設計一種非常高效的可以合併多次DMA傳輸的模式。 1 協議簡介        協議的簡單介紹可以參考ht

《精通Linux 裝置驅動程式開發》下載

2018年11月02日 14:24:20 茹粿鰅莧丨你 閱讀數:1 標籤: 程式設計 資料 區

VxWorks驅動程式開發指南--驅動程式的組織結構

驅動程式的組織結構 驅動程式最重要的部分就是驅動程式原始碼檔案,原始檔描述了裝置如何和VxBus、VxWorks OS互動。但是,VxWorks 裝置驅動程式還需要另外一些檔案,這些附加檔案能夠幫助你將自己編寫的驅動整合到VxWorks編譯環境中去,這也是釋出驅動程式最重要的一步。本節主要討論如

Android驅動程式開發和除錯環境配置

    本文用《Android深度探索(卷1):HAL與驅動開發》的隨書原始碼為例詳細說明如何配置Android驅動開發和測試環境,並且如何使用原始碼中的build.sh指令碼檔案在各種平臺(Ubuntu Linux、Android模擬器和S3C6410開發板)上編譯、安裝和

在windows10 下搭建 visual studio 2015 驅動程式開發環境

需要做的準備 一臺安裝好windwos10 的電腦(工作機) 下載windwos10 安裝包(用來安裝虛擬機器)這裡 下載最新版本的VirtualBox(虛擬機器軟體 也可以使用vmware)這裡 下載visual studio 2015 安裝包這裡 下載w

Eclipse 搭建 Linux 核心驅動程式開發環境

1、開發工具 eclipse 、arm-linux-gcc交叉工具鏈、對應開發板的Linux 核心原始碼。2、安裝開發工具,並將核心原始碼包解壓到指定路徑中,並編譯。 eg:/usr/local/arm/linux_E9_3.0.35_for_Linux3、利用eclipse

Linux USB 驅動開發(五)—— USB驅動程式開發過程簡單總結

       裝置驅動程式是作業系統核心和機器硬體之間的介面,由一組函式和一些私有資料組成,是應用程式和硬體裝置之間的橋樑。在應用程式看來,硬體裝置只是一個裝置檔案,應用程式可以像操作普通檔案一樣對硬體裝置進行操作。       裝置驅動程式是核心的一部分,主要完成以下功能

Linux下PCI裝置驅動程式開發基本框架

PCI是一種廣泛採用的匯流排標準,它提供了許多優於其它匯流排標準(如EISA)的新特性,目前已經成為計算機系統中應用最為廣泛,並且最為通用的匯流排標準。Linux的核心能較好地支援PCI匯流排,本文以Intel 386體系結構為主,探討了在Linux下開發PCI裝置驅動程式的基本框架。    一、PCI匯流排

Windows NT 驅動程式開發人員提示 -- 應注意避免

一定不要在沒有標註 I/O 請求資料包 (IRP) 掛起 (IoMarkIrpPending) 的情況下通過排程例程返回 STATUS_PENDING。 一定不要通過中斷服務例程 (ISR) 呼叫 KeSynchronizeExecution。 它會使系統死鎖。 一定不要將 DeviceObject-&g

[RK3399][Android7.1] 學習筆記 DRM驅動程式開發(介紹)

平臺 核心版本 安卓版本 rk Linux4.4 Android7.1 1. 簡介 DRM 全稱是 Direct Rendering Mana

《Windows 驅動程式開發與除錯》

第一部分:Windows系統架構概覽(1小時) 概述Windows 作業系統的架構和系統元件,包括HAL、核心、執行體、系統程序(IDLE、SMSS.EXE、WinLogon.EXE)和子系統等。介紹重要的系統檔案:NTOSKRNL.EXE、HAL.DLL、CLFS.SYS

WDM驅動程式開發之環境配置篇

一個星期前郭老師給我佈置了一項任務:開發我們自己設計的一塊板子的PCI裝置驅動,並給我指出了方向,具體說就是“三步走”戰略: (1)入門。熟悉基於DriverStudio開發環境的裝置驅動開發,同時側面瞭解PCI裝置驅動程式的相關知識。 (2)進階。運用純DDK進行驅動開

Linux網路驅動程式開發例項分析

一.Linux系統裝置驅動程式概述   1.1 Linux裝置驅動程式分類   1.2 編寫驅動程式的一些基本概念 二.Linux系統網路裝置驅動程式 2.1 網路驅動程式的結構 2.2 網路驅動程式的基本方法 2.3 網路驅動程式中用到的資料結構 2.4 常用的系統支援 

《Linux裝置驅動程式開發詳解》中的virtualBox下的ubuntu在vmware下使用

最近在看宋寶華老師的《Linux裝置驅動程式開發詳解》第三版,在看到1.5小節Linux裝置驅動的開發環境構建時,我也 打算在自己電腦使用宋老師的系統(裡面有書配套的原始碼)。由於我之前電腦上已經安裝過了vmware workstation,就決定在 此環境下安裝系統。按照

linux驅動程式開發的學習步驟

1. 學會寫簡單的makefile  2. 編一應用程式,可以用makefile跑起來  3. 學會寫驅動的makefile 4. 寫一簡單char驅動,makefile編譯通過,可以insmod, lsmod, rmmod. 在驅動的init函式裡列印hello world, insmod後應該能夠通過d

Windows CE下驅動程式開發基礎

我想即使讀者看過微軟的關於驅動開發的培訓教材和CE幫助文件中的驅動部分,頭腦中仍然一片茫然。要想真正瞭解驅動程式必須結合一些驅動程式原始碼,在此我以串列埠驅動程式(COM16550)中初始化過程為線索簡單講一講驅動開發的基礎知識。    WindowsCE下的串列埠驅動程式能

嵌入式Linux驅動程式開發

嵌入式Linux驅動程式開發系統呼叫是作業系統核心和應用程式之間的介面,裝置驅動程式是作業系統核心和機器硬體之間的介面。裝置驅動程式為應用程式遮蔽了硬體的細節,這樣在應用程式看來,硬體裝置只是一個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作。裝置驅動程式是核心的

【 專欄 】- 手把手教你從零實現Linux裝置驅動程式(基於友善之臂4412開發板)

手把手教你從零實現Linux裝置驅動程式(基於友善之臂4412開發板) ARM-tiny4412這款CPU是基於ARMv7架構的晶片,目前在網上開發現成資源較少,為了彌補這一缺陷,本人決定將我所學所用的這塊晶片的開發技巧和方法共享

從零開始寫linux字元裝置驅動程式(一)(基於友善之臂tiny4412開發板)

從這篇博文開始,我將開始手把手教會大家寫linux裝置驅動程式這是開篇,如何來寫第一個字元裝置驅動程式。首先,寫一個最簡單的字元裝置驅動程式需要什麼?或者說我們需要了解什麼?1、每一個字元裝置至少需要有一個裝置號2、裝置號 = 主裝置號 + 次裝置號3、同一類裝置的主裝置號一

基於Visual C 2010開發Windows7應用 多點觸控圖片處理應用程式 1 同時處理多張圖片

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!