完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
下面对几种常见的使用方法进行举例说明:
通过 memremap/ioremap 来使用 在 Device Tree 配置如下,然后通过“memory-region”参数可将该预留内存分配给特定的设备驱动使用: reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; foobar_reserved: foobar@70000000 { no-map; reg = <0x0 0x70000000 0x0 0x10000000>; }; }; foobar_driver: foobar_driver@0 { memory-region = <&foobar_reserved>; }; 在设备驱动程序中,可解析 Device Tree 节点获得预留内存的物理地址和大小,然后通过 memremap/ioremap 映射这片内存空间来使用: /* Get reserved memory region from Device-tree */ np = of_parse_phandle(dev->of_node, "memory-region", 0); if (!np) { dev_err(dev, "No %s specifiedn", "memory-region"); goto error1; } rc = of_address_to_resource(np, 0, &r); if (rc) { dev_err(dev, "No memory address assigned to the regionn"); goto error1; } lp->paddr = r.start; lp->vaddr = memremap(r.start, resource_size(&r), MEMREMAP_WB); dev_info(dev, "Allocated reserved memory, vaddr: 0x%0llX, paddr: 0x%0llXn", (u64)lp->vaddr, lp->paddr); 通过 DMA API 来使用 设置“shared-dma-pool”属性后,可让设备驱动通过 DMA API 来使用预留内存: reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; foobar_reserved: foobar@70000000 { compatible = "shared-dma-pool"; no-map; reg = <0x0 0x70000000 0x0 0x10000000>; }; }; foobar_driver: foobar_driver@0 { memory-region = <&foobar_reserved>; }; 设备驱动程序中可类似常规地使用 DMA API,它申请的内存不是来源于默认的 CMA 内存池,而是来源于该预留内存: /* Initialize reserved memory resources */ rc = of_reserved_mem_device_init(dev); if(rc) { dev_err(dev, "Could not get reserved memoryn"); goto error1; } /* Allocate memory */ dma_set_coherent_mask(dev, 0xFFFFFFFF); lp->vaddr = dma_alloc_coherent(dev, ALLOC_SIZE, &lp->paddr, GFP_KERNEL); dev_info(dev, "Allocated coherent memory, vaddr: 0x%0llX, paddr: 0x%0llXn", (u64)lp->vaddr, lp->paddr); 给 CMA 预留内存 有时我们不需要将预留内存分配给特定的设备驱动,而只是想给默认 CMA 内存池分配一片固定的内存区域,这时我们可配置上“reusable”和“linux,cma-default”: reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; linux,cma { compatible = "shared-dma-pool"; reusable; reg = <0x0 0x70000000 0x0 0x10000000>; linux,cma-default; }; }; 由此可见,不同于 memreserve,通过 reserved-memory 预留的内存有可能进入系统 CMA,这需要满足以下几个条件:
|
|
|
|
只有小组成员才能发言,加入小组>>
467 浏览 0 评论
590 浏览 0 评论
715 浏览 0 评论
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS系统定制开发
1381 浏览 0 评论
全志T113双核异构处理器的使用基于Tina Linux5.0——RTOS编译开发说明
747 浏览 0 评论
全志V85x硬件设计大赛作品精选第二期,快来Pick你心目中的最佳方案
91926浏览 3评论
2837浏览 1评论
5109浏览 1评论
Yuzuki Lizard 全志V851S开发板 –移植 QT5.12.9教程
16393浏览 1评论
关于全志T113开发板接7寸LCD屏幕显示异常问题的解决方案
1127浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:18 , Processed in 0.610007 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号