linux驱动之设备树查找节点(3)

目录

1. 提取指定属性的值

2. 根据属性值查找并读取32位整形数组

3. 根据属性值查找并读取字符串

4. 提取默认属性#address-cells和#size-cells的值

5. 通过路径查找节点

6. 通过节点名属性查找节点

7. 通过设备类型查找节点

8. 提取I/O口地址

9. 设备树中提取I/O口地址转换为物理地址;

10. 提取I/O口地址并映射成虚拟地址

11. 从设备树中提取资源


查找办法:

通过节点的compatible属性值查找指定节点;

通过节点名查找指定节点;

通过节点路径查找指定节点;

struct device_node结构体 

//头文件linux/of.h
//设备节点,描述设备数节点;
struct device_node {
	const char *name;//节点名
	const char *type;//设备类型
	phandle phandle;
	char	*full_name;//全路径节点名

	struct	property *properties;
	struct	property *deadprops;	/* removed properties */
	struct	device_node *parent; //父节点指针
	struct	device_node *child;  //子节点指针
	struct	device_node *sibling;//兄弟节点指针
	struct	device_node *next;	/* next device of same type */
	struct	device_node *allnext;	/* next in list of all nodes */
	struct	proc_dir_entry *pde;	/* this node's proc directory */
	struct	kref kref;
	unsigned long _flags;
	void	*data;
};

struct property结构体

struct property {
	char	*name; //属性名
	int	length;    //属性值的字节数
	void	*value;//属性值的首地址
	struct property *next;
	unsigned long _flags;
	unsigned int unique_id;
};

1. 提取指定属性的值

struct property *of_find_property(const struct device_node *np, //设备节点指针;

                        const char *name,  //需要查找的属性名;

                        int *lenp); //输出参数;非NULL则查找成功后被赋值为查找到的属性长度;

2. 根据属性值查找并读取32位整形数组

int of_property_read_u32_array(const struct device_node *np, //设备节点指针;
                      const char *propname, //需要查找的属性名;
                      u32 *out_values, //输出参数,存储查到的整形值
                      size_t sz);           //输出数组大小

成功:返回0; 属性不存在返回-EINVAL;属性没有值返回-ENODATA; 属性数据不够大返回-EOVERFLOW;

static inline int of_property_read_u32(const struct device_node *np,
				       const char *propname,
				       u32 *out_value)
{
	return of_property_read_u32_array(np, propname, out_value, 1);
}

 从上述代码可看出 of_property_read_u32 是 of_property_read_u32_array 的特殊形式;

3. 根据属性值查找并读取字符串

int of_property_read_string(struct device_node *np,//设备节点指针

                const char *propname,  //被查找的属性名
                const char **out_string) ;//返回指向以null结尾的字符串指针

成功:返回0; 属性不存在返回-EINVAL;属性没有值返回-ENODATA; 字符串不是以null结尾返回-EILSEQ;

 

4. 提取默认属性#address-cells和#size-cells的值

int of_n_addr_cells(struct device_node *np);

int of_n_size_cells(struct device_node *np);

 

5. 通过路径查找节点

struct device_node *of_find_node_by_path(const char *path);

示例:
    struct device_node *np;
    np = of_find_node_by_path("/soc@ff000000/cpm@9c0/serial@a80");
    np = of_find_node_by_path("/");

内部是通过比较struct device_node的full_name成员;

6. 通过节点名属性查找节点

struct device_node *of_find_node_by_name(

                                struct device_node *from,//开始查找的节点或null
                                const char *name)  //匹配的字符串名字;

 内部是通过比较struct device_node的name成员;

7. 通过设备类型查找节点

struct device_node *of_find_node_by_type(struct device_node *from,
    const char *type) //匹配的类型字符串;

 内部是通过比较struct device_node的type成员;

8. 提取I/O口地址

const u32 *of_get_address(struct device_node *dev, //设备节点

                                            int index,//地址编号
                                            u64 *size,//输出参数,I/O口地址的长度;

                 unsigned int *flags);//输出参数,类型(IORESOURCE_IO,IORESOURCE_MEM)

9. 设备树中提取I/O口地址转换为物理地址;

 u64 of_translate_address(struct device_node *dev,

                                             const __be32 *in_addr);//设备树提取的I/O地址;

 

10. 提取I/O口地址并映射成虚拟地址

void __iomem *of_iomap(struct device_node *device, int index);

 

11. 从设备树中提取资源

int of_address_to_resource(struct device_node *dev, int index,
               struct resource *r); //输出参数,指向资源

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天未及海宽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值