簡體   English   中英

任何用於AXI突發類型設備的內置Linux方法?

[英]Any built-in Linux methods for AXI-burst type devices?

我需要與基於AXI突發接口的FPGA器件進行通信。 在不涉及DMA的情況下,通過Linux訪問此類設備有哪些方法? Burst是AXI標准的固有屬性,通常應在傳輸大量數據時自動觸發。 更大的問題是FPGA的設計只能響應A​​XI總線上的突發類型請求。 因此,當應用程序嘗試順序復制時,這會在Linux上導致嚴重問題。 我已經嘗試過memcpy而且它不起作用。

我假設你的“FPGA器件”是一個自定義模塊,通過AXI接口內存映射到Cortex-A9。 我認為有兩種或三種方法可以完成這項工作。

1)可緩存映射。 高速緩存硬件接口一次執行整個高速緩存行的突發傳輸。 您需要手動清理(寫入后)並使其無效(在讀取之前)。

2)不可緩存的映射,並且具有ARM匯編語言例程來處理低級傳輸。 我認為“加載和存儲多個寄存器”指令可以提供您正在尋找的內容。

我有一個類似的問題,需要通過Cortex-A9處理器的8字節傳輸來訪問AXI外設(自定義內存控制器)。 當然,通常的ARM指令傳輸1,2或4個字節(字節,半字,字)。 那些通過可緩存映射工作,但不是通過不可緩存的映射。 LDM / STM ,一次2個字,與兩個映射一起使用。

當然,AHB / AXI傳輸模式取決於實現方式。 根據您的描述,您需要INCR或WRAP模式而不是SINGLE。 但它不應該那樣。 這提出了你可以做到這一點的第三種方式:

3)與您的數字硬件設計師交談,讓他了解其實施對軟件的影響。

在我看來,你不應該做不尋常/定制的低級別MMU操作。 Linux有高級方法,您可以在設備驅動程序和/或board.c中放置標准掛鈎,主要選項是是否要進行非緩存(即COHERENT)。 請參閱LDD3

您需要設置MMU以通知硬件組件的功能。 您還需要確保整個互連支持突發並且不進行任何轉換(如果在生成互連時組件的功能存在任何歧義,則可能會發生這種情況)。

要設置MMU,您可以執行如下調用:

/* shareable device: S=b0 TEX=b000 AP=b11, C=b0, B=b1 = 0xC06*/
Xil_SetTlbAttributes(COMPONENT_BASE_ADDRESS, 0xC06);

屬性定義如下(來自Zynq技術參考手冊 ):

Encoding Bits   Cache Attribute
  C   B
  0   0         Non-cacheable
  0   1         Write-back, write-allocate
  1   0         Write-through, no write-allocate
  1   1         Write-back, no write-allocate

所以上面的行會將區域設置為回寫,寫入分配,這可能會給你寫入突發訪問權限。

另見Xilinx AR#47406此論壇帖子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM