linux设备树- device_node的 fwnode的作用

目录

概述

实例

代码分析

1. fwnode  变量的初始化

2. of_fwnode_ops 结构体提供了一组  “函数”

3. fwnode_xxx() 调用of_fwnode 函数的实现


概述

1. of_node_init(np)函数初始化了fwnode 变量

2. 初始化fwnode.ops =of_fwnode_ops 结构体(实际包含一组函数)

3. 类似 fwnode_xxx 的函数调用,实际调用了  ”of_fwnode_ops“结构体 提供的一组函数

4. of_fwnode_ops“结构体的fw_fwnode_xxx 最终调用of_xxx 函数

两个property.c 文件的说明

drivers/of/property.c        提供 of_xxx() 和  of_fwnode_xxx() 函数

drivers/base/property.c   提供 fwnode_xxx ()

实例

1. struct fwnode_handle *fixed_node = fwnode_get_named_child_node(fwnode, "fixed-link");
2. fwnode_property_read_u32_array(fwnode, "fixed-link",NULL, 0);
3. fwnode_property_read_u32_array(fwnode, "fixed-link",prop, ARRAY_SIZE(prop));

1. 略

2. 未提供地址,则返回数组的成员数量

3.  略

代码分析

1. fwnode  变量的初始化

static bool populate_node(const void *blob,int offset,
			  void **mem, struct device_node *dad,
			  struct device_node **pnp, bool dryrun)
{
	struct device_node *np;
	const char *pathp;
	unsigned int l, allocl;

	pathp = fdt_get_name(blob, offset, &l);
	if (!pathp) {
		*pnp = NULL;
		return false;
	}
	allocl = ++l;
	np = unflatten_dt_alloc(mem, sizeof(struct device_node) + allocl,
				__alignof__(struct device_node));
	if (!dryrun) {
		char *fn;
		of_node_init(np); // 初始化 np->fwnode
		np->full_name = fn = ((char *)np) + sizeof(*np); //填充np->full_name
		memcpy(fn, pathp, l);
        .......
	}

	.......
}
static inline void of_node_init(struct device_node *node)
{
#if defined(CONFIG_OF_KOBJ)
	kobject_init(&node->kobj, &of_node_ktype);
#endif
	node->fwnode.ops = &of_fwnode_ops; //填充具体的操作函数结构体of_fwnode_ops
}

2. of_fwnode_ops 结构体提供了一组  “函数”

const struct fwnode_operations of_fwnode_ops = {
	.get = of_fwnode_get,
	.put = of_fwnode_put,
	.device_is_available = of_fwnode_device_is_available,
	.device_get_match_data = of_fwnode_device_get_match_data,
	.property_present = of_fwnode_property_present,
	.property_read_int_array = of_fwnode_property_read_int_array,
	.property_read_string_array = of_fwnode_property_read_string_array,
	.get_parent = of_fwnode_get_parent,
	.get_next_child_node = of_fwnode_get_next_child_node,
	.get_named_child_node = of_fwnode_get_named_child_node,
	.get_reference_args = of_fwnode_get_reference_args,
	.graph_get_next_endpoint = of_fwnode_graph_get_next_endpoint,
	.graph_get_remote_endpoint = of_fwnode_graph_get_remote_endpoint,
	.graph_get_port_parent = of_fwnode_graph_get_port_parent,
	.graph_parse_endpoint = of_fwnode_graph_parse_endpoint,
};

3. fwnode_xxx() 调用of_fwnode 函数的实现

static int fwnode_property_read_int_array(const struct fwnode_handle *fwnode,
					  const char *propname,
					  unsigned int elem_size, void *val,
					  size_t nval)
{
	int ret;
    //利用宏组成fwnode->ops->property_read_int_array(fwnode,propname,elem_size,val,nval)
	ret = fwnode_call_int_op(fwnode, property_read_int_array, propname,
				 elem_size, val, nval);
	if (ret == -EINVAL && !IS_ERR_OR_NULL(fwnode) &&
	    !IS_ERR_OR_NULL(fwnode->secondary))
		ret = fwnode_call_int_op(
			fwnode->secondary, property_read_int_array, propname,
			elem_size, val, nval);

	return ret;
}

相关推荐

  1. linux设备- device_node fwnode作用

    2024-04-22 04:00:02       31 阅读
  2. Linux各目录作用

    2024-04-22 04:00:02       27 阅读
  3. Linux文件夹作用

    2024-04-22 04:00:02       24 阅读
  4. Linux中命令添加-r作用

    2024-04-22 04:00:02       66 阅读
  5. linux 下 /usr/local作用

    2024-04-22 04:00:02       31 阅读
  6. B、B+及B*原理、作用及区别

    2024-04-22 04:00:02       39 阅读
  7. linuxshelldate命令加号“+“作用

    2024-04-22 04:00:02       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 04:00:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 04:00:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 04:00:02       82 阅读
  4. Python语言-面向对象

    2024-04-22 04:00:02       91 阅读

热门阅读

  1. XXE漏洞

    XXE漏洞

    2024-04-22 04:00:02      36 阅读
  2. 使用Python实现文本分类与情感分析模型

    2024-04-22 04:00:02       41 阅读
  3. bev算法 简介

    2024-04-22 04:00:02       40 阅读
  4. Python编程:高效数据处理与自动化任务实践

    2024-04-22 04:00:02       44 阅读
  5. List<int[]>[] g = new ArrayList[n];

    2024-04-22 04:00:02       42 阅读
  6. 2024.4.21

    2024-04-22 04:00:02       34 阅读
  7. 数据结构习题--反转链表

    2024-04-22 04:00:02       40 阅读
  8. 白学的小知识[函数]

    2024-04-22 04:00:02       55 阅读
  9. 11-2.Vue2.x基本列表—列表过滤 filter--computed

    2024-04-22 04:00:02       37 阅读
  10. SPISPI

    2024-04-22 04:00:02       35 阅读