新手移植系统遇到一些问题, 卡一段时间了, 求助一下
移植 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 就可以用吗?
实在不懂, 有没有什么方向可参考, 谢谢