2012-11-06 50 views
0

同時調用這個函數:如何在ARM arch計算機上寫入HW控制器寄存器和DMA?

static inline void writel(unsigned int v, volatile void __iomem *addr) 
{ 
    *(volatile unsigned int __force *)addr = cpu_to_le32(v); 
} 
  1. 是否該地址是absoulute或通過MMU?
  2. DMA - 寫入地址是否由MMU翻譯?
  3. 爲什麼寄存器地址在系統中沒有提到here
+0

你是否從核心域調用該函數,例如內核模塊內? –

+0

是這個問題的所有上下文都在內核地址 – 0x90

+0

有一個ARM應用程序註釋「在ARM SMP系統上實現DMA」http://infocenter.arm.com/help/index.jsp?topic=/com。 arm.doc.dai0228a/index.html - 這可能會引發更多問題 – auselen

回答

1

這裏是我的答案,希望他們幫助你:

  1. 是的,地址由MMU翻譯。傳遞給writel的地址應該是通過ioremap調用獲得的虛擬地址(VA)。 ioremap將採取物理地址(PA)。
  2. 不,地址不是由MMU翻譯的。傳遞給DMA的地址應該是物理地址。典型的DMA是存在於MMU之外的專用外設。
  3. 您必須搜索'bcm2835 arm外設',而不是'ARM Linux上的內核內存佈局'。作爲提示,如果你想在linux內核中找到寄存器位置,請在linux-kernel-tree/arch/arm中搜索ioremap
+0

http://www.arm.linux.org.uk/developer/memory.txt – 0x90

+0

0x90,請參閱更新的答案。 – alexander

+0

對於像A53這樣的新型ARM而言是否爲真?他們有每個axi頻道的IOMMU。 SMMU是否影響在AXI端口上的尋址? – Nic30g