如何在Linux DTS中reserved一段内存以及在驱动层和用户层使用此段内存

1)本章主要分享如何在Linux reserved内存以及使用方法,适用于三星平台、以及其他SOC厂商(MTK/海思/Mstar/Amlogic/SigmaStar/全志/RockChip平台等)遵守Linux 标准架构的平台。分享给将要学习或者正在学习Linux内存相关问题的同学。

2)适用于对C语言有基本的认识,以及对Linux驱动知识有基本的掌握能力。

3)Linux内核版本:Linux5.10.61。

4)内容属于原创,若转载,请说明出处。

5)本人提供相关问题有偿答疑和支持。

首先看下Linux标准的DTS中关于reserved内存的定义方式:reserved-memory是关键字

.......
reserved-memory {
	#address-cells = <1>;
	#size-cells = <1>;
	ranges;

	cma0 {
		compatible = "shared-dma-pool";
		reusable;
		size = <0x01000000>;
		alignment = <0x1000>;
		linux,cma-default;
	};
};
........

我这里自定义我自己的内存区域:起始地址是0x27F00000,长度是1MB(0x00100000)

reserved-memory {
	#address-cells = <1>;
	#size-cells = <1>;
	ranges;

	cma0 {
		compatible = "shared-dma-pool";
		reusable;
		size = <0x01000000>;
		alignment = <0x1000>;
		linux,cma-default;
	};
	cus: buffer@0 {
		reg=<0x27F00000 0x00100000>;
		no_map;
	};
};
customer@0 {
		   compatible = "customer,user,mem";
		   memory-region = <&cus>;
};

系统启动可以看到内存打印信息:

驱动层相关读写,主要是3个相关API:

of_parse_phandle 

of_address_to_resource

memremap

static int platform_probe (struct platform_device *pdev)
{
	struct device_node* dev_node;
	struct resource res;
	int ret; void* base;
	
	dev_node = of_parse_phandle(pdev->dev.of node, "memory-region", 0);
	ret = of_address_to_resource(dev_node, 0, &res);
	base =memremap(res.start, resource_size(&res), MEMREMAP_WB);
	pr_info("paddr:0x%04X  vaddr:0x%04X\n", (unsigned int)res.start, (unsigned int)base);
	
    *(unsigned int*)base = (unsigned int)0x12345678;
    
	return 0;
}

用户层读写相关API参考:

#define MAP_SIZE 0x100000
#define base 0x27F00000

int fd = open ("/dev/mem",O RDWRIO | NDELAY);
void *map_base = mmap(NULL, MAP_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED, fd,base)

*(volatile unsigned int*)(map base)= 0x11223344;

close(fd);
munmap(map_base,MAP_SIZE);

完整的源码:

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值