linux 设备树-of_address_to_resource

本文详细介绍了LinuxDeviceTree中的`reg`和`ranges`属性在地址转换过程中的作用,包括of_address_to_resource函数的工作原理,以及如何通过`of_get_address`、`of_property_read_string_index`和地址翻译来处理设备节点的内存和I/O资源分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实例分析-reg 属性解析(基于ranges属性)

实例1

/{
	#address-cells = <0x01>;
	#size-cells = <0x01>;
	soc {
		compatible = "simple-bus";
		#address-cells = <0x01>;
		#size-cells = <0x01>;
		ranges = <0x7e000000 0x3f000000 0x1000000 0x40000000 0x40000000 0x1000>;
		dma@7e007000 {
			compatible = "brcm,bcm2835-dma";
			reg = <0x7e007000 0xf00>;
			......
		};
	}
	......
}

 实例2

 

struct resource {

        resource_size_t start; // 0x3f007000

        resource_size_t end; // 0x3f007eff

        const char *name;     // dma@7e007000 (reg-names 或者device_node->full_name)

        unsigned long flags;   //   0x200 IORESOURCE_MEM

        unsigned long desc;

        struct resource *parent, *sibling, *child;

};

1. of_address_to_resource 整体分析


of_address_to_resource(np, num_reg, &temp_res)  
分析:获取节点的reg 属性,生成struct resource
	 最终填充到platfor_device 结构体的pdev->num_resources和 pdev->resource

核心的三步操作:

1. addrp = of_get_address(dev, index, &size, &flags);   	     
 分析: 获取reg 属性的 第index组的信息(addrp:基地址  size: 大小  flags:默认) 

2. of_property_read_string_index(dev, "reg-names",index, &name); 
 分析: 从reg-names 属性中获取index组的名称


3. return __of_address_to_resource(dev, addrp, size, flags, name, r); 
 分析: 进行地址转换(基于父节点的ranges属性),并存储到struct resource *r 结构体中

 第一步: of_get_address

const __be32 *of_get_address(struct device_node *dev, int index, u64 *size,
		    unsigned int *flags)
{
	const __be32 *prop;
	unsigned int psize;
	struct device_node *parent;
	struct of_bus *bus;
	int onesize, i, na, ns;

	/* Get p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐分享-程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值