petalinux 保留一段专用内存给你的驱动程序

本文介绍了在PetaLinux系统中为驱动程序或应用程序预留专用内存的方法,包括普通预留、通过DMA API预留和为CMA预留。通过设备树配置,可以创建内存保留区域,然后在驱动程序中使用memremap或ioremap映射。此外,文章还讨论了如何为DMA操作预留内存以及扩展CMA内存池。
摘要由CSDN通过智能技术生成

在实际应用中,需要保留一段专用内存,给驱动程序或者应用程序,比如给PL 访问的一段内存,用于查表,等等。

本文介绍如何在petalinlux 里实现保留一段内存。在这里我引用原文有3种方式预留内存:普通的,DMA,CMA。我的应用中打算使用普通的,32位方式。但这里3种方式都介绍。

来自参与的问题:https://forums.xilinx.com/t5/Embedded-Linux/Zynq-Petalinux-reserve-a-DDR-memory-region/m-p/1078634#M40548

其中重要的参考来自:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841683/Linux+Reserved+Memory

 

预留内存

要从系统地址空间保留内存范围,可以在设备树配置中使用保留的内存节点。 每个子节点定义一个特定的内存空间,并且可以根据内核文档中所述可用于保留内存节点的不同参数进行配置。 然后可以通过memory-region参数将保留的存储空间分配给特定的设备驱动程序。

用于64位Cortex-A53 MPSoC的system-top.dts文件中的设备树节点:

reserved-memory {
   #addre
Petalinux中,BRAM可以被视为一个类似于RAM的设备,因此可以使用驱动程序来对其进行控制和访问。下面是一个简单的BRAM驱动程序的示例代码: ```c #include <linux/module.h> #include <linux/platform_device.h> #include <linux/ioport.h> #include <linux/io.h> #define BRAM_SIZE 0x1000 #define BRAM_BASEADDR 0x40000000 static void __iomem *bram_base; static int bram_probe(struct platform_device *pdev) { struct resource *res; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "unable to get BRAM memory resource\n"); return -ENODEV; } if (request_mem_region(res->start, BRAM_SIZE, pdev->name) == NULL) { dev_err(&pdev->dev, "unable to request BRAM memory region\n"); return -EBUSY; } bram_base = ioremap(res->start, BRAM_SIZE); if (!bram_base) { dev_err(&pdev->dev, "unable to map BRAM memory\n"); release_mem_region(res->start, BRAM_SIZE); return -ENOMEM; } return 0; } static int bram_remove(struct platform_device *pdev) { iounmap(bram_base); release_mem_region(BRAM_BASEADDR, BRAM_SIZE); return 0; } static struct platform_driver bram_driver = { .driver = { .name = "bram", .owner = THIS_MODULE, }, .probe = bram_probe, .remove = bram_remove, }; static int __init bram_init(void) { return platform_driver_register(&bram_driver); } static void __exit bram_exit(void) { platform_driver_unregister(&bram_driver); } module_init(bram_init); module_exit(bram_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("BRAM driver"); ``` 这个驱动程序将BRAM作为一个平台设备进行管理。在驱动程序的probe函数中,首先获取BRAM的资源信息并请求BRAM的内存区域,然后使用ioremap函数将BRAM的物理地址映射到内核虚拟地址空间中,最后可以在驱动程序中使用bram_base指针来访问BRAM的内容。在驱动程序的remove函数中,需要释放BRAM的内存区域并解除BRAM的映射。 需要注意的是,这个驱动程序只是一个简单的示例,实际使用中可能需要根据具体的应用场景进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值