of_property_read_string 剖析~

前言

今天在一个群里面看到的一个朋友提交,说of_property_read_string 这个函数有两个定义,到底是用了哪个呢?

所以这篇文章就说下这个函数。

函数引用的头文件

引用的头文件位置在

\kernel-4.4\include\linux\of.h

其中一个是

extern int of_property_read_string(struct device_node *np,const char *propname,const char **out_string);

还有一个是

static inline int of_property_read_string(struct device_node *np,const char *propname,const char **out_string)
{return -ENOSYS;
}

但是并不是两个都用到,他们用了一个宏  CONFIG_OF 来选择

CONFIG_OF 宏有什么用?

这个宏的解释是

Open Firmware. This was invented long time ago when Apple was producing laptops based on PowerPC CPUs. Openfirmware provides a good description of the devices connected to the platform. In Linux kernel the part that works with device data is called Device Tree (DT). More details in theUsage model.

他的作用是

Openfirmware provides a good description of the devices connected to the platform

他提供了一种更好的方式来连接设备和驱动。

他是名字是

called Device Tree (DT)

DTS,那很明显了,开了这个宏,就表示使用了DTS设备树的方式来连接设备和驱动程序。

of_property_read_string 函数本体

函数位置

"./drivers/of/base.c"

函数原型

/*** of_property_read_string - Find and read a string from a property* @np:         device node from which the property value is to be read.* @propname:   name of the property to be searched.* @out_string: pointer to null terminated return string, modified only if*              return value is 0.** Search for a property in a device tree node and retrieve a null* terminated string value (pointer to data, not a copy). Returns 0 on* success, -EINVAL if the property does not exist, -ENODATA if property* does not have a value, and -EILSEQ if the string is not null-terminated* within the length of the property data.** The out_string pointer is modified only if a valid string can be decoded.*/
int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)
{struct property *prop = of_find_property(np, propname, NULL);if (!prop)return -EINVAL;if (!prop->value)return -ENODATA;if (strnlen(prop->value, prop->length) >= prop->length)return -EILSEQ;*out_string = prop->value;return 0;
}
EXPORT_SYMBOL_GPL(of_property_read_string);

函数的作用:

返回propname对应dts节点对应的值。

使用方式:

传入np,就是设备树的节点,然后返回 "clock-output-names" 字符串对应的值,存入clk_name 里面。

of_property_read_string 函数剖析

int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)
{struct property *prop = of_find_property(np, propname, NULL);if (!prop)return -EINVAL;if (!prop->value)return -ENODATA;if (strnlen(prop->value, prop->length) >= prop->length)return -EILSEQ;*out_string = prop->value;return 0;
}
EXPORT_SYMBOL_GPL(of_property_read_string);
  • of_find_property 这个是找到这个dts节点,怎么找,可以再去这个函数分析一下。

  • strnlen功能「获取字符串实际字符个数,不包括结尾的'\0';如果实际个数 <= 第二个参数,则返回字符串实际字符个数,否则返回第二个参数。」

  • prop->length 是之前预设的一个值,strnlen正常情况返回的就是字符串的长度 减1「去掉\n字符」。

  • *out_string = prop->value 这里就是二级指针起到作用了,没有重新分配内存,直接把指针指向字符串位置。

我们再看看prop 的结构体,就一目了然了。

struct property {char	*name;int	length;void	*value;struct property *next;unsigned long _flags;unsigned int unique_id;struct bin_attribute attr;
};

关于二级指针举个例子

#include "stdio.h"char *str = "helloworld";
char **p = NULL;
int main(void)
{p = &str;printf("%s\n",*p);return (0);
}
推荐阅读
我把我的所有文章都汇总了,在公众号菜单也有。
专辑|Linux文章汇总
专辑|程序人生

===========

  

PS想加入技术群的同学,加了我好友后,就给我发「篮球的大肚子」这句话,有可能机器人打瞌睡,可以多发几次,不要发与技术无关的消息或者推广。

如果想获取学习资料,就在公众号后台回复「1024」,足够多的学习资料可以让你学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欧几里得算法扩展欧几里得算法

欧几里德算法 欧几里德算法又称辗转相除法&#xff0c;用于计算两个整数a,b的最大公约数。 基本算法&#xff1a;设aqbr&#xff0c;其中a&#xff0c;b&#xff0c;q&#xff0c;r都是整数&#xff0c;则gcd(a,b)gcd(b,r)&#xff0c;即gcd(a,b)gcd(b,a%b)。 第一种证…

mysql查询没有权限试图_MySQL迁移后提示查询view权限不足的处理

一.问题描述&#xff1a;开发人员反应xx物流系统mysql查询视图提示权限不足,请DBA介入处理.MariaDB [abc]> select * from c_time;ERROR 1045 (28000): Access denied for user lsa% (using password: YES)版本&#xff1a;mariadb 10.1.18 for centos 6.6二.问题分析&#…

CPU频率和核心

设置CPU的核心数在/sys/devices/system/cpu目录下可以看到你的CPU有几个核心&#xff0c;如果是四核&#xff0c;就是cpu0&#xff0c;cpu1&#xff0c;cpu2,cpu3 4个文件夹。cpu0 常开。进一个其他文件夹&#xff0c;比如cpu1&#xff0c;里面有个online文件用cat命令查看该文…

Java中的Map

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.HashMap:1.根据键的HashCode值存储数据2.最多只允许一条记录的键为Null,允许多条记录的值为Null3.不支持线程的同步(不支持多线程同时写操作),线程不安全,…

关于“进程”与“线程”的最通俗解析

来源&#xff1a;电子工程专辑进程&#xff08;process&#xff09;和线程&#xff08;thread&#xff09;是操作系统的基本概念&#xff0c;但是它们比较抽象&#xff0c;不容易掌握。最近&#xff0c;我读到一篇材料&#xff0c;发现有一个很好的类比&#xff0c;可以把它们解…

mysql 排序num_MySQL 实现row_number() 分组排序功能

数据库基本脚本CREATE TABLE a (ID INT(10) NULL DEFAULT NULL,class INT(10) NULL DEFAULT NULL,score INT(10) NULL DEFAULT NULL)COLLATEutf8_general_ciENGINEInnoDB;insert into a values (1,1,110);insert into a values (2,1,120);insert into a values (3,1,130);inser…

Netty源码学习(零)前言

本系列文章将介绍Netty的工作机制&#xff0c;以及分析Netty的主要源码。 基于的版本是4.1.15.Final&#xff08;2017.08.24发布&#xff09; 水平有限&#xff0c;如有谬误请留言指正 参考资料 the_flash的简书 占小狼的简书 转载于:https://www.cnblogs.com/stevenczp/p/7571…

要想选到音质好的耳机,你应该需要知道这些~

最近在一个音频公司调试我们设备的音频&#xff0c;从这次调试中&#xff0c;有所收获&#xff0c;希望这次的吹牛大家看完后&#xff0c;以后去买音频产品&#xff0c;可以分辨什么是好的&#xff0c;什么是不好的。有些产品硬件没有问题&#xff0c;但是产品经理因为个人喜好…

mysql kafka binlog_为什么使用kafka处理mysql binlog?

在开发 Spark Streaming 的公共组件过程中&#xff0c;需要将 binlog 的数据(Array[Byte])转换为 Json 格式&#xff0c;供用户使用&#xff0c;本文提供一种转换的思路。另外我们会用到几个辅助类&#xff0c;为了行文流畅&#xff0c;我们将辅助类的定义放在文章的最后面。如…

Fantasia (Tarjan+树形DP)

Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一张N个点、M条边的无向图 $G$ 。每个点有个权值Wi。 我们定义 $G_i$ 为图 $G$ 中删除第 $i$ 号顶点后的图。我们想计算 $G_1, G_2, ..., G_n$ 这N张图的权值。 对于任意一张图 $G$ &#xff0c;它的权值是这样定义…

买书这件事

知识这种东西&#xff0c;你只有不断的补充才不会觉得匮乏&#xff0c;我每年都会买点书&#xff0c;我喜欢买书&#xff0c;但是却不看书&#xff0c;很多书籍我都是当成工具书来用。我记得在2015年的时候&#xff0c;我需要自己写专利&#xff0c;但是我对写专利这个事情一窍…

python logging mysql_Python 操作 MySQL 的正确姿势

欢迎大家关注腾讯云技术社区-博客园官方主页&#xff0c;我们将持续在博客园为大家推荐技术精品文章哦~作者&#xff1a;邵建永使用Python进行MySQL的库主要有三个&#xff0c;Python-MySQL(更熟悉的名字可能是MySQLdb)&#xff0c;PyMySQL和SQLAlchemy。Python-MySQL资格最老&…

Linus Torvalds的最新电脑配置

大家好&#xff0c;祝大家6.1节日快乐最近Linus Torvalds 公布了他的电脑配置&#xff0c;有了这个配置清单之后&#xff0c;每个人都可以拥有一台和Linux之父一样的电脑&#xff0c;当你拥有了一台之后&#xff0c;你可以发个朋友圈&#xff0c;「我今天用Linus 的电脑解了一个…

马上就校招了,是要去实习还是复习?

昨天晚上&#xff0c;遇到一个特别纠结的同学&#xff0c;他现在收到一份实习的通知&#xff0c;他犹豫是要去实习呢还是继续在学校复习学习技术。实习的话可以增加自己校招的筹码&#xff0c;比如在和面试官侃大山的时候&#xff0c;可以把实习这件事情拿出来说&#xff0c;这…

mysql order by 索引名字_MySQL如何利用索引优化ORDER BY排序语句

MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。通过索引优化来实现MySQL的ORDER BY语句优化&#xff1a;1、ORDER BY的索引优化。如果一个SQL语句形…

YAML/Properties配置文件与Spring Boot(转)

多年来&#xff0c;Java开发人员依赖于属性文件或xml文件来指定应用程序配置。在企业应用程序中&#xff0c;人们可以为每个环境&#xff08;如开发&#xff0c;分段和生产&#xff09;创建单独的文件&#xff0c;以定义相应环境的属性。但是&#xff0c;通过Spring引导&#x…

嵌入式杂谈之makefile补充

我看了下自己的文章库存&#xff0c;好像还没有一篇关于Makefile的文章&#xff0c;所以这篇刚好可以弥补自己的缺失。makefile预定义变量预定义变量即系统自带的变量预定义变量作用AR库文件维护程序的名称&#xff0c;默认为arAS汇编程序的名称&#xff0c;默认为asCCc编译器的…

Weex 解决Print: Entry, :CFBundleIdentifier, Does Not Exist 错误方法

一、原因 导致这个错误的原因是我们的/user/你的用户名/.rncache文件中 boost_1_63_0.tar.gz文件内容不完整导致 如果你也玩过React-native框架&#xff0c;在0.45版本之后也会出现这个错误。 解决方法&#xff1a; 1、重新下载一个boost_1_63_0.tar.gz文件&#xff0c;替换它&…

mysql表单查询_表单查询实例

[TOC]### 1.查找部门30中员工的详细信息。select * from emp where deptno 30;### 2.找出从事clerk工作的员工的编号、姓名、部门号。select empno,ename,deptno from emp where job clerk;### 3.检索出奖金多于基本工资的员工信息。select * from emp where comm > sal;#…

安卓9.0马达框架分析

前言最近需要将之前的一些驱动接口转为安卓标准接口&#xff0c;方便上层应用或者第三方应用去适配。这篇文章先从简单的马达框架入手进行讲解。正文整个马达框架比较简单&#xff0c;安卓官方已经帮我们实现了framework到HAL层&#xff0c;我们需要实现的就只有驱动层。这篇文…