作者:
ridge (夏天)
2014-07-11 01:23:47新手移植系統遇到一些問題, 卡一段時間了, 求助一下
移植 linux kernel driver
需要一塊20M上下的 physical 連續的記憶體給硬體使用
參考的程式是直接
platform_get_resource(pdev, IORESOURCE_MEM, 0);
然後拿得到的 physical addr?
印出來的位置是 0xbe......~0xbf 直接轉換
ioremap 得到 virtual addr 就一路操作下去
我仿造直接拿 0xbe......~0xbf...... 去做 ioremap
結果失敗, 印一堆 kernel message 查了一下
http://lxr.free-electrons.com/source/arch/arm/mm/ioremap.c#L334
287 if (size && !(sizeof(phys_addr_t) == 4 && pfn >= 0x100000)) {
288 struct static_vm *svm;
289
290 svm = find_static_vm_paddr(paddr, size, mtype);
291 if (svm) {
292 addr = (unsigned long)svm->vm.addr;
293 addr += paddr - svm->vm.phys_addr;
294 return (void __iomem *) (offset + addr);
295 }
296 }
297
298 /*
299 * Don't allow RAM to be mapped - this causes problems with ARMv6+
300 */
301 if (WARN_ON(pfn_valid(pfn)))
302 return NULL;
印log對起來是 svm=find_static_vm_paddr 就得到 0
然後 pfn_valid(pfn) = 1, 然後就印了訊息直接 return NULL
覺得少做了一些事所以這樣失敗, 一直亂試還沒結果
是因為沒有保留一塊記憶體, 還是少建立對應表, 還是少做哪些事?
網路上查詢要在一開始保留大塊記憶體大部分做法是
alloc_bootmem(size) 或是開機設定 kernel 參數 mem=xx
alloc_bootmem(size) 試過了目前還是失敗
回傳的位置已是 virtual addr 轉成 physical addr 就可用
不用在 ioremap 還甚麼設定就直接用?
開機設定 kernel 參數這部分還沒試過
這個就直接用 ioremap 轉換一個 physical addr 就可以用嗎?
實在不懂, 有沒有甚麼方向可參考, 謝謝