基於zedboard的DMA設計筆記

2022-08-29 17:51:10 字數 1332 閱讀 8802

2.bar0空間的概念:bar(base address register )

該組暫存器簡稱為bar暫存器,bar暫存器儲存pci裝置使用的位址空間的基位址,該基位址儲存的是該裝置在pci匯流排域中的位址。其中每乙個裝置最多可以有6個基址空間,但多數裝置不會使用這麼多組位址空間。在pci裝置復位之後,該暫存器將存放pci裝置需要使用的基址空間大小,這段空間是i/o空間還是儲存器空間,如果是儲存器空間該空間是否可預取,系統軟體對pci匯流排進行配置時,首先獲得bar暫存器中的初始化資訊,之後根據處理器系統的配置,將合理的基位址寫入相應的bar暫存器中。系統軟體還可以使用該暫存器,獲得pci裝置使用的bar空間的長度,其方法是向bar暫存器寫入0xffff-ffff,之後再讀取該暫存器。處理器訪問pci裝置的bar空間時,需要使用bar暫存器提供的基位址。值得注意的是,處理器使用儲存器域的位址,而bar暫存器存放pci匯流排域的位址。因此處理器系統並不能直接使用「bar暫存器+偏移」的方式訪問pci裝置的暫存器空間,而需要將pci匯流排域的位址轉換為儲存器域的位址。如果x86處理器系統使能了iommu後,這兩個位址也並不一定相等,因此處理器系統直接使用這個pci匯流排域的實體地址,並不能確保訪問pci裝置的bar空間的正確性。除此之外在linux pci匯流排域的實體地址。而在pci_devàresource[bar].start引數中儲存的位址已經經過pci匯流排域到儲存器域的位址轉換,因此在編寫linux系統的裝置驅動程式時,需要使用pci_devàresource[bar].start引數中的實體地址,然後再經過ioremap函式將實體地址轉換為「儲存器域」的虛擬位址。

3. demo中的設計

pio傳輸就是programmable io,通常用於配置暫存器等小資料的傳輸,一次傳輸32bit資料。首先需要明確一點,pio傳輸都用主機(也就是pc電腦rt端)主動發起,進行一次pio傳輸主要需要位址和資料兩個引數。

那麼我們來看一下,這兩個引數在bmd的設計中是怎麼傳遞的。

bmd_64_rx_engine.trn_rd[44:34]/[63:34] (pio寫/讀)–> bmd_64_rx_engine.addr_o[10:0]–>bmd_ep.req_addr[10:0] ->bmd_ep_mem_access.addr_i[6:0] -> 位址用於索引暫存器

bmd_rx_engine. wr_data_o[31:0](pio寫) -> bmd_ep_mem_access.wr_data_i[31:0]

待續............

基於zedboard的AD9361初始化配置(上)

步驟一 因為github所給的hdl檔案全是原始檔,需要通過make工具生成vivado的工程檔案和hdf檔案。windows操作環境下無法直接使用make工具,有兩種方法可以考慮,一種是直接在linux環境下使用make,因為linux本身自帶make工具 另一種方法,在windows下安裝cyg...

Zedboard的啟動流程

最近由於專案需要,接觸了比較多zedboard 1.純pl 同一般傳統的xilinx fpga開發流程一致。2.純ps 同傳統的arm開發一樣。3.ps pl 裸跑 在arm核上裸跑程式 包括arm對於fpga的訪問 4.ps pl 作業系統 配置作業系統,在作業系統上執行程式。為此需要boot.b...

基於REST架構的Web Service設計

先前我曾經介紹過利用apache axis實現基於soap的web service實現技術和相關 總的來說,soap的web service解決方案雖然較為成熟,且安全性較好,但是使用門檻較高,在大併發情況下會有效能問題,在網際網路上使用不太普及,因此並不太適合web 2.0 服務使用,目前大量的w...