9054 DMA 中斷 基位址暫存器的一些理解

2021-04-25 04:02:06 字數 2145 閱讀 3095

關於

dma——以前總有乙個錯誤的認識——

pci卡的

dma操作是由主機板上的

dma控制器

8237

控制,但是想利用

8237

控制器進行

dma操作,需要首先發

dma申請,然後

8237

會在空閒的時候發

dma允許訊號。然而,通過檢視

pci規範發現,

pci根本就沒有相應的訊號連線。後來檢視了

9054

手冊之後才知道,原來

dma控制器是嵌在了

9054

晶元內部,這樣就不難想象

dma操作的全流程了:首先在需要傳輸資料的時候,通過

9054

和pci

向主機發中斷,然後由主機通過讀取中斷向量來判斷是何種中斷,如果是需要

dma方式傳輸資料,則在

dma控制器的一些暫存器(源端起始位址、資料塊大小、目的端起始位址暫存器等)寫資料,同時會通過對

9054

的本地配置暫存器的操作配置

dma的操作方式等。待

dma控制器配置完畢後,

dma控制器通過

lhold#

、lholda

和req#

、gnt#

分別來申請占用本地匯流排和系統,之後進行

dma操作。

9054

提供兩個

dma通道,每個通道都支援

gather/scatter

(分散/

集中)dma

和block

(塊)dma

兩種模式。這兩種模式的區別在於後者要求源端和目的端的資料塊都是連續儲存的,否則就需要進行多次

dma操作;而前者則可以只用一次

dma操作傳輸非連續儲存的多個資料塊,但是主機或者本地處理器需要首先建立描述塊(

descriptor block: composed of pci and local addresses, transfer count, transfer direction, and address of next descriptor block

),然後設定

dma的方式,並(用描述塊的位址)初始化

9054

內部的dma

描述指標暫存器(

descriptor pointer register

),最後設定

dmacsr0

或者dmacsr1

來啟動dma

操作。dma

啟動之後

9054

首先從描述塊中讀出第乙個描述塊,然後開始

dma傳輸。

注:至於該描述塊(

descriptor block

)如何建立還需要進一步檢視

9054

的資料手冊,可能該描述塊的建立需要由驅動程式或主機程式完成。

關於中斷——

9054

內部包含很多的中斷源,都可以通過暫存器來配置是否發中斷,向主機還是本地匯流排發中斷。如果向主機發中斷,則主機檢測到中斷之後,從

9054

暫存器中讀取中斷向量(intcsr)來判斷來進行何種中斷操作;同樣,如果向本地匯流排發中斷,則由本地的處理器用同樣方式來處理中斷。

關於基位址暫存器——基位址暫存器是用於將本地的儲存空間對映到系統得記憶體(或

i/o)空間中,這樣主機可以很方便的操作本地的儲存器。在指紋比對加速卡系統中,可以採用乙個基位址暫存器來對映所有的儲存空間(包括庫指紋緩衝、平方根表儲存器、

th_grade

表儲存器、現場指紋相關的表儲存器等),然後本地介面模組檢測到屬於該基位址記憶體空間的位址時,可以通過解碼來判斷該位址屬於哪個表資料。

基位址暫存器是乙個

32bit

的暫存器,分為兩個部分,後n個

bit為唯讀(表示對映空間的大小),前

32-n

個為可讀可寫(表示該對映空間在記憶體空間中的基偏移位址)。

pci規範規定,主機初始化時,首先向該暫存器寫全

』1』,然後讀該暫存器,通過該暫存器返回值來判斷所對映空間的大小以及對映型別(記憶體或者

i/o,最後一位為『0』

表示記憶體空間對映,否則市

i/o空間對映),之後系統給該對映空間分配乙個基偏移量。

位址暫存器

段位址 偏移 左邊的是段位址 右邊的是偏移位址 8086 cpu 字長16位 資料匯流排20條 cpu最多定址空間為2 16 資料匯流排卻有20條 cpu無法只能定址16位 無法定址20位 那麼怎麼解決呢 既然乙個暫存器無法儲存20位那就拿兩個cpu來儲存 乙個用來存段位址 乙個用來存偏移位址 實體...

暫存器位址對映

目錄 暫存器位址對映 暫存器位址對映關係 mdk5 中的位址關係以及查詢方法 gpiob的埠位址 埠位址如何對映到具體暫存器的位址?暫存器位址與埠位址的關係 apb2外圍裝置匯流排的位址 外圍裝置基位址 綜上所述 如上圖所示,進行了一次強制型別轉換,其實位址這個東西就是代表儲存的地點,任何型別對他來...

DSP 中斷暫存器

幾乎所有的mcu都不允許mov指令修改pc值,這是乙個常識。2.中斷服務表指標暫存器istp interrupt servicetable pointer 用於確定中斷服務程式在中斷服務表中的位址。istp中的字段istb確定ist的位址的基值,另一欄位hpeint確定特定的中斷,並給出這一特定中斷...